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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]