in core/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java [958:1184]
public static boolean visit(SQLEvalVisitor visitor, SQLBinaryOpExpr x) {
SQLExpr left = unwrap(x.getLeft());
SQLExpr right = unwrap(x.getRight());
// final WallConditionContext old = wallConditionContextLocal.get();
left.accept(visitor);
right.accept(visitor);
final WallConditionContext wallConditionContext = WallVisitorUtils.getWallConditionContext();
if (x.getOperator() == SQLBinaryOperator.BooleanOr) {
if (wallConditionContext != null) {
if (Boolean.TRUE.equals(left.getAttribute(EVAL_VALUE)) || Boolean.TRUE.equals(right.getAttribute(EVAL_VALUE))) {
wallConditionContext.setPartAlwayTrue(true);
}
}
} else if (x.getOperator() == SQLBinaryOperator.BooleanAnd) {
if (wallConditionContext != null) {
if (Boolean.FALSE.equals(left.getAttribute(EVAL_VALUE)) || Boolean.FALSE.equals(right.getAttribute(EVAL_VALUE))) {
wallConditionContext.setPartAlwayFalse(true);
}
}
} else if (x.getOperator() == SQLBinaryOperator.BooleanXor) {
if (wallConditionContext != null) {
wallConditionContext.setXor(true);
}
} else if (x.getOperator() == SQLBinaryOperator.BitwiseAnd //
|| x.getOperator() == SQLBinaryOperator.BitwiseNot //
|| x.getOperator() == SQLBinaryOperator.BitwiseOr //
|| x.getOperator() == SQLBinaryOperator.BitwiseXor) {
if (wallConditionContext != null) {
wallConditionContext.setBitwise(true);
}
}
Object leftValue = left.getAttribute(EVAL_VALUE);
Object rightValue = right.getAttributes().get(EVAL_VALUE);
if (x.getOperator() == SQLBinaryOperator.Like) {
if (isAlwayTrueLikePattern(x.getRight())) {
x.putAttribute(WallVisitorUtils.HAS_TRUE_LIKE, Boolean.TRUE);
x.putAttribute(EVAL_VALUE, Boolean.TRUE);
return false;
}
}
if (x.getOperator() == SQLBinaryOperator.NotLike) {
if (isAlwayTrueLikePattern(x.getRight())) {
x.putAttribute(EVAL_VALUE, Boolean.FALSE);
return false;
}
}
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 != null && leftEvalExpr.equals(rightEvalExpr)) {
switch (x.getOperator()) {
case Like:
case SoudsLike:
case Equality:
case GreaterThanOrEqual:
case LessThanOrEqual:
case NotLessThan:
case NotGreaterThan:
x.putAttribute(EVAL_VALUE, Boolean.TRUE);
return false;
case NotEqual:
case LessThanOrGreater:
case NotLike:
case GreaterThan:
case LessThan:
x.putAttribute(EVAL_VALUE, Boolean.FALSE);
return false;
default:
break;
}
}
}
if (!leftHasValue) {
return false;
}
if (!rightHasValue) {
return false;
}
if (wallConditionContext != null) {
wallConditionContext.setConstArithmetic(true);
}
leftValue = processValue(leftValue);
rightValue = processValue(rightValue);
if (leftValue == null || rightValue == null) {
return false;
}
Object value = null;
switch (x.getOperator()) {
case Add:
value = add(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case Subtract:
value = sub(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case Multiply:
value = multi(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case Divide:
value = div(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case RightShift:
value = rightShift(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case BitwiseAnd:
value = bitAnd(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case BitwiseOr:
value = bitOr(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case GreaterThan:
value = gt(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case GreaterThanOrEqual:
value = gteq(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case LessThan:
value = lt(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case LessThanOrEqual:
value = lteq(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case Is:
if (rightValue == EVAL_VALUE_NULL) {
if (leftValue != null) {
value = (leftValue == EVAL_VALUE_NULL);
x.putAttribute(EVAL_VALUE, value);
break;
}
}
break;
case Equality:
value = eq(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case NotEqual:
case LessThanOrGreater:
value = !eq(leftValue, rightValue);
x.putAttribute(EVAL_VALUE, value);
break;
case IsNot:
if (leftValue == EVAL_VALUE_NULL) {
x.putAttribute(EVAL_VALUE, false);
} else if (leftValue != null) {
x.putAttribute(EVAL_VALUE, true);
}
break;
case RegExp:
case RLike: {
String pattern = castToString(rightValue);
String input = castToString(left.getAttributes().get(EVAL_VALUE));
boolean matchResult = Pattern.matches(pattern, input);
x.putAttribute(EVAL_VALUE, matchResult);
break;
}
case NotRegExp:
case NotRLike: {
String pattern = castToString(rightValue);
String input = castToString(left.getAttributes().get(EVAL_VALUE));
boolean matchResult = !Pattern.matches(pattern, input);
x.putAttribute(EVAL_VALUE, matchResult);
break;
}
case Like: {
String pattern = castToString(rightValue);
String input = castToString(left.getAttributes().get(EVAL_VALUE));
boolean matchResult = like(input, pattern);
x.putAttribute(EVAL_VALUE, matchResult);
break;
}
case NotLike: {
String pattern = castToString(rightValue);
String input = castToString(left.getAttributes().get(EVAL_VALUE));
boolean matchResult = !like(input, pattern);
x.putAttribute(EVAL_VALUE, matchResult);
break;
}
case Concat: {
String result = leftValue.toString() + rightValue.toString();
x.putAttribute(EVAL_VALUE, result);
break;
}
case BooleanAnd: {
boolean first = eq(leftValue, true);
boolean second = eq(rightValue, true);
x.putAttribute(EVAL_VALUE, first && second);
break;
}
case BooleanOr: {
boolean first = eq(leftValue, true);
boolean second = eq(rightValue, true);
x.putAttribute(EVAL_VALUE, first || second);
break;
}
default:
break;
}
return false;
}