This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 922162fb882c91c96c34ccfec2eca9f1086f613f Author: morrySnow <[email protected]> AuthorDate: Mon Oct 9 19:04:47 2023 +0800 [fix](Nereids) alias function support arithmetic functions (#25162) --- .../doris/nereids/rules/analysis/BindExpression.java | 7 +++---- .../nereids/rules/expression/rules/FunctionBinder.java | 9 ++++----- .../trees/expressions/functions/FunctionBuilder.java | 6 ++++-- .../trees/expressions/functions/udf/AliasUdfBuilder.java | 4 ++-- .../doris/nereids/rules/analysis/FunctionRegistryTest.java | 2 +- .../suites/nereids_p0/javaudf/test_alias_function.groovy | 14 ++++++++++++++ 6 files changed, 28 insertions(+), 14 deletions(-) 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 eee7a2825a1..41422b1b1bf 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 @@ -698,7 +698,7 @@ public class BindExpression implements AnalysisRuleFactory { String functionName = unboundTVFRelation.getFunctionName(); TVFProperties 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"); } @@ -726,12 +726,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<Expression> 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 dada408062b..135bf3e0008 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 @@ -104,14 +104,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 287280c44a1..0b3a50a239b 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<? extends Object> 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<? extends Object> arguments); + public abstract Expression build(String name, List<? extends Object> 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 18268aea973..197cb8b396d 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<Map<SlotReference, Expression>> { 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 9758a6c10b0..5f2c839d722 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<Expression> 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 6b3d240fa85..7aa5077600c 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 --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
