You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2025/12/17 06:58:35 UTC

(doris) branch branch-4.0 updated: branch-4.0: [fix](mtmv) Fix query rewrite by mv fail when both use cte and group sets #57741 (#58994)

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

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


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 10666f21b9c branch-4.0: [fix](mtmv) Fix query rewrite by mv fail when both use cte and group sets #57741 (#58994)
10666f21b9c is described below

commit 10666f21b9cd781e0899051dc28a88e46668879a
Author: github-actions[bot] <41...@users.noreply.github.com>
AuthorDate: Wed Dec 17 14:58:27 2025 +0800

    branch-4.0: [fix](mtmv) Fix query rewrite by mv fail when both use cte and group sets #57741 (#58994)
    
    Cherry-picked from #57741
    
    Co-authored-by: seawinde <wu...@selectdb.com>
---
 .../nereids/rules/analysis/NormalizeRepeat.java    |  48 +++---
 .../mv/AbstractMaterializedViewAggregateRule.java  |   6 +-
 .../mv/MaterializedViewFilterAggregateRule.java    |   7 +-
 ...MaterializedViewFilterProjectAggregateRule.java |   5 +-
 ...MaterializedViewProjectFilterAggregateRule.java |  14 +-
 .../mv/grouping_sets/grouping_sets.out             |  60 ++++++++
 .../mv/grouping_sets/grouping_sets.groovy          | 168 ++++++++++++++++++++-
 7 files changed, 279 insertions(+), 29 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java
index 319e8209771..a294e128201 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java
@@ -63,24 +63,29 @@ import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
 /** NormalizeRepeat
- * eg: select sum(b + 1), grouping(a+1) from t1 group by grouping sets ((b+1));
+ * eg: SELECT
+ *      camp,
+ *      COUNT(occupation) AS occ_cnt,
+ *      GROUPING(camp) AS grouping
+ *     FROM
+ *      `roles`
+ *      GROUP BY ROLLUP(camp);
  * Original Plan:
- * LogicalRepeat ( groupingSets=[[(a#0 + 1)]],
- *                 outputExpressions=[sum((b#1 + 1)) AS `sum((b + 1))`#2,
- *                 Grouping((a#0 + 1)) AS `Grouping((a + 1))`#3] )
- *      +--LogicalOlapScan (t1)
- *
+ * LogicalRepeat ( groupingSets=[[camp#2], []], outputExpressions=[camp#2,
+ *                  count(occupation#1) AS `occ_cnt`#6, Grouping(camp#2) AS `grouping`#7], groupingId=Optional.empty )
+ *  +--LogicalFilter[10] ( predicates=(__DORIS_DELETE_SIGN__#4 = 0) )
+ *      +--LogicalOlapScan ( qualified=roles, indexName=index_not_selected, selectedIndexId=1765187322191,
+ *                              preAgg=UNSET, operativeCol=[], virtualColumns=[] )
  * After:
- * LogicalAggregate[62] ( groupByExpr=[(a + 1)#4, GROUPING_ID#7, GROUPING_PREFIX_(a + 1)#6],
- *                        outputExpr=[sum((b + 1)#5) AS `sum((b + 1))`#2,
- *                                    GROUPING_PREFIX_(a + 1)#6 AS `GROUPING_PREFIX_(a + 1)`#3] )
- *    +--LogicalRepeat ( groupingSets=[[(a + 1)#4]],
- *                       outputExpressions=[(a + 1)#4,
- *                                          (b + 1)#5,
- *                                          GROUPING_ID#7,
- *                                          GROUPING_PREFIX_(a + 1)#6] )
- *      +--LogicalProject[60] ( projects=[(a#0 + 1) AS `(a + 1)`#4, (b#1 + 1) AS `(b + 1)`#5], excepts=[]
- *          +--LogicalOlapScan ( t1 )
+ * LogicalAggregate[19] ( groupByExpr=[camp#2, GROUPING_PREFIX_camp#8, GROUPING_ID#9],
+ *                          outputExpr=[camp#2, count(occupation#1) AS `occ_cnt`#6,
+ *                              GROUPING_PREFIX_camp#8 AS `grouping`#7], hasRepeat=true )
+ *  +--LogicalRepeat ( groupingSets=[[camp#2], []], outputExpressions=[camp#2, occupation#1,
+ *                              Grouping(camp#2) AS `GROUPING_PREFIX_camp`#8], groupingId=Optional[GROUPING_ID#9] )
+ *      +--LogicalProject[17] ( distinct=false, projects=[camp#2, occupation#1] )
+ *          +--LogicalFilter[10] ( predicates=(__DORIS_DELETE_SIGN__#4 = 0) )
+ *              +--LogicalOlapScan ( qualified=roles, indexName=index_not_selected,
+ *                                  selectedIndexId=1765187322191, preAgg=UNSET, operativeCol=[], virtualColumns=[] )
  */
 public class NormalizeRepeat extends OneAnalysisRuleFactory {
     @Override
@@ -198,7 +203,16 @@ public class NormalizeRepeat extends OneAnalysisRuleFactory {
 
         Plan normalizedChild = pushDownProject(pushedProject, repeat.child());
 
-        SlotReference groupingId = new SlotReference(Repeat.COL_GROUPING_ID, BigIntType.INSTANCE, false);
+        // If grouping id is not present, we need to add it, if repeat already has grouping id, use it directly
+        // which is for the case repeat is introduced by mv rewrite, should keep the rewritten grouping id
+        // is same to the original grouping id
+        SlotReference groupingId = repeat.getGroupingId().orElse(
+                new SlotReference(Repeat.COL_GROUPING_ID, BigIntType.INSTANCE, false));
+        // remove grouping id from repeat output expressions, grouping id should not in repeat output
+        // this keep consistent with original repeat behavior
+        normalizedRepeatOutput = normalizedRepeatOutput.stream()
+                .filter(expr -> !expr.equals(groupingId))
+                .collect(Collectors.toList());
         LogicalRepeat<Plan> normalizedRepeat = repeat.withNormalizedExpr(
                 (List) normalizedGroupingSets, normalizedRepeatOutput, groupingId, normalizedChild);
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewAggregateRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewAggregateRule.java
index 6f85ea76ad3..87ddc7a0ca5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewAggregateRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewAggregateRule.java
@@ -240,7 +240,9 @@ public abstract class AbstractMaterializedViewAggregateRule extends AbstractMate
         if (queryAggregate.getSourceRepeat().isPresent()) {
             // construct group sets for repeat
             List<List<Expression>> rewrittenGroupSetsExpressions = new ArrayList<>();
-            List<List<Expression>> groupingSets = queryAggregate.getSourceRepeat().get().getGroupingSets();
+            List<List<Expression>> groupingSets = queryAggregate.collectFirst(LogicalRepeat.class::isInstance)
+                    .map(repeat -> ((LogicalRepeat<? extends Plan>) repeat).getGroupingSets())
+                    .orElse(queryAggregate.getSourceRepeat().get().getGroupingSets());
             for (List<Expression> groupingSet : groupingSets) {
                 if (groupingSet.isEmpty()) {
                     rewrittenGroupSetsExpressions.add(ImmutableList.of());
@@ -262,7 +264,7 @@ public abstract class AbstractMaterializedViewAggregateRule extends AbstractMate
                 }
             }
             LogicalRepeat<Plan> repeat = new LogicalRepeat<>(rewrittenGroupSetsExpressions,
-                    finalOutputExpressions, tempRewritedPlan);
+                    finalOutputExpressions, queryStructInfo.getGroupingId().get(), tempRewritedPlan);
             return NormalizeRepeat.doNormalize(repeat);
         }
         return new LogicalAggregate<>(finalGroupExpressions, finalOutputExpressions, tempRewritedPlan);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterAggregateRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterAggregateRule.java
index 10b7aa5e84d..768faf99838 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterAggregateRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterAggregateRule.java
@@ -38,8 +38,11 @@ public class MaterializedViewFilterAggregateRule extends AbstractMaterializedVie
     @Override
     public List<Rule> buildRules() {
         return ImmutableList.of(
-                logicalFilter(logicalAggregate(any().when(LogicalPlan.class::isInstance))).thenApplyMultiNoThrow(
-                        ctx -> {
+                logicalFilter(logicalAggregate(any().when(LogicalPlan.class::isInstance))
+                        // Temporarily unsupported: do not rewrite when GROUP SETS is used together with HAVING.
+                        // Will be re-enabled after the fix is completed.
+                        .when(aggregate -> !aggregate.getSourceRepeat().isPresent()))
+                        .thenApplyMultiNoThrow(ctx -> {
                             LogicalFilter<LogicalAggregate<Plan>> root = ctx.root;
                             return rewrite(root, ctx.cascadesContext);
                         }).toRule(RuleType.MATERIALIZED_VIEW_FILTER_AGGREGATE));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterProjectAggregateRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterProjectAggregateRule.java
index eb7c9bf5f82..b568bb8c59d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterProjectAggregateRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewFilterProjectAggregateRule.java
@@ -40,7 +40,10 @@ public class MaterializedViewFilterProjectAggregateRule extends AbstractMaterial
     @Override
     public List<Rule> buildRules() {
         return ImmutableList.of(
-                logicalFilter(logicalProject(logicalAggregate(any().when(LogicalPlan.class::isInstance))))
+                logicalFilter(logicalProject(logicalAggregate(any().when(LogicalPlan.class::isInstance)).when(
+                        // Temporarily unsupported: do not rewrite when GROUP SETS is used together with HAVING.
+                        // Will be re-enabled after the fix is completed.
+                        aggregate -> !aggregate.getSourceRepeat().isPresent())))
                         .thenApplyMultiNoThrow(ctx -> {
                             LogicalFilter<LogicalProject<LogicalAggregate<Plan>>> root = ctx.root;
                             return rewrite(root, ctx.cascadesContext);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewProjectFilterAggregateRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewProjectFilterAggregateRule.java
index c83eedea2a1..782128d9af5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewProjectFilterAggregateRule.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/MaterializedViewProjectFilterAggregateRule.java
@@ -39,10 +39,14 @@ public class MaterializedViewProjectFilterAggregateRule extends AbstractMaterial
 
     @Override
     public List<Rule> buildRules() {
-        return ImmutableList.of(logicalProject(logicalFilter(logicalAggregate(
-                any().when(LogicalPlan.class::isInstance)))).thenApplyMultiNoThrow(ctx -> {
-                    LogicalProject<LogicalFilter<LogicalAggregate<Plan>>> root = ctx.root;
-                    return rewrite(root, ctx.cascadesContext);
-                }).toRule(RuleType.MATERIALIZED_VIEW_PROJECT_FILTER_AGGREGATE));
+        return ImmutableList.of(
+                logicalFilter(logicalProject(logicalAggregate(any().when(LogicalPlan.class::isInstance)).when(
+                        // Temporarily unsupported: do not rewrite when GROUP SETS is used together with HAVING.
+                        // Will be re-enabled after the fix is completed.
+                        aggregate -> !aggregate.getSourceRepeat().isPresent())))
+                        .thenApplyMultiNoThrow(ctx -> {
+                            LogicalFilter<LogicalProject<LogicalAggregate<Plan>>> root = ctx.root;
+                            return rewrite(root, ctx.cascadesContext);
+                        }).toRule(RuleType.MATERIALIZED_VIEW_FILTER_PROJECT_AGGREGATE));
     }
 }
diff --git a/regression-test/data/nereids_rules_p0/mv/grouping_sets/grouping_sets.out b/regression-test/data/nereids_rules_p0/mv/grouping_sets/grouping_sets.out
index 16e370a993d..91c3a80aa52 100644
--- a/regression-test/data/nereids_rules_p0/mv/grouping_sets/grouping_sets.out
+++ b/regression-test/data/nereids_rules_p0/mv/grouping_sets/grouping_sets.out
@@ -233,3 +233,63 @@ o	2023-12-10	a	46.00	33.50	12.50	2	\N
 o	2023-12-11	c	43.20	43.20	43.20	1	\N
 o	2023-12-12	c	57.40	56.20	1.20	2	\N
 
+-- !query15_0_before --
+\N	\N
+\N	2023-12-11
+3	\N
+3	2023-12-11
+
+-- !query15_0_after --
+\N	\N
+\N	2023-12-11
+3	\N
+3	2023-12-11
+
+-- !query16_0_before --
+\N	\N	\N	1	1	3	7	43.20	43.20	43.20	1	0
+\N	\N	2023-12-11	1	0	3	6	43.20	43.20	43.20	1	0
+\N	3	\N	0	1	2	5	43.20	43.20	43.20	1	0
+\N	3	2023-12-11	0	0	2	4	43.20	43.20	43.20	1	0
+3	\N	\N	1	1	1	3	43.20	43.20	43.20	1	0
+3	\N	2023-12-11	1	0	1	2	43.20	43.20	43.20	1	0
+3	3	\N	0	1	0	1	43.20	43.20	43.20	1	0
+3	3	2023-12-11	0	0	0	0	43.20	43.20	43.20	1	0
+
+-- !query16_0_after --
+\N	\N	\N	1	1	3	7	43.20	43.20	43.20	1	0
+\N	\N	2023-12-11	1	0	3	6	43.20	43.20	43.20	1	0
+\N	3	\N	0	1	2	5	43.20	43.20	43.20	1	0
+\N	3	2023-12-11	0	0	2	4	43.20	43.20	43.20	1	0
+3	\N	\N	1	1	1	3	43.20	43.20	43.20	1	0
+3	\N	2023-12-11	1	0	1	2	43.20	43.20	43.20	1	0
+3	3	\N	0	1	0	1	43.20	43.20	43.20	1	0
+3	3	2023-12-11	0	0	0	0	43.20	43.20	43.20	1	0
+
+-- !query17_before --
+\N	\N	\N	1	1	3	7	43.20	43.20	43.20	1	0
+\N	\N	2023-12-11	1	0	3	6	43.20	43.20	43.20	1	0
+3	\N	\N	1	1	1	3	43.20	43.20	43.20	1	0
+3	\N	2023-12-11	1	0	1	2	43.20	43.20	43.20	1	0
+
+-- !query17_after --
+\N	\N	\N	1	1	3	7	43.20	43.20	43.20	1	0
+\N	\N	2023-12-11	1	0	3	6	43.20	43.20	43.20	1	0
+3	\N	\N	1	1	1	3	43.20	43.20	43.20	1	0
+3	\N	2023-12-11	1	0	1	2	43.20	43.20	43.20	1	0
+
+-- !query18_before --
+\N	\N	\N	1	1	3	7	43.20	43.20	43.20	1	0
+\N	\N	2023-12-11	1	0	3	6	43.20	43.20	43.20	1	0
+\N	3	\N	0	1	2	5	43.20	43.20	43.20	1	0
+\N	3	2023-12-11	0	0	2	4	43.20	43.20	43.20	1	0
+3	\N	\N	1	1	1	3	43.20	43.20	43.20	1	0
+3	\N	2023-12-11	1	0	1	2	43.20	43.20	43.20	1	0
+
+-- !query18_after --
+\N	\N	\N	1	1	3	7	43.20	43.20	43.20	1	0
+\N	\N	2023-12-11	1	0	3	6	43.20	43.20	43.20	1	0
+\N	3	\N	0	1	2	5	43.20	43.20	43.20	1	0
+\N	3	2023-12-11	0	0	2	4	43.20	43.20	43.20	1	0
+3	\N	\N	1	1	1	3	43.20	43.20	43.20	1	0
+3	\N	2023-12-11	1	0	1	2	43.20	43.20	43.20	1	0
+
diff --git a/regression-test/suites/nereids_rules_p0/mv/grouping_sets/grouping_sets.groovy b/regression-test/suites/nereids_rules_p0/mv/grouping_sets/grouping_sets.groovy
index 8f1608f7ca2..f01ab7847c8 100644
--- a/regression-test/suites/nereids_rules_p0/mv/grouping_sets/grouping_sets.groovy
+++ b/regression-test/suites/nereids_rules_p0/mv/grouping_sets/grouping_sets.groovy
@@ -474,7 +474,6 @@ suite("materialized_view_grouping_sets") {
     order_qt_query10_0_after "${query10_0}"
     sql """ DROP MATERIALIZED VIEW IF EXISTS mv10_0"""
 
-
     // single table rollup with grouping scalar function and filter
     def mv10_1 =
             """
@@ -510,7 +509,6 @@ suite("materialized_view_grouping_sets") {
     order_qt_query10_1_after "${query10_1}"
     sql """ DROP MATERIALIZED VIEW IF EXISTS mv10_1"""
 
-
     // multi table rollup without grouping scalar function
     def mv11_0 =
             """
@@ -648,5 +646,171 @@ suite("materialized_view_grouping_sets") {
     async_mv_rewrite_fail(db, mv14_0, query14_0, "mv14_0")
     order_qt_query14_0_after "${query14_0}"
     sql """ DROP MATERIALIZED VIEW IF EXISTS mv14_0"""
+
+    // group sets with cte
+    def mv15_0 =
+            """
+            select l_shipdate, o_orderdate, l_partkey, l_suppkey,
+            sum(o_totalprice) as sum_total,
+            max(o_totalprice) as max_total,
+            min(o_totalprice) as min_total,
+            count(*) as count_all,
+            bitmap_union(to_bitmap(case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)) as bitmap_union_basic
+            from lineitem
+            left join orders on lineitem.l_orderkey = orders.o_orderkey and l_shipdate = o_orderdate
+            group by
+            l_shipdate,
+            o_orderdate,
+            l_partkey,
+            l_suppkey;
+            """
+    def query15_0 =
+            """
+            with t as (
+                select t1.l_partkey, t1.l_suppkey, o_orderdate,
+                grouping(t1.l_suppkey),
+                grouping(o_orderdate),
+                grouping_id(t1.l_partkey, t1.l_suppkey),
+                grouping_id(t1.l_partkey, t1.l_suppkey, o_orderdate),
+                sum(o_totalprice),
+                max(o_totalprice),
+                min(o_totalprice),
+                count(*),
+                count(distinct case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)
+                from (select * from lineitem where l_shipdate = '2023-12-11') t1
+                left join orders on t1.l_orderkey = orders.o_orderkey and t1.l_shipdate = o_orderdate
+                group by
+                GROUPING SETS ((l_shipdate, o_orderdate, l_partkey), (l_partkey, l_suppkey), (l_suppkey), ())
+            )
+            select t1.l_suppkey, t2.o_orderdate
+            from
+            t t1
+            inner join
+            t t2 on t1.l_partkey = t2.l_partkey;
+            """
+    order_qt_query15_0_before "${query15_0}"
+    async_mv_rewrite_success(db, mv15_0, query15_0, "mv15_0")
+    order_qt_query15_0_after "${query15_0}"
+    sql """ DROP MATERIALIZED VIEW IF EXISTS mv15_0"""
+
+    // group sets with alias and the alias is grouping id
+    def mv16_0 =
+            """
+            select l_shipdate, o_orderdate, l_partkey, l_suppkey,
+            sum(o_totalprice) as sum_total,
+            max(o_totalprice) as max_total,
+            min(o_totalprice) as min_total,
+            count(*) as count_all,
+            bitmap_union(to_bitmap(case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)) as bitmap_union_basic
+            from lineitem
+            left join orders on lineitem.l_orderkey = orders.o_orderkey and l_shipdate = o_orderdate
+            group by
+            l_shipdate,
+            o_orderdate,
+            l_partkey,
+            l_suppkey;
+            """
+    def query16_0 =
+            """
+            select t1.l_partkey as p_alias, t1.l_suppkey as s_alias, o_orderdate,
+            grouping(t1.l_suppkey),
+            grouping(o_orderdate),
+            grouping_id(t1.l_partkey, t1.l_suppkey),
+            grouping_id(t1.l_partkey, t1.l_suppkey, o_orderdate),
+            sum(o_totalprice),
+            max(o_totalprice),
+            min(o_totalprice),
+            count(*),
+            count(distinct case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)
+            from (select * from lineitem where l_shipdate = '2023-12-11') t1
+            left join orders on t1.l_orderkey = orders.o_orderkey and t1.l_shipdate = o_orderdate
+            group by
+            CUBE (t1.l_partkey, t1.l_suppkey, o_orderdate);
+            """
+    order_qt_query16_0_before "${query16_0}"
+    async_mv_rewrite_success(db, mv16_0, query16_0, "mv16_0")
+    order_qt_query16_0_after "${query16_0}"
+    sql """ DROP MATERIALIZED VIEW IF EXISTS mv16_0"""
+
+    // group sets with alias and the alias is grouping id and query has filter on column
+    def mv17 =
+            """
+            select l_shipdate, o_orderdate, l_partkey, l_suppkey,
+            sum(o_totalprice) as sum_total,
+            max(o_totalprice) as max_total,
+            min(o_totalprice) as min_total,
+            count(*) as count_all,
+            bitmap_union(to_bitmap(case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)) as bitmap_union_basic
+            from lineitem
+            left join orders on lineitem.l_orderkey = orders.o_orderkey and l_shipdate = o_orderdate
+            group by
+            l_shipdate,
+            o_orderdate,
+            l_partkey,
+            l_suppkey;
+            """
+    def query17 =
+            """
+            select t1.l_partkey as p_alias, t1.l_suppkey as s_alias, o_orderdate,
+            grouping(t1.l_suppkey),
+            grouping(o_orderdate),
+            grouping_id(t1.l_partkey, t1.l_suppkey),
+            grouping_id(t1.l_partkey, t1.l_suppkey, o_orderdate),
+            sum(o_totalprice),
+            max(o_totalprice),
+            min(o_totalprice),
+            count(*),
+            count(distinct case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)
+            from (select * from lineitem where l_shipdate = '2023-12-11') t1
+            left join orders on t1.l_orderkey = orders.o_orderkey and t1.l_shipdate = o_orderdate
+            group by
+            CUBE (t1.l_partkey, t1.l_suppkey, o_orderdate)
+            having grouping(t1.l_suppkey) >= 1;
+            """
+    order_qt_query17_before "${query17}"
+    async_mv_rewrite_success(db, mv17, query17, "mv17")
+    order_qt_query17_after "${query17}"
+    sql """ DROP MATERIALIZED VIEW IF EXISTS mv17"""
+
+
+    // group sets with alias and the alias is grouping id and query has filter on column
+    def mv18 =
+            """
+            select l_shipdate, o_orderdate, l_partkey, l_suppkey,
+            sum(o_totalprice) as sum_total,
+            max(o_totalprice) as max_total,
+            min(o_totalprice) as min_total,
+            count(*) as count_all,
+            bitmap_union(to_bitmap(case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)) as bitmap_union_basic
+            from lineitem
+            left join orders on lineitem.l_orderkey = orders.o_orderkey and l_shipdate = o_orderdate
+            group by
+            l_shipdate,
+            o_orderdate,
+            l_partkey,
+            l_suppkey;
+            """
+    def query18 =
+            """
+            select t1.l_partkey as p_alias, t1.l_suppkey as s_alias, o_orderdate,
+            grouping(t1.l_suppkey),
+            grouping(o_orderdate),
+            grouping_id(t1.l_partkey, t1.l_suppkey),
+            grouping_id(t1.l_partkey, t1.l_suppkey, o_orderdate),
+            sum(o_totalprice),
+            max(o_totalprice),
+            min(o_totalprice),
+            count(*),
+            count(distinct case when o_shippriority > 1 and o_orderkey IN (1, 3) then o_custkey else null end)
+            from (select * from lineitem where l_shipdate = '2023-12-11') t1
+            left join orders on t1.l_orderkey = orders.o_orderkey and t1.l_shipdate = o_orderdate
+            group by
+            CUBE (t1.l_partkey, t1.l_suppkey, o_orderdate)
+            having grouping_id(t1.l_partkey, t1.l_suppkey) >= 1;
+            """
+    order_qt_query18_before "${query18}"
+    async_mv_rewrite_success(db, mv18, query18, "mv18")
+    order_qt_query18_after "${query18}"
+    sql """ DROP MATERIALIZED VIEW IF EXISTS mv18"""
 }
 


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