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