This is an automated email from the ASF dual-hosted git repository.
yiguolei 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 c3812b382b1 branch-2.1: [fix](nereids) fix bug of
MergePercentileToArray #49773 (#50603)
c3812b382b1 is described below
commit c3812b382b1c40aa55ba3aa533c6e3f0c015d365
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue May 6 17:09:32 2025 +0800
branch-2.1: [fix](nereids) fix bug of MergePercentileToArray #49773 (#50603)
Cherry-picked from #49773
Co-authored-by: feiniaofeiafei <[email protected]>
---
.../rules/rewrite/MergePercentileToArray.java | 34 +++++++++++++++------
.../rules/rewrite/MergePercentileToArrayTest.java | 13 ++++++++
.../merge_percentile_to_array.out | Bin 723 -> 2204 bytes
.../merge_percentile_to_array.groovy | 21 +++++++++++++
4 files changed, 58 insertions(+), 10 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArray.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArray.java
index fe81adf13bf..a791d737080 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArray.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArray.java
@@ -23,13 +23,13 @@ import org.apache.doris.nereids.rules.RuleType;
import org.apache.doris.nereids.rules.analysis.NormalizeAggregate;
import
org.apache.doris.nereids.rules.rewrite.NormalizeToSlot.NormalizeToSlotContext;
import org.apache.doris.nereids.trees.expressions.Alias;
-import org.apache.doris.nereids.trees.expressions.Cast;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.expressions.NamedExpression;
import org.apache.doris.nereids.trees.expressions.Slot;
import
org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction;
import org.apache.doris.nereids.trees.expressions.functions.agg.Percentile;
import
org.apache.doris.nereids.trees.expressions.functions.agg.PercentileArray;
+import org.apache.doris.nereids.trees.expressions.functions.scalar.Array;
import org.apache.doris.nereids.trees.expressions.functions.scalar.ElementAt;
import org.apache.doris.nereids.trees.expressions.literal.ArrayLiteral;
import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
@@ -40,6 +40,7 @@ import
org.apache.doris.nereids.trees.plans.logical.LogicalProject;
import org.apache.doris.nereids.types.ArrayType;
import org.apache.doris.nereids.types.DoubleType;
import org.apache.doris.nereids.util.ExpressionUtils;
+import org.apache.doris.nereids.util.TypeCoercionUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
@@ -76,20 +77,33 @@ public class MergePercentileToArray extends
OneRewriteRuleFactory {
// Merge percentile into percentile_array according to funcMap
private List<AggregateFunction> getPercentileArrays(Map<DistinctAndExpr,
List<AggregateFunction>> funcMap) {
List<AggregateFunction> newPercentileArrays = Lists.newArrayList();
+
for (Map.Entry<DistinctAndExpr, List<AggregateFunction>> entry :
funcMap.entrySet()) {
- List<Literal> literals = new ArrayList<>();
+ List<Expression> percentList = new ArrayList<>();
+ boolean allPercentIsLiteral = true;
for (AggregateFunction aggFunc : entry.getValue()) {
- List<Expression> literal = aggFunc.child(1).collectToList(expr
-> expr instanceof Literal);
- literals.add((Literal) literal.get(0));
+ Expression percent = aggFunc.child(1);
+ percentList.add(percent);
+ if (allPercentIsLiteral && !(percent instanceof Literal)) {
+ allPercentIsLiteral = false;
+ }
}
- ArrayLiteral arrayLiteral = new ArrayLiteral(literals);
- PercentileArray percentileArray = null;
+ ArrayLiteral percentArrayLiteral = null;
+ Array percentArray = null;
+ if (allPercentIsLiteral) {
+ percentArrayLiteral = new ArrayLiteral((List) percentList);
+ } else {
+ percentArray = new Array(percentList.toArray(new
Expression[0]));
+ }
+
+ PercentileArray percentileArray;
+ Expression secondArg = allPercentIsLiteral
+ ? TypeCoercionUtils.castIfNotSameType(percentArrayLiteral,
ArrayType.of(DoubleType.INSTANCE))
+ : TypeCoercionUtils.castIfNotSameType(percentArray,
ArrayType.of(DoubleType.INSTANCE));
if (entry.getKey().isDistinct) {
- percentileArray = new PercentileArray(true,
entry.getKey().getExpression(), new Cast(arrayLiteral,
- ArrayType.of(DoubleType.INSTANCE)));
+ percentileArray = new PercentileArray(true,
entry.getKey().getExpression(), secondArg);
} else {
- percentileArray = new
PercentileArray(entry.getKey().getExpression(), new Cast(arrayLiteral,
- ArrayType.of(DoubleType.INSTANCE)));
+ percentileArray = new
PercentileArray(entry.getKey().getExpression(), secondArg);
}
newPercentileArrays.add(percentileArray);
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArrayTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArrayTest.java
index 224db4fcac5..47597db1af3 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArrayTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/MergePercentileToArrayTest.java
@@ -51,5 +51,18 @@ public class MergePercentileToArrayTest extends
TestWithFeService implements Mem
&&
p.getProjects().get(2).toSql().contains("element_at(percentile_array"))
);
}
+
+ @Test
+ void testGrouping() {
+ String sql = "SELECT percentile(a, 0.11), percentile(a,0.25+0.1) as
percentiles,sum(a) FROM t group by grouping sets((b),())";
+ PlanChecker.from(connectContext)
+ .analyze(sql)
+ .rewrite()
+ .matches(
+ logicalProject(logicalAggregate()).when(p ->
+
p.getProjects().get(0).toSql().contains("element_at(percentile_array")
+ &&
p.getProjects().get(1).toSql().contains("element_at(percentile_array"))
+ );
+ }
}
diff --git
a/regression-test/data/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.out
b/regression-test/data/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.out
index 1b2f876cfba..87c516ec593 100644
Binary files
a/regression-test/data/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.out
and
b/regression-test/data/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.out
differ
diff --git
a/regression-test/suites/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.groovy
b/regression-test/suites/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.groovy
index 5bb13c6336c..acbeaeb8791 100644
---
a/regression-test/suites/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.groovy
+++
b/regression-test/suites/nereids_rules_p0/merge_percentile_to_array/merge_percentile_to_array.groovy
@@ -61,4 +61,25 @@ suite("merge_percentile_to_array") {
percentile(pk, 0.4) as c2 from test_merge_percentile;"""
order_qt_same_percentile_group_by """select sum(a),percentile(pk, 0.1) as
c1 , percentile(pk, 0.1) as c2 ,
percentile(pk, 0.4) as c2 from test_merge_percentile group by a;"""
+
+ order_qt_grouping """
+ select a,percentile(pk, 0.1),percentile(pk, 0.9) from
test_merge_percentile group by grouping sets((a,b),(a),())
+ """
+ sql "set debug_skip_fold_constant=true;"
+ order_qt_skip_fold """
+ select a,b,percentile(pk, 0.1+0.2),percentile(pk, 0.9),percentile(pk, 0.6)
from test_merge_percentile group by a,b
+ """
+ order_qt_grouping_skip_fold "SELECT percentile(a, 0.11),
percentile(a,0.25) as percentiles FROM test_merge_percentile ts group by
grouping sets((b),(pk),())"
+ order_qt_grouping_expr "SELECT percentile(a, 0.11), percentile(a,0.25+0.1)
as percentiles FROM test_merge_percentile ts group by grouping
sets((b),(pk),())"
+ order_qt_grouping_expr_other_agg "SELECT percentile(a, 0.11),
percentile(a,0.25+0.1) as percentiles, min(a) FROM test_merge_percentile ts
group by grouping sets((b),(a),())"
+ order_qt_grouping_expr_other_agg_upper_ref """select c1,c3 from (SELECT
percentile(a, 0.11) c1, percentile(a,0.25+0.1) as c2, min(a) c3
+ FROM test_merge_percentile ts group by grouping sets((b),(pk),())) t"""
+ order_qt_grouping_expr_other_agg_upper_ref_multi_transform """select
percentile(c1,0.5),percentile(c1,0.25), c2 from
+ (SELECT percentile(a, 0.11) c1, percentile(a,0.25+0.1) as c2, min(a) c3
+ FROM test_merge_percentile ts group by grouping sets((b),(pk),())) t group
by c2"""
+ order_qt_grouping_multi_merge """
+ select percentile(c1,0.5), percentile(c1,0.25),
percentile(c2,0.1),percentile(c2,0.1+0.6) from
+ (SELECT percentile(a, 0.11) c1, percentile(a,0.25+0.1) as c2, min(a) c3
+ FROM test_merge_percentile ts group by grouping sets((b),(pk),())) t group
by c2
+ """
}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]