public static boolean visit()

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;
    }