From f80da144fd9cb5d043eca845c2ca67d59ad4a0ec Mon Sep 17 00:00:00 2001 From: kiki Date: Fri, 27 Sep 2013 14:37:52 +0800 Subject: [PATCH] fix blacklist bug & parameterize NULL to ? --- .../db2/visitor/DB2ParameterizedOutputVisitor.java | 9 +++++++++ .../mysql/visitor/MySqlParameterizedOutputVisitor.java | 9 +++++++++ .../visitor/OracleParameterizedOutputVisitor.java | 9 +++++++++ .../visitor/PGParameterizedOutputVisitor.java | 9 +++++++++ .../visitor/SQLServerParameterizedOutputVisitor.java | 10 ++++++++++ .../druid/sql/visitor/ParameterizedOutputVisitor.java | 10 ++++++++++ .../sql/visitor/ParameterizedOutputVisitorUtils.java | 9 ++++++++- src/main/java/com/alibaba/druid/wall/WallProvider.java | 2 +- 8 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ParameterizedOutputVisitor.java index eba6bfe4f6..a4c1d85c03 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/db2/visitor/DB2ParameterizedOutputVisitor.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; import com.alibaba.druid.sql.visitor.ParameterizedVisitor; @@ -86,4 +87,12 @@ public class DB2ParameterizedOutputVisitor extends DB2OutputVisitor implements P return ParameterizedOutputVisitorUtils.visit(this, x); } + public boolean visit(SQLNullExpr x) { + if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { + return super.visit(x); + } + + return ParameterizedOutputVisitorUtils.visit(this, x); + } + } 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 e3a06c4e8c..68a3c04488 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 @@ -26,6 +26,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; @@ -171,6 +172,14 @@ public class MySqlParameterizedOutputVisitor extends MySqlOutputVisitor implemen return ParameterizedOutputVisitorUtils.visit(this, x); } + public boolean visit(SQLNullExpr x) { + if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { + return super.visit(x); + } + + return ParameterizedOutputVisitorUtils.visit(this, x); + } + protected void printValuesList(MySqlInsertStatement x) { List valuesList = x.getValuesList(); print("VALUES "); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java index adf0d69f26..9f6bd476b3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleParameterizedOutputVisitor.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; import com.alibaba.druid.sql.visitor.ParameterizedVisitor; @@ -92,4 +93,12 @@ public class OracleParameterizedOutputVisitor extends OracleOutputVisitor implem return ParameterizedOutputVisitorUtils.visit(this, x); } + public boolean visit(SQLNullExpr x) { + if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { + return super.visit(x); + } + + return ParameterizedOutputVisitorUtils.visit(this, x); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGParameterizedOutputVisitor.java index 7e2f991f96..7656b3e10d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGParameterizedOutputVisitor.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; import com.alibaba.druid.sql.visitor.ParameterizedVisitor; @@ -86,4 +87,12 @@ public class PGParameterizedOutputVisitor extends PGOutputVisitor implements Par return ParameterizedOutputVisitorUtils.visit(this, x); } + public boolean visit(SQLNullExpr x) { + if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { + return super.visit(x); + } + + return ParameterizedOutputVisitorUtils.visit(this, x); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerParameterizedOutputVisitor.java index 299eb2cd18..2653ce3384 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerParameterizedOutputVisitor.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.visitor.ParameterizedOutputVisitorUtils; import com.alibaba.druid.sql.visitor.ParameterizedVisitor; @@ -81,4 +82,13 @@ public class SQLServerParameterizedOutputVisitor extends SQLServerOutputVisitor return ParameterizedOutputVisitorUtils.visit(this, x); } + + public boolean visit(SQLNullExpr x) { + if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { + return super.visit(x); + } + + return ParameterizedOutputVisitorUtils.visit(this, x); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitor.java index a1b01122d1..475188c7f7 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitor.java @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; public class ParameterizedOutputVisitor extends SQLASTOutputVisitor implements ParameterizedVisitor { @@ -83,4 +84,13 @@ public class ParameterizedOutputVisitor extends SQLASTOutputVisitor implements P return ParameterizedOutputVisitorUtils.visit(this, x); } + + public boolean visit(SQLNullExpr x) { + if (!ParameterizedOutputVisitorUtils.checkParameterize(x)) { + return super.visit(x); + } + + return ParameterizedOutputVisitorUtils.visit(this, 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 4c676171ff..298d8e4e88 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ParameterizedOutputVisitorUtils.java @@ -28,6 +28,7 @@ import com.alibaba.druid.sql.ast.expr.SQLInListExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.ast.expr.SQLNCharExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; @@ -152,7 +153,7 @@ public class ParameterizedOutputVisitorUtils { if (Boolean.TRUE.equals(x.getAttribute(ParameterizedOutputVisitorUtils.ATTR_PARAMS_SKIP))) { return false; } - + SQLObject parent = x.getParent(); if (parent instanceof SQLDataType // @@ -173,6 +174,12 @@ public class ParameterizedOutputVisitorUtils { return false; } + public static boolean visit(ParameterizedVisitor v, SQLNullExpr x) { + v.print('?'); + v.incrementReplaceCunt(); + return false; + } + public static SQLBinaryOpExpr merge(ParameterizedVisitor v, SQLBinaryOpExpr x) { SQLExpr left = x.getLeft(); SQLExpr right = x.getRight(); diff --git a/src/main/java/com/alibaba/druid/wall/WallProvider.java b/src/main/java/com/alibaba/druid/wall/WallProvider.java index 467a6e0836..4f88ecebb9 100644 --- a/src/main/java/com/alibaba/druid/wall/WallProvider.java +++ b/src/main/java/com/alibaba/druid/wall/WallProvider.java @@ -315,7 +315,7 @@ public abstract class WallProvider { Map functionStats, List violations, boolean syntaxError) { if (!blackListEnable) { - WallSqlStat stat = new WallSqlStat(tableStats, functionStats, syntaxError); + WallSqlStat stat = new WallSqlStat(tableStats, functionStats, violations, syntaxError); return stat; }