This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new a7af869bfd [opt](Nereids) group_concat to support more cases (#15815) a7af869bfd is described below commit a7af869bfd3c9b4fce51efb0e992235302010d9d Author: mch_ucchi <41606806+sohardforan...@users.noreply.github.com> AuthorDate: Fri Jan 13 00:41:13 2023 +0800 [opt](Nereids) group_concat to support more cases (#15815) enhance group_concat to support group_concat(cast(slot), ...) and support call it with 1 argument. --- .../doris/nereids/trees/expressions/OrderExpression.java | 4 ++++ .../trees/expressions/functions/agg/GroupConcat.java | 11 +++++++---- .../org/apache/doris/nereids/util/ExpressionUtils.java | 14 ++++++++++++++ .../suites/nereids_syntax_p0/group_concat.groovy | 10 ++++++++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java index fa03ce45d7..da80d2e7a3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/OrderExpression.java @@ -48,6 +48,10 @@ public class OrderExpression extends Expression implements UnaryExpression, Prop return orderKey.isNullFirst(); } + public OrderKey getOrderKey() { + return orderKey; + } + @Override public <R, C> R accept(ExpressionVisitor<R, C> visitor, C context) { return visitor.visitOrderExpression(this, context); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java index 48d531bb45..08c6f64d0f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/agg/GroupConcat.java @@ -33,6 +33,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import java.util.List; +import java.util.stream.Collectors; /** * AggregateFunction 'group_concat'. This class is generated by GenerateFunction. @@ -41,13 +42,14 @@ public class GroupConcat extends AggregateFunction implements ExplicitlyCastableSignature, PropagateNullable { public static final List<FunctionSignature> SIGNATURES = ImmutableList.of( + FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT).varArgs(VarcharType.SYSTEM_DEFAULT), FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT) .varArgs(VarcharType.SYSTEM_DEFAULT, AnyDataType.INSTANCE), FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT) .varArgs(VarcharType.SYSTEM_DEFAULT, VarcharType.SYSTEM_DEFAULT, AnyDataType.INSTANCE) ); - private int nonOrderArguments; + private final int nonOrderArguments; /** * constructor with 1 argument. @@ -103,8 +105,10 @@ public class GroupConcat extends AggregateFunction */ @Override public GroupConcat withDistinctAndChildren(boolean distinct, List<Expression> children) { - Preconditions.checkArgument(children().size() > 1); + Preconditions.checkArgument(children().size() >= 1); + // in type coercion, the orderExpression will be the child of cast, we should push down cast. + children = children.stream().map(ExpressionUtils::pushDownCastInOrderExpression).collect(Collectors.toList()); boolean foundOrderExpr = false; int firstOrderExrIndex = 0; for (int i = 0; i < children.size(); i++) { @@ -118,11 +122,10 @@ public class GroupConcat extends AggregateFunction } } + List<OrderExpression> orders = (List) children.subList(firstOrderExrIndex, children.size()); if (firstOrderExrIndex == 1) { - List<OrderExpression> orders = (List) children.subList(firstOrderExrIndex, children.size()); return new GroupConcat(distinct, children.get(0), orders.toArray(new OrderExpression[0])); } else if (firstOrderExrIndex == 2) { - List<OrderExpression> orders = (List) children.subList(firstOrderExrIndex, children.size()); return new GroupConcat(distinct, children.get(0), children.get(1), orders.toArray(new OrderExpression[0])); } else { throw new AnalysisException("group_concat requires one or two parameters: " + children); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java index 7a7ed01f30..3490ec284f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java @@ -28,6 +28,7 @@ import org.apache.doris.nereids.trees.expressions.InPredicate; import org.apache.doris.nereids.trees.expressions.IsNull; import org.apache.doris.nereids.trees.expressions.Not; import org.apache.doris.nereids.trees.expressions.Or; +import org.apache.doris.nereids.trees.expressions.OrderExpression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; @@ -466,4 +467,17 @@ public class ExpressionUtils { .flatMap(expr -> expr.getInputSlots().stream()) .collect(ImmutableSet.toImmutableSet()); } + + /** + * cast push down in order expression + */ + public static Expression pushDownCastInOrderExpression(Expression expression) { + if (expression instanceof Cast + && ((Cast) expression).child() instanceof OrderExpression) { + Cast cast = ((Cast) expression); + OrderExpression order = ((OrderExpression) cast.child()); + return order.withChildren(cast.withChildren(order.getOrderKey().getExpr())); + } + return expression; + } } diff --git a/regression-test/suites/nereids_syntax_p0/group_concat.groovy b/regression-test/suites/nereids_syntax_p0/group_concat.groovy index 87fd62b281..0f16089cbd 100644 --- a/regression-test/suites/nereids_syntax_p0/group_concat.groovy +++ b/regression-test/suites/nereids_syntax_p0/group_concat.groovy @@ -34,4 +34,14 @@ suite("group_concat") { from numbers('number'='10')""" result([["0,1,2,3,4,5,6,7,8,9"]]) } + + test { + sql "select group_concat(cast(number as string)) from numbers('number'='10')" + result([["0, 1, 2, 3, 4, 5, 6, 7, 8, 9"]]) + } + + test { + sql "select group_concat(cast(number as string), ' : ') from numbers('number'='10')" + result([["0 : 1 : 2 : 3 : 4 : 5 : 6 : 7 : 8 : 9"]]) + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org