in core/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java [184:622]
public static boolean visit(SQLEvalVisitor visitor, SQLMethodInvokeExpr x) {
SQLExpr owner = x.getOwner();
if (owner != null) {
owner.accept(visitor);
}
String methodName = x.getMethodName();
if (methodName == null) {
return true;
}
methodName = methodName.toLowerCase();
Function function = visitor.getFunction(methodName);
if (function == null) {
function = functions.get(methodName);
}
if (function != null) {
Object result = function.eval(visitor, x);
if (result != SQLEvalVisitor.EVAL_ERROR && result != null) {
x.putAttribute(EVAL_VALUE, result);
}
return false;
}
switch (methodName) {
case "mod": {
if (x.getArguments().size() != 2) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
SQLExpr param1 = x.getArguments().get(1);
param0.accept(visitor);
param1.accept(visitor);
Object param0Value = param0.getAttributes().get(EVAL_VALUE);
Object param1Value = param1.getAttributes().get(EVAL_VALUE);
if (param0Value == null || param1Value == null) {
return false;
}
long intValue0 = castToLong(param0Value);
long intValue1 = castToLong(param1Value);
long result = intValue0 % intValue1;
if (result >= Integer.MIN_VALUE && result <= Integer.MAX_VALUE) {
int intResult = (int) result;
x.putAttribute(EVAL_VALUE, intResult);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "abs": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
Object result;
if (paramValue instanceof Integer) {
result = Math.abs(((Integer) paramValue).intValue());
} else if (paramValue instanceof Long) {
result = Math.abs(((Long) paramValue).longValue());
} else {
result = castToDecimal(paramValue).abs();
}
x.putAttribute(EVAL_VALUE, result);
break;
}
case "acos": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.acos(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "asin": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.asin(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "atan": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.atan(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "atan2": {
if (x.getArguments().size() != 2) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
SQLExpr param1 = x.getArguments().get(1);
param0.accept(visitor);
param1.accept(visitor);
Object param0Value = param0.getAttributes().get(EVAL_VALUE);
Object param1Value = param1.getAttributes().get(EVAL_VALUE);
if (param0Value == null || param1Value == null) {
return false;
}
double doubleValue0 = castToDouble(param0Value);
double doubleValue1 = castToDouble(param1Value);
double result = Math.atan2(doubleValue0, doubleValue1);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "ceil":
case "ceiling": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
if (Double.isNaN(doubleValue)) {
x.putAttribute(EVAL_VALUE, null);
} else {
int result = (int) Math.ceil(doubleValue);
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "cos": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.cos(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "sin": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.sin(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "log": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.log(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "log10": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.log10(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "tan": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.tan(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "sqrt": {
if (x.getArguments().size() != 1) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
param0.accept(visitor);
Object paramValue = param0.getAttributes().get(EVAL_VALUE);
if (paramValue == null) {
return false;
}
double doubleValue = castToDouble(paramValue);
double result = Math.sqrt(doubleValue);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "power":
case "pow": {
if (x.getArguments().size() != 2) {
return false;
}
SQLExpr param0 = x.getArguments().get(0);
SQLExpr param1 = x.getArguments().get(1);
param0.accept(visitor);
param1.accept(visitor);
Object param0Value = param0.getAttributes().get(EVAL_VALUE);
Object param1Value = param1.getAttributes().get(EVAL_VALUE);
if (param0Value == null || param1Value == null) {
return false;
}
double doubleValue0 = castToDouble(param0Value);
double doubleValue1 = castToDouble(param1Value);
double result = Math.pow(doubleValue0, doubleValue1);
if (Double.isNaN(result)) {
x.putAttribute(EVAL_VALUE, null);
} else {
x.putAttribute(EVAL_VALUE, result);
}
break;
}
case "pi": {
x.putAttribute(EVAL_VALUE, Math.PI);
break;
}
case "rand": {
x.putAttribute(EVAL_VALUE, Math.random());
break;
}
case "chr": {
SQLExpr first = x.getArguments().get(0);
Object firstResult = getValue(first);
if (firstResult instanceof Number) {
int intValue = ((Number) firstResult).intValue();
char ch = (char) intValue;
x.putAttribute(EVAL_VALUE, Character.toString(ch));
}
break;
}
case "current_user":
x.putAttribute(EVAL_VALUE, "CURRENT_USER");
break;
case "name": {
if (owner != null && x.getArguments().isEmpty()) {
Object ownerValue = owner.getAttribute(EVAL_VALUE);
if (ownerValue == null) {
ownerValue = owner;
}
if (ownerValue instanceof SQLDataType) {
String name = ((SQLDataType) ownerValue).getName();
x.putAttribute(EVAL_VALUE, name);
}
if (ownerValue instanceof SQLMethodInvokeExpr) {
String name = ((SQLMethodInvokeExpr) ownerValue).getMethodName();
x.putAttribute(EVAL_VALUE, name);
}
}
break;
}
case "type": {
if (owner != null && x.getArguments().isEmpty()) {
Object ownerValue = owner.getAttribute(EVAL_VALUE);
if (ownerValue == null) {
ownerValue = owner;
}
String type = type(ownerValue);
x.putAttribute(EVAL_VALUE, type);
}
break;
}
case "parent": {
if (owner != null && x.getArguments().isEmpty()) {
Object ownerValue = owner.getAttribute(EVAL_VALUE);
if (ownerValue == null) {
ownerValue = owner;
}
if (ownerValue instanceof SQLObject) {
SQLObject parent = ((SQLObject) ownerValue).getParent();
if (parent instanceof SQLSelect) {
parent = parent.getParent();
}
if (parent instanceof SQLSelectStatement) {
x.putAttribute(EVAL_VALUE, EVAL_VALUE_NULL);
}
}
}
break;
}
default:
break;
}
return false;
}