This is an automated email from the ASF dual-hosted git repository. morrysnow pushed a commit to branch branch-1.2-lts in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push: new 6454d96350 [fix](planner) support multi distinct group_concat (#17364) 6454d96350 is described below commit 6454d96350da8ef5de45cd6ff5a37bc6f9a4f0f6 Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Fri Mar 3 14:50:57 2023 +0800 [fix](planner) support multi distinct group_concat (#17364) pick from master #17237 --- .../aggregate_function_simple_factory.cpp | 2 +- .../main/java/org/apache/doris/analysis/Expr.java | 9 +++++++++ .../org/apache/doris/analysis/FunctionCallExpr.java | 5 +++++ .../java/org/apache/doris/analysis/SelectStmt.java | 13 +++++++++---- .../org/apache/doris/catalog/AggregateFunction.java | 7 ++++++- .../java/org/apache/doris/catalog/FunctionSet.java | 21 ++++++++++++++++++++- 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp b/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp index 8a28ee2f69..5a94e64e2f 100644 --- a/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp +++ b/be/src/vec/aggregate_functions/aggregate_function_simple_factory.cpp @@ -68,6 +68,7 @@ AggregateFunctionSimpleFactory& AggregateFunctionSimpleFactory::instance() { register_aggregate_function_uniq(instance); register_aggregate_function_bit(instance); register_aggregate_function_bitmap(instance); + register_aggregate_function_group_concat(instance); register_aggregate_function_combinator_distinct(instance); register_aggregate_function_reader_load( instance); // register aggregate function for agg reader @@ -75,7 +76,6 @@ AggregateFunctionSimpleFactory& AggregateFunctionSimpleFactory::instance() { register_aggregate_function_stddev_variance_pop(instance); register_aggregate_function_topn(instance); register_aggregate_function_approx_count_distinct(instance); - register_aggregate_function_group_concat(instance); register_aggregate_function_percentile(instance); register_aggregate_function_percentile_approx(instance); register_aggregate_function_window_funnel(instance); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java index 37759a5b49..a94a1ee21d 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java @@ -2061,6 +2061,15 @@ public abstract class Expr extends TreeNode<Expr> implements ParseNode, Cloneabl return hasNullableChild(); } } + if (fn.functionName().equalsIgnoreCase("group_concat")) { + int size = Math.min(fn.getNumArgs(), children.size()); + for (int i = 0; i < size; ++i) { + if (children.get(i).isNullable()) { + return true; + } + } + return false; + } return true; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index a6f1e3089e..6d45021179 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -705,6 +705,11 @@ public class FunctionCallExpr extends Expr { } } + if (fnParams.isDistinct() && !orderByElements.isEmpty()) { + throw new AnalysisException( + "group_concat don't support using distinct with order by together: " + this.toSql()); + } + return; } if (fnName.getFunction().equalsIgnoreCase("field")) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index 003c5fa79b..3a9507b414 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -1138,9 +1138,9 @@ public class SelectStmt extends QueryStmt { // i) There is no GROUP-BY clause, and // ii) Other DISTINCT aggregates are present. ExprSubstitutionMap countAllMap = createCountAllMap(aggExprs, analyzer); - final ExprSubstitutionMap multiCountOrSumDistinctMap = - createSumOrCountMultiDistinctSMap(aggExprs, analyzer); - countAllMap = ExprSubstitutionMap.compose(multiCountOrSumDistinctMap, countAllMap, analyzer); + final ExprSubstitutionMap multiDistinctAggMap = + createMultiDistinctAggSMap(aggExprs, analyzer); + countAllMap = ExprSubstitutionMap.compose(multiDistinctAggMap, countAllMap, analyzer); List<Expr> substitutedAggs = Expr.substituteList(aggExprs, countAllMap, analyzer, false); // the resultExprs must substitute in the same way as aggExprs @@ -1336,7 +1336,7 @@ public class SelectStmt extends QueryStmt { * Build smap count_distinct->multi_count_distinct sum_distinct->multi_count_distinct * assumes that select list and having clause have been analyzed. */ - private ExprSubstitutionMap createSumOrCountMultiDistinctSMap( + private ExprSubstitutionMap createMultiDistinctAggSMap( ArrayList<FunctionCallExpr> aggExprs, Analyzer analyzer) throws AnalysisException { final List<FunctionCallExpr> distinctExprs = Lists.newArrayList(); for (FunctionCallExpr aggExpr : aggExprs) { @@ -1368,6 +1368,11 @@ public class SelectStmt extends QueryStmt { final FunctionCallExpr countExpr = new FunctionCallExpr("MULTI_DISTINCT_COUNT", new FunctionParams(inputExpr.isDistinct(), countInputExpr)); replaceExpr = new ArithmeticExpr(ArithmeticExpr.Operator.DIVIDE, sumExpr, countExpr); + } else if (functionName.equalsIgnoreCase("GROUP_CONCAT")) { + final List<Expr> groupConcatInputExprs = inputExpr.getChildren(); + replaceExpr = new FunctionCallExpr(new FunctionName("MULTI_DISTINCT_GROUP_CONCAT"), + new FunctionParams(inputExpr.isDistinct(), groupConcatInputExprs), + inputExpr.getOrderByElements()); } else { throw new AnalysisException(inputExpr.getFnName() + " can't support multi distinct."); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java index 2e8db6c044..2beb5504cf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/AggregateFunction.java @@ -58,6 +58,9 @@ public class AggregateFunction extends Function { public static ImmutableSet<String> ALWAYS_NULLABLE_AGGREGATE_FUNCTION_NAME_SET = ImmutableSet.of("stddev_samp", "variance_samp", "var_samp", "percentile_approx"); + public static ImmutableSet<String> CUSTOM_AGGREGATE_FUNCTION_NAME_SET = + ImmutableSet.of("group_concat"); + public static ImmutableSet<String> SUPPORT_ORDER_BY_AGGREGATE_FUNCTION_NAME_SET = ImmutableSet.of("group_concat"); // Set if different from retType_, null otherwise. @@ -169,7 +172,9 @@ public class AggregateFunction extends Function { AggregateFunction.NOT_NULLABLE_AGGREGATE_FUNCTION_NAME_SET.contains(fnName.getFunction()) ? NullableMode.ALWAYS_NOT_NULLABLE : AggregateFunction.ALWAYS_NULLABLE_AGGREGATE_FUNCTION_NAME_SET.contains(fnName.getFunction()) - ? NullableMode.ALWAYS_NULLABLE : NullableMode.DEPEND_ON_ARGUMENT); + ? NullableMode.ALWAYS_NULLABLE : + AggregateFunction.CUSTOM_AGGREGATE_FUNCTION_NAME_SET.contains(fnName.getFunction()) + ? NullableMode.CUSTOM : NullableMode.DEPEND_ON_ARGUMENT); setLocation(location); this.intermediateType = (intermediateType.equals(retType)) ? null : intermediateType; this.updateFnSymbol = updateFnSymbol; diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java index e23d2afdb3..9b6ea9b16b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/FunctionSet.java @@ -2720,10 +2720,29 @@ public class FunctionSet<T> { // Group_concat(string) vectorized addBuiltin(AggregateFunction.createBuiltin("group_concat", Lists.<Type>newArrayList(Type.VARCHAR), Type.VARCHAR, Type.VARCHAR, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_group_concat", Lists.<Type>newArrayList(Type.VARCHAR), Type.VARCHAR, + Type.VARCHAR, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("group_concat", Lists.<Type>newArrayList(Type.CHAR), Type.CHAR, + Type.CHAR, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_group_concat", Lists.<Type>newArrayList(Type.CHAR), Type.CHAR, + Type.CHAR, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("group_concat", Lists.<Type>newArrayList(Type.STRING), Type.STRING, + Type.STRING, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_group_concat", Lists.<Type>newArrayList(Type.STRING), Type.STRING, + Type.STRING, initNullString, "", "", "", "", false, true, false, true)); // Group_concat(string, string) vectorized addBuiltin(AggregateFunction.createBuiltin("group_concat", Lists.<Type>newArrayList(Type.VARCHAR, Type.VARCHAR), Type.VARCHAR, Type.VARCHAR, initNullString, "", "", "", "", false, true, false, true)); - + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_group_concat", Lists.<Type>newArrayList(Type.VARCHAR, Type.VARCHAR), + Type.VARCHAR, Type.VARCHAR, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("group_concat", Lists.<Type>newArrayList(Type.CHAR, Type.CHAR), + Type.CHAR, Type.CHAR, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_group_concat", Lists.<Type>newArrayList(Type.CHAR, Type.CHAR), + Type.CHAR, Type.CHAR, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("group_concat", Lists.<Type>newArrayList(Type.STRING, Type.STRING), + Type.STRING, Type.STRING, initNullString, "", "", "", "", false, true, false, true)); + addBuiltin(AggregateFunction.createBuiltin("multi_distinct_group_concat", Lists.<Type>newArrayList(Type.STRING, Type.STRING), + Type.STRING, Type.STRING, initNullString, "", "", "", "", false, true, false, true)); // analytic functions // Rank addBuiltin(AggregateFunction.createAnalyticBuiltin("rank", --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org