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 8d0260d237..3a6ca2b3e3 100644 --- a/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/wall/spi/WallVisitorUtils.java @@ -37,6 +37,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; +import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr.Item; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; @@ -1022,6 +1023,17 @@ public class WallVisitorUtils { return SQLEvalVisitorUtils.eval(dbType, x, Collections.emptyList(), false); } + if (x instanceof SQLCaseExpr) { + SQLCaseExpr caseExpr = (SQLCaseExpr) x; + if (caseExpr.getItems().size() > 0) { + SQLCaseExpr.Item item = caseExpr.getItems().get(0); + Object conditionVal = getValue(visitor, item.getConditionExpr()); + if (conditionVal instanceof Boolean) { + addViolation(visitor, ErrorCode.CONST_CASE_CONDITION, "const case condition", caseExpr); + } + } + } + return null; } 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 bbdd51a9d2..62a9b47ca7 100644 --- a/src/main/java/com/alibaba/druid/wall/violation/ErrorCode.java +++ b/src/main/java/com/alibaba/druid/wall/violation/ErrorCode.java @@ -63,6 +63,7 @@ public interface ErrorCode { public final static int EmptyQueryHasCondition = 2106; public final static int DoubleConstCondition = 2107; public final static int SameConstLike = 2108; + public final static int CONST_CASE_CONDITION = 2109; public final static int NOT_PARAMETERIZED = 2200; public final static int MULTI_TENANT = 2201;