From 4decf975c634c6e796d633350ea9bdc72592c2f6 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 25 Jun 2017 18:38:12 +0800 Subject: [PATCH] bug fixed for sql parsre parameterized. --- .../java/com/alibaba/druid/sql/SQLUtils.java | 2 +- .../mysql/visitor/MySqlOutputVisitor.java | 3 +- .../sql/visitor/SQLASTOutputVisitor.java | 32 ++++++++++--------- .../com/alibaba/druid/bvt/bug/Issue1769.java | 30 +++++++++++++++++ .../bvt/sql/ExportParameterShardingTest.java | 6 ++-- ...ySqlParameterizedOutputVisitorTest_29.java | 2 +- ...ySqlParameterizedOutputVisitorTest_30.java | 2 +- ...ySqlParameterizedOutputVisitorTest_31.java | 2 +- ...ySqlParameterizedOutputVisitorTest_32.java | 2 +- ...ySqlParameterizedOutputVisitorTest_33.java | 2 +- ...ySqlParameterizedOutputVisitorTest_34.java | 2 +- 11 files changed, 58 insertions(+), 27 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/bug/Issue1769.java diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 070993d5cf..ddd1aab332 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -268,7 +268,7 @@ public class SQLUtils { StringBuilder out = new StringBuilder(); SQLASTOutputVisitor visitor = createFormatOutputVisitor(out, statementList, dbType); if (parameters != null) { - visitor.setParameters(parameters); + visitor.setInputParameters(parameters); } if (option == null) { 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 75b7628922..65c74b48a8 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 @@ -669,10 +669,9 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV public boolean visit(SQLVariantRefExpr x) { { - int parametersSize = this.getParametersSize(); int index = x.getIndex(); - if (index >= 0 && index < parametersSize) { + if (inputParameters != null && index < inputParameters.size()) { return super.visit(x); } 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 5bffc12073..ba9955fd1b 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -53,6 +53,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet protected boolean groupItemSingleLine = false; protected List parameters; + protected List inputParameters; protected Set tables; protected boolean exportTables = false; @@ -86,14 +87,6 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet this.parameterized = parameterized; } - public int getParametersSize() { - if (parameters == null) { - return 0; - } - - return this.parameters.size(); - } - public int getReplaceCount() { return this.replaceCount; } @@ -133,8 +126,17 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return this.tables; } + @Deprecated public void setParameters(List parameters) { - this.parameters = parameters; + if (parameters != null && parameters.size() > 0) { + this.inputParameters = parameters; + } else { + this.parameters = parameters; + } + } + + public void setInputParameters(List parameters) { + this.inputParameters = parameters; } public int getIndentCount() { @@ -366,15 +368,15 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet SQLBinaryOperator operator = x.getOperator(); - if (parameters != null - && parameters.size() > 0 + if (inputParameters != null + && inputParameters.size() > 0 && operator == SQLBinaryOperator.Equality && x.getRight() instanceof SQLVariantRefExpr ) { SQLVariantRefExpr right = (SQLVariantRefExpr) x.getRight(); int index = right.getIndex(); - if (index >= 0 && index < parameters.size()) { - Object param = parameters.get(index); + if (index >= 0 && index < inputParameters.size()) { + Object param = inputParameters.get(index); if (param instanceof Collection) { x.getLeft().accept(this); print0(" IN ("); @@ -1530,12 +1532,12 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLVariantRefExpr x) { int index = x.getIndex(); - if (index < 0 || parameters == null || index >= parameters.size()) { + if (index < 0 || inputParameters == null || index >= inputParameters.size()) { print0(x.getName()); return false; } - Object param = parameters.get(index); + Object param = inputParameters.get(index); SQLObject parent = x.getParent(); diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Issue1769.java b/src/test/java/com/alibaba/druid/bvt/bug/Issue1769.java new file mode 100644 index 0000000000..166164cef8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Issue1769.java @@ -0,0 +1,30 @@ +package com.alibaba.druid.bvt.bug; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlExportParameterVisitor; +import junit.framework.TestCase; + +import java.io.StringWriter; + +/** + * Created by wenshao on 25/06/2017. + */ +public class Issue1769 extends TestCase { + public void test_for_issue() throws Exception { + String sql = "SELECT id FROM test WHERE type = 9 AND name = ? AND orderId in (1, 2, 3);"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatement(); + + StringWriter out = new StringWriter(); + MySqlExportParameterVisitor v = new MySqlExportParameterVisitor(out); + v.setParameterized(true); + v.setShardingSupport(false); + v.setPrettyFormat(false); + stmt.accept(v); + + System.out.println(v.getParameters()); + System.out.println(v.getTables()); + assertEquals("SELECT id FROM test WHERE type = ? AND name = ? AND orderId IN (?)", out.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/ExportParameterShardingTest.java b/src/test/java/com/alibaba/druid/bvt/sql/ExportParameterShardingTest.java index a19505a8d6..1e9d26cbde 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/ExportParameterShardingTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/ExportParameterShardingTest.java @@ -26,11 +26,11 @@ public class ExportParameterShardingTest extends TestCase { 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); + List parameters = visitor.getParameters(); + //visitor.setParameters(parameters); stmt.accept(visitor); @@ -52,7 +52,7 @@ public class ExportParameterShardingTest extends TestCase { StringBuilder out = new StringBuilder(); SQLASTOutputVisitor visitor = SQLUtils.createOutputVisitor(out, dbType); - visitor.setParameters(parameters); + visitor.setInputParameters(parameters); visitor.addTableMapping("t_user", "t_user_0000"); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_29.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_29.java index 6f3c4b9fcc..0a00923f62 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_29.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_29.java @@ -69,7 +69,7 @@ public class MySqlParameterizedOutputVisitorTest_29 extends TestCase { StringBuilder buf = new StringBuilder(); SQLASTOutputVisitor visitor1 = SQLUtils.createOutputVisitor(buf, dbType); visitor1.addTableMapping("xx_abcde_ta", "xx_abcde_ta_0018"); - visitor1.setParameters(visitor.getParameters()); + visitor1.setInputParameters(visitor.getParameters()); pstmt.accept(visitor1); assertEquals("SELECT `a1`.`id`, `a1`.`gmt_create`, `a1`.`gmt_modified`, `a1`.`push_date`, `a1`.`parent_task_id`\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_30.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_30.java index 6c619777a7..1298e4101b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_30.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_30.java @@ -74,7 +74,7 @@ public class MySqlParameterizedOutputVisitorTest_30 extends TestCase { StringBuilder buf = new StringBuilder(); SQLASTOutputVisitor visitor1 = SQLUtils.createOutputVisitor(buf, dbType); visitor1.addTableMapping("udata", "udata_0888"); - visitor1.setParameters(visitor.getParameters()); + visitor1.setInputParameters(visitor.getParameters()); pstmt.accept(visitor1); assertEquals("SELECT `udata`.`id` AS `id`, `udata`.`gmt_create` AS `gmtCreate`, `udata`.`gmt_modified` AS `gmtModified`, `udata`.`uid` AS `userId`, `udata`.`user_nick` AS `userNick`\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_31.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_31.java index ab1218b03d..c3de86ae55 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_31.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_31.java @@ -71,7 +71,7 @@ public class MySqlParameterizedOutputVisitorTest_31 extends TestCase { StringBuilder buf = new StringBuilder(); SQLASTOutputVisitor visitor1 = SQLUtils.createOutputVisitor(buf, dbType); visitor1.addTableMapping("udata", "udata_0888"); - visitor1.setParameters(visitor.getParameters()); + visitor1.setInputParameters(visitor.getParameters()); pstmt.accept(visitor1); assertEquals("SELECT `udata`.`id` AS `id`, `udata`.`gmt_create` AS `gmtCreate`, `udata`.`gmt_modified` AS `gmtModified`, `udata`.`uid` AS `userId`, `udata`.`user_nick` AS `userNick`\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_32.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_32.java index 27d801b9e2..30bcf373e3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_32.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_32.java @@ -65,7 +65,7 @@ public class MySqlParameterizedOutputVisitorTest_32 extends TestCase { StringBuilder buf = new StringBuilder(); SQLASTOutputVisitor visitor1 = SQLUtils.createOutputVisitor(buf, dbType); visitor1.addTableMapping("udata", "udata_0888"); - visitor1.setParameters(visitor.getParameters()); + visitor1.setInputParameters(visitor.getParameters()); pstmt.accept(visitor1); assertEquals("SELECT COUNT(*) AS count\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_33.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_33.java index daa1736276..41d6e212a1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_33.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_33.java @@ -52,7 +52,7 @@ public class MySqlParameterizedOutputVisitorTest_33 extends TestCase { StringBuilder buf = new StringBuilder(); SQLASTOutputVisitor visitor1 = SQLUtils.createOutputVisitor(buf, dbType); visitor1.addTableMapping("udata", "udata_0888"); - visitor1.setParameters(visitor.getParameters()); + visitor1.setInputParameters(visitor.getParameters()); pstmt.accept(visitor1); assertEquals("SELECT *\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java index d28553c714..ecfe301639 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_34.java @@ -52,7 +52,7 @@ public class MySqlParameterizedOutputVisitorTest_34 extends TestCase { StringBuilder buf = new StringBuilder(); SQLASTOutputVisitor visitor1 = SQLUtils.createOutputVisitor(buf, dbType); visitor1.addTableMapping("udata", "udata_0888"); - visitor1.setParameters(visitor.getParameters()); + visitor1.setInputParameters(visitor.getParameters()); pstmt.accept(visitor1); assertEquals("SELECT *\n" +