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