This is an automated email from the ASF dual-hosted git repository. panxiaolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 8a761dff840 [Bug](materialized-view) fix create mv failed on unique table (#27971) 8a761dff840 is described below commit 8a761dff840371e38dd311b0cd4b4a81d6e193bf Author: Pxl <pxl...@qq.com> AuthorDate: Tue Dec 5 14:53:09 2023 +0800 [Bug](materialized-view) fix create mv failed on unique table (#27971) fix create mv failed on unique table --- .../doris/alter/MaterializedViewHandler.java | 9 +++---- .../doris/analysis/CreateMaterializedViewStmt.java | 30 ++++++++++++---------- .../main/java/org/apache/doris/catalog/Env.java | 4 +-- .../analysis/CreateMaterializedViewStmtTest.java | 4 --- regression-test/data/mv_p0/unique/unique.out | 9 +++++-- .../data/mv_p0/varchar_length/varchar_length.out | 2 +- .../doris/regression/action/CreateMVAction.groovy | 8 ++---- .../test_mv_useless/test_agg_mv_useless.groovy | 14 ---------- .../test_mv_useless/test_uniq_mv_useless.groovy | 2 +- regression-test/suites/mv_p0/unique/unique.groovy | 17 +++++++++--- 10 files changed, 46 insertions(+), 53 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java index 9c55d755348..2e048a8ff8a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java @@ -488,14 +488,10 @@ public class MaterializedViewHandler extends AlterHandler { // check b.1 throw new DdlException("The materialized view of unique table must not has grouping columns"); } - addMVClause.setMVKeysType(olapTable.getKeysType()); for (MVColumnItem mvColumnItem : mvColumnItemList) { - if (olapTable.getKeysType() == KeysType.UNIQUE_KEYS && !mvColumnItem.isKey()) { - mvColumnItem.setAggregationType(AggregateType.REPLACE, true); - } - if (olapTable.getKeysType() == KeysType.UNIQUE_KEYS) { + mvColumnItem.setIsKey(false); for (String slotName : mvColumnItem.getBaseColumnNames()) { if (!addMVClause.isReplay() && olapTable @@ -505,6 +501,9 @@ public class MaterializedViewHandler extends AlterHandler { mvColumnItem.setIsKey(true); } } + if (!mvColumnItem.isKey()) { + mvColumnItem.setAggregationType(AggregateType.REPLACE, true); + } } // check a.2 and b.2 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 76fdb402c04..a248d1404b5 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 @@ -146,10 +146,6 @@ public class CreateMaterializedViewStmt extends DdlStmt { return dbName; } - public void setMVKeysType(KeysType type) { - mvKeysType = type; - } - public KeysType getMVKeysType() { return mvKeysType; } @@ -209,11 +205,11 @@ public class CreateMaterializedViewStmt extends DdlStmt { analyzer = new Analyzer(analyzer.getEnv(), analyzer.getContext()); selectStmt.analyze(analyzer); + analyzeSelectClause(analyzer); + analyzeFromClause(); if (selectStmt.getAggInfo() != null) { mvKeysType = KeysType.AGG_KEYS; } - analyzeSelectClause(analyzer); - analyzeFromClause(); if (selectStmt.getWhereClause() != null) { if (!isReplay && selectStmt.getWhereClause().hasAggregateSlot()) { throw new AnalysisException( @@ -303,6 +299,12 @@ public class CreateMaterializedViewStmt extends DdlStmt { if (!isReplay && tableRefList.get(0).hasExplicitAlias()) { throw new AnalysisException("The materialized view not support table with alias."); } + if (!isReplay && !(tableRefList.get(0).getTable() instanceof OlapTable)) { + throw new AnalysisException("The materialized view only support olap table."); + } + OlapTable olapTable = (OlapTable) tableRefList.get(0).getTable(); + mvKeysType = olapTable.getKeysType(); + 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 " @@ -412,14 +414,7 @@ public class CreateMaterializedViewStmt extends DdlStmt { * The keys type of Materialized view is aggregation. * All of group by columns are keys of materialized view. */ - if (mvKeysType == KeysType.AGG_KEYS) { - for (MVColumnItem mvColumnItem : mvColumnItemList) { - if (mvColumnItem.getAggregationType() != null) { - break; - } - mvColumnItem.setIsKey(true); - } - } else if (mvKeysType == KeysType.DUP_KEYS) { + if (mvKeysType == KeysType.DUP_KEYS) { /** * There is no aggregation function in materialized view. * Supplement key of MV columns @@ -463,6 +458,13 @@ public class CreateMaterializedViewStmt extends DdlStmt { MVColumnItem mvColumnItem = mvColumnItemList.get(theBeginIndexOfValue); mvColumnItem.setAggregationType(AggregateType.NONE, true); } + } else { + for (MVColumnItem mvColumnItem : mvColumnItemList) { + if (mvColumnItem.getAggregationType() != null) { + break; + } + mvColumnItem.setIsKey(true); + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 5a58bcc9cf5..2e5874fed12 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -3979,8 +3979,8 @@ public class Env { } } LOG.debug("index column size: {}, cluster column size: {}", indexColumns.size(), clusterColumns.size()); - if (isKeysRequired) { - Preconditions.checkArgument(indexColumns.size() > 0); + if (isKeysRequired && indexColumns.isEmpty()) { + throw new DdlException("The materialized view need key column"); } // sort by cluster keys for mow if set, otherwise by index columns List<Column> sortKeyColumns = clusterColumns.isEmpty() ? indexColumns diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java index 4fa6dabafe6..782f7cfbab9 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateMaterializedViewStmtTest.java @@ -866,13 +866,9 @@ public class CreateMaterializedViewStmtTest { { analyzer.getClusterName(); result = "default"; - selectStmt.getAggInfo(); - result = null; selectStmt.getSelectList(); result = selectList; selectStmt.analyze(analyzer); - selectStmt.getAggInfo(); // return null, so that the mv can be a duplicate mv - result = null; } }; diff --git a/regression-test/data/mv_p0/unique/unique.out b/regression-test/data/mv_p0/unique/unique.out index 0eda77a9754..b82de1d7cc0 100644 --- a/regression-test/data/mv_p0/unique/unique.out +++ b/regression-test/data/mv_p0/unique/unique.out @@ -1,6 +1,11 @@ -- This file is automatically generated. You should know what you did if you want to edit this +-- !select -- +\N 3 -3 +1 1 1 +2 2 2 + -- !select_star -- 1 1 1 a -2 2 2 b -3 -3 \N c +20 2 2 b +300 -3 \N c diff --git a/regression-test/data/mv_p0/varchar_length/varchar_length.out b/regression-test/data/mv_p0/varchar_length/varchar_length.out index d944f69b4a3..2943852ba7b 100644 --- a/regression-test/data/mv_p0/varchar_length/varchar_length.out +++ b/regression-test/data/mv_p0/varchar_length/varchar_length.out @@ -4,5 +4,5 @@ test1 UNIQUE_KEYS vid VARCHAR(1) VARCHAR(1) No true \N true report_time INT INT No true \N true mv_test UNIQUE_KEYS mv_report_time INT INT No true \N true `report_time` - mv_vid VARCHAR(65533) VARCHAR(65533) No true \N REPLACE true `vid` + mv_vid VARCHAR(65533) VARCHAR(65533) No true \N NONE true `vid` diff --git a/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/CreateMVAction.groovy b/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/CreateMVAction.groovy index 7007b4541fc..0319158cd17 100644 --- a/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/CreateMVAction.groovy +++ b/regression-test/framework/src/main/groovy/org/apache/doris/regression/action/CreateMVAction.groovy @@ -80,12 +80,8 @@ class CreateMVAction implements SuiteAction { Throwable ex = null long startTime = System.currentTimeMillis() - try { - log.info("sql:\n${sql}".toString()) - (result, meta) = JdbcUtils.executeToList(conn, sql) - } catch (Throwable t) { - ex = t - } + log.info("sql:\n${sql}".toString()) + (result, meta) = JdbcUtils.executeToList(conn, sql) long endTime = System.currentTimeMillis() return new ActionResult(result, ex, startTime, endTime, meta) diff --git a/regression-test/suites/mv_p0/test_mv_useless/test_agg_mv_useless.groovy b/regression-test/suites/mv_p0/test_mv_useless/test_agg_mv_useless.groovy index a95a80bdadc..360978cbea4 100644 --- a/regression-test/suites/mv_p0/test_mv_useless/test_agg_mv_useless.groovy +++ b/regression-test/suites/mv_p0/test_mv_useless/test_agg_mv_useless.groovy @@ -38,20 +38,6 @@ suite ("test_agg_mv_useless") { sql "insert into ${testTable} select 2,2,2;" sql "insert into ${testTable} select 3,3,3;" - test { - sql "create materialized view k1 as select k1 from ${testTable};" - exception "errCode = 2," - } - - test { - sql "create materialized view k1_k2 as select k1,k2 from ${testTable};" - exception "errCode = 2," - } - test { - sql "create materialized view k1_k2_sumk3 as select k1,k2,sum(k3) from${testTable} group by k1,k2;" - exception "errCode = 2," - } - 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;") diff --git a/regression-test/suites/mv_p0/test_mv_useless/test_uniq_mv_useless.groovy b/regression-test/suites/mv_p0/test_mv_useless/test_uniq_mv_useless.groovy index 0c67d45c623..62d20d73fa4 100644 --- a/regression-test/suites/mv_p0/test_mv_useless/test_uniq_mv_useless.groovy +++ b/regression-test/suites/mv_p0/test_mv_useless/test_uniq_mv_useless.groovy @@ -43,6 +43,6 @@ suite ("test_uniq_mv_useless") { exception "errCode = 2," } - 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_u21 as select k2,k1 from ${testTable};") sql "insert into ${testTable} select 4,4,4;" } diff --git a/regression-test/suites/mv_p0/unique/unique.groovy b/regression-test/suites/mv_p0/unique/unique.groovy index 7a1b8ccf7df..473c078529e 100644 --- a/regression-test/suites/mv_p0/unique/unique.groovy +++ b/regression-test/suites/mv_p0/unique/unique.groovy @@ -34,8 +34,7 @@ suite ("unique") { """ sql "insert into u_table select 1,1,1,'a';" - sql "insert into u_table select 2,2,2,'b';" - sql "insert into u_table select 3,-3,null,'c';" + sql "insert into u_table select 20,2,2,'b';" test { sql """create materialized view k12s3m as select k1,sum(k2),max(k2) from u_table group by k1;""" @@ -43,11 +42,21 @@ suite ("unique") { } test { sql """create materialized view kadj as select k4 from u_table""" - exception "must same with all slot" + exception "The materialized view need key column" } createMV("create materialized view kadj as select k3,k2,k1,k4 from u_table;") - createMV("create materialized view k1l4 as select k1,length(k4) from u_table;") + + createMV("create materialized view kadj2 as select k3,k2,length(k4) from u_table;") + + createMV("create materialized view k31l42 as select k3,length(k1),k2 from u_table;") + sql "insert into u_table select 300,-3,null,'c';" + explain { + sql("select k3,length(k1),k2 from u_table order by 1,2,3;") + contains "(k31l42)" + } + qt_select "select k3,length(k1),k2 from u_table order by 1,2,3;" + test { sql """create materialized view kadp as select k4 from u_table group by k4;""" --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org