This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 608000b8ce1 branch-2.1: [enhance](mtmv)Change the way to verify the 
existence of partition names when refreshing MTMV #45290 (#45725)
608000b8ce1 is described below

commit 608000b8ce19c6778e123a3d819516bc908af63d
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Dec 23 10:01:02 2024 +0800

    branch-2.1: [enhance](mtmv)Change the way to verify the existence of 
partition names when refreshing MTMV #45290 (#45725)
    
    Cherry-picked from #45290
    
    Co-authored-by: zhangdong <zhangd...@selectdb.com>
---
 .../trees/plans/commands/info/RefreshMTMVInfo.java | 39 ++++++++++-
 .../test_refresh_partition_name_mtmv.groovy        | 76 ++++++++++++++++++++++
 2 files changed, 114 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RefreshMTMVInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RefreshMTMVInfo.java
index bf483f87a15..94e92433069 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RefreshMTMVInfo.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/RefreshMTMVInfo.java
@@ -17,23 +17,33 @@
 
 package org.apache.doris.nereids.trees.plans.commands.info;
 
+import org.apache.doris.analysis.AllPartitionDesc;
+import org.apache.doris.analysis.SinglePartitionDesc;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Env;
 import org.apache.doris.catalog.MTMV;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ErrorCode;
 import org.apache.doris.common.MetaNotFoundException;
+import org.apache.doris.common.util.MetaLockUtils;
+import org.apache.doris.mtmv.MTMVPartitionInfo.MTMVPartitionType;
 import org.apache.doris.mtmv.MTMVPartitionUtil;
+import org.apache.doris.mtmv.MTMVRelatedTableIf;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.util.Utils;
 import org.apache.doris.qe.ConnectContext;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.apache.commons.collections.CollectionUtils;
 
+import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 
 /**
  * refresh mtmv info
@@ -67,13 +77,40 @@ public class RefreshMTMVInfo {
             Database db = 
Env.getCurrentInternalCatalog().getDbOrDdlException(mvName.getDb());
             MTMV mtmv = (MTMV) db.getTableOrMetaException(mvName.getTbl(), 
TableType.MATERIALIZED_VIEW);
             if (!CollectionUtils.isEmpty(partitions)) {
-                MTMVPartitionUtil.getPartitionsIdsByNames(mtmv, partitions);
+                checkPartitionExist(mtmv);
             }
         } catch (org.apache.doris.common.AnalysisException | 
MetaNotFoundException | DdlException e) {
             throw new AnalysisException(e.getMessage());
         }
     }
 
+    private void checkPartitionExist(MTMV mtmv) throws 
org.apache.doris.common.AnalysisException {
+        MTMVRelatedTableIf relatedTable = 
mtmv.getMvPartitionInfo().getRelatedTable();
+        List<TableIf> tables = Lists.newArrayList(mtmv, relatedTable);
+        tables.sort(Comparator.comparing(TableIf::getId));
+        MetaLockUtils.readLockTables(tables);
+        try {
+            if 
(mtmv.getMvPartitionInfo().getPartitionType().equals(MTMVPartitionType.SELF_MANAGE))
 {
+                throw new AnalysisException(
+                        "The partition method of this asynchronous 
materialized view "
+                                + "does not support refreshing by partition");
+            }
+            List<AllPartitionDesc> partitionDescs = 
MTMVPartitionUtil.getPartitionDescsByRelatedTable(
+                    mtmv.getTableProperty().getProperties(), 
mtmv.getMvPartitionInfo(), mtmv.getMvProperties());
+            Set<String> shouldExistPartitionNames = 
Sets.newHashSetWithExpectedSize(partitionDescs.size());
+            partitionDescs.stream().forEach(desc -> {
+                shouldExistPartitionNames.add(((SinglePartitionDesc) 
desc).getPartitionName());
+            });
+            for (String partition : partitions) {
+                if (!shouldExistPartitionNames.contains(partition)) {
+                    throw new 
org.apache.doris.common.AnalysisException("partition not exist: " + partition);
+                }
+            }
+        } finally {
+            MetaLockUtils.readUnlockTables(tables);
+        }
+    }
+
     /**
      * getMvName
      *
diff --git 
a/regression-test/suites/mtmv_p0/test_refresh_partition_name_mtmv.groovy 
b/regression-test/suites/mtmv_p0/test_refresh_partition_name_mtmv.groovy
new file mode 100644
index 00000000000..a1894533983
--- /dev/null
+++ b/regression-test/suites/mtmv_p0/test_refresh_partition_name_mtmv.groovy
@@ -0,0 +1,76 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.junit.Assert;
+
+suite("test_refresh_partition_name_mtmv","mtmv") {
+    String suiteName = "test_refresh_partition_name_mtmv"
+    String tableName = "${suiteName}_table"
+    String mvName = "${suiteName}_mv"
+    sql """drop table if exists `${tableName}`"""
+    sql """drop materialized view if exists ${mvName};"""
+
+    sql """
+        CREATE TABLE ${tableName}
+        (
+            k2 TINYINT,
+            k3 INT not null
+        )
+        COMMENT "my first table"
+        PARTITION BY LIST(`k3`)
+        (
+            PARTITION `p1` VALUES IN ('1'),
+            PARTITION `p2` VALUES IN ('2'),
+            PARTITION `p3` VALUES IN ('3')
+        )
+        DISTRIBUTED BY HASH(k2) BUCKETS 2
+        PROPERTIES (
+            "replication_num" = "1"
+        );
+        """
+    sql """
+        CREATE MATERIALIZED VIEW ${mvName}
+        BUILD DEFERRED REFRESH AUTO ON MANUAL
+        partition by(`k3`)
+        DISTRIBUTED BY RANDOM BUCKETS 2
+        PROPERTIES (
+        'replication_num' = '1',
+        'refresh_partition_num' = '2'
+        )
+        AS
+        SELECT * from ${tableName};
+        """
+
+    test {
+          sql """
+              REFRESH MATERIALIZED VIEW ${mvName} partitions(p_4)
+          """
+          exception "partition not exist"
+    }
+
+    sql """
+        alter table ${tableName} add PARTITION `p4` VALUES IN ('4')
+        """
+    sql """
+          REFRESH MATERIALIZED VIEW ${mvName} partitions(p_4)
+      """
+
+    waitingMTMVTaskFinishedByMvName(mvName)
+
+    sql """drop table if exists `${tableName}`"""
+    sql """drop materialized view if exists ${mvName};"""
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to