From 97933dd516de98dba7acab97dfa54b73b6a4a49d Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 13 Nov 2017 14:02:02 +0800 Subject: [PATCH] bug fixed for sql parser. for issue #2105 --- .../ParameterizedOutputVisitorUtils.java | 22 ++++++++++++--- ...rizedOutputVisitorTest_59_multiupdate.java | 27 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_59_multiupdate.java diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java index 734b63e05d..602ca017b4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -87,11 +87,27 @@ public class ParameterizedOutputVisitorUtils { } for (int i = 0; i < statementList.size(); i++) { - if (i > 0) { - out.append(";\n"); - } SQLStatement stmt = statementList.get(i); + if (i > 0) { + SQLStatement preStmt = statementList.get(i - 1); + + if (preStmt.getClass() == stmt.getClass()) { + StringBuilder buf = new StringBuilder(); + ParameterizedVisitor v1 = createParameterizedOutputVisitor(buf, dbType); + preStmt.accept(v1); + if (out.toString().equals(buf.toString())) { + continue; + } + } + + if (!preStmt.isAfterSemi()) { + out.append(";\n"); + } else { + out.append('\n'); + } + } + if (stmt.hasBeforeComment()) { stmt.getBeforeCommentsDirect().clear(); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_59_multiupdate.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_59_multiupdate.java new file mode 100644 index 0000000000..37f7dce0cb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_59_multiupdate.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_59_multiupdate extends TestCase { + final String dbType = JdbcConstants.MYSQL; + public void test_for_parameterize() throws Exception { + + String sql = "update t_order set salary = 101 where id = 101;update t_order set salary = 102 where id = 102"; + + List params = new ArrayList(); + String psql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType, params); + assertEquals("UPDATE t_order\n" + + "SET salary = ?\n" + + "WHERE id = ?;", psql); + assertEquals(2, params.size()); + assertEquals(101, params.get(0)); + } +}