improved wall filter. for issue #2371

This commit is contained in:
wenshao
2018-03-10 23:37:52 +08:00
parent b66ca83cae
commit a69b5ddcbc
11 changed files with 238 additions and 5 deletions
@@ -288,4 +288,9 @@ public class DB2WallVisitor extends DB2ASTVisitorAdapter implements WallVisitor
public List<WallUpdateCheckItem> getUpdateCheckItems() {
return updateCheckItems;
}
public boolean visit(SQLJoinTableSource x) {
WallVisitorUtils.check(this, x);
return true;
}
}
@@ -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<WallUpdateCheckItem> getUpdateCheckItems() {
return updateCheckItems;
}
public boolean visit(SQLJoinTableSource x) {
WallVisitorUtils.check(this, x);
return true;
}
}
@@ -354,4 +354,9 @@ public class OracleWallVisitor extends OracleASTVisitorAdapter implements WallVi
public List<WallUpdateCheckItem> getUpdateCheckItems() {
return updateCheckItems;
}
public boolean visit(SQLJoinTableSource x) {
WallVisitorUtils.check(this, x);
return true;
}
}
@@ -311,4 +311,9 @@ public class PGWallVisitor extends PGASTVisitorAdapter implements WallVisitor {
public List<WallUpdateCheckItem> getUpdateCheckItems() {
return updateCheckItems;
}
public boolean visit(SQLJoinTableSource x) {
WallVisitorUtils.check(this, x);
return true;
}
}
@@ -347,4 +347,9 @@ public class SQLServerWallVisitor extends SQLServerASTVisitorAdapter implements
public List<WallUpdateCheckItem> getUpdateCheckItems() {
return updateCheckItems;
}
public boolean visit(SQLJoinTableSource x) {
WallVisitorUtils.check(this, x);
return true;
}
}
@@ -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);
}
}
}
@@ -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;
@@ -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)
);
}
}
@@ -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 {
@@ -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<SQLStatement> 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());
}
}
@@ -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<Object> params = new ArrayList<Object>();
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));
}
}