diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 988f1606c4..5bffc12073 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1131,7 +1131,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (mapTableName != null) { print0(mapTableName); } else { - owner.accept(this); + if (owner instanceof SQLIdentifierExpr && x.getParent() instanceof SQLExprTableSource) { + print0(((SQLIdentifierExpr) owner).getName()); + } else { + owner.accept(this); + } } print('.'); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_41.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_41.java new file mode 100644 index 0000000000..84dff4c67b --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_41.java @@ -0,0 +1,57 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.serializer.SerializerFeature; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_41 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + String sql = "select * from db_00.t_00_00 where id > 1"; + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + SQLStatement statement = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, JdbcConstants.MYSQL); + List parameters = new ArrayList(); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + /*visitor.setPrettyFormat(false);*/ + statement.accept(visitor); + /* JSONArray array = new JSONArray(); + for(String table : visitor.getTables()){ + array.add(table.replaceAll("`","")); + }*/ + + String psql = out.toString(); + assertEquals("SELECT *\n" + + "FROM db_00.t\n" + + "WHERE id > ?", psql); + String params_json = JSONArray.toJSONString(parameters, SerializerFeature.WriteClassName); + System.out.println(params_json); + JSONArray jsonArray = JSON.parseArray(params_json); + String json = JSONArray.toJSONString(jsonArray, SerializerFeature.WriteClassName); + assertEquals("[1]", json); + + String rsql = SQLUtils.toSQLString(SQLUtils.parseStatements(psql, dbType), dbType, jsonArray); + assertEquals("SELECT *\n" + + "FROM db_00.t\n" + + "WHERE id > 1", rsql); + } +}