mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improve WallFilter
This commit is contained in:
@@ -24,6 +24,7 @@ import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
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.SQLMethodInvokeExpr;
|
||||
@@ -147,4 +148,8 @@ public class MySqlEvalVisitorImpl extends MySqlASTVisitorAdapter implements SQLE
|
||||
public void registerFunction(String funcName, Function function) {
|
||||
functions.put(funcName, function);
|
||||
}
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
return SQLEvalVisitorUtils.visit(this, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.Map;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
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.SQLMethodInvokeExpr;
|
||||
@@ -134,4 +135,8 @@ public class OracleEvalVisitor extends OracleASTVisitorAdapter implements SQLEva
|
||||
public void registerFunction(String funcName, Function function) {
|
||||
functions.put(funcName, function);
|
||||
}
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
return SQLEvalVisitorUtils.visit(this, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.Map;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
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.SQLMethodInvokeExpr;
|
||||
@@ -134,4 +135,8 @@ public class PGEvalVisitor extends PGASTVisitorAdapter implements SQLEvalVisitor
|
||||
public void registerFunction(String funcName, Function function) {
|
||||
functions.put(funcName, function);
|
||||
}
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
return SQLEvalVisitorUtils.visit(this, x);
|
||||
}
|
||||
}
|
||||
|
||||
+5
@@ -23,6 +23,7 @@ import java.util.Map;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
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.SQLMethodInvokeExpr;
|
||||
@@ -134,4 +135,8 @@ public class SQLServerEvalVisitor extends SQLServerASTVisitorAdapter implements
|
||||
public void registerFunction(String funcName, Function function) {
|
||||
functions.put(funcName, function);
|
||||
}
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
return SQLEvalVisitorUtils.visit(this, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import com.alibaba.druid.sql.visitor.functions.Function;
|
||||
public interface SQLEvalVisitor extends SQLASTVisitor {
|
||||
|
||||
public static final String EVAL_VALUE = "eval.value";
|
||||
public static final String EVAL_EXPR = "eval.expr";
|
||||
public static final Object EVAL_ERROR = new Object();
|
||||
|
||||
Function getFunction(String funcName);
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.Map;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCaseExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
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.SQLMethodInvokeExpr;
|
||||
@@ -128,4 +129,8 @@ public class SQLEvalVisitorImpl extends SQLASTVisitorAdapter implements SQLEvalV
|
||||
public void registerFunction(String funcName, Function function) {
|
||||
functions.put(funcName, function);
|
||||
}
|
||||
|
||||
public boolean visit(SQLIdentifierExpr x) {
|
||||
return SQLEvalVisitorUtils.visit(this, x);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.visitor;
|
||||
|
||||
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_EXPR;
|
||||
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
@@ -57,6 +58,7 @@ import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerEvalVisitor;
|
||||
import com.alibaba.druid.sql.visitor.functions.Ascii;
|
||||
import com.alibaba.druid.sql.visitor.functions.Concat;
|
||||
import com.alibaba.druid.sql.visitor.functions.Function;
|
||||
import com.alibaba.druid.sql.visitor.functions.Hex;
|
||||
import com.alibaba.druid.sql.visitor.functions.Instr;
|
||||
import com.alibaba.druid.sql.visitor.functions.Lcase;
|
||||
import com.alibaba.druid.sql.visitor.functions.Left;
|
||||
@@ -66,6 +68,7 @@ import com.alibaba.druid.sql.visitor.functions.Reverse;
|
||||
import com.alibaba.druid.sql.visitor.functions.Right;
|
||||
import com.alibaba.druid.sql.visitor.functions.Trim;
|
||||
import com.alibaba.druid.sql.visitor.functions.Ucase;
|
||||
import com.alibaba.druid.sql.visitor.functions.Unhex;
|
||||
import com.alibaba.druid.util.JdbcUtils;
|
||||
import com.alibaba.druid.wall.spi.WallVisitorUtils;
|
||||
import com.alibaba.druid.wall.spi.WallVisitorUtils.WallConditionContext;
|
||||
@@ -158,6 +161,8 @@ public class SQLEvalVisitorUtils {
|
||||
functions.put("upper", Ucase.instance);
|
||||
functions.put("ucase", Lcase.instance);
|
||||
functions.put("lower", Lcase.instance);
|
||||
functions.put("hex", Hex.instance);
|
||||
functions.put("unhex", Unhex.instance);
|
||||
}
|
||||
|
||||
public static boolean visit(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) {
|
||||
@@ -709,11 +714,40 @@ public class SQLEvalVisitorUtils {
|
||||
}
|
||||
}
|
||||
|
||||
if (!left.getAttributes().containsKey(EVAL_VALUE)) {
|
||||
boolean leftHasValue = left.getAttributes().containsKey(EVAL_VALUE);
|
||||
boolean rightHasValue = right.getAttributes().containsKey(EVAL_VALUE);
|
||||
|
||||
if ((!leftHasValue) && !rightHasValue) {
|
||||
SQLExpr leftEvalExpr = (SQLExpr) left.getAttribute(EVAL_EXPR);
|
||||
SQLExpr rightEvalExpr = (SQLExpr) right.getAttribute(EVAL_EXPR);
|
||||
|
||||
if (leftEvalExpr.equals(rightEvalExpr)) {
|
||||
switch (x.getOperator()) {
|
||||
case Like:
|
||||
case Equality:
|
||||
case GreaterThanOrEqual:
|
||||
case LessThanOrEqual:
|
||||
case NotLessThan:
|
||||
case NotGreaterThan:
|
||||
x.putAttribute(EVAL_VALUE, Boolean.TRUE);
|
||||
return false;
|
||||
case NotEqual:
|
||||
case NotLike:
|
||||
case GreaterThan:
|
||||
case LessThan:
|
||||
x.putAttribute(EVAL_VALUE, Boolean.FALSE);
|
||||
return false;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!leftHasValue) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!right.getAttributes().containsKey(EVAL_VALUE)) {
|
||||
if (!rightHasValue) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1473,4 +1507,8 @@ public class SQLEvalVisitorUtils {
|
||||
return Pattern.matches(regexpr, input);
|
||||
}
|
||||
|
||||
public static boolean visit(SQLEvalVisitor visitor, SQLIdentifierExpr x) {
|
||||
x.putAttribute(EVAL_EXPR, x);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,19 +15,44 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.visitor.functions;
|
||||
|
||||
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE;
|
||||
|
||||
import org.apache.xerces.impl.dv.util.HexBin;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.parser.ParserException;
|
||||
import com.alibaba.druid.sql.visitor.SQLEvalVisitor;
|
||||
|
||||
|
||||
public class Hex implements Function {
|
||||
|
||||
public final static Hex instance = new Hex();
|
||||
|
||||
|
||||
public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) {
|
||||
if(x.getParameters().size() != 1) {
|
||||
if (x.getParameters().size() != 1) {
|
||||
throw new ParserException("argument's != 1, " + x.getParameters().size());
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
SQLExpr param0 = x.getParameters().get(0);
|
||||
param0.accept(visitor);
|
||||
|
||||
Object param0Value = param0.getAttributes().get(EVAL_VALUE);
|
||||
if (param0Value == null) {
|
||||
return SQLEvalVisitor.EVAL_ERROR;
|
||||
}
|
||||
|
||||
if (param0Value instanceof String) {
|
||||
byte[] bytes = ((String) param0Value).getBytes();
|
||||
String result = HexBin.encode(bytes);
|
||||
return result;
|
||||
}
|
||||
|
||||
if (param0Value instanceof Number) {
|
||||
long value = ((Number) param0Value).longValue();
|
||||
String result = Long.toHexString(value).toUpperCase();
|
||||
return result;
|
||||
}
|
||||
|
||||
return SQLEvalVisitor.EVAL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright 1999-2011 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.druid.sql.visitor.functions;
|
||||
|
||||
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE;
|
||||
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_EXPR;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
import org.apache.xerces.impl.dv.util.HexBin;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.parser.ParserException;
|
||||
import com.alibaba.druid.sql.visitor.SQLEvalVisitor;
|
||||
|
||||
public class Unhex implements Function {
|
||||
|
||||
public final static Unhex instance = new Unhex();
|
||||
|
||||
public Object eval(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) {
|
||||
if (x.getParameters().size() != 1) {
|
||||
throw new ParserException("argument's != 1, " + x.getParameters().size());
|
||||
}
|
||||
|
||||
SQLExpr param0 = x.getParameters().get(0);
|
||||
|
||||
if (param0 instanceof SQLMethodInvokeExpr) {
|
||||
SQLMethodInvokeExpr paramMethodExpr = (SQLMethodInvokeExpr) param0;
|
||||
if (paramMethodExpr.getMethodName().equalsIgnoreCase("hex")) {
|
||||
SQLExpr subParamExpr = paramMethodExpr.getParameters().get(0);
|
||||
subParamExpr.accept(visitor);
|
||||
|
||||
Object param0Value = subParamExpr.getAttributes().get(EVAL_VALUE);
|
||||
if (param0Value == null) {
|
||||
x.putAttribute(EVAL_EXPR, subParamExpr);
|
||||
return SQLEvalVisitor.EVAL_ERROR;
|
||||
}
|
||||
|
||||
return param0Value;
|
||||
}
|
||||
}
|
||||
|
||||
param0.accept(visitor);
|
||||
|
||||
Object param0Value = param0.getAttributes().get(EVAL_VALUE);
|
||||
if (param0Value == null) {
|
||||
return SQLEvalVisitor.EVAL_ERROR;
|
||||
}
|
||||
|
||||
if (param0Value instanceof String) {
|
||||
byte[] bytes = HexBin.decode((String) param0Value);
|
||||
String result;
|
||||
try {
|
||||
result = new String(bytes, "UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new IllegalStateException(e.getMessage(), e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
return SQLEvalVisitor.EVAL_ERROR;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user