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" />