This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-4.2
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.2 by this push:
     new ede61fe3d6a branch-4.2: [fix](function) Preserve DISTINCT in median 
percentile conversion #68386 (#70039)
ede61fe3d6a is described below

commit ede61fe3d6a6e1f68d4b3b29c138e6eda46fceed
Author: morrySnow <[email protected]>
AuthorDate: Tue Nov 3 17:10:28 2026 +0800

    branch-4.2: [fix](function) Preserve DISTINCT in median percentile 
conversion #68386 (#70039)
    
    picked from master #68386
    
    Co-authored-by: Mryange <[email protected]>
---
 .../rules/expression/rules/MedianConvert.java      |  2 +-
 .../expression/MedianConvertBackportTest.java}     | 32 ++++++++--------------
 .../test_convert_median_to_percentile.out          |  3 ++
 .../test_convert_median_to_percentile.groovy       | 13 +++++++++
 4 files changed, 29 insertions(+), 21 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MedianConvert.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MedianConvert.java
index e6e295ef98c..d8144bf2508 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MedianConvert.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MedianConvert.java
@@ -39,7 +39,7 @@ public class MedianConvert implements 
ExpressionPatternRuleFactory {
     public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
         return ImmutableList.of(
                 matchesType(Median.class).then(median ->
-                    new Percentile(median.child(0), DoubleLiteral.of(0.5))
+                    new Percentile(median.isDistinct(), median.child(0), 
DoubleLiteral.of(0.5))
                 ).toRule(ExpressionRuleType.MEDIAN_CONVERT)
         );
     }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MedianConvert.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/MedianConvertBackportTest.java
similarity index 55%
copy from 
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MedianConvert.java
copy to 
fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/MedianConvertBackportTest.java
index e6e295ef98c..1519d7c0f6f 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/MedianConvert.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/MedianConvertBackportTest.java
@@ -15,32 +15,24 @@
 // specific language governing permissions and limitations
 // under the License.
 
-package org.apache.doris.nereids.rules.expression.rules;
+package org.apache.doris.nereids.rules.expression;
 
-import org.apache.doris.nereids.rules.expression.ExpressionPatternMatcher;
-import org.apache.doris.nereids.rules.expression.ExpressionPatternRuleFactory;
-import org.apache.doris.nereids.rules.expression.ExpressionRuleType;
-import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.rules.expression.rules.MedianConvert;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Median;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Percentile;
 import org.apache.doris.nereids.trees.expressions.literal.DoubleLiteral;
+import org.apache.doris.nereids.types.DoubleType;
 
 import com.google.common.collect.ImmutableList;
+import org.junit.jupiter.api.Test;
 
-import java.util.List;
-
-/**
- * median(col) -> percentile(col, 0.5)
- */
-public class MedianConvert implements ExpressionPatternRuleFactory {
-    public static MedianConvert INSTANCE = new MedianConvert();
-
-    @Override
-    public List<ExpressionPatternMatcher<? extends Expression>> buildRules() {
-        return ImmutableList.of(
-                matchesType(Median.class).then(median ->
-                    new Percentile(median.child(0), DoubleLiteral.of(0.5))
-                ).toRule(ExpressionRuleType.MEDIAN_CONVERT)
-        );
+class MedianConvertBackportTest extends ExpressionRewriteTestHelper {
+    @Test
+    void preservesDistinctAndNonDistinctMedian() {
+        executor = new 
ExpressionRuleExecutor(ImmutableList.of(bottomUp(MedianConvert.INSTANCE)));
+        SlotReference input = new SlotReference("value", DoubleType.INSTANCE);
+        assertRewrite(new Median(true, input), new Percentile(true, input, 
DoubleLiteral.of(0.5)));
+        assertRewrite(new Median(false, input), new Percentile(false, input, 
DoubleLiteral.of(0.5)));
     }
 }
diff --git 
a/regression-test/data/nereids_rules_p0/expression/test_convert_median_to_percentile.out
 
b/regression-test/data/nereids_rules_p0/expression/test_convert_median_to_percentile.out
index 3cccc3d6fb0..43e5deec56b 100644
--- 
a/regression-test/data/nereids_rules_p0/expression/test_convert_median_to_percentile.out
+++ 
b/regression-test/data/nereids_rules_p0/expression/test_convert_median_to_percentile.out
@@ -19,3 +19,6 @@
 -- !select_6 --
 2001   125.5
 
+-- !median_distinct --
+5.5    1
+
diff --git 
a/regression-test/suites/nereids_rules_p0/expression/test_convert_median_to_percentile.groovy
 
b/regression-test/suites/nereids_rules_p0/expression/test_convert_median_to_percentile.groovy
index 2d8cf3a8b59..11c03bb37cd 100644
--- 
a/regression-test/suites/nereids_rules_p0/expression/test_convert_median_to_percentile.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/expression/test_convert_median_to_percentile.groovy
@@ -73,6 +73,19 @@ suite("test_convert_median_to_percentile") {
     qt_select_5 "${sql5}"
     qt_select_6 "${sql6}"
 
+    sql "DROP TABLE IF EXISTS median_distinct"
+    sql """
+        CREATE TABLE median_distinct (
+            id INT,
+            value INT
+        )
+        DISTRIBUTED BY HASH(id) BUCKETS 1
+        PROPERTIES ("replication_num" = "1")
+    """
+    sql "INSERT INTO median_distinct VALUES (1, 1), (2, 1), (3, 10)"
+    order_qt_median_distinct "SELECT median(DISTINCT value), median(value) 
FROM median_distinct"
+    sql "DROP TABLE IF EXISTS median_distinct"
+
     sql "DROP TABLE if exists sales"
     sql "DROP DATABASE if exists test_convert_median_to_percentile"
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to