From 3c75e5a43973f3dac44bee8d5343c20bbd0acf13 Mon Sep 17 00:00:00 2001 From: BiteTheDDDDt Date: Tue, 28 Feb 2023 23:46:35 +0800 Subject: [PATCH 1/4] add more error infomation for select materialized view fail --- .../org/apache/doris/planner/SingleNodePlanner.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java index b6abbb8b30dfd8..cab354b0be9d40 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java @@ -68,6 +68,7 @@ import org.apache.doris.common.util.VectorizedUtil; import org.apache.doris.planner.external.ExternalFileScanNode; import org.apache.doris.qe.ConnectContext; +import org.apache.doris.rewrite.mvrewrite.MVSelectFailedException; import org.apache.doris.thrift.TNullSide; import org.apache.doris.thrift.TPushAggOp; @@ -1316,8 +1317,10 @@ private PlanNode createRepeatNodePlan(SelectStmt selectStmt, Analyzer analyzer, } public boolean selectMaterializedView(QueryStmt queryStmt, Analyzer analyzer) - throws UserException { + throws UserException, MVSelectFailedException { boolean selectFailed = false; + boolean haveError = false; + String errorMsg = "select fail reason: "; if (queryStmt instanceof SelectStmt) { SelectStmt selectStmt = (SelectStmt) queryStmt; for (TableRef tableRef : selectStmt.getTableRefs()) { @@ -1364,6 +1367,11 @@ public boolean selectMaterializedView(QueryStmt queryStmt, Analyzer analyzer) selectStmt.getAggInfo().updateTypeOfAggregateExprs(); } } catch (Exception e) { + if (haveError) { + errorMsg += ","; + } + errorMsg += e.getMessage(); + haveError = true; tupleSelectFailed = true; } } @@ -1379,6 +1387,9 @@ public boolean selectMaterializedView(QueryStmt queryStmt, Analyzer analyzer) selectFailed |= selectMaterializedView(unionOperand.getQueryStmt(), analyzer); } } + if (haveError) { + throw new MVSelectFailedException(errorMsg); + } return selectFailed; } From 5e6a1762856e40b28d6eb8e874ffbf5e0a52c795 Mon Sep 17 00:00:00 2001 From: BiteTheDDDDt Date: Wed, 1 Mar 2023 17:21:47 +0800 Subject: [PATCH 2/4] fix case --- .../test_agg_mv_useless.groovy | 47 +------------- .../test_dup_mv_useless.groovy | 65 ++----------------- .../test_uniq_mv_useless.groovy | 16 +---- 3 files changed, 8 insertions(+), 120 deletions(-) diff --git a/regression-test/suites/materialized_view_p0/test_mv_useless/test_agg_mv_useless.groovy b/regression-test/suites/materialized_view_p0/test_mv_useless/test_agg_mv_useless.groovy index 16bb73b2b8b5e8..e818fda5759f23 100644 --- a/regression-test/suites/materialized_view_p0/test_mv_useless/test_agg_mv_useless.groovy +++ b/regression-test/suites/materialized_view_p0/test_mv_useless/test_agg_mv_useless.groovy @@ -57,49 +57,8 @@ suite ("test_agg_mv_useless") { exception "errCode = 2," } - sql "create materialized view k1_u1 as select k1 from ${testTable} group by k1;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } - - sql "create materialized view k1_k2_u21 as select k2,k1 from ${testTable} group by k2,k1 order by k2,k1;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } - - sql "create materialized view k1_sumk3 as select k1,sum(k3) from ${testTable} group by k1;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } + createMV("create materialized view k1_u1 as select k1 from ${testTable} group by k1;") + createMV("create materialized view k1_k2_u21 as select k2,k1 from ${testTable} group by k2,k1 order by k2,k1;") + createMV("create materialized view k1_sumk3 as select k1,sum(k3) from ${testTable} group by k1;") sql "insert into ${testTable} select 4,4,4;" } diff --git a/regression-test/suites/materialized_view_p0/test_mv_useless/test_dup_mv_useless.groovy b/regression-test/suites/materialized_view_p0/test_mv_useless/test_dup_mv_useless.groovy index 6cb308b8bd8297..914c7133090f62 100644 --- a/regression-test/suites/materialized_view_p0/test_mv_useless/test_dup_mv_useless.groovy +++ b/regression-test/suites/materialized_view_p0/test_mv_useless/test_dup_mv_useless.groovy @@ -49,66 +49,9 @@ suite ("test_dup_mv_useless") { exception "errCode = 2," } - sql "create materialized view k1_u1 as select k1 from ${testTable} group by k1;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - Thread.sleep(5000) - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } - sql "create materialized view k1_k2_u12 as select k1,k2 from ${testTable} group by k1,k2;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - Thread.sleep(5000) - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } - sql "create materialized view k1_k2_u21 as select k2,k1 from ${testTable} group by k2,k1 order by k2,k1;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - Thread.sleep(5000) - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } - sql " create materialized view k1_k2_sumk3 as select k1,k2,sum(k3) from ${testTable} group by k1,k2;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - Thread.sleep(5000) - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } - + createMV("create materialized view k1_u1 as select k1 from ${testTable} group by k1;") + createMV("create materialized view k1_k2_u12 as select k1,k2 from ${testTable} group by k1,k2;") + createMV("create materialized view k1_k2_u21 as select k2,k1 from ${testTable} group by k2,k1 order by k2,k1;") + createMV("create materialized view k1_k2_sumk3 as select k1,k2,sum(k3) from ${testTable} group by k1,k2;") sql "insert into ${testTable} select 4,4,4;" } diff --git a/regression-test/suites/materialized_view_p0/test_mv_useless/test_uniq_mv_useless.groovy b/regression-test/suites/materialized_view_p0/test_mv_useless/test_uniq_mv_useless.groovy index 1d79d442db08d2..50d12f402855ec 100644 --- a/regression-test/suites/materialized_view_p0/test_mv_useless/test_uniq_mv_useless.groovy +++ b/regression-test/suites/materialized_view_p0/test_mv_useless/test_uniq_mv_useless.groovy @@ -53,20 +53,6 @@ suite ("test_uniq_mv_useless") { exception "errCode = 2," } - sql "create materialized view k1_k2_u21 as select k2,k1 from ${testTable} group by k2,k1 order by k2,k1;" - max_try_secs = 60 - while (max_try_secs--) { - String res = getJobState(testTable) - if (res == "FINISHED") { - break - } else { - Thread.sleep(2000) - if (max_try_secs < 1) { - println "test timeout," + "state:" + res - assertEquals("FINISHED",res) - } - } - } - + createMV ("create materialized view k1_k2_u21 as select k2,k1 from ${testTable} group by k2,k1 order by k2,k1;") sql "insert into ${testTable} select 4,4,4;" } From 383691eb3b088dc9385cdf66c6dbc4d756db8955 Mon Sep 17 00:00:00 2001 From: BiteTheDDDDt Date: Fri, 3 Mar 2023 14:22:08 +0800 Subject: [PATCH 3/4] fix --- fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java index aa10992ee86a52..f4502883d331e1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java @@ -552,7 +552,7 @@ public boolean matchExprs(List exprs, SelectStmt stmt, boolean ignoreAlias return true; // means this is alias of other expr. } SlotRef aliasExpr = (SlotRef) originExpr; - if (aliasExpr.getColumnName() == null) { + if (aliasExpr.getColumnName() == null && desc.getSourceExprs() == null) { return true; // means this is alias of other expr. } if (aliasExpr.desc != null) { From 735301a786331579c2b1009895ea059970f7519d Mon Sep 17 00:00:00 2001 From: BiteTheDDDDt Date: Fri, 3 Mar 2023 16:11:58 +0800 Subject: [PATCH 4/4] fix --- .../main/java/org/apache/doris/analysis/SlotRef.java | 11 ++++++++++- .../mv_with_view/mv_with_view.groovy | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java index f4502883d331e1..ffb8c2ef3768aa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java @@ -551,10 +551,19 @@ public boolean matchExprs(List exprs, SelectStmt stmt, boolean ignoreAlias if (!(originExpr instanceof SlotRef)) { return true; // means this is alias of other expr. } + SlotRef aliasExpr = (SlotRef) originExpr; - if (aliasExpr.getColumnName() == null && desc.getSourceExprs() == null) { + if (aliasExpr.getColumnName() == null) { + if (desc.getSourceExprs() != null) { + for (Expr expr : desc.getSourceExprs()) { + if (!expr.matchExprs(exprs, stmt, ignoreAlias, tableName)) { + return false; + } + } + } return true; // means this is alias of other expr. } + if (aliasExpr.desc != null) { TableIf table = aliasExpr.desc.getParent().getTable(); if (table != null && table.getName() != tableName) { diff --git a/regression-test/suites/materialized_view_p0/mv_with_view/mv_with_view.groovy b/regression-test/suites/materialized_view_p0/mv_with_view/mv_with_view.groovy index 4b794b7cb1cb5c..4c147d51ac01cc 100644 --- a/regression-test/suites/materialized_view_p0/mv_with_view/mv_with_view.groovy +++ b/regression-test/suites/materialized_view_p0/mv_with_view/mv_with_view.groovy @@ -45,6 +45,10 @@ suite ("mv_with_view") { } qt_select_star "select * from d_table order by k1;" + sql """ + drop view if exists v_k132; + """ + sql """ create view v_k132 as select k1,k3,k2 from d_table where k1 = 1; """