diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 7444787058..59b8f5b58c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -158,10 +158,9 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV { this.dbType = JdbcConstants.MYSQL; + this.shardingSupport = true; } - private boolean shardingSupport = true; - public MySqlOutputVisitor(Appendable appender){ super(appender); } 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 636cb92c4c..2af092a09b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -57,6 +57,8 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet protected boolean parameterized = false; protected boolean parameterizedMergeInList = false; + protected boolean shardingSupport = false; + public SQLASTOutputVisitor(Appendable appender){ this.appender = appender; } @@ -88,7 +90,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } public void addTableMapping(String srcTable, String destTable) { - if (tableMapping != null) { + if (tableMapping == null) { tableMapping = new HashMap(); } tableMapping.put(srcTable, destTable); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/ExportParameterShardingTest.java b/src/test/java/com/alibaba/druid/bvt/sql/ExportParameterShardingTest.java new file mode 100644 index 0000000000..a19505a8d6 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/ExportParameterShardingTest.java @@ -0,0 +1,63 @@ +package com.alibaba.druid.bvt.sql; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 23/11/2016. + */ +public class ExportParameterShardingTest extends TestCase { + String dbType = JdbcConstants.MYSQL; + + public void test_exportParameter() throws Exception { + String sql = "select * from t_user_0000 where oid = 1001"; + + List stmtList = SQLUtils.parseStatements(sql, dbType); + + assertEquals(1, stmtList.size()); + + SQLStatement stmt = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + List parameters = new ArrayList(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, dbType); + visitor.setParameterized(true); + visitor.setParameterizedMergeInList(true); + visitor.setParameters(parameters); + + stmt.accept(visitor); + + System.out.println(out); + System.out.println(JSON.toJSONString(parameters)); + + String restoredSql = restore(out.toString(), parameters); + assertEquals("SELECT *\n" + + "FROM t_user_0000\n" + + "WHERE oid = 1001", restoredSql); + } + + public String restore(String sql, List parameters) { + List stmtList = SQLUtils.parseStatements(sql, dbType); + + assertEquals(1, stmtList.size()); + + SQLStatement stmt = stmtList.get(0); + + StringBuilder out = new StringBuilder(); + SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, dbType); + visitor.setParameters(parameters); + + visitor.addTableMapping("t_user", "t_user_0000"); + + stmt.accept(visitor); + + return out.toString(); + } +}