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]