From 7bfdd1cfea5da8123245d33e793f0127dac1e914 Mon Sep 17 00:00:00 2001 From: yakolee Date: Tue, 20 May 2014 20:03:24 +0800 Subject: [PATCH] improve ParameterizedOutputVisitor --- .../MySqlParameterizedOutputVisitor.java | 9 +++++ .../ParameterizedOutputVisitorUtils.java | 33 +++++++++++++++---- .../MySqlParameterizedOutputVisitorTest.java | 20 +++++++++++ 3 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java index 6d1a66f561..520327e6fa 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlParameterizedOutputVisitor.java @@ -22,6 +22,7 @@ import java.util.Properties; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLHexExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; @@ -181,6 +182,14 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor implemen return ParameterizedOutputVisitorUtils.visit(this, x); } + public boolean visit(SQLHexExpr x) { + if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { + return super.visit(x); + } + + return ParameterizedOutputVisitorUtils.visit(this, x); + } + public boolean visit(MySqlCharExpr x) { if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { return super.visit(x); 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 1c5560db36..7d97f2c721 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLHexExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; @@ -55,11 +56,16 @@ public class ParameterizedOutputVisitorUtils { return sql; } - SQLStatement stmt = statementList.get(0); - StringBuilder out = new StringBuilder(); ParameterizedVisitor visitor = createParameterizedOutputVisitor(out, dbType); - stmt.accept(visitor); + + for (int i = 0; i < statementList.size(); i++) { + if (i > 0) { + out.append(";\n"); + } + SQLStatement stmt = statementList.get(i); + stmt.accept(visitor); + } if (visitor.getReplaceCount() == 0) { return sql; @@ -189,12 +195,18 @@ public class ParameterizedOutputVisitorUtils { v.incrementReplaceCunt(); return false; } - + public static boolean visit(ParameterizedVisitor v, SQLVariantRefExpr x) { v.print('?'); v.incrementReplaceCunt(); return false; } + + public static boolean visit(ParameterizedVisitor v, SQLHexExpr x) { + v.print('?'); + v.incrementReplaceCunt(); + return false; + } public static SQLBinaryOpExpr merge(ParameterizedVisitor v, SQLBinaryOpExpr x) { SQLExpr left = x.getLeft(); @@ -204,8 +216,17 @@ public class ParameterizedOutputVisitorUtils { if (left instanceof SQLLiteralExpr && right instanceof SQLLiteralExpr) { if (x.getOperator() == SQLBinaryOperator.Equality // || x.getOperator() == SQLBinaryOperator.NotEqual) { - left.putAttribute(ATTR_PARAMS_SKIP, true); - right.putAttribute(ATTR_PARAMS_SKIP, true); + if((left instanceof SQLIntegerExpr) && (right instanceof SQLIntegerExpr) ) { + if (((SQLIntegerExpr) left).getNumber().intValue() < 100) { + left.putAttribute(ATTR_PARAMS_SKIP, true); + } + if (((SQLIntegerExpr) right).getNumber().intValue() < 100) { + right.putAttribute(ATTR_PARAMS_SKIP, true); + } + } else { + left.putAttribute(ATTR_PARAMS_SKIP, true); + right.putAttribute(ATTR_PARAMS_SKIP, true); + } } return x; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java index 1c6ae7247d..8aa9b52bcc 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/visitor/MySqlParameterizedOutputVisitorTest.java @@ -26,6 +26,26 @@ public class MySqlParameterizedOutputVisitorTest extends TestCase { + " AND alino = _gbk '2013110900031031001700thfund00163619'" + " AND apserialno = _gbk '201405120002300002170013205458'"; System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); + System.out.println("-----------------------"); + + sql = "SELECT p.AppId, p.PlayerId, p.Nickname, p.CreateTime FROM acc_playeruser AS pu INNER JOIN acc_player AS p ON (pu.AppId = p.AppId AND pu.PlayerId = p.PlayerId) WHERE pu.UserId=x'881A58F6204D4E048F66E41596A66A57';"; + System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); + System.out.println("-----------------------"); + + sql = "SET @now := NOW(); INSERT characters (uid, name, race, career, sex, creation) VALUES (4068548, '', 58, 0, 0, @now); SET @id := LAST_INSERT_ID(); INSERT characters_data (character_id, data, creation) VALUES (@id, ' \0\0\0\0\0\0\0\04068548\0\0\0:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0<\0\0\0d\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0d\0\0\0__\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0', @now); SELECT @id; "; + System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); + System.out.println("-----------------------"); + + sql = "INSERT INTO qrtz_JOB_DETAILS (SCHED_NAME, JOB_NAME, JOB_GROUP, DESCRIPTION, JOB_CLASS_NAME, IS_DURABLE, IS_NONCONCURRENT, IS_UPDATE_DATA, REQUESTS_RECOVERY, JOB_DATA) VALUES('DefaultQuartzScheduler', 'taobao.item.recommend.delete_368815794_2_35391685928', 'tasks', null, 'cn.agooo.job.TasksJob', 0, 0, 0, 0, x'ACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000017400077461736B7349647372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000002063227800')"; + System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); + System.out.println("-----------------------"); + + sql = "SELECT * FROM sync_contactsdata WHERE __id=x'2EEE5AE7CB0E4AF697D966AE8BF046B8'"; + System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); + System.out.println("-----------------------"); + + sql = "select TID,POSTFEE,RECEIVERADDRESS from tradegroup003 where (0 = 650954981082695 or tid=650954981082695) And SELLERNICK='______________' And BUYERNICK='yingge7' and CREATED > date_sub(now(), interval 48 hour) and STATUS = 'WAIT_BUYER_PAY' and func_isNotFollowgroup003(tradegroup003.tid,'______________') = 0"; + System.out.println(ParameterizedOutputVisitorUtils.parameterize(sql, "mysql")); } }