This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push: new a47ced8ac3a branch-2.1: [fix](Nereids) alias function should use unbound slot as place holder (#43765) a47ced8ac3a is described below commit a47ced8ac3a7640b23ad0469105f78db6b785a16 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> AuthorDate: Wed Nov 13 10:58:45 2024 +0800 branch-2.1: [fix](Nereids) alias function should use unbound slot as place holder (#43765) Cherry-picked from #43597 Co-authored-by: morrySnow <zhangwen...@selectdb.com> --- .../trees/expressions/functions/udf/AliasUdf.java | 30 +--------------------- .../expressions/functions/udf/AliasUdfBuilder.java | 14 +++++----- .../nereids_p0/javaudf/test_alias_function.groovy | 16 ++++++------ 3 files changed, 16 insertions(+), 44 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java index 7b97335e77c..c8b7a3c721a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/udf/AliasUdf.java @@ -21,23 +21,18 @@ import org.apache.doris.catalog.AliasFunction; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.analyzer.UnboundFunction; -import org.apache.doris.nereids.analyzer.UnboundSlot; import org.apache.doris.nereids.parser.NereidsParser; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; import org.apache.doris.nereids.trees.expressions.functions.scalar.ScalarFunction; -import org.apache.doris.nereids.trees.expressions.visitor.DefaultExpressionRewriter; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.DataType; import org.apache.doris.nereids.types.NullType; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Maps; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; /** @@ -88,20 +83,10 @@ public class AliasUdf extends ScalarFunction implements ExplicitlyCastableSignat String functionSql = function.getOriginFunction().toSql(); Expression parsedFunction = new NereidsParser().parseExpression(functionSql); - Map<String, SlotReference> replaceMap = Maps.newHashMap(); - for (int i = 0; i < function.getNumArgs(); ++i) { - replaceMap.put(function.getParameters().get(i), - new SlotReference( - function.getParameters().get(i), - DataType.fromCatalogType(function.getArgs()[i]))); - } - - Expression slotBoundFunction = VirtualSlotReplacer.INSTANCE.replace(parsedFunction, replaceMap); - AliasUdf aliasUdf = new AliasUdf( function.functionName(), Arrays.stream(function.getArgs()).map(DataType::fromCatalogType).collect(Collectors.toList()), - ((UnboundFunction) slotBoundFunction), + ((UnboundFunction) parsedFunction), function.getParameters()); AliasUdfBuilder builder = new AliasUdfBuilder(aliasUdf); @@ -123,17 +108,4 @@ public class AliasUdf extends ScalarFunction implements ExplicitlyCastableSignat public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) { return visitor.visitAliasUdf(this, context); } - - private static class VirtualSlotReplacer extends DefaultExpressionRewriter<Map<String, SlotReference>> { - public static final VirtualSlotReplacer INSTANCE = new VirtualSlotReplacer(); - - public Expression replace(Expression expression, Map<String, SlotReference> context) { - return expression.accept(this, context); - } - - @Override - public Expression visitUnboundSlot(UnboundSlot slot, Map<String, SlotReference> context) { - return context.get(slot.getName()); - } - } } 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 2bb832524e9..58c5abcdd26 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 @@ -21,10 +21,10 @@ import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.common.Pair; import org.apache.doris.common.util.ReflectionUtils; import org.apache.doris.nereids.analyzer.Scope; +import org.apache.doris.nereids.analyzer.UnboundSlot; import org.apache.doris.nereids.rules.analysis.ExpressionAnalyzer; import org.apache.doris.nereids.rules.expression.ExpressionRewriteContext; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.functions.BoundFunction; import org.apache.doris.nereids.types.DataType; import org.apache.doris.nereids.util.TypeCoercionUtils; @@ -90,14 +90,14 @@ public class AliasUdfBuilder extends UdfBuilder { // replace the placeholder slot to the input expressions. // adjust input, parameter and replaceMap to be corresponding. - Map<String, SlotReference> slots = Maps.newLinkedHashMap(); + Map<String, UnboundSlot> slots = Maps.newLinkedHashMap(); aliasUdf.getUnboundFunction().foreachUp(child -> { - if (child instanceof SlotReference) { - slots.put(((SlotReference) child).getName(), (SlotReference) child); + if (child instanceof UnboundSlot) { + slots.put(((UnboundSlot) child).getName(), (UnboundSlot) child); } }); - Map<SlotReference, Expression> paramSlotToRealInput = Maps.newHashMap(); + Map<UnboundSlot, Expression> paramSlotToRealInput = Maps.newHashMap(); for (int i = 0; i < inputs.size(); ++i) { String parameter = aliasUdf.getParameters().get(i); Preconditions.checkArgument(slots.containsKey(parameter)); @@ -107,8 +107,8 @@ public class AliasUdfBuilder extends UdfBuilder { ExpressionAnalyzer udfAnalyzer = new ExpressionAnalyzer( null, new Scope(ImmutableList.of()), null, false, false) { @Override - public Expression visitSlotReference(SlotReference slotReference, ExpressionRewriteContext context) { - return paramSlotToRealInput.get(slotReference); + public Expression visitUnboundSlot(UnboundSlot unboundSlot, ExpressionRewriteContext context) { + return paramSlotToRealInput.get(unboundSlot); } }; 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 579724a0139..c7c138e9934 100644 --- a/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy +++ b/regression-test/suites/nereids_p0/javaudf/test_alias_function.groovy @@ -33,7 +33,7 @@ suite("nereids_test_alias_function") { CREATE ALIAS FUNCTION f2(DATETIMEV2(3), INT) with PARAMETER (datetime1, int1) as DATE_FORMAT(HOURS_ADD( date_trunc(datetime1, 'day'), - add(multiply(floor(divide(HOUR(datetime1), divide(24, int1))), 1), 1)), '%Y%m%d:%H') + add(multiply(floor(divide(day(datetime1), divide(24, int1))), 1), 1)), '%Y%m%d:%H') ''' sql ''' CREATE ALIAS FUNCTION f3(INT) with PARAMETER (int1) as @@ -50,11 +50,11 @@ suite("nereids_test_alias_function") { } test { sql 'select f2(f1(\'2023-05-20\', 2), 3)' - result([['20230518:01']]) + result([['20230518:03']]) } test { sql 'select f3(4)' - result([['20230518:01']]) + result([['20230518:04']]) } test { sql 'select cast(f1(\'2023-06-01\', k1) as string) from test order by k1' @@ -67,17 +67,17 @@ suite("nereids_test_alias_function") { test { sql 'select f2(f1(\'2023-05-20\', k1), 4) from test order by k1' result([ - ['20230519:01'], - ['20230518:01'], - ['20230517:01'] + ['20230519:04'], + ['20230518:04'], + ['20230517:03'] ]) } test { sql 'select f3(k1) from test order by k1' result([ ['20230518:01'], - ['20230518:01'], - ['20230518:01'] + ['20230518:02'], + ['20230518:03'] ]) } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org