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]

Reply via email to