diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java index 5e11baf167044b..a325491adc0a4a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java @@ -577,6 +577,10 @@ private void processReplaceTable(Database db, OlapTable origTable, List allMTMVs = relationManager.getAllMTMVs(Lists.newArrayList(new BaseTableInfo(table))); + boolean hasMvA = false; + boolean hasMvB = false; + for (MTMV mtmv : allMTMVs) { + if ("mv_a".equals(mtmv.getName())) { + hasMvA = true; + } + if ("mv_b".equals(mtmv.getName())) { + hasMvB = true; + } + } + Assertions.assertFalse(hasMvA); + Assertions.assertTrue(hasMvB); + + + createTable("CREATE TABLE `stu1` (`sid` int(32) NULL, `sname` varchar(32) NULL)\n" + + "ENGINE=OLAP\n" + + "DUPLICATE KEY(`sid`)\n" + + "DISTRIBUTED BY HASH(`sid`) BUCKETS 1\n" + + "PROPERTIES ('replication_allocation' = 'tag.location.default: 1')"); + + DdlException exception = Assertions.assertThrows(DdlException.class, () -> + alterTableSync("ALTER TABLE stu1 REPLACE WITH TABLE mv_b PROPERTIES('swap' = 'true')")); + Assertions.assertEquals("errCode = 2, detailMessage = replace table[mv_b] cannot be a materialized view", exception.getMessage()); + } +} diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java index 6d0bbbbda53a27..04af189aa8e33e 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java +++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/TestWithFeService.java @@ -66,6 +66,7 @@ import org.apache.doris.nereids.rules.RuleType; import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator; import org.apache.doris.nereids.trees.plans.commands.AddConstraintCommand; +import org.apache.doris.nereids.trees.plans.commands.AlterMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.CreateMTMVCommand; import org.apache.doris.nereids.trees.plans.commands.CreateTableCommand; import org.apache.doris.nereids.trees.plans.commands.DropConstraintCommand; @@ -630,6 +631,11 @@ public void createDatabase(String db) throws Exception { Env.getCurrentEnv().createDb(createDbStmt); } + public void createDatabaseAndUse(String db) throws Exception { + createDatabase(db); + useDatabase(db); + } + public void createDatabaseWithSql(String createDbSql) throws Exception { CreateDbStmt createDbStmt = (CreateDbStmt) parseAndAnalyzeStmt(createDbSql); Env.getCurrentEnv().createDb(createDbStmt); @@ -854,6 +860,19 @@ protected void createMv(String sql) throws Exception { Thread.sleep(100); } + protected void alterMv(String sql) throws Exception { + NereidsParser nereidsParser = new NereidsParser(); + LogicalPlan parsed = nereidsParser.parseSingle(sql); + StmtExecutor stmtExecutor = new StmtExecutor(connectContext, sql); + if (parsed instanceof AlterMTMVCommand) { + ((AlterMTMVCommand) parsed).run(connectContext, stmtExecutor); + } + checkAlterJob(); + // waiting table state to normal + Thread.sleep(1000); + } + + protected void createMvByNereids(String sql) throws Exception { new MockUp() { @Mock