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

englefly pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 2dd96898ebd [fix](nereids) fix LogicalRepeat compute equalset (#47737)
2dd96898ebd is described below

commit 2dd96898ebdd217bd2fcaec58fd81740160e7415
Author: feiniaofeiafei <moail...@selectdb.com>
AuthorDate: Fri Feb 21 20:38:04 2025 +0800

    [fix](nereids) fix LogicalRepeat compute equalset (#47737)
    
    ### What problem does this PR solve?
    
    Issue Number: close #xxx
    
    Related PR: #xxx
    
    Problem Summary:
    This PR addresses an issue where LogicalRepeat should not propagate
    equalset because, in scenarios involving group by cube(a, b) with a = b,
    LogicalRepeat generates four rows (e.g., when a = b = 3, the rows are
    (3,3), (3,null), (null,3), and (null,null)), which breaks the equalset
    relationship a = b. To resolve this, the equalset slots are now retained
    only when they are part of the common set of LogicalRepeat's group by
    keys. This ensures the integrity of equalset is maintained during group
    by cube operations, preventing incorrect query results.
---
 .../org/apache/doris/nereids/properties/DataTrait.java  |   4 ++++
 .../nereids/trees/plans/logical/LogicalRepeat.java      |  11 +++++++++++
 .../nereids/rules/rewrite/EliminateGroupByKeyTest.java  |  15 +++++++++++++++
 .../eliminate_gby_key/eliminate_gby_key.out             | Bin 128 -> 204 bytes
 .../eliminate_gby_key/eliminate_gby_key.groovy          |   2 ++
 5 files changed, 32 insertions(+)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/DataTrait.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/DataTrait.java
index 9ef4e835108..156a57d5b00 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/DataTrait.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/properties/DataTrait.java
@@ -366,6 +366,10 @@ public class DataTrait {
             fdDgBuilder.removeNotContain(outputSlots);
         }
 
+        public void pruneEqualSetSlots(Set<Slot> outputSlots) {
+            equalSetBuilder.removeNotContain(outputSlots);
+        }
+
         public void replaceUniformBy(Map<Slot, Slot> replaceMap) {
             uniformSet.replace(replaceMap);
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java
index 6773c1c1a96..23c8be7417c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalRepeat.java
@@ -34,9 +34,11 @@ import org.apache.doris.nereids.util.Utils;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * LogicalRepeat.
@@ -196,7 +198,16 @@ public class LogicalRepeat<CHILD_TYPE extends Plan> 
extends LogicalUnary<CHILD_T
 
     @Override
     public void computeEqualSet(DataTrait.Builder builder) {
+        Set<Expression> common = getCommonGroupingSetExpressions();
+        Set<Slot> slots = new HashSet<>();
+        for (Expression expr : common) {
+            if (!(expr instanceof Slot)) {
+                return;
+            }
+            slots.add((Slot) expr);
+        }
         builder.addEqualSet(child().getLogicalProperties().getTrait());
+        builder.pruneEqualSetSlots(slots);
     }
 
     @Override
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByKeyTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByKeyTest.java
index 103e074c73b..7362c81e5af 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByKeyTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/EliminateGroupByKeyTest.java
@@ -56,6 +56,7 @@ class EliminateGroupByKeyTest extends TestWithFeService 
implements MemoPatternMa
                 + "UNIQUE KEY(id)\n"
                 + "distributed by hash(id) buckets 10\n"
                 + "properties('replication_num' = '1');");
+        createTable("create table test.eli_gbk_t(a int, b int) distributed by 
hash(a) properties('replication_num'='1');");
         connectContext.setDatabase("test");
         
connectContext.getSessionVariable().setDisableNereidsRules("PRUNE_EMPTY_PARTITION");
     }
@@ -179,4 +180,18 @@ class EliminateGroupByKeyTest extends TestWithFeService 
implements MemoPatternMa
                         agg.getGroupByExpressions().size() == 1
                                 && 
agg.getGroupByExpressions().get(0).toSql().equals("name")));
     }
+
+    @Test
+    void testRepeatEliminateByEqual() {
+        PlanChecker.from(connectContext)
+                .analyze("select count(1) from (select a,b from eli_gbk_t 
where a=b group by grouping sets((a,b),(b,a))) t group by a,b;")
+                .rewrite()
+                .printlnTree()
+                .matches(logicalAggregate().when(agg -> 
agg.getGroupByExpressions().size() == 1));
+        PlanChecker.from(connectContext)
+                .analyze("select count(1) from (select a,b from eli_gbk_t 
where a=b group by cube(a,b)) t group by a,b;")
+                .rewrite()
+                .printlnTree()
+                .matches(logicalAggregate().when(agg -> 
agg.getGroupByExpressions().size() == 2));
+    }
 }
diff --git 
a/regression-test/data/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.out 
b/regression-test/data/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.out
index 1ee4ca86f6d..ba3fbff56df 100644
Binary files 
a/regression-test/data/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.out 
and 
b/regression-test/data/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.out 
differ
diff --git 
a/regression-test/suites/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.groovy
 
b/regression-test/suites/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.groovy
index d8370318d8d..0fa49496708 100644
--- 
a/regression-test/suites/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.groovy
+++ 
b/regression-test/suites/nereids_rules_p0/eliminate_gby_key/eliminate_gby_key.groovy
@@ -291,4 +291,6 @@ suite("eliminate_gby_key") {
        sql "create table eli_gbk_t(a int, b int) distributed by hash(a) 
properties('replication_num'='1');"
        sql "insert into eli_gbk_t values(1,1),(2,1),(3,1);"
        qt_grouping """select count(1) from (select b as k, a k3, sum(b) as 
sum_k1 from  eli_gbk_t where b=1 group by cube(k,a)) t group by k,k3 order by 
1"""
+       qt_grouping_equalset """select count(1) from (select a,b from eli_gbk_t 
where a=b group by cube(a,b)) t group by a,b;"""
+       qt_grouping_equalset_can_eliminate """select count(1) from (select a,b 
from eli_gbk_t where a=b group by grouping sets((a,b),(b,a))) t group by a,b;"""
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to