This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new df6d14bcdaa Support parsing Doris ALTER TABLE REPLACE syntax (#38101)
df6d14bcdaa is described below
commit df6d14bcdaafb23195b12f02361f94f8ed59feea
Author: cxy <[email protected]>
AuthorDate: Fri Feb 20 00:46:59 2026 +0800
Support parsing Doris ALTER TABLE REPLACE syntax (#38101)
---
.../src/main/antlr4/imports/doris/DDLStatement.g4 | 1 +
.../statement/type/DorisDDLStatementVisitor.java | 17 +++++++++
.../ddl/table/ReplaceTableDefinitionSegment.java | 42 ++++++++++++++++++++++
.../type/ddl/table/AlterTableStatement.java | 15 ++++++++
.../standard/type/AlterTableStatementAssert.java | 39 ++++++++++++++++++++
.../definition/ExpectedReplaceTableDefinition.java | 40 +++++++++++++++++++++
.../table/AlterTableStatementTestCase.java | 4 +++
.../src/main/resources/case/ddl/alter-table.xml | 41 +++++++++++++++++++++
.../resources/sql/supported/ddl/alter-table.xml | 4 +++
9 files changed, 203 insertions(+)
diff --git
a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4
b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4
index 750d00b0523..32367d83747 100644
---
a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4
+++
b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4
@@ -139,6 +139,7 @@ alterListItem
| RENAME keyOrIndex indexName TO indexName # renameIndex
| RENAME ROLLUP oldRollupName=identifier newRollupName=identifier #
renameRollup
| RENAME PARTITION oldPartitionName=identifier newPartitionName=identifier
# renamePartition
+ | REPLACE WITH TABLE tableName propertiesClause? # replaceTable
| CONVERT TO charset charsetName collateClause? # alterConvert
| FORCE # alterTableForce
| ORDER BY alterOrderList # alterTableOrder
diff --git
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
index 06c9cef0c43..134029ed4b7 100644
---
a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
+++
b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDDLStatementVisitor.java
@@ -117,6 +117,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ValidSt
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.WhileStatementContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.RenameRollupContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.RenamePartitionContext;
+import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ReplaceTableContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.AlterStoragePolicyContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.PropertiesClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.CreateEncryptKeyContext;
@@ -163,6 +164,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.Con
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.CreateTableOptionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.LockTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.RenameTableDefinitionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.ReplaceTableDefinitionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.tablespace.TablespaceSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.view.ViewColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
@@ -478,6 +480,8 @@ public final class DorisDDLStatementVisitor extends
DorisStatementVisitor implem
alterTableStatement.getDropConstraintDefinitions().add((DropConstraintDefinitionSegment)
alterDefinitionSegment);
} else if (alterDefinitionSegment instanceof
RenameTableDefinitionSegment) {
alterTableStatement.setRenameTable(((RenameTableDefinitionSegment)
alterDefinitionSegment).getRenameTable());
+ } else if (alterDefinitionSegment instanceof
ReplaceTableDefinitionSegment) {
+
alterTableStatement.setReplaceTable((ReplaceTableDefinitionSegment)
alterDefinitionSegment);
} else if (alterDefinitionSegment instanceof
ConvertTableDefinitionSegment) {
alterTableStatement.setConvertTableDefinition((ConvertTableDefinitionSegment)
alterDefinitionSegment);
} else if (alterDefinitionSegment instanceof
DropIndexDefinitionSegment) {
@@ -563,6 +567,9 @@ public final class DorisDDLStatementVisitor extends
DorisStatementVisitor implem
if (alterListItemContext instanceof AlterRenameTableContext) {
return Optional.of((RenameTableDefinitionSegment)
visit(alterListItemContext));
}
+ if (alterListItemContext instanceof ReplaceTableContext) {
+ return Optional.of((ReplaceTableDefinitionSegment)
visit(alterListItemContext));
+ }
if (alterListItemContext instanceof AlterConvertContext) {
return Optional.of((ConvertTableDefinitionSegment)
visit(alterListItemContext));
}
@@ -660,6 +667,16 @@ public final class DorisDDLStatementVisitor extends
DorisStatementVisitor implem
return result;
}
+ @Override
+ public ASTNode visitReplaceTable(final ReplaceTableContext ctx) {
+ ReplaceTableDefinitionSegment result = new
ReplaceTableDefinitionSegment(ctx.start.getStartIndex(),
ctx.stop.getStopIndex());
+ result.setReplaceTable((SimpleTableSegment) visit(ctx.tableName()));
+ if (null != ctx.propertiesClause()) {
+
result.setProperties(extractPropertiesSegment(ctx.propertiesClause()));
+ }
+ return result;
+ }
+
@Override
public ASTNode visitRenameTable(final RenameTableContext ctx) {
Collection<RenameTableDefinitionSegment> renameTables = new
LinkedList<>();
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/table/ReplaceTableDefinitionSegment.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/table/ReplaceTableDefinitionSegment.java
new file mode 100644
index 00000000000..55a755789d4
--- /dev/null
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/segment/ddl/table/ReplaceTableDefinitionSegment.java
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+package org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.AlterDefinitionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.property.PropertiesSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
+
+/**
+ * Replace table definition segment.
+ */
+@RequiredArgsConstructor
+@Getter
+@Setter
+public final class ReplaceTableDefinitionSegment implements
AlterDefinitionSegment {
+
+ private final int startIndex;
+
+ private final int stopIndex;
+
+ private SimpleTableSegment replaceTable;
+
+ private PropertiesSegment properties;
+}
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/AlterTableStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/AlterTableStatement.java
index adcf04cfaad..92e849d41ca 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/AlterTableStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/AlterTableStatement.java
@@ -42,6 +42,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.rollup.Re
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.AlgorithmTypeSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.ConvertTableDefinitionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.LockTableSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.ReplaceTableDefinitionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
@@ -66,6 +67,8 @@ public final class AlterTableStatement extends DDLStatement {
private SimpleTableSegment renameTable;
+ private ReplaceTableDefinitionSegment replaceTable;
+
private ConvertTableDefinitionSegment convertTableDefinition;
private ModifyCollectionRetrievalSegment modifyCollectionRetrieval;
@@ -119,6 +122,15 @@ public final class AlterTableStatement extends
DDLStatement {
return Optional.ofNullable(renameTable);
}
+ /**
+ * Get replace table definition.
+ *
+ * @return replace table definition
+ */
+ public Optional<ReplaceTableDefinitionSegment> getReplaceTable() {
+ return Optional.ofNullable(replaceTable);
+ }
+
/**
* Get convert table definition.
*
@@ -175,6 +187,9 @@ public final class AlterTableStatement extends DDLStatement
{
if (getRenameTable().isPresent()) {
result.add(getRenameTable().get());
}
+ if (getReplaceTable().isPresent() && null !=
getReplaceTable().get().getReplaceTable()) {
+ result.add(getReplaceTable().get().getReplaceTable());
+ }
for (AddColumnDefinitionSegment each : addColumnDefinitions) {
for (ColumnDefinitionSegment columnDefinition :
each.getColumnDefinitions()) {
result.addAll(columnDefinition.getReferencedTables());
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/AlterTableStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/AlterTableStatementAssert.java
index 38d47b7bac9..8b7b6fa4b65 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/AlterTableStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/AlterTableStatementAssert.java
@@ -33,6 +33,9 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.partition
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.primary.DropPrimaryKeyDefinitionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.rollup.RenameRollupDefinitionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.ConvertTableDefinitionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.ReplaceTableDefinitionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.property.PropertiesSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.property.PropertySegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.type.ddl.table.AlterTableStatement;
@@ -57,6 +60,8 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameIndexDefinition;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenamePartitionDefinition;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameRollupDefinition;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.distsql.ExpectedProperties;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.distsql.ExpectedProperty;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.table.AlterTableStatementTestCase;
import java.util.Collection;
@@ -87,6 +92,7 @@ public final class AlterTableStatementAssert {
public static void assertIs(final SQLCaseAssertContext assertContext,
final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
assertTable(assertContext, actual, expected);
assertRenameTable(assertContext, actual, expected);
+ assertReplaceTable(assertContext, actual, expected);
assertAddColumnDefinitions(assertContext, actual, expected);
assertAddConstraintDefinitions(assertContext, actual, expected);
assertModifyConstraintDefinitions(assertContext, actual, expected);
@@ -128,6 +134,39 @@ public final class AlterTableStatementAssert {
}
}
+ private static void assertReplaceTable(final SQLCaseAssertContext
assertContext, final AlterTableStatement actual, final
AlterTableStatementTestCase expected) {
+ Optional<ReplaceTableDefinitionSegment> replaceTableSegment =
actual.getReplaceTable();
+ if (null == expected.getReplaceTable()) {
+ assertFalse(replaceTableSegment.isPresent(),
assertContext.getText("Actual replace table segment should not exist."));
+ } else {
+ assertTrue(replaceTableSegment.isPresent(),
assertContext.getText("Actual replace table segment should exist."));
+ ReplaceTableDefinitionSegment actualReplaceTable =
replaceTableSegment.get();
+ assertNotNull(actualReplaceTable.getReplaceTable(),
assertContext.getText("Actual replace table should exist."));
+ TableAssert.assertIs(assertContext,
actualReplaceTable.getReplaceTable(), expected.getReplaceTable().getTable());
+ if (null == expected.getReplaceTable().getProperties()) {
+ assertNull(actualReplaceTable.getProperties(),
assertContext.getText("Actual properties should not exist."));
+ } else {
+ assertNotNull(actualReplaceTable.getProperties(),
assertContext.getText("Actual properties should exist."));
+ assertProperties(assertContext,
actualReplaceTable.getProperties(), expected.getReplaceTable().getProperties());
+ }
+ SQLSegmentAssert.assertIs(assertContext, actualReplaceTable,
expected.getReplaceTable());
+ }
+ }
+
+ private static void assertProperties(final SQLCaseAssertContext
assertContext, final PropertiesSegment actual, final ExpectedProperties
expected) {
+ SQLSegmentAssert.assertIs(assertContext, actual, expected);
+ assertThat(assertContext.getText("Properties size assertion error: "),
actual.getProperties().size(), is(expected.getProperties().size()));
+ for (int i = 0; i < expected.getProperties().size(); i++) {
+ assertProperty(assertContext, actual.getProperties().get(i),
expected.getProperties().get(i));
+ }
+ }
+
+ private static void assertProperty(final SQLCaseAssertContext
assertContext, final PropertySegment actual, final ExpectedProperty expected) {
+ assertThat(assertContext.getText(String.format("Property key '%s'
assertion error: ", expected.getKey())), actual.getKey(),
is(expected.getKey()));
+ assertThat(assertContext.getText(String.format("Property value for key
'%s' assertion error: ", expected.getKey())), actual.getValue(),
is(expected.getValue()));
+ SQLSegmentAssert.assertIs(assertContext, actual, expected);
+ }
+
private static void assertTable(final SQLCaseAssertContext assertContext,
final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
TableAssert.assertIs(assertContext, actual.getTable(),
expected.getTable());
}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedReplaceTableDefinition.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedReplaceTableDefinition.java
new file mode 100644
index 00000000000..878988167f6
--- /dev/null
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedReplaceTableDefinition.java
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+package
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition;
+
+import lombok.Getter;
+import lombok.Setter;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.AbstractExpectedSQLSegment;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.distsql.ExpectedProperties;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
+
+import javax.xml.bind.annotation.XmlElement;
+
+/**
+ * Expected replace table definition.
+ */
+@Getter
+@Setter
+public final class ExpectedReplaceTableDefinition extends
AbstractExpectedSQLSegment {
+
+ @XmlElement(name = "table")
+ private ExpectedSimpleTable table;
+
+ @XmlElement(name = "properties")
+ private ExpectedProperties properties;
+}
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/AlterTableStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/AlterTableStatementTestCase.java
index 0532b39baa6..a740b6b477e 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/AlterTableStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/AlterTableStatementTestCase.java
@@ -32,6 +32,7 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.s
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameIndexDefinition;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenamePartitionDefinition;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedRenameRollupDefinition;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedReplaceTableDefinition;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
import javax.xml.bind.annotation.XmlElement;
@@ -51,6 +52,9 @@ public final class AlterTableStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "rename-table")
private ExpectedSimpleTable renameTable;
+ @XmlElement(name = "replace-table")
+ private ExpectedReplaceTableDefinition replaceTable;
+
@XmlElement(name = "convert-table")
private ExpectedConvertTableDefinition convertTable;
diff --git a/test/it/parser/src/main/resources/case/ddl/alter-table.xml
b/test/it/parser/src/main/resources/case/ddl/alter-table.xml
index 897ca46c7d9..350cbd53a82 100644
--- a/test/it/parser/src/main/resources/case/ddl/alter-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/alter-table.xml
@@ -2761,4 +2761,45 @@
</column-definition>
</add-column>
</alter-table>
+
+ <alter-table sql-case-id="alter_table_replace_with_table_swap_true">
+ <table name="tbl1" start-index="12" stop-index="15" />
+ <replace-table start-index="17" stop-index="67">
+ <table name="tbl2" start-index="36" stop-index="39" />
+ <properties start-index="41" stop-index="67">
+ <property key="swap" value="true" start-index="52"
stop-index="66" />
+ </properties>
+ </replace-table>
+ </alter-table>
+
+ <alter-table sql-case-id="alter_table_replace_with_table_swap_false">
+ <table name="tbl1" start-index="12" stop-index="15" />
+ <replace-table start-index="17" stop-index="68">
+ <table name="tbl2" start-index="36" stop-index="39" />
+ <properties start-index="41" stop-index="68">
+ <property key="swap" value="false" start-index="52"
stop-index="67" />
+ </properties>
+ </replace-table>
+ </alter-table>
+
+ <alter-table sql-case-id="alter_table_replace_with_table_default">
+ <table name="tbl1" start-index="12" stop-index="15" />
+ <replace-table start-index="17" stop-index="39">
+ <table name="tbl2" start-index="36" stop-index="39" />
+ </replace-table>
+ </alter-table>
+
+ <alter-table sql-case-id="alter_table_replace_with_table_with_database">
+ <table name="tbl1" start-index="12" stop-index="19">
+ <owner name="db1" start-index="12" stop-index="14" />
+ </table>
+ <replace-table start-index="21" stop-index="75">
+ <table name="tbl2" start-index="40" stop-index="47">
+ <owner name="db2" start-index="40" stop-index="42" />
+ </table>
+ <properties start-index="49" stop-index="75">
+ <property key="swap" value="true" start-index="60"
stop-index="74" />
+ </properties>
+ </replace-table>
+ </alter-table>
</sql-parser-test-cases>
diff --git
a/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml
b/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml
index 51c3fb7978e..e8bea9f12ad 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/alter-table.xml
@@ -398,4 +398,8 @@
<sql-case id="alter_table_with_lock_default_mysql" value="ALTER TABLE
t_order ADD COLUMN col_lock_default INT, LOCK=DEFAULT" db-types="MySQL" />
<sql-case id="alter_table_with_lock_shared_doris" value="ALTER TABLE
t_order ADD COLUMN col_lock_shared INT, LOCK=SHARED" db-types="Doris" />
<sql-case id="alter_table_with_lock_exclusive_doris" value="ALTER TABLE
t_order ADD COLUMN col_lock_exclusive INT, LOCK=EXCLUSIVE" db-types="Doris" />
+ <sql-case id="alter_table_replace_with_table_swap_true" value="ALTER TABLE
tbl1 REPLACE WITH TABLE tbl2 PROPERTIES('swap' = 'true')" db-types="Doris" />
+ <sql-case id="alter_table_replace_with_table_swap_false" value="ALTER
TABLE tbl1 REPLACE WITH TABLE tbl2 PROPERTIES('swap' = 'false')"
db-types="Doris" />
+ <sql-case id="alter_table_replace_with_table_default" value="ALTER TABLE
tbl1 REPLACE WITH TABLE tbl2" db-types="Doris" />
+ <sql-case id="alter_table_replace_with_table_with_database" value="ALTER
TABLE db1.tbl1 REPLACE WITH TABLE db2.tbl2 PROPERTIES('swap' = 'true')"
db-types="Doris" />
</sql-cases>