From 2c80259f668738c3d75b965aff8e77e9c5c580ab Mon Sep 17 00:00:00 2001 From: zhangdong <493738387@qq.com> Date: Tue, 16 Jul 2024 15:01:28 +0800 Subject: [PATCH] [fix](mtmv) use isManagedTable instead of check table type (#34287) (#37822) pick: https://github.com/apache/doris/pull/34287 --- .../org/apache/doris/analysis/Analyzer.java | 2 +- .../org/apache/doris/analysis/SelectStmt.java | 3 +- .../doris/catalog/CatalogRecycleBin.java | 33 +++++-- .../org/apache/doris/catalog/Database.java | 8 +- .../java/org/apache/doris/catalog/Env.java | 10 +- .../doris/common/proc/IndexInfoProcDir.java | 5 +- .../common/proc/RemoteIndexSchemaProcDir.java | 3 +- .../doris/common/proc/StatisticProcNode.java | 3 +- .../doris/consistency/ConsistencyChecker.java | 3 +- .../doris/datasource/InternalCatalog.java | 9 +- .../apache/doris/httpv2/rest/ShowAction.java | 4 +- .../httpv2/rest/StorageTypeCheckAction.java | 3 +- .../java/org/apache/doris/load/ExportJob.java | 2 +- .../apache/doris/load/ExportTaskExecutor.java | 3 +- .../plans/commands/info/DropMTMVInfo.java | 2 +- .../doris/statistics/query/IndexStats.java | 3 +- .../doris/statistics/query/QueryStats.java | 15 ++- .../doris/statistics/query/TableStats.java | 3 +- .../suites/mtmv_p0/test_recover_mtmv.groovy | 93 +++++++++++++++++++ 19 files changed, 152 insertions(+), 55 deletions(-) create mode 100644 regression-test/suites/mtmv_p0/test_recover_mtmv.groovy diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index 86ce414356..861dc517a0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -841,7 +841,7 @@ public class Analyzer { .getDbOrAnalysisException(tableName.getDb()); TableIf table = database.getTableOrAnalysisException(tableName.getTbl()); - if (table.getType() == TableType.OLAP && (((OlapTable) table).getState() == OlapTableState.RESTORE + if (table.isManagedTable() && (((OlapTable) table).getState() == OlapTableState.RESTORE || ((OlapTable) table).getState() == OlapTableState.RESTORE_WITH_LOAD)) { Boolean isNotRestoring = ((OlapTable) table).getPartitions().stream() .filter(partition -> partition.getState() == PartitionState.RESTORE).collect(Collectors.toList()) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java index ee2d33b96b..97b929762e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java @@ -30,7 +30,6 @@ import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.catalog.Table; import org.apache.doris.catalog.TableIf; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.catalog.Type; import org.apache.doris.catalog.View; import org.apache.doris.common.AnalysisException; @@ -1087,7 +1086,7 @@ public class SelectStmt extends QueryStmt { break; } long rowCount = 0; - if (tblRef.getTable().getType() == TableType.OLAP) { + if (tblRef.getTable().isManagedTable()) { rowCount = ((OlapTable) (tblRef.getTable())).getRowCount(); if (LOG.isDebugEnabled()) { LOG.debug("tableName={} rowCount={}", tblRef.getAlias(), rowCount); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java index 46a5ad26ed..7d31a8c6bb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java @@ -112,7 +112,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { } private void addRecycledTabletsForTable(Set recycledTabletSet, Table table) { - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { OlapTable olapTable = (OlapTable) table; Collection allPartitions = olapTable.getAllPartitions(); for (Partition partition : allPartitions) { @@ -321,7 +321,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { } Table table = tableInfo.getTable(); - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { Env.getCurrentEnv().onEraseOlapTable((OlapTable) table, false); } iterator.remove(); @@ -352,7 +352,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { long tableId = table.getId(); if (isExpire(tableId, currentTimeMs)) { - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { Env.getCurrentEnv().onEraseOlapTable((OlapTable) table, false); } @@ -434,7 +434,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { continue; } Table table = tableInfo.getTable(); - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { Env.getCurrentEnv().onEraseOlapTable((OlapTable) table, false); } @@ -455,7 +455,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { return; } Table table = tableInfo.getTable(); - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { Env.getCurrentEnv().onEraseOlapTable((OlapTable) table, true); } LOG.info("replay erase table[{}]", tableId); @@ -646,8 +646,12 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { } Table table = tableInfo.getTable(); - db.registerTable(table); - LOG.info("recover db[{}] with table[{}]: {}", dbId, table.getId(), table.getName()); + if (table.getType() == TableType.OLAP) { + db.registerTable(table); + LOG.info("recover db[{}] with table[{}]: {}", dbId, table.getId(), table.getName()); + } else { + LOG.info("ignore recover db[{}] with table[{}]: {}", dbId, table.getId(), table.getName()); + } iterator.remove(); idToRecycleTime.remove(table.getId()); tableNames.remove(table.getName()); @@ -694,6 +698,11 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { + db.getFullName()); } + if (table.getType() == TableType.MATERIALIZED_VIEW) { + throw new DdlException("Can not recover materialized view '" + tableName + "' or table id '" + + tableId + "' in " + db.getFullName()); + } + innerRecoverTable(db, table, tableName, newTableName, null, false); LOG.info("recover db[{}] with table[{}]: {}", dbId, table.getId(), table.getName()); return true; @@ -732,7 +741,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { throw new DdlException("Table name[" + newTableName + "] is already used"); } - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { // olap table should also check if any rollup has same name as "newTableName" ((OlapTable) table).checkAndSetName(newTableName, false); } else { @@ -756,7 +765,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { Env.getCurrentEnv().getEditLog().logRecoverTable(recoverInfo); } // Only olap table need recover dynamic partition, other table like jdbc odbc view.. do not need it - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { DynamicPartitionUtil.registerOrRemoveDynamicPartitionTable(db.getId(), (OlapTable) table, isReplay); } } finally { @@ -767,6 +776,10 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { public synchronized void recoverPartition(long dbId, OlapTable table, String partitionName, long partitionIdToRecover, String newPartitionName) throws DdlException { + if (table.getType() == TableType.MATERIALIZED_VIEW) { + throw new DdlException("Can not recover partition in materialized view: " + table.getName()); + } + long recycleTime = -1; // make sure to get db write lock RecyclePartitionInfo recoverPartitionInfo = null; @@ -903,7 +916,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable { // idToTable for (RecycleTableInfo tableInfo : idToTable.values()) { Table table = tableInfo.getTable(); - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java index 548119dfb7..9cdab71fc0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Database.java @@ -286,7 +286,7 @@ public class Database extends MetaObject implements Writable, DatabaseIf } for (Table table : tables) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } @@ -307,7 +307,7 @@ public class Database extends MetaObject implements Writable, DatabaseIf
try { long usedReplicaCount = 0; for (Table table : this.idToTable.values()) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } @@ -545,7 +545,7 @@ public class Database extends MetaObject implements Writable, DatabaseIf
readLock(); try { for (Table table : idToTable.values()) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } OlapTable olapTable = (OlapTable) table; @@ -866,7 +866,7 @@ public class Database extends MetaObject implements Writable, DatabaseIf
if (newBinlogConfig.isEnable() && !oldBinlogConfig.isEnable()) { // check all tables binlog enable is true for (Table table : idToTable.values()) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } 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 5864634842..7eac8adf34 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 @@ -3532,7 +3532,7 @@ public class Env { } // There MUST BE 2 space in front of each column description line // sqlalchemy requires this to parse SHOW CREATE TABLE stmt. - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { sb.append(" ").append( column.toSql(((OlapTable) table).getKeysType() == KeysType.UNIQUE_KEYS, true)); } else { @@ -3994,7 +3994,7 @@ public class Env { } List
tableList = db.getTables(); for (Table table : tableList) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } @@ -4492,7 +4492,7 @@ public class Env { throw new DdlException("Table name[" + newTableName + "] is already used"); } - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { // olap table should also check if any rollup has same name as "newTableName" ((OlapTable) table).checkAndSetName(newTableName, false); } else { @@ -5568,7 +5568,7 @@ public class Env { List replicaPersistInfos = backendTabletsInfo.getReplicaPersistInfos(); for (ReplicaPersistInfo info : replicaPersistInfos) { OlapTable olapTable = (OlapTable) getInternalCatalog().getDb(info.getDbId()) - .flatMap(db -> db.getTable(info.getTableId())).filter(t -> t.getType() == TableType.OLAP) + .flatMap(db -> db.getTable(info.getTableId())).filter(t -> t.isManagedTable()) .orElse(null); if (olapTable == null) { continue; @@ -6111,7 +6111,7 @@ public class Env { } for (Table table : tables) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java index de91b59dce..8ed0b8d971 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java @@ -22,7 +22,6 @@ import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.MaterializedIndexMeta; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.TableIf; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.common.AnalysisException; import org.apache.doris.qe.SessionVariable; @@ -60,7 +59,7 @@ public class IndexInfoProcDir implements ProcDirInterface { result.setNames(TITLE_NAMES); table.readLock(); try { - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { OlapTable olapTable = (OlapTable) table; // indices order @@ -122,7 +121,7 @@ public class IndexInfoProcDir implements ProcDirInterface { try { List schema = null; Set bfColumns = null; - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { OlapTable olapTable = (OlapTable) table; schema = olapTable.getSchemaByIndexId(idxId); if (schema == null) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/RemoteIndexSchemaProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/RemoteIndexSchemaProcDir.java index c21f64c5d3..f2531b7ec1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/RemoteIndexSchemaProcDir.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/RemoteIndexSchemaProcDir.java @@ -21,7 +21,6 @@ import org.apache.doris.catalog.Column; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.TableIf; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.catalog.Tablet; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.util.FetchRemoteTabletSchemaUtil; @@ -90,7 +89,7 @@ public class RemoteIndexSchemaProcDir implements ProcDirInterface { List partitions = Lists.newArrayList(); table.readLock(); try { - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { OlapTable olapTable = (OlapTable) table; for (String partitionName : partitionNameList) { Partition partition = olapTable.getPartition(partitionName); diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java index d6d16cb12e..f12717fb57 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java @@ -24,7 +24,6 @@ import org.apache.doris.catalog.MaterializedIndex.IndexExtState; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.TableIf; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.catalog.Tablet; import org.apache.doris.common.AnalysisException; @@ -95,7 +94,7 @@ public class StatisticProcNode implements ProcNodeInterface { this.db.getTables().stream().filter(Objects::nonNull).forEach(t -> { ++tableNum; - if (t.getType() == TableType.OLAP) { + if (t.isManagedTable()) { OlapTable olapTable = (OlapTable) t; olapTable.readLock(); try { diff --git a/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java b/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java index b052f0d4ad..471e235684 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java +++ b/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java @@ -25,7 +25,6 @@ import org.apache.doris.catalog.MetaObject; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Partition; import org.apache.doris.catalog.Table; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.catalog.Tablet; import org.apache.doris.common.Config; import org.apache.doris.common.MetaNotFoundException; @@ -268,7 +267,7 @@ public class ConsistencyChecker extends MasterDaemon { // sort tables Queue tableQueue = new PriorityQueue<>(Math.max(tables.size(), 1), COMPARATOR); for (Table table : tables) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } tableQueue.add(table); diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java index 866597670a..7f94b1c338 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java @@ -956,11 +956,12 @@ public class InternalCatalog implements CatalogIf { long recycleTime) { if (table.getType() == TableType.ELASTICSEARCH) { esRepository.deRegisterTable(table.getId()); - } else if (table.getType() == TableType.OLAP) { + } else if (table.isManagedTable()) { // drop all temp partitions of this table, so that there is no temp partitions in recycle bin, // which make things easier. ((OlapTable) table).dropAllTempPartitions(); - } else if (table.getType() == TableType.MATERIALIZED_VIEW) { + } + if (table.getType() == TableType.MATERIALIZED_VIEW) { Env.getCurrentEnv().getMtmvService().deregisterMTMV((MTMV) table); } @@ -1176,7 +1177,7 @@ public class InternalCatalog implements CatalogIf { List createTableStmt = Lists.newArrayList(); table.readLock(); try { - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { if (!CollectionUtils.isEmpty(stmt.getRollupNames())) { OlapTable olapTable = (OlapTable) table; for (String rollupIndexName : stmt.getRollupNames()) { @@ -1380,7 +1381,7 @@ public class InternalCatalog implements CatalogIf { try { Table table = db.getTableOrDdlException(tableName); - if (table.getType() != TableType.OLAP && table.getType() != TableType.MATERIALIZED_VIEW) { + if (!table.isManagedTable()) { throw new DdlException("Only support create partition from a OLAP table"); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java index 8156710aa1..8d93a440b2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java @@ -307,7 +307,7 @@ public class ShowAction extends RestBaseController { // sort by table name List
tables = db.getTables(); for (Table table : tables) { - if (table.getType() != TableType.OLAP) { + if (!table.isManagedTable()) { continue; } table.readLock(); @@ -352,7 +352,7 @@ public class ShowAction extends RestBaseController { Map oneEntry = Maps.newHashMap(); if (table.getType() == TableType.VIEW || table.getType() == TableType.ODBC) { oneEntry.put(table.getName(), 0L); - } else if (table.getType() == TableType.OLAP) { + } else if (table.isManagedTable()) { table.readLock(); try { long tableSize = ((OlapTable) table).getDataSize(singleReplica); diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java index d5eba8509f..56e9e27ed1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java @@ -22,7 +22,6 @@ import org.apache.doris.catalog.Env; import org.apache.doris.catalog.MaterializedIndexMeta; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Table; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.common.MetaNotFoundException; import org.apache.doris.httpv2.entity.ResponseEntityBuilder; import org.apache.doris.mysql.privilege.PrivPredicate; @@ -64,7 +63,7 @@ public class StorageTypeCheckAction extends RestBaseController { Map> result = Maps.newHashMap(); List
tbls = db.getTables(); for (Table tbl : tbls) { - if (tbl.getType() != TableType.OLAP) { + if (!tbl.isManagedTable()) { continue; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java index a0de8c0fad..4b5f1087b0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java @@ -273,7 +273,7 @@ public class ExportJob implements Writable { if (exportTable.getType() == TableType.VIEW) { // view table generateViewOrExternalTableOutfile(qualifiedTableName); - } else if (exportTable.getType() == TableType.OLAP) { + } else if (exportTable.isManagedTable()) { // olap table generateOlapTableOutfile(qualifiedTableName); } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/ExportTaskExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/load/ExportTaskExecutor.java index 0f2e9c3667..1424f3bc30 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/ExportTaskExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/ExportTaskExecutor.java @@ -24,7 +24,6 @@ import org.apache.doris.catalog.Database; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.Partition; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.catalog.TabletMeta; import org.apache.doris.common.AnalysisException; import org.apache.doris.load.ExportFailMsg.CancelType; @@ -88,7 +87,7 @@ public class ExportTaskExecutor implements TransientTaskExecutor { throw new JobException("Export executor has been canceled, task id: {}", taskId); } // check the version of tablets, skip if the consistency is in partition level. - if (exportJob.getExportTable().getType() == TableType.OLAP && !exportJob.isPartitionConsistency()) { + if (exportJob.getExportTable().isManagedTable() && !exportJob.isPartitionConsistency()) { try { Database db = Env.getCurrentEnv().getInternalCatalog().getDbOrAnalysisException( exportJob.getTableName().getDb()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropMTMVInfo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropMTMVInfo.java index 8143c8c8f1..47ae57c7e4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropMTMVInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DropMTMVInfo.java @@ -69,7 +69,7 @@ public class DropMTMVInfo { */ public DropTableStmt translateToLegacyStmt() { TableName tableName = mvName.transferToTableName(); - DropTableStmt dropTableStmt = new DropTableStmt(ifExists, tableName, false); + DropTableStmt dropTableStmt = new DropTableStmt(ifExists, tableName, true); dropTableStmt.setMaterializedView(true); return dropTableStmt; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/query/IndexStats.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/query/IndexStats.java index df1265b735..8a877014cd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/query/IndexStats.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/query/IndexStats.java @@ -20,7 +20,6 @@ package org.apache.doris.statistics.query; import org.apache.doris.catalog.Column; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.TableIf; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.common.util.Util; import com.google.common.collect.ImmutableMap; @@ -138,7 +137,7 @@ public class IndexStats { */ public Map getStats(boolean summary) { List indexColumns; - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { OlapTable olapTable = (OlapTable) table; indexColumns = olapTable.getSchemaByIndexId(indexId); } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/query/QueryStats.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/query/QueryStats.java index 3cb9502dbb..56f9d2f774 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/query/QueryStats.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/query/QueryStats.java @@ -21,7 +21,6 @@ import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.Env; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.TableIf; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.DdlException; import org.apache.doris.common.Pair; @@ -187,7 +186,7 @@ public class QueryStats { DatabaseIf d = c.getDbOrAnalysisException(database); TableIf t = d.getTableOrAnalysisException(table); long indexId = TableStats.DEFAULT_INDEX_ID; - if (t.getType() == TableType.OLAP) { + if (t.isManagedTable()) { indexId = ((OlapTable) t).getIndexIdByName(index); } return getStats(c.getId(), d.getId(), t.getId(), indexId, summary); @@ -266,7 +265,7 @@ public class QueryStats { ConcurrentHashMap indexStats = catalogStats.get(c.getId()).getDataBaseStats().get(d.getId()) .getTableStats().get(t.getId()).getIndexStats(); - if (t.getType() == TableType.OLAP) { + if (t.isManagedTable()) { for (Map.Entry entry : indexStats.entrySet()) { for (Map.Entry indexEntry : entry.getValue().getColumnQueryStats().entrySet()) { if (result.containsKey(indexEntry.getKey())) { @@ -300,7 +299,7 @@ public class QueryStats { CatalogIf c = Env.getCurrentEnv().getCatalogMgr().getCatalogOrAnalysisException(catalog); DatabaseIf d = c.getDbOrAnalysisException(db); TableIf t = d.getTableOrAnalysisException(tbl); - if (t.getType() == TableType.OLAP) { + if (t.isManagedTable()) { ((OlapTable) t).getIndexNameToId().keySet().forEach(indexName -> result.put(indexName, 0L)); } else { result.put(tbl, 0L); @@ -316,7 +315,7 @@ public class QueryStats { } ConcurrentHashMap indexStats = catalogStats.get(c.getId()).getDataBaseStats().get(d.getId()) .getTableStats().get(t.getId()).getIndexStats(); - if (t.getType() == TableType.OLAP) { + if (t.isManagedTable()) { for (Map.Entry entry : indexStats.entrySet()) { result.put(((OlapTable) t).getIndexNameById(entry.getKey()), entry.getValue().getQueryStats()); } @@ -334,7 +333,7 @@ public class QueryStats { CatalogIf c = Env.getCurrentEnv().getCatalogMgr().getCatalogOrAnalysisException(catalog); DatabaseIf d = c.getDbOrAnalysisException(db); TableIf t = d.getTableOrAnalysisException(tbl); - if (t.getType() == TableType.OLAP) { + if (t.isManagedTable()) { ((OlapTable) t).getIndexNameToId().forEach((indexName, indexId) -> { Map> indexResult = new LinkedHashMap<>(); ((OlapTable) t).getSchemaByIndexId(indexId) @@ -358,7 +357,7 @@ public class QueryStats { ConcurrentHashMap indexStats = catalogStats.get(c.getId()).getDataBaseStats().get(d.getId()) .getTableStats().get(t.getId()).getIndexStats(); for (Map.Entry entry : indexStats.entrySet()) { - String indexName = t.getType() == TableType.OLAP ? ((OlapTable) t).getIndexNameById(entry.getKey()) : tbl; + String indexName = t.isManagedTable() ? ((OlapTable) t).getIndexNameById(entry.getKey()) : tbl; if (!result.containsKey(indexName)) { continue; } @@ -373,7 +372,7 @@ public class QueryStats { indexResult.get(indexEntry.getKey()).second = indexEntry.getValue().get(); } } - if (t.getType() == TableType.OLAP) { + if (t.isManagedTable()) { result.get(((OlapTable) t).getIndexNameById(entry.getKey())).putAll(indexResult); } else { result.put(tbl, indexResult); diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/query/TableStats.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/query/TableStats.java index e6c314d39a..8b24c99aa3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/query/TableStats.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/query/TableStats.java @@ -20,7 +20,6 @@ package org.apache.doris.statistics.query; import org.apache.doris.catalog.DatabaseIf; import org.apache.doris.catalog.OlapTable; import org.apache.doris.catalog.TableIf; -import org.apache.doris.catalog.TableIf.TableType; import org.apache.doris.common.AnalysisException; import com.google.common.collect.ImmutableMap; @@ -126,7 +125,7 @@ public class TableStats { Map stat = new HashMap<>(); stat.put("summary", ImmutableMap.of("query", getQueryStats())); Map dstat = new HashMap<>(); - if (table.getType() == TableType.OLAP) { + if (table.isManagedTable()) { OlapTable olapTable = (OlapTable) table; for (Map.Entry entry : olapTable.getIndexNameToId().entrySet()) { if (indexStats.containsKey(entry.getValue())) { diff --git a/regression-test/suites/mtmv_p0/test_recover_mtmv.groovy b/regression-test/suites/mtmv_p0/test_recover_mtmv.groovy new file mode 100644 index 0000000000..4e926d6692 --- /dev/null +++ b/regression-test/suites/mtmv_p0/test_recover_mtmv.groovy @@ -0,0 +1,93 @@ +// 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_recover_mtmv") { + def tableName = "t_test_recover_mtmv_user" + def mvName = "test_recover_mtmv" + def dbName = "regression_test_mtmv_p0" + def dbName1 = "test_recover_mtmv_db"; + sql """drop table if exists `${tableName}`""" + sql """drop database if exists `${dbName1}`""" + sql """ + CREATE TABLE IF NOT EXISTS `${tableName}` ( + event_day DATE, + id BIGINT, + username VARCHAR(20) + ) + DISTRIBUTED BY HASH(id) BUCKETS 10 + PROPERTIES ( + "replication_num" = "1" + ); + """ + sql """drop materialized view if exists ${mvName};""" + + sql """ + CREATE MATERIALIZED VIEW ${mvName} + BUILD DEFERRED REFRESH COMPLETE ON MANUAL + DISTRIBUTED BY RANDOM BUCKETS 2 + PROPERTIES ('replication_num' = '1') + AS + SELECT * FROM ${tableName}; + """ + + // test recover partition of MTMV + try { + sql """ + RECOVER PARTITION p1 FROM ${mvName}; + """ + Assert.fail(); + } catch (Exception e) { + log.info(e.getMessage()) + } + + // test recover mv + sql """ + DROP MATERIALIZED VIEW ${mvName} + """ + try { + sql """ + recover table ${mvName}; + """ + Assert.fail(); + } catch (Exception e) { + log.info(e.getMessage()) + } + + sql """create database `${dbName1}`""" + + sql """ + CREATE MATERIALIZED VIEW ${dbName1}.${mvName} + BUILD DEFERRED REFRESH COMPLETE ON MANUAL + DISTRIBUTED BY RANDOM BUCKETS 2 + PROPERTIES ('replication_num' = '1') + AS + SELECT * FROM ${tableName}; + """ + + sql """drop database if exists `${dbName1}`""" + + sql """recover database ${dbName1};""" + + def result = sql """show tables from ${dbName1};""" + log.info(result.toString()) + assertEquals(0, result.size()) + + sql """drop database if exists `${dbName1}`""" + sql """drop table if exists `${tableName}`""" +}