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 9ad9ff355f2 Support parsing Doris CREATE TABLE LIKE syntax (#38289)
9ad9ff355f2 is described below
commit 9ad9ff355f243ef8adcad68aa7d924588e0d4c22
Author: cxy <[email protected]>
AuthorDate: Mon Mar 2 11:10:17 2026 +0800
Support parsing Doris CREATE TABLE LIKE syntax (#38289)
---
.../doris/src/main/antlr4/imports/doris/DDLStatement.g4 | 2 +-
.../visitor/statement/type/DorisDDLStatementVisitor.java | 3 +++
.../statement/type/ddl/table/CreateTableStatement.java | 3 +++
.../ddl/standard/type/CreateTableStatementAssert.java | 12 ++++++++++++
.../ddl/standard/table/CreateTableStatementTestCase.java | 4 ++++
.../parser/src/main/resources/case/ddl/create-table.xml | 15 +++++++++++++++
.../src/main/resources/sql/supported/ddl/create-table.xml | 2 ++
7 files changed, 40 insertions(+), 1 deletion(-)
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 d04bbb69944..97819f83ffc 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
@@ -689,7 +689,7 @@ visibility
;
createLikeClause
- : LP_? LIKE tableName RP_?
+ : LP_? LIKE tableName RP_? (WITH ROLLUP LP_ identifier (COMMA_
identifier)* RP_)?
;
createIndexSpecification
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 757cb4044a6..500316eddfd 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
@@ -532,6 +532,9 @@ public final class DorisDDLStatementVisitor extends
DorisStatementVisitor implem
}
if (null != ctx.createLikeClause()) {
result.setLikeTable((SimpleTableSegment)
visit(ctx.createLikeClause()));
+ for (IdentifierContext each : ctx.createLikeClause().identifier())
{
+ result.getRollups().add(new
RollupSegment(each.getStart().getStartIndex(), each.getStop().getStopIndex(),
new IdentifierValue(each.getText())));
+ }
}
if (null != ctx.createTableOptions()) {
result.setCreateTableOption((CreateTableOptionSegment)
visit(ctx.createTableOptions()));
diff --git
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
index 32f227e2145..eb5e4d2b371 100644
---
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
+++
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/type/ddl/table/CreateTableStatement.java
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.Co
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintDefinitionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.index.IndexSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.rollup.RollupSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.CreateTableOptionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
@@ -63,6 +64,8 @@ public final class CreateTableStatement extends DDLStatement {
private final List<ColumnSegment> columns = new LinkedList<>();
+ private final Collection<RollupSegment> rollups = new LinkedList<>();
+
private SQLStatementAttributes attributes;
public CreateTableStatement(final DatabaseType databaseType) {
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java
index 25a22d09de2..2390220eff2 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/standard/type/CreateTableStatementAssert.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.column.ColumnDefinitionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.constraint.ConstraintDefinitionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.rollup.RollupSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.table.CreateTableOptionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
@@ -31,6 +32,7 @@ import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.col
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ColumnDefinitionAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.ConstraintDefinitionAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.definition.CreateTableOptionDefinitionAssert;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.rollup.RollupAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.segment.table.TableAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.dml.standard.type.SelectStatementAssert;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.ddl.standard.table.CreateTableStatementTestCase;
@@ -63,6 +65,7 @@ public final class CreateTableStatementAssert {
assertCreateTableAsSelectStatement(assertContext, actual, expected);
assertCreateTableAsSelectStatementColumns(assertContext, actual,
expected);
assertLikeTableStatement(assertContext, actual, expected);
+ assertRollups(assertContext, actual, expected);
assertCreateTableOptionStatement(assertContext, actual, expected);
}
@@ -118,6 +121,15 @@ public final class CreateTableStatementAssert {
}
}
+ private static void assertRollups(final SQLCaseAssertContext
assertContext, final CreateTableStatement actual, final
CreateTableStatementTestCase expected) {
+ assertThat(assertContext.getText("Rollups size assertion error: "),
actual.getRollups().size(), is(expected.getRollups().size()));
+ int count = 0;
+ for (RollupSegment each : actual.getRollups()) {
+ RollupAssert.assertIs(assertContext, each,
expected.getRollups().get(count));
+ count++;
+ }
+ }
+
private static void assertCreateTableOptionStatement(final
SQLCaseAssertContext assertContext, final CreateTableStatement actual, final
CreateTableStatementTestCase expected) {
Optional<CreateTableOptionSegment> createTableOption =
actual.getCreateTableOption();
if (null == expected.getCreateTableOption()) {
diff --git
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java
index 13dd93ff7e2..ac3bbe8f36c 100644
---
a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java
+++
b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/standard/table/CreateTableStatementTestCase.java
@@ -24,6 +24,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.ExpectedColumnDefinition;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedConstraintDefinition;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.definition.ExpectedCreateTableOptionDefinition;
+import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.rollup.ExpectedRollup;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.table.ExpectedSimpleTable;
import
org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dml.standard.SelectStatementTestCase;
@@ -56,6 +57,9 @@ public final class CreateTableStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "like-table")
private ExpectedSimpleTable likeTable;
+ @XmlElement(name = "rollup")
+ private final List<ExpectedRollup> rollups = new LinkedList<>();
+
@XmlElement(name = "create-table-option")
private ExpectedCreateTableOptionDefinition createTableOption;
}
diff --git a/test/it/parser/src/main/resources/case/ddl/create-table.xml
b/test/it/parser/src/main/resources/case/ddl/create-table.xml
index c3644cbb9c7..bb1170703c4 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-table.xml
@@ -81,6 +81,21 @@
<table name="t_log" start-index="13" stop-index="17" />
<like-table name="t_old_log" start-index="24" stop-index="32" />
</create-table>
+ <create-table sql-case-id="create_table_like_with_rollup">
+ <table name="table2" start-index="13" stop-index="24">
+ <owner name="test1" start-index="13" stop-index="17" />
+ </table>
+ <like-table name="table1" start-index="31" stop-index="42">
+ <owner name="test1" start-index="31" stop-index="35" />
+ </like-table>
+ <rollup name="r1" start-index="57" stop-index="58" />
+ <rollup name="r2" start-index="60" stop-index="61" />
+ </create-table>
+ <create-table sql-case-id="create_table_like_with_single_rollup">
+ <table name="t_new" start-index="13" stop-index="17" />
+ <like-table name="t_old" start-index="24" stop-index="28" />
+ <rollup name="r1" start-index="43" stop-index="44" />
+ </create-table>
<create-table sql-case-id="create_table">
<table name="t_log" start-index="13" stop-index="17" />
<column-definition type="int" primary-key="true" start-index="19"
stop-index="36">
diff --git
a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
index e1cf8e32cf9..01b1d3bd509 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
@@ -24,6 +24,8 @@
<sql-case id="create_table_with_backtick" value="CREATE TABLE ```t_order`
(i int)" db-types="MySQL" />
<sql-case id="create_table_column_with_backtick" value="create table
`````t_o``r``d``e``r``` (```i` int)" db-types="MySQL" />
<sql-case id="create_table_with_like" value="CREATE TABLE t_log LIKE
t_old_log" db-types="MySQL,Doris" />
+ <sql-case id="create_table_like_with_rollup" value="CREATE TABLE
test1.table2 LIKE test1.table1 WITH ROLLUP (r1,r2)" db-types="Doris" />
+ <sql-case id="create_table_like_with_single_rollup" value="CREATE TABLE
t_new LIKE t_old WITH ROLLUP (r1)" db-types="Doris" />
<sql-case id="create_table" value="CREATE TABLE t_log(id int PRIMARY KEY,
status varchar(10))" />
<sql-case id="create_table_with_engin_charset" value="CREATE TABLE
t_log(id int PRIMARY KEY, status varchar(10)) ENGINE=InnoDB DEFAULT
CHARSET=utf8mb4" db-types="MySQL,Doris" />
<sql-case id="create_table_with_keyword" value="CREATE TABLE t_log(id int
PRIMARY KEY, status boolean)" db-types="PostgreSQL,openGauss" />