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]

Reply via email to