Source:
public Object visitCall(CallExpression node, Object context) { List<Type> argumentTypes = new ArrayList<>(); List<Object> argumentValues = new ArrayList<>(); FunctionHandle functionHandle = node.getFunctionHandle(); FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(node.getFunctionHandle()); for (RowExpression expression : node.getArguments()) { Object value = expression.accept(this, context); if (value == null && !functionMetadata.isCalledOnNullInput()) { return null; } argumentValues.add(value); argumentTypes.add(expression.getType()); } if (functionMetadata.getName().toUpperCase().equals(ARRAY_CONSTRUCTOR)) { SpecialCallResult result = tryHandleArrayConstructor(node, argumentValues); if (result.isChanged()) { return result.getValue(); } } if (resolution.isCastFunction(functionHandle)) { SpecialCallResult result = tryHandleCast(node, argumentValues); if (result.isChanged()) { return result.getValue(); } } if (resolution.isLikeFunction(functionHandle)) { SpecialCallResult result = tryHandleLike(node, argumentValues, argumentTypes, context); if (result.isChanged()) { return result.getValue(); } } for (int i = 0; i < argumentValues.size(); i++) { Object value = argumentValues.get(i); if (value == null && !functionMetadata.isCalledOnNullInput()) { return null; } } if (functionMetadata.getFunctionKind() != SCALAR) { return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); } if (optimizationLevel.ordinal() < MOST_EVALUATED.ordinal() && (!functionMetadata.isDeterministic() || hasUnresolvedValue(argumentValues) || functionMetadata.getName().equals("fail"))) { return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); } return functionInvoker.invoke(functionHandle, session, argumentValues); }

Target:
public Object visitCall(CallExpression node, Object context) { List<Type> argumentTypes = new ArrayList<>(); List<Object> argumentValues = new ArrayList<>(); FunctionHandle functionHandle = node.getFunctionHandle(); FunctionMetadata functionMetadata = metadata.getFunctionManager().getFunctionMetadata(node.getFunctionHandle()); for (RowExpression expression : node.getArguments()) { Object value = expression.accept(this, context); if (value == null && !functionMetadata.isCalledOnNullInput()) { return null; } argumentValues.add(value); argumentTypes.add(expression.getType()); } if (resolution.isArrayConstructor(functionHandle)) { SpecialCallResult result = tryHandleArrayConstructor(node, argumentValues); if (result.isChanged()) { return result.getValue(); } } if (resolution.isCastFunction(functionHandle)) { SpecialCallResult result = tryHandleCast(node, argumentValues); if (result.isChanged()) { return result.getValue(); } } if (resolution.isLikeFunction(functionHandle)) { SpecialCallResult result = tryHandleLike(node, argumentValues, argumentTypes, context); if (result.isChanged()) { return result.getValue(); } } if (functionMetadata.getFunctionKind() != SCALAR) { return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); } if (optimizationLevel.ordinal() < EVALUATED.ordinal() && (!functionMetadata.isDeterministic() || hasUnresolvedValue(argumentValues) || resolution.isFailFunction(functionHandle))) { return call(node.getDisplayName(), functionHandle, node.getType(), toRowExpressions(argumentValues, node.getArguments())); } return functionInvoker.invoke(functionHandle, session, argumentValues); }