diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java index 2a2a529ff9..d09432029c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java @@ -699,7 +699,7 @@ public class BindExpression implements AnalysisRuleFactory { String functionName = unboundTVFRelation.getFunctionName(); Properties arguments = unboundTVFRelation.getProperties(); FunctionBuilder functionBuilder = functionRegistry.findFunctionBuilder(functionName, arguments); - BoundFunction function = functionBuilder.build(functionName, arguments); + Expression function = functionBuilder.build(functionName, arguments); if (!(function instanceof TableValuedFunction)) { throw new AnalysisException(function.toSql() + " is not a TableValuedFunction"); } @@ -727,12 +727,11 @@ public class BindExpression implements AnalysisRuleFactory { String functionName = unboundFunction.getName(); FunctionBuilder functionBuilder = functionRegistry.findFunctionBuilder(functionName, boundArguments); - BoundFunction function = functionBuilder.build(functionName, boundArguments); + Expression function = functionBuilder.build(functionName, boundArguments); if (!(function instanceof TableGeneratingFunction)) { throw new AnalysisException(function.toSql() + " is not a TableGeneratingFunction"); } - function = (BoundFunction) TypeCoercionUtils.processBoundFunction(function); - return function; + return (BoundFunction) TypeCoercionUtils.processBoundFunction((BoundFunction) function); } private void checkIfOutputAliasNameDuplicatedForGroupBy(List expressions, diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java index 2c72170e78..63591bc3e0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FunctionBinder.java @@ -158,14 +158,13 @@ public class FunctionBinder extends AbstractExpressionRewriteRule { .accept(this, context); } - FunctionBuilder builder = functionRegistry.findFunctionBuilder(unboundFunction.getDbName(), - functionName, arguments); - BoundFunction boundFunction = builder.build(functionName, arguments); + FunctionBuilder builder = functionRegistry.findFunctionBuilder( + unboundFunction.getDbName(), functionName, arguments); if (builder instanceof AliasUdfBuilder) { // we do type coercion in build function in alias function, so it's ok to return directly. - return boundFunction; + return builder.build(functionName, arguments); } else { - return TypeCoercionUtils.processBoundFunction(boundFunction); + return TypeCoercionUtils.processBoundFunction((BoundFunction) builder.build(functionName, arguments)); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/FunctionBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/FunctionBuilder.java index 287280c44a..0b3a50a239 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/FunctionBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/FunctionBuilder.java @@ -17,6 +17,8 @@ package org.apache.doris.nereids.trees.expressions.functions; +import org.apache.doris.nereids.trees.expressions.Expression; + import com.google.common.collect.ImmutableList; import java.util.List; @@ -28,7 +30,7 @@ public abstract class FunctionBuilder { /** check whether arguments can apply to the constructor */ public abstract boolean canApply(List arguments); - public final BoundFunction build(String name, Object argument) { + public final Expression build(String name, Object argument) { return build(name, ImmutableList.of(argument)); } @@ -38,5 +40,5 @@ public abstract class FunctionBuilder { * @param arguments the function's argument expressions * @return the concrete bound function instance */ - public abstract BoundFunction build(String name, List arguments); + public abstract Expression build(String name, List arguments); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdfBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdfBuilder.java index 18268aea97..197cb8b396 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdfBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdfBuilder.java @@ -67,7 +67,7 @@ public class AliasUdfBuilder extends UdfBuilder { } @Override - public BoundFunction build(String name, List arguments) { + public Expression build(String name, List arguments) { // use AliasFunction to process TypeCoercion BoundFunction boundAliasFunction = ((BoundFunction) aliasUdf.withChildren(arguments.stream() .map(Expression.class::cast).collect(Collectors.toList()))); @@ -90,7 +90,7 @@ public class AliasUdfBuilder extends UdfBuilder { replaceMap.put(slots.get(parameter), inputs.get(i)); } - return ((BoundFunction) SlotReplacer.INSTANCE.replace(boundFunction, replaceMap)); + return SlotReplacer.INSTANCE.replace(boundFunction, replaceMap); } private static class SlotReplacer extends DefaultExpressionRewriter> { diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/FunctionRegistryTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/FunctionRegistryTest.java index 9758a6c10b..5f2c839d72 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/FunctionRegistryTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/FunctionRegistryTest.java @@ -121,7 +121,7 @@ public class FunctionRegistryTest implements MemoPatternMatchSupported { ImmutableList arguments = ImmutableList.of(Literal.of(1)); FunctionBuilder functionBuilder = functionRegistry.findFunctionBuilder("foo", arguments); - BoundFunction function = functionBuilder.build("foo", arguments); + Expression function = functionBuilder.build("foo", arguments); Assertions.assertEquals(function.getClass(), ExtendFunction.class); Assertions.assertEquals(arguments, function.getArguments()); } diff --git a/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy b/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy index 6b3d240fa8..7aa5077600 100644 --- a/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy +++ b/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy @@ -23,6 +23,7 @@ suite("nereids_test_alias_function") { sql 'drop function if exists f1(datetimev2(3), int)' sql 'drop function if exists f2(datetimev2(3), int)' sql 'drop function if exists f3(int)' + sql 'drop function if exists f4(int, int)' sql ''' create alias function f1(datetimev2(3), int) with parameter (datetime1, int1) as @@ -39,6 +40,10 @@ suite("nereids_test_alias_function") { f2(f1('2023-05-20', 2), int1) ''' + sql ''' + CREATE ALIAS FUNCTION f4(INT,INT) WITH PARAMETER(n,d) AS add(1,floor(divide(n,d))) + ''' + test { sql 'select cast(f1(\'2023-06-01\', 3) as string);' result([['2023-05-29 00:00:00']]) @@ -75,4 +80,13 @@ suite("nereids_test_alias_function") { ['20230518:01'] ]) } + + test { + sql 'select f4(1,2) from test' + result([ + [1.0d], + [1.0d], + [1.0d] + ]) + } } \ No newline at end of file