From 16890260f7b416917aea1e5a02df405791edc48f Mon Sep 17 00:00:00 2001 From: BiteTheDDDDt Date: Tue, 31 Oct 2023 11:29:48 +0800 Subject: [PATCH 1/2] SelectMaterializedIndexWithAggregate do not change plan when match base index --- .../SelectMaterializedIndexWithAggregate.java | 40 +++++++++++++++++++ .../testProjectionMV1/testProjectionMV1.out | 8 ++++ .../testProjectionMV1.groovy | 12 ++++++ 3 files changed, 60 insertions(+) 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 12fe7b75c9ca14..4c3179c29033c8 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 @@ -116,6 +116,10 @@ public List buildRules() { agg.getGroupByExpressions(), new HashSet<>(agg.getExpressions())); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -162,6 +166,10 @@ public List buildRules() { requiredExpr ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -207,6 +215,10 @@ public List buildRules() { collectRequireExprWithAggAndProject(agg.getExpressions(), project.getProjects()) ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -265,6 +277,10 @@ public List buildRules() { requiredExpr ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -322,6 +338,10 @@ public List buildRules() { requiredExpr ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -369,6 +389,10 @@ public List buildRules() { nonVirtualGroupByExprs(agg), new HashSet<>(agg.getExpressions())); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -422,6 +446,10 @@ public List buildRules() { requiredExpr ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -474,6 +502,10 @@ public List buildRules() { collectRequireExprWithAggAndProject(agg.getExpressions(), project.getProjects()) ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -539,6 +571,10 @@ public List buildRules() { requiredExpr ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); @@ -605,6 +641,10 @@ public List buildRules() { requiredExpr ); + if (result.indexId == scan.getTable().getBaseIndexId()) { + return ctx.root; + } + LogicalOlapScan mvPlan = scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId); SlotContext slotContext = generateBaseScanExprToMvExpr(mvPlan); diff --git a/regression-test/data/mv_p0/ut/testProjectionMV1/testProjectionMV1.out b/regression-test/data/mv_p0/ut/testProjectionMV1/testProjectionMV1.out index ba455b7e850d3c..523176bb0a5fdd 100644 --- a/regression-test/data/mv_p0/ut/testProjectionMV1/testProjectionMV1.out +++ b/regression-test/data/mv_p0/ut/testProjectionMV1/testProjectionMV1.out @@ -9,3 +9,11 @@ 1 1 2 2 +-- !select_mv -- +1 2 +2 2 + +-- !select_mv -- +1 2 +2 2 + diff --git a/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy b/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy index c23b533832f2c0..4104cc08732556 100644 --- a/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy +++ b/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy @@ -50,4 +50,16 @@ suite ("testProjectionMV1") { contains "(emps_mv)" } qt_select_mv "select empid, deptno from emps order by empid;" + + explain { + sql("select empid, sum(deptno) from emps group by empid order by empid;") + contains "(emps_mv)" + } + qt_select_mv "select empid, sum(deptno) from emps group by empid order by empid;" + + explain { + sql("select deptno, sum(empid) from emps group by deptno order by deptno;") + contains "(emps_mv)" + } + qt_select_mv "select deptno, sum(empid) from emps group by deptno order by deptno;" } From b6acc97c367af4b40ecf492cf72df258d09b0b98 Mon Sep 17 00:00:00 2001 From: BiteTheDDDDt Date: Tue, 31 Oct 2023 11:52:00 +0800 Subject: [PATCH 2/2] forbid table withh alias --- .../apache/doris/analysis/CreateMaterializedViewStmt.java | 3 +++ .../mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java index 5c3c117a71fd3e..c42f3734f3d71d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java @@ -298,6 +298,9 @@ private void analyzeFromClause() throws AnalysisException { if (tableRefList.size() != 1) { throw new AnalysisException("The materialized view only support one table in from clause."); } + if (!isReplay && tableRefList.get(0).hasExplicitAlias()) { + throw new AnalysisException("The materialized view not support table with alias."); + } TableName tableName = tableRefList.get(0).getName(); if (tableName == null) { throw new AnalysisException("table in from clause is invalid, please check if it's single table " diff --git a/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy b/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy index 4104cc08732556..329e54a1f2dcaf 100644 --- a/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy +++ b/regression-test/suites/mv_p0/ut/testProjectionMV1/testProjectionMV1.groovy @@ -34,6 +34,11 @@ suite ("testProjectionMV1") { sql """insert into emps values("2020-01-01",1,"a",1,1,1);""" sql """insert into emps values("2020-01-02",2,"b",2,2,2);""" + test { + sql "create materialized view emps_mv as select deptno, empid from emps t order by deptno;" + exception "errCode = 2," + } + createMV("create materialized view emps_mv as select deptno, empid from emps order by deptno;") sql """insert into emps values("2020-01-01",1,"a",1,1,1);"""