You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/06/02 03:38:55 UTC
[shardingsphere] branch master updated: Support create table like syntax parsed (#25926) (#25993)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 35856435d1b Support create table like syntax parsed (#25926) (#25993)
35856435d1b is described below
commit 35856435d1b10f9c1d388b3040c4c8d8005616e2
Author: niu niu <zi...@aliyun.com>
AuthorDate: Fri Jun 2 11:38:47 2023 +0800
Support create table like syntax parsed (#25926) (#25993)
---
.../visitor/statement/type/MySQLDDLStatementVisitor.java | 3 +++
.../dialect/handler/ddl/CreateTableStatementHandler.java | 14 ++++++++++++++
.../statement/mysql/ddl/MySQLCreateTableStatement.java | 16 ++++++++++++++++
.../statement/ddl/impl/CreateTableStatementAssert.java | 12 ++++++++++++
.../jaxb/statement/ddl/CreateTableStatementTestCase.java | 3 +++
.../parser/src/main/resources/case/ddl/create-table.xml | 4 ++++
.../main/resources/sql/supported/ddl/create-table.xml | 1 +
7 files changed, 53 insertions(+)
diff --git a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
index 3104bf4485b..8715e02b99f 100644
--- a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
+++ b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
@@ -252,6 +252,9 @@ public final class MySQLDDLStatementVisitor extends MySQLStatementVisitor implem
}
}
}
+ if (null != ctx.createLikeClause()) {
+ result.setLikeTable((SimpleTableSegment) visit(ctx.createLikeClause()));
+ }
return result;
}
diff --git a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java
index 2d6d82a1460..a2f86e29137 100644
--- a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java
+++ b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/handler/ddl/CreateTableStatementHandler.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.handler.SQLStatementHandler;
@@ -86,4 +87,17 @@ public final class CreateTableStatementHandler implements SQLStatementHandler {
}
return Collections.emptyList();
}
+
+ /**
+ * Get like table.
+ *
+ * @param createTableStatement create table statement
+ * @return like table
+ */
+ public static Optional<SimpleTableSegment> getLikeTable(final CreateTableStatement createTableStatement) {
+ if (createTableStatement instanceof MySQLCreateTableStatement) {
+ return ((MySQLCreateTableStatement) createTableStatement).getLikeTable();
+ }
+ return Optional.empty();
+ }
}
diff --git a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
index 06ed55928d9..0281b9c7bdc 100644
--- a/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
+++ b/parser/sql/statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/ddl/MySQLCreateTableStatement.java
@@ -19,15 +19,31 @@ package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.ddl;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import java.util.Optional;
+
/**
* MySQL create table statement.
*/
@RequiredArgsConstructor
@Getter
+@Setter
public final class MySQLCreateTableStatement extends CreateTableStatement implements MySQLStatement {
private final boolean ifNotExists;
+
+ private SimpleTableSegment likeTable;
+
+ /**
+ * Get like table.
+ *
+ * @return like table
+ */
+ public Optional<SimpleTableSegment> getLikeTable() {
+ return Optional.ofNullable(likeTable);
+ }
}
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java
index ab007e74784..872d73726f3 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/CreateTableStatementAssert.java
@@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.ColumnDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
import org.apache.shardingsphere.sql.parser.sql.dialect.handler.ddl.CreateTableStatementHandler;
@@ -60,6 +61,7 @@ public final class CreateTableStatementAssert {
assertConstraintDefinitions(assertContext, actual, expected);
assertCreateTableAsSelectStatement(assertContext, actual, expected);
assertCreateTableAsSelectStatementColumns(assertContext, actual, expected);
+ assertLikeTableStatement(assertContext, actual, expected);
}
private static void assertTable(final SQLCaseAssertContext assertContext, final CreateTableStatement actual, final CreateTableStatementTestCase expected) {
@@ -103,4 +105,14 @@ public final class CreateTableStatementAssert {
count++;
}
}
+
+ private static void assertLikeTableStatement(final SQLCaseAssertContext assertContext, final CreateTableStatement actual, final CreateTableStatementTestCase expected) {
+ Optional<SimpleTableSegment> likeTableSegment = CreateTableStatementHandler.getLikeTable(actual);
+ if (null == expected.getLikeTable()) {
+ assertFalse(likeTableSegment.isPresent(), "actual like table statement should not exist");
+ } else {
+ assertTrue(likeTableSegment.isPresent(), "actual like table statement should exist");
+ TableAssert.assertIs(assertContext, likeTableSegment.get(), expected.getLikeTable());
+ }
+ }
}
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java
index 45a2574a15c..61ee3733503 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/ddl/CreateTableStatementTestCase.java
@@ -51,4 +51,7 @@ public final class CreateTableStatementTestCase extends SQLParserTestCase {
@XmlElement(name = "select")
private SelectStatementTestCase createTableAsSelectStatement;
+
+ @XmlElement(name = "like-table")
+ private ExpectedSimpleTable likeTable;
}
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 6393a0f7e63..e3387c4be2c 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
@@ -17,6 +17,10 @@
-->
<sql-parser-test-cases>
+ <create-table sql-case-id="create_table_with_like">
+ <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">
<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 ebfbd0d41d4..db5c27855bb 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
@@ -17,6 +17,7 @@
-->
<sql-cases>
+ <sql-case id="create_table_with_like" value="CREATE TABLE t_log LIKE t_old_log" db-types="MySQL" />
<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" />
<sql-case id="create_table_with_keyword" value="CREATE TABLE t_log(id int PRIMARY KEY, status boolean)" db-types="PostgreSQL,openGauss" />