From e314df948dfcd90b4bb957cf3e7bb6fe8bdd12b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 22 Mar 2012 19:58:36 +0800 Subject: [PATCH] refactor --- .../visitor/MySqlExportParameterVisitor.java | 2 +- .../visitor/OracleExportParameterVisitor.java | 2 +- .../MSSQLServerExportParameterVisitor.java | 2 +- .../visitor}/ExportParameterVisitorUtils.java | 4 +-- .../druid/wall/spi/WallVisitorUtils.java | 32 +++++++++++++------ .../filter/wall/MustParameterizedTest3.java | 2 ++ 6 files changed, 30 insertions(+), 14 deletions(-) rename src/main/java/com/alibaba/druid/{mapping/spi => sql/visitor}/ExportParameterVisitorUtils.java (93%) diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java index 63d4b64737..367b8c181f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlExportParameterVisitor.java @@ -3,7 +3,6 @@ package com.alibaba.druid.sql.dialect.mysql.visitor; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.mapping.spi.ExportParameterVisitorUtils; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; @@ -13,6 +12,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.visitor.ExportParameterVisitor; +import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils; public class MySqlExportParameterVisitor extends MySqlASTVisitorAdapter implements ExportParameterVisitor { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleExportParameterVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleExportParameterVisitor.java index 17767990aa..077ba64c44 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleExportParameterVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleExportParameterVisitor.java @@ -3,7 +3,6 @@ package com.alibaba.druid.sql.dialect.oracle.visitor; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.mapping.spi.ExportParameterVisitorUtils; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; @@ -12,6 +11,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.visitor.ExportParameterVisitor; +import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils; public class OracleExportParameterVisitor extends OracleASTVIsitorAdapter implements ExportParameterVisitor { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/MSSQLServerExportParameterVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/MSSQLServerExportParameterVisitor.java index d66fbeca67..dc545fb3a4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/MSSQLServerExportParameterVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/MSSQLServerExportParameterVisitor.java @@ -3,7 +3,6 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.mapping.spi.ExportParameterVisitorUtils; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; @@ -12,6 +11,7 @@ import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectGroupByClause; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.visitor.ExportParameterVisitor; +import com.alibaba.druid.sql.visitor.ExportParameterVisitorUtils; public class MSSQLServerExportParameterVisitor extends SQLServerASTVisitorAdapter implements ExportParameterVisitor { diff --git a/src/main/java/com/alibaba/druid/mapping/spi/ExportParameterVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java similarity index 93% rename from src/main/java/com/alibaba/druid/mapping/spi/ExportParameterVisitorUtils.java rename to src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java index 533e130ca8..6dd2e1fafe 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/ExportParameterVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/ExportParameterVisitorUtils.java @@ -1,4 +1,4 @@ -package com.alibaba.druid.mapping.spi; +package com.alibaba.druid.sql.visitor; import java.util.List; @@ -49,7 +49,7 @@ public class ExportParameterVisitorUtils { } public static void exportParameter(final List parameters, SQLBinaryOpExpr x) { - if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr) { + if (x.getLeft() instanceof SQLLiteralExpr && x.getRight() instanceof SQLLiteralExpr && x.getOperator().isRelational()) { return; } 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 392bc00624..1633edadb6 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -88,15 +88,7 @@ public class WallVisitorUtils { // if (visitor.getConfig().isMustParameterized()) { if (where != null) { - if (visitor.getConfig().isMustParameterized()) { - ExportParameterVisitor exportParameterVisitor = visitor.getProvider().createExportParameterVisitor(); - where.accept(exportParameterVisitor); - - if (exportParameterVisitor.getParameters().size() > 0) { - addViolation(visitor, x); - return; - } - } + checkCondition(visitor, x.getWhere()); if (Boolean.TRUE == getValue(where)) { if (where instanceof SQLBinaryOpExpr) { @@ -144,6 +136,25 @@ public class WallVisitorUtils { if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) { addViolation(visitor, x); + return; + } + + checkCondition(visitor, x.getWhere()); + } + + private static void checkCondition(WallVisitor visitor, SQLExpr x) { + if (x == null) { + return; + } + + if (visitor.getConfig().isMustParameterized()) { + ExportParameterVisitor exportParameterVisitor = visitor.getProvider().createExportParameterVisitor(); + x.accept(exportParameterVisitor); + + if (exportParameterVisitor.getParameters().size() > 0) { + addViolation(visitor, x); + return; + } } } @@ -183,7 +194,10 @@ public class WallVisitorUtils { if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) { addViolation(visitor, x); + return; } + + checkCondition(visitor, x.getWhere()); } @SuppressWarnings({ "unchecked", "rawtypes" }) diff --git a/src/test/java/com/alibaba/druid/bvt/filter/wall/MustParameterizedTest3.java b/src/test/java/com/alibaba/druid/bvt/filter/wall/MustParameterizedTest3.java index f6a77f6fa2..22a2426f0f 100644 --- a/src/test/java/com/alibaba/druid/bvt/filter/wall/MustParameterizedTest3.java +++ b/src/test/java/com/alibaba/druid/bvt/filter/wall/MustParameterizedTest3.java @@ -18,6 +18,8 @@ public class MustParameterizedTest3 extends TestCase { public void testMySql() throws Exception { Assert.assertFalse(WallUtils.isValidateMySql("select * from t where id = (3 + 5 - 2 - 1)", config)); Assert.assertFalse(WallUtils.isValidateMySql("select * from t where id != id + 3", config)); + Assert.assertFalse(WallUtils.isValidateMySql("delete from t where id != id + 3", config)); + Assert.assertFalse(WallUtils.isValidateMySql("delete from t where id = 'aa' + 'bbb'", config)); Assert.assertTrue(WallUtils.isValidateMySql("select * from t where id = ? ORDER BY 1", config)); Assert.assertTrue(WallUtils.isValidateMySql("select 1, 2, 3 from t where id = ?", config)); }