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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]