diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java index 1b6b26077f..67dd0e68a3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java @@ -40,6 +40,7 @@ import org.apache.doris.nereids.trees.expressions.SlotNotFromChildren; import org.apache.doris.nereids.trees.expressions.SlotReference; import org.apache.doris.nereids.trees.expressions.VirtualSlotReference; import org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction; +import org.apache.doris.nereids.trees.expressions.functions.agg.BitmapUnion; import org.apache.doris.nereids.trees.expressions.functions.agg.BitmapUnionCount; import org.apache.doris.nereids.trees.expressions.functions.agg.Count; import org.apache.doris.nereids.trees.expressions.functions.agg.HllUnion; @@ -882,6 +883,20 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial } } + @Override + public PreAggStatus visitBitmapUnion(BitmapUnion bitmapUnion, CheckContext context) { + Expression expr = bitmapUnion.child(); + if (expr instanceof ToBitmap) { + expr = expr.child(0); + } + Optional slotOpt = ExpressionUtils.extractSlotOrCastOnSlot(expr); + if (slotOpt.isPresent() && context.valueNameToColumn.containsKey(normalizeName(slotOpt.get().toSql()))) { + return PreAggStatus.on(); + } else { + return PreAggStatus.off("invalid bitmap_union: " + bitmapUnion.toSql()); + } + } + @Override public PreAggStatus visitHllUnionAgg(HllUnionAgg hllUnionAgg, CheckContext context) { Optional slotOpt = ExpressionUtils.extractSlotOrCastOnSlot(hllUnionAgg.child()); @@ -892,6 +907,16 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial } } + @Override + public PreAggStatus visitHllUnion(HllUnion hllUnion, CheckContext context) { + Optional slotOpt = ExpressionUtils.extractSlotOrCastOnSlot(hllUnion.child()); + if (slotOpt.isPresent() && context.valueNameToColumn.containsKey(normalizeName(slotOpt.get().toSql()))) { + return PreAggStatus.on(); + } else { + return PreAggStatus.off("invalid hll_union: " + hllUnion.toSql()); + } + } + private PreAggStatus checkAggFunc( AggregateFunction aggFunc, AggregateType matchingAggType, diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index c17d38718e..9e72058a8d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -2186,11 +2186,11 @@ public class QueryPlanTest extends TestWithFeService { + " \"replication_num\" = \"1\"\n" + ");"); - String queryBaseTableStr = "explain select /*+ SET_VAR(enable_nereids_planner=false) */ id,id2,orthogonal_bitmap_union_count(id3) from test.bitmap_tb t1 group by id,id2"; + String queryBaseTableStr = "explain select id,id2,orthogonal_bitmap_union_count(id3) from test.bitmap_tb t1 group by id,id2"; String explainString1 = getSQLPlanOrErrorMsg(queryBaseTableStr); Assert.assertTrue(explainString1.contains("PREAGGREGATION: ON")); - String queryTableStr = "explain select /*+ SET_VAR(enable_nereids_planner=false) */ id,orthogonal_bitmap_union_count(id3) from test.bitmap_tb t1 group by id"; + String queryTableStr = "explain select id,orthogonal_bitmap_union_count(id3) from test.bitmap_tb t1 group by id"; String explainString2 = getSQLPlanOrErrorMsg(queryTableStr); Assert.assertTrue(explainString2.contains("PREAGGREGATION: ON")); } @@ -2213,7 +2213,7 @@ public class QueryPlanTest extends TestWithFeService { + " \"in_memory\"=\"false\"\n" + ");"); - String queryBaseTableStr = "explain select /*+ SET_VAR(enable_nereids_planner=false) */ dt, hll_union(pv) from test.test_hll group by dt"; + String queryBaseTableStr = "explain select dt, hll_union(pv) from test.test_hll group by dt"; String explainString = getSQLPlanOrErrorMsg(queryBaseTableStr); Assert.assertTrue(explainString.contains("PREAGGREGATION: ON")); }