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 8c3a5713d0..e0b865b936 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -816,6 +816,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet if (parent instanceof ValuesClause) { print('?'); incrementReplaceCunt(); + + if(this instanceof ExportParameterVisitor || this.parameters != null){ + this.getParameters().add(null); + } return false; } } @@ -830,7 +834,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet print('?'); incrementReplaceCunt(); - if(this instanceof ExportParameterVisitor) { + if(this instanceof ExportParameterVisitor || this.parameters != null){ ExportParameterVisitorUtils.exportParameter((this).getParameters(), x); } return false; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_16.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_16.java new file mode 100644 index 0000000000..085d9497bc --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_16.java @@ -0,0 +1,48 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlExportParameterVisitor; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.ExportParameterVisitor; +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_16 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + + String sql = "/* 0bfacfa414829200086238910e/0.3// */" + + "insert into `t1` (" + + " `f0`, `f1`, `f2`, `f3`, `f4`, " + + "`f5`, `f6`, `f7`, `f8`, `f9`, " + + "`destination`, `start_standard`, `start_fee`, `add_standard`, `add_fee`, " + + "`region_fee_standard`, `region_fee_add`, `cell_fee`, `way_day`, `version`)" + + " values ( 1, 2, 2, 3, 0, -4, 1, null, '2016-12-28 18:13:28.825', '2016-12-28 18:13:28.825', 1, 1, 0, 1, 0, null, null, null, null, 0)\n"; + String psql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType); + assertEquals("INSERT INTO `t1` (`f0`, `f1`, `f2`, `f3`, `f4`\n" + + "\t, `f5`, `f6`, `f7`, `f8`, `f9`\n" + + "\t, `destination`, `start_standard`, `start_fee`, `add_standard`, `add_fee`\n" + + "\t, `region_fee_standard`, `region_fee_add`, `cell_fee`, `way_day`, `version`)\n" + + "VALUES (?, ?, ?, ?, ?\n" + + "\t\t, ?, ?, ?, ?, ?\n" + + "\t\t, ?, ?, ?, ?, ?\n" + + "\t\t, ?, ?, ?, ?, ?)", psql); + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + + StringBuilder out = new StringBuilder(); + ExportParameterVisitor visitor = new MySqlExportParameterVisitor(out); + for (SQLStatement stmt : stmtList) { + stmt.accept(visitor); + } + assertEquals(20, visitor.getParameters().size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_17.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_17.java new file mode 100644 index 0000000000..fee907305e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_17.java @@ -0,0 +1,39 @@ +package com.alibaba.druid.bvt.sql.mysql.param; + +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlExportParameterVisitor; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.ExportParameterVisitor; +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +import java.util.List; + +/** + * Created by wenshao on 16/8/23. + */ +public class MySqlParameterizedOutputVisitorTest_17 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + + String sql = "replace into `mytable_0228` " + + "( `user_id`, `c_level`, `l_level`, `t_level`, `v_level`, `tag`) " + + "values ( 2272895716, 'C1', null, 'T1', 'V0', '0') "; + String psql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType); + assertEquals("REPLACE INTO mytable (`user_id`, `c_level`, `l_level`, `t_level`, `v_level`, `tag`)\n" + + "VALUES (?, ?, ?, ?, ?\n" + + "\t, ?)", psql); + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + + StringBuilder out = new StringBuilder(); + ExportParameterVisitor visitor = new MySqlExportParameterVisitor(out); + for (SQLStatement stmt : stmtList) { + stmt.accept(visitor); + } + assertEquals(6, visitor.getParameters().size()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_18.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_18.java new file mode 100644 index 0000000000..d5de557eae --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_18.java @@ -0,0 +1,73 @@ +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.dialect.mysql.visitor.MySqlExportParameterVisitor; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.ExportParameterVisitor; +import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; +import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +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_18 extends TestCase { + public void test_for_parameterize() throws Exception { + final String dbType = JdbcConstants.MYSQL; + + String sql = "insert into `t_n_0021` ( " + + "`f0`, `f1`, `f2`, `f3`, `f4`" + + ", `f5`, `f6`, `f7`, `f8`, `f9`" + + ", `f10`, `f11`, `f12`, `f13`, `f14`" + + ", `f15`) " + + "values ( NOW(), NOW(), 123, 'abc', 'abd'" + + ", 'tair:ldbcount:808', 0.0, 2.0, 0, 251, 0, '172.29.60.62', 2, 1483686655818, 12, 0);"; + String psql = ParameterizedOutputVisitorUtils.parameterize(sql, dbType); + assertEquals("INSERT INTO t_n (`f0`, `f1`, `f2`, `f3`, `f4`\n" + + "\t, `f5`, `f6`, `f7`, `f8`, `f9`\n" + + "\t, `f10`, `f11`, `f12`, `f13`, `f14`\n" + + "\t, `f15`)\n" + + "VALUES (NOW(), NOW(), ?, ?, ?\n" + + "\t\t, ?, ?, ?, ?, ?\n" + + "\t\t, ?, ?, ?, ?, ?\n" + + "\t\t, ?)", psql); + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); + List stmtList = parser.parseStatementList(); + + 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.setExportTables(true); + /*visitor.setPrettyFormat(false);*/ + + SQLStatement stmt = stmtList.get(0); + stmt.accept(visitor); + + // System.out.println(parameters); + assertEquals(14, parameters.size()); + + StringBuilder buf = new StringBuilder(); + SQLASTOutputVisitor visitor1 = SQLUtils.createOutputVisitor(buf, dbType); + visitor1.setParameters(visitor.getParameters()); + stmt.accept(visitor1); + + assertEquals("INSERT INTO `t_n_0021` (`f0`, `f1`, `f2`, `f3`, `f4`\n" + + "\t, `f5`, `f6`, `f7`, `f8`, `f9`\n" + + "\t, `f10`, `f11`, `f12`, `f13`, `f14`\n" + + "\t, `f15`)\n" + + "VALUES (NOW(), NOW(), 123, 'abc', 'abd'\n" + + "\t, 'tair:ldbcount:808', 0.0, 2.0, 0, 251\n" + + "\t, 0, '172.29.60.62', 2, 1483686655818, 12\n" + + "\t, 0)", buf.toString()); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerInsertTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerInsertTest9.java new file mode 100644 index 0000000000..f8ee5ac628 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerInsertTest9.java @@ -0,0 +1,54 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.sqlserver; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerInsertStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.util.List; + +public class SQLServerInsertTest9 extends TestCase { + + public void test_0() throws Exception { + String sql = "insert into dashboard_role_res (res_id, role_id,res_type) values (?, ? ,?) , (?, ? ,?)"; + + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + parser.setParseCompleteValues(false); + parser.setParseValuesSize(3); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + SQLServerInsertStatement insertStmt = (SQLServerInsertStatement) stmt; + + Assert.assertEquals(2, insertStmt.getValuesList().size()); + Assert.assertEquals(3, insertStmt.getValues().getValues().size()); + Assert.assertEquals(3, insertStmt.getColumns().size()); + Assert.assertEquals(1, statementList.size()); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + String formatSql = "INSERT INTO dashboard_role_res (res_id, role_id, res_type)\n" + + "VALUES (?, ?, ?),\n" + + "(?, ?, ?)"; + Assert.assertEquals(formatSql, SQLUtils.toSQLServerString(insertStmt)); + } +}