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
commit 556ba3027f9e721ff2e98dba9308ff34e1d5a5e1
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Sep 10 09:01:14 2026 +0800
branch-4.1: [fix](rbo) Preserve nullability in distinct window rewrites
#67666 (#67721)
Cherry-picked from #67666
Co-authored-by: morrySnow <[email protected]>
---
.../rules/rewrite/DistinctWindowExpression.java | 6 ++--
.../multi_distinct/multi_distinct_window.out | 8 +++++
.../multi_distinct/multi_distinct_window.groovy | 38 ++++++++++++++++++++++
3 files changed, 48 insertions(+), 4 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DistinctWindowExpression.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DistinctWindowExpression.java
index fd75e5382fc..28df6bbad64 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DistinctWindowExpression.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DistinctWindowExpression.java
@@ -27,8 +27,6 @@ import
org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunctio
import org.apache.doris.nereids.trees.expressions.functions.agg.Count;
import org.apache.doris.nereids.trees.expressions.functions.agg.GroupConcat;
import
org.apache.doris.nereids.trees.expressions.functions.agg.MultiDistinctCount;
-import
org.apache.doris.nereids.trees.expressions.functions.agg.MultiDistinctGroupConcat;
-import
org.apache.doris.nereids.trees.expressions.functions.agg.MultiDistinctSum;
import org.apache.doris.nereids.trees.expressions.functions.agg.Sum;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.logical.LogicalWindow;
@@ -92,9 +90,9 @@ public class DistinctWindowExpression extends
OneRewriteRuleFactory {
}
return Optional.of(new MultiDistinctCount(false,
func.child(0)));
} else if (func instanceof Sum) {
- return Optional.of(new MultiDistinctSum(false, ((Sum)
func).child()));
+ return Optional.of(((Sum) func).convertToMultiDistinct());
} else if (func instanceof GroupConcat) {
- return Optional.of(new MultiDistinctGroupConcat(false,
func.children()));
+ return Optional.of(((GroupConcat)
func).convertToMultiDistinct());
}
}
return Optional.empty();
diff --git
a/regression-test/data/nereids_p0/multi_distinct/multi_distinct_window.out
b/regression-test/data/nereids_p0/multi_distinct/multi_distinct_window.out
index f742696436a..57e864865f6 100644
--- a/regression-test/data/nereids_p0/multi_distinct/multi_distinct_window.out
+++ b/regression-test/data/nereids_p0/multi_distinct/multi_distinct_window.out
@@ -29,3 +29,11 @@
2 2 a
3 2 a
+-- !sum_empty_frame --
+1 \N \N 0
+2 10 10 1
+
+-- !group_concat_empty_frame --
+1 \N \N
+2 a a
+
diff --git
a/regression-test/suites/nereids_p0/multi_distinct/multi_distinct_window.groovy
b/regression-test/suites/nereids_p0/multi_distinct/multi_distinct_window.groovy
index a91cc74ef32..78fce086587 100644
---
a/regression-test/suites/nereids_p0/multi_distinct/multi_distinct_window.groovy
+++
b/regression-test/suites/nereids_p0/multi_distinct/multi_distinct_window.groovy
@@ -32,6 +32,22 @@ suite('multi_distinct_window') {
insert into multi values (1, 2, 'a'),(1, 2, 'a'), (2, 2, 'a'), (3, 2, 'a');
"""
+ sql """
+ drop table if exists multi_not_null;
+ CREATE TABLE multi_not_null (
+ id int NOT NULL,
+ v1 int NOT NULL,
+ v2 varchar NOT NULL
+ ) ENGINE = OLAP
+ DUPLICATE KEY(id) COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(id) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1"
+ );
+
+ insert into multi_not_null values (1, 10, 'a'), (2, 20, 'b');
+ """
+
qt_count "select id, count(distinct v1) over() from multi order by id;"
qt_count_partition "select id, v1, count(distinct v1) over(partition by
id) from multi order by id;"
@@ -42,6 +58,28 @@ suite('multi_distinct_window') {
qt_distinct_group_concat "select id, v1, group_concat(distinct v2) over()
from multi order by id;"
+ qt_sum_empty_frame """
+ select id,
+ sum(distinct v1) over (
+ order by id rows between 1 preceding and 1 preceding),
+ multi_distinct_sum(v1) over (
+ order by id rows between 1 preceding and 1 preceding),
+ count(distinct v1) over (
+ order by id rows between 1 preceding and 1 preceding)
+ from multi_not_null
+ order by id;
+ """
+
+ qt_group_concat_empty_frame """
+ select id,
+ group_concat(distinct v2) over (
+ order by id rows between 1 preceding and 1 preceding),
+ multi_distinct_group_concat(v2) over (
+ order by id rows between 1 preceding and 1 preceding)
+ from multi_not_null
+ order by id;
+ """
+
test {
sql """select id, count(distinct v1, v2) over() from multi order by
id;"""
exception "COUNT with DISTINCT only support 1 parameter in analytic
function"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]