From 09022a8f126df921655cff42fec6727aac63495d Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Wed, 17 Apr 2024 17:51:36 +0800 Subject: [PATCH 1/2] [fix](planner)create view statement should forbid mv rewrite --- .../org/apache/doris/analysis/SelectStmt.java | 5 +-- .../doris/analysis/SetOperationStmt.java | 7 ++++ .../suites/mv_p0/test_base/test_base.groovy | 32 +++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index 344fa3df6dbf79..3b449f0388227a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -501,8 +501,6 @@ public void analyze(Analyzer analyzer) throws UserException { } } } - fromClause.setNeedToSql(needToSql); - fromClause.analyze(analyzer); if (!isForbiddenMVRewrite()) { Boolean haveMv = false; @@ -521,6 +519,9 @@ public void analyze(Analyzer analyzer) throws UserException { } } + fromClause.setNeedToSql(needToSql); + fromClause.analyze(analyzer); + // Generate !empty() predicates to filter out empty collections. // Skip this step when analyzing a WITH-clause because CollectionTableRefs // do not register collection slots in their parent in that context diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java index 065865141cc69d..4467dda3b912ce 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java @@ -234,6 +234,13 @@ public void getTableRefs(Analyzer analyzer, List tblRefs, Set } } + public void forbiddenMVRewrite() { + super.forbiddenMVRewrite(); + for (SetOperand op : operands) { + op.getQueryStmt().forbiddenMVRewrite(); + } + } + /** * Propagates DISTINCT from left to right, and checks that all * set operands are set compatible, adding implicit casts if necessary. diff --git a/regression-test/suites/mv_p0/test_base/test_base.groovy b/regression-test/suites/mv_p0/test_base/test_base.groovy index f3229813e2f9dc..607388baf25a70 100644 --- a/regression-test/suites/mv_p0/test_base/test_base.groovy +++ b/regression-test/suites/mv_p0/test_base/test_base.groovy @@ -54,4 +54,36 @@ suite ("test_base") { contains "(dwd)" } qt_select_mv "SELECT id,created_at FROM dwd order by 1, 2;" + + sql """set enable_nereids_planner=false;""" + sql """drop table if exists test_mv_view_t;""" + sql """drop view if exists test_mv_view_t_view;""" + sql """CREATE TABLE `test_mv_view_t` ( + `day` date NOT NULL, + `game_code` varchar(100) NOT NULL , + `plat_code` varchar(100) NOT NULL + ) ENGINE=OLAP + duplicate KEY(`day`) + DISTRIBUTED BY HASH(`day`) BUCKETS 4 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + );""" + sql """INSERT INTO test_mv_view_t VALUES('2024-04-01', 'x', 'y');""" + createMV ("""create materialized view test_mv_view_t_mv as + select `day`, count(game_code) + from test_mv_view_t group by day;""") + sql """create view test_mv_view_t_view + as + select `day` + from test_mv_view_t + where day<'2024-04-15' + + union all + select `day` + from test_mv_view_t + where day>='2024-04-15';""" + explain { + sql("""SELECT * from test_mv_view_t_view where day='2024-04-15';""") + notContains("mv_day") + } } From eb5a08757aaeff763ba1ba4fc08e33f9c93be7f4 Mon Sep 17 00:00:00 2001 From: starocean999 <12095047@qq.com> Date: Wed, 17 Apr 2024 19:19:40 +0800 Subject: [PATCH 2/2] fix case --- .../src/main/java/org/apache/doris/analysis/SelectStmt.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index 3b449f0388227a..344fa3df6dbf79 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -501,6 +501,8 @@ public void analyze(Analyzer analyzer) throws UserException { } } } + fromClause.setNeedToSql(needToSql); + fromClause.analyze(analyzer); if (!isForbiddenMVRewrite()) { Boolean haveMv = false; @@ -519,9 +521,6 @@ public void analyze(Analyzer analyzer) throws UserException { } } - fromClause.setNeedToSql(needToSql); - fromClause.analyze(analyzer); - // Generate !empty() predicates to filter out empty collections. // Skip this step when analyzing a WITH-clause because CollectionTableRefs // do not register collection slots in their parent in that context