diff --git a/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java index 8613f5dee5..755e54331f 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/DB2WallVisitor.java @@ -288,4 +288,9 @@ public class DB2WallVisitor extends DB2ASTVisitorAdapter implements WallVisitor public List getUpdateCheckItems() { return updateCheckItems; } + + public boolean visit(SQLJoinTableSource x) { + WallVisitorUtils.check(this, x); + return true; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java index 07b8fb2771..a6f8db853a 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/MySqlWallVisitor.java @@ -20,9 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.PagerUtils; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLCommentHint; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; @@ -35,7 +33,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStateme import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; -import com.alibaba.druid.sql.ast.SQLLimit; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; @@ -450,4 +447,9 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi public List getUpdateCheckItems() { return updateCheckItems; } + + public boolean visit(SQLJoinTableSource x) { + WallVisitorUtils.check(this, x); + return true; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java index 0cf2bc1ddf..172921d329 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/OracleWallVisitor.java @@ -354,4 +354,9 @@ public class OracleWallVisitor extends OracleASTVisitorAdapter implements WallVi public List getUpdateCheckItems() { return updateCheckItems; } + + public boolean visit(SQLJoinTableSource x) { + WallVisitorUtils.check(this, x); + return true; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/PGWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/PGWallVisitor.java index bbd5ba1678..ea1b8ceec4 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/PGWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/PGWallVisitor.java @@ -311,4 +311,9 @@ public class PGWallVisitor extends PGASTVisitorAdapter implements WallVisitor { public List getUpdateCheckItems() { return updateCheckItems; } + + public boolean visit(SQLJoinTableSource x) { + WallVisitorUtils.check(this, x); + return true; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java index 905e1cf4d8..0debc439b8 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java +++ b/src/main/java/com/alibaba/druid/wall/spi/SQLServerWallVisitor.java @@ -347,4 +347,9 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements public List getUpdateCheckItems() { return updateCheckItems; } + + public boolean visit(SQLJoinTableSource x) { + WallVisitorUtils.check(this, x); + return true; + } } diff --git a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java index e111359fbf..75242f0d79 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -2644,4 +2644,11 @@ public class WallVisitorUtils { addViolation(visitor, ErrorCode.EVIL_HINTS, "hint not allow", x); } } + + public static void check(WallVisitor visitor, SQLJoinTableSource x) { + SQLExpr condition = x.getCondition(); + if (condition instanceof SQLName) { + addViolation(visitor, ErrorCode.INVALID_JOIN_CONDITION, "invalid join condition", x); + } + } } diff --git a/src/main/java/com/alibaba/druid/wall/violation/ErrorCode.java b/src/main/java/com/alibaba/druid/wall/violation/ErrorCode.java index 14874ecdb9..202c54f508 100644 --- a/src/main/java/com/alibaba/druid/wall/violation/ErrorCode.java +++ b/src/main/java/com/alibaba/druid/wall/violation/ErrorCode.java @@ -82,6 +82,7 @@ public interface ErrorCode { public final static int READ_ONLY = 4000; public final static int UNION = 5000; + public final static int INVALID_JOIN_CONDITION = 6000; public final static int COMPOUND = 8000; diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest149.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest149.java new file mode 100644 index 0000000000..65a3ee6e11 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/mysql/MySqlWallTest149.java @@ -0,0 +1,19 @@ +package com.alibaba.druid.bvt.filter.wall.mysql; + +import com.alibaba.druid.wall.WallProvider; +import com.alibaba.druid.wall.spi.MySqlWallProvider; +import junit.framework.TestCase; +import org.junit.Assert; + +public class MySqlWallTest149 extends TestCase { + + public void test_false() throws Exception { + WallProvider provider = new MySqlWallProvider(); + + String sql = "select t1.teacher_id from teacher_1 t1 left join teacher_2 t2 on t1.teacher_id"; + + assertFalse( + provider.checkValid(sql) + ); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java index 835d03298a..a744668246 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/StringComparisonFunctionsTest.java @@ -92,7 +92,7 @@ public class StringComparisonFunctionsTest extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT 'David!' LIKE 'David_';", text); + Assert.assertEquals("SELECT 'David!' LIKE 'David\\\\_';", text); } public void test_6() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest102.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest102.java new file mode 100644 index 0000000000..9bf26a5f2e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest102.java @@ -0,0 +1,152 @@ +package com.alibaba.druid.bvt.sql.mysql.createTable; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; + +import java.util.List; + +public class MySqlCreateTableTest102 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE `xktv_perf_6519` (\n" + + "  `kd` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',\n" + + "  `gmt_create` datetime NOT NULL COMMENT '创建时间',\n" + + "  `time` datetime NOT NULL COMMENT '统计的时间',\n" + + "  `scope` int(11) NOT NULL COMMENT '时间粒度',\n" + + "  `knstance_id` varchar(128) DEFAULT NULL COMMENT '实例id',\n" + + "  `kp` varchar(16) NOT NULL COMMENT 'ip',\n" + + "  `port` int(11) NOT NULL COMMENT 'port',\n" + + "  `db` varchar(42) NOT NULL COMMENT 'db',\n" + + "  `hashcode` varchar(32) NOT NULL COMMENT 'hashcode',\n" + + "  `sql_type` varchar(6) NOT NULL COMMENT 'sql_type',\n" + + "  `logical_table` varchar(128) DEFAULT NULL COMMENT '逻辑表名',\n" + + "  `physical_table` varchar(128) DEFAULT NULL COMMENT '物理表名',\n" + + "  `request_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT '执行次数',\n" + + "  `rows_examined` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rows_examined',\n" + + "  `rows_sent` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rows_sent',\n" + + "  `rows_affected` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rows_affected',\n" + + "  `knnodb_pages_read` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'innodb_pages_read',\n" + + "  `knnodb_pages_io_read` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'innodb_pages_io_read',\n" + + "  `rt_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_count',\n" + + "  `query_time` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'query_time',\n" + + "  `wait_time` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'wait_time',\n" + + "  `lock_time` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'lock_time',\n" + + "  `rt_1ms_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_1ms_count',\n" + + "  `rt_2ms_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_2ms_count',\n" + + "  `rt_3ms_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_3ms_count',\n" + + "  `rt_10ms_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_10ms_count',\n" + + "  `rt_100ms_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_100ms_count',\n" + + "  `rt_1s_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_1s_count',\n" + + "  `rt_gt1s_count` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'rt_gt1s_count',\n" + + "  `avg_90_rt` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'avg_90_rt',\n" + + "  `avg_95_rt` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'avg_95_rt',\n" + + "  `avg_99_rt` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'avg_99_rt',\n" + + "  `avg_rt` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'avg_rt',\n" + + "  `val_ext_c0` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c0',\n" + + "  `val_ext_c1` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c1',\n" + + "  `val_ext_c2` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c2',\n" + + "  `val_ext_c3` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c3',\n" + + "  `val_ext_c4` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c4',\n" + + "  `val_ext_c5` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c5',\n" + + "  `val_ext_c6` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c6',\n" + + "  `val_ext_c7` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c7',\n" + + "  `val_ext_c8` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c8',\n" + + "  `val_ext_c9` decimal(42,20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c9',\n" + + "  `str_ext_c0` varchar(128) DEFAULT NULL COMMENT 'str_ext_c0',\n" + + "  `str_ext_c1` varchar(128) DEFAULT NULL COMMENT 'str_ext_c1',\n" + + "  `str_ext_c2` varchar(128) DEFAULT NULL COMMENT 'str_ext_c2',\n" + + "  `str_ext_c3` varchar(128) DEFAULT NULL COMMENT 'str_ext_c3',\n" + + "  `str_ext_c4` varchar(128) DEFAULT NULL COMMENT 'str_ext_c4',\n" + + "  `str_ext_c5` varchar(128) DEFAULT NULL COMMENT 'str_ext_c5',\n" + + "  `str_ext_c6` varchar(128) DEFAULT NULL COMMENT 'str_ext_c6',\n" + + "  `str_ext_c7` varchar(128) DEFAULT NULL COMMENT 'str_ext_c7',\n" + + "  `str_ext_c8` varchar(128) DEFAULT NULL COMMENT 'str_ext_c8',\n" + + "  `str_ext_c9` varchar(128) DEFAULT NULL COMMENT 'str_ext_c9',\n" + + "  `str_ext_c10` varchar(128) DEFAULT NULL COMMENT 'str_ext_c10',\n" + + "  `str_ext_c11` varchar(128) DEFAULT NULL COMMENT 'str_ext_c11',\n" + + "  `str_ext_c12` varchar(128) DEFAULT NULL COMMENT 'str_ext_c12',\n" + + "  `str_ext_c13` varchar(128) DEFAULT NULL COMMENT 'str_ext_c13',\n" + + "  `str_ext_c14` varchar(128) DEFAULT NULL COMMENT 'str_ext_c14',\n" + + "  PRIMARY KEY (`kd`) COMMENT 'index_key_ins_perf_6519',\n" + + "  KEY `kdx_time` (`time`) COMMENT 'index_perf_time_6519',\n" + + "  KEY `kdx_instance_time` (`kp`,`port`,`scope`,`time`) COMMENT 'index_ins_perf_inst_time_6519',\n" + + "  KEY `kdx_instance_hash` (`kp`,`port`,`hashcode`,`scope`,`time`) COMMENT 'index_ins_perf_hash_6519',\n" + + "  KEY `kdx_instance_all_dim` (`kp`,`port`,`db`,`logical_table`,`physical_table`,`sql_type`,`hashcode`,`scope`,`time`) COMMENT 'index_ins_perf_all_6519'\n" + + ") ENGINE=XENGINE AUTO_INCREMENT=339181584 DEFAULT CHARSET=utf8mb4 COMMENT='sql_ins_perf'"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + MySqlCreateTableStatement stmt = (MySqlCreateTableStatement)statementList.get(0); + + assertEquals(1, statementList.size()); + assertEquals(63, stmt.getTableElementList().size()); + + assertEquals("CREATE TABLE `xktv_perf_6519` (\n" + + "\t`kd` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',\n" + + "\t`gmt_create` datetime NOT NULL COMMENT '创建时间',\n" + + "\t`time` datetime NOT NULL COMMENT '统计的时间',\n" + + "\t`scope` int(11) NOT NULL COMMENT '时间粒度',\n" + + "\t`knstance_id` varchar(128) DEFAULT NULL COMMENT '实例id',\n" + + "\t`kp` varchar(16) NOT NULL COMMENT 'ip',\n" + + "\t`port` int(11) NOT NULL COMMENT 'port',\n" + + "\t`db` varchar(42) NOT NULL COMMENT 'db',\n" + + "\t`hashcode` varchar(32) NOT NULL COMMENT 'hashcode',\n" + + "\t`sql_type` varchar(6) NOT NULL COMMENT 'sql_type',\n" + + "\t`logical_table` varchar(128) DEFAULT NULL COMMENT '逻辑表名',\n" + + "\t`physical_table` varchar(128) DEFAULT NULL COMMENT '物理表名',\n" + + "\t`request_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT '执行次数',\n" + + "\t`rows_examined` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rows_examined',\n" + + "\t`rows_sent` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rows_sent',\n" + + "\t`rows_affected` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rows_affected',\n" + + "\t`knnodb_pages_read` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'innodb_pages_read',\n" + + "\t`knnodb_pages_io_read` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'innodb_pages_io_read',\n" + + "\t`rt_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_count',\n" + + "\t`query_time` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'query_time',\n" + + "\t`wait_time` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'wait_time',\n" + + "\t`lock_time` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'lock_time',\n" + + "\t`rt_1ms_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_1ms_count',\n" + + "\t`rt_2ms_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_2ms_count',\n" + + "\t`rt_3ms_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_3ms_count',\n" + + "\t`rt_10ms_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_10ms_count',\n" + + "\t`rt_100ms_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_100ms_count',\n" + + "\t`rt_1s_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_1s_count',\n" + + "\t`rt_gt1s_count` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'rt_gt1s_count',\n" + + "\t`avg_90_rt` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'avg_90_rt',\n" + + "\t`avg_95_rt` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'avg_95_rt',\n" + + "\t`avg_99_rt` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'avg_99_rt',\n" + + "\t`avg_rt` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'avg_rt',\n" + + "\t`val_ext_c0` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c0',\n" + + "\t`val_ext_c1` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c1',\n" + + "\t`val_ext_c2` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c2',\n" + + "\t`val_ext_c3` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c3',\n" + + "\t`val_ext_c4` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c4',\n" + + "\t`val_ext_c5` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c5',\n" + + "\t`val_ext_c6` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c6',\n" + + "\t`val_ext_c7` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c7',\n" + + "\t`val_ext_c8` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c8',\n" + + "\t`val_ext_c9` decimal(42, 20) DEFAULT '0.00000000000000000000' COMMENT 'val_ext_c9',\n" + + "\t`str_ext_c0` varchar(128) DEFAULT NULL COMMENT 'str_ext_c0',\n" + + "\t`str_ext_c1` varchar(128) DEFAULT NULL COMMENT 'str_ext_c1',\n" + + "\t`str_ext_c2` varchar(128) DEFAULT NULL COMMENT 'str_ext_c2',\n" + + "\t`str_ext_c3` varchar(128) DEFAULT NULL COMMENT 'str_ext_c3',\n" + + "\t`str_ext_c4` varchar(128) DEFAULT NULL COMMENT 'str_ext_c4',\n" + + "\t`str_ext_c5` varchar(128) DEFAULT NULL COMMENT 'str_ext_c5',\n" + + "\t`str_ext_c6` varchar(128) DEFAULT NULL COMMENT 'str_ext_c6',\n" + + "\t`str_ext_c7` varchar(128) DEFAULT NULL COMMENT 'str_ext_c7',\n" + + "\t`str_ext_c8` varchar(128) DEFAULT NULL COMMENT 'str_ext_c8',\n" + + "\t`str_ext_c9` varchar(128) DEFAULT NULL COMMENT 'str_ext_c9',\n" + + "\t`str_ext_c10` varchar(128) DEFAULT NULL COMMENT 'str_ext_c10',\n" + + "\t`str_ext_c11` varchar(128) DEFAULT NULL COMMENT 'str_ext_c11',\n" + + "\t`str_ext_c12` varchar(128) DEFAULT NULL COMMENT 'str_ext_c12',\n" + + "\t`str_ext_c13` varchar(128) DEFAULT NULL COMMENT 'str_ext_c13',\n" + + "\t`str_ext_c14` varchar(128) DEFAULT NULL COMMENT 'str_ext_c14',\n" + + "\tPRIMARY KEY (`kd`),\n" + + "\tKEY `kdx_time` (`time`),\n" + + "\tKEY `kdx_instance_time` (`kp`, `port`, `scope`, `time`),\n" + + "\tKEY `kdx_instance_hash` (`kp`, `port`, `hashcode`, `scope`, `time`),\n" + + "\tKEY `kdx_instance_all_dim` (`kp`, `port`, `db`, `logical_table`, `physical_table`, `sql_type`, `hashcode`, `scope`, `time`)\n" + + ") ENGINE = XENGINE AUTO_INCREMENT = 339181584 CHARSET = utf8mb4 COMMENT 'sql_ins_perf'", stmt.toString()); + } +} \ No newline at end of file diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_61.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_61.java new file mode 100644 index 0000000000..6355811815 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_61.java @@ -0,0 +1,32 @@ +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/9/23. + */ +public class MySqlParameterizedOutputVisitorTest_61 extends TestCase { + public void test_for_parameterize() throws Exception { + + String sql = "insert ignore into ktv_ibx_1690 (id, msg_id, cid, openid, gmt_create, gmt_modified, read_status, reach_status, create_at, type, tag, sender_id, extension, domain, at_me) VALUES (399644333, 49099001633, \"543351210\", 306202, now(), now(), 2, 2, 1515051603113, 51, 0, 26659032, '', 'dingding', 0), (399644599334, 49399311994, \"543351210\", 306202, now(), now(), 2, 2, 1515045263923, 51, 0, 55235569, '', 'dingding', 0), (399644599335, 49352513493, \"543351210\", 306202, now(), now(), 2, 2, 1515032652532, 51, 0, 91605449, '', 'dingding', 0), (399644599336, 49333315435, \"543351210\", 306202, now(), now(), 2, 2, 1515029099196, 51, 0, 159661969, '', 'dingding', 0), (399644599333, 49253992490, \"543351210\", 306202, now(), now(), 2, 2, 1514969992945, 51, 0, 26659032, '', 'dingding', 0), (399644599339, 49553143033, \"543351210\", 306202, now(), now(), 2, 2, 1514969920339, 51, 0, 26659032, '', 'dingding', 0), (399644599339, 49191512129, \"543351210\", 306202, now(), now(), 2, 2, 1514943655456, 51, 0, 104293319, '', 'dingding', 0), (399644599340, 49465261219, \"543351210\", 306202, now(), now(), 2, 2, 1514943290229, 51, 0, 26659032, '', 'dingding', 0), (399644599341, 49169690919, \"543351210\", 306202, now(), now(), 2, 2, 1514946945243, 51, 0, 104293319, '', 'dingding', 0), (399644599342, 43096553593, \"543351210\", 306202, now(), now(), 2, 2, 1514343951224, 51, 0, 26659032, '', 'dingding', 0), (399644599343, 46939394349, \"543351210\", 306202, now(), now(), 2, 2, 1514230399590, 51, 0, 26659032, '', 'dingding', 0), (399644599344, 43121249113, \"543351210\", 306202, now(), now(), 2, 2, 1514256154905, 51, 0, 26659032, '', 'dingding', 0), (399644599345, 46996923949, \"543351210\", 306202, now(), now(), 2, 2, 1514256015609, 51, 0, 26659032, '', 'dingding', 0), (399644599346, 43506239192, \"543351210\", 306202, now(), now(), 2, 2, 1514253595163, 51, 0, 26659032, '', 'dingding', 0), (399644599343, 46914302251, \"543351210\", 306202, now(), now(), 2, 2, 1514193122944, 51, 0, 26659032, '', 'dingding', 0), (399644599349, 46901562353, \"543351210\", 306202, now(), now(), 2, 2, 1514193003304, 51, 0, 26659032, '', 'dingding', 0), (399644599349, 46993995514, \"543351210\", 306202, now(), now(), 2, 2, 1514192994193, 51, 0, 26659032, '', 'dingding', 0), (399644599350, 46906923503, \"543351210\", 306202, now(), now(), 2, 2, 1514191365460, 51, 0, 159661969, '', 'dingding', 0), (399644599351, 43015354139, \"543351210\", 306202, now(), now(), 2, 2, 1514191433515, 51, 0, 26659032, '', 'dingding', 0), (399644599352, 43410063334, \"543351210\", 306202, now(), now(), 2, 2, 1514191049930, 51, 0, 26659032, '', 'dingding', 0), (399644599353, 43410045959, \"543351210\", 306202, now(), now(), 2, 2, 1514190943523, 51, 0, 26659032, '', 'dingding', 0), (399644599354, 46919625433, \"543351210\", 306202, now(), now(), 2, 2, 1514130390293, 51, 0, 26659032, '', 'dingding', 0), (399644599355, 46336694953, \"543351210\", 306202, now(), now(), 2, 2, 1514130332624, 51, 0, 26659032, '', 'dingding', 0)"; + + List params = new ArrayList(); + String psql = ParameterizedOutputVisitorUtils.parameterize(sql, JdbcConstants.MYSQL, params); + assertEquals("INSERT IGNORE INTO ktv_ibx (id, msg_id, cid, openid, gmt_create\n" + + "\t, gmt_modified, read_status, reach_status, create_at, type\n" + + "\t, tag, sender_id, extension, domain, at_me)\n" + + "VALUES (?, ?, ?, ?, now()\n" + + "\t\t, now(), ?, ?, ?, ?\n" + + "\t\t, ?, ?, ?, ?, ?)", psql); + assertEquals(13, params.size()); + assertEquals(399644333, params.get(0)); + assertEquals(49099001633L, params.get(1)); + assertEquals("543351210", params.get(2)); + } + +}