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 9c55d75534..2e048a8ff8 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 76fdb402c0..a248d1404b 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 5a58bcc9cf..2e5874fed1 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 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 4fa6dabafe..782f7cfbab 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 0eda77a975..b82de1d7cc 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 d944f69b4a..2943852ba7 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 7007b4541f..0319158cd1 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 a95a80bdad..360978cbea 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 0c67d45c62..62d20d73fa 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 7a1b8ccf7d..473c078529 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;"""