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

Reply via email to