This is an automated email from the ASF dual-hosted git repository.

panjuan 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 77debda  support mysql alter rename statement (#10487)
77debda is described below

commit 77debda907c71834b632c7d0ce08b397235bf581
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed May 26 17:06:00 2021 +0800

    support mysql alter rename statement (#10487)
    
    * create RenameTableDefinitionSegment to support mysql alter table rename
    
    * add parse test case
    
    * fix test case error
---
 .../impl/MySQLDDLStatementSQLVisitor.java          | 14 ++++++++
 .../impl/PostgreSQLDDLStatementSQLVisitor.java     | 19 ++++++++---
 .../ddl/table/RenameTableDefinitionSegment.java    | 39 ++++++++++++++++++++++
 .../ddl/impl/AlterTableStatementAssert.java        | 15 +++++++++
 .../statement/ddl/AlterTableStatementTestCase.java |  3 ++
 .../src/main/resources/case/ddl/alter-table.xml    |  6 ++++
 .../src/main/resources/sql/supported/ddl/alter.xml |  3 +-
 7 files changed, 93 insertions(+), 6 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
index 6f6e858..9bcc6b9 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLDDLStatementSQLVisitor.java
@@ -33,6 +33,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterLi
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterListItemContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterLogfileGroupContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterProcedureContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterRenameTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterServerContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableDropContext;
@@ -95,6 +96,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.Co
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.routine.RoutineBodySegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.routine.ValidStatementSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -248,6 +250,8 @@ public final class MySQLDDLStatementSQLVisitor extends 
MySQLStatementSQLVisitor
                     
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
                     
result.getAddConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                } else if (each instanceof RenameTableDefinitionSegment) {
+                    result.setRenameTable(((RenameTableDefinitionSegment) 
each).getRenameTable());
                 }
             }
         }
@@ -285,10 +289,20 @@ public final class MySQLDDLStatementSQLVisitor extends 
MySQLStatementSQLVisitor
             if (each instanceof AddTableConstraintContext) {
                 result.getValue().add((ConstraintDefinitionSegment) 
visit(((AddTableConstraintContext) each).tableConstraintDef()));
             }
+            if (each instanceof AlterRenameTableContext) {
+                result.getValue().add((RenameTableDefinitionSegment) 
visit(each));
+            }
         }
         return result;
     }
     
+    @Override
+    public ASTNode visitAlterRenameTable(final AlterRenameTableContext ctx) {
+        RenameTableDefinitionSegment result = new 
RenameTableDefinitionSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex());
+        result.setRenameTable((SimpleTableSegment) visit(ctx.tableName()));
+        return result;
+    }
+    
     private DropColumnDefinitionSegment 
generateDropColumnDefinitionSegment(final AlterTableDropContext ctx) {
         ColumnSegment column = new 
ColumnSegment(ctx.columnInternalRef.start.getStartIndex(), 
ctx.columnInternalRef.stop.getStopIndex(),
                 (IdentifierValue) visit(ctx.columnInternalRef));
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
index 298f0cf..5771133 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java
@@ -50,12 +50,12 @@ import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Dr
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.DropSequenceContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.DropTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.DropViewContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IdentifierContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IndexNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IndexNamesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.ModifyColumnSpecificationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.PrepareContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.RenameColumnSpecificationContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.RenameTableSpecificationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TableConstraintContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TableNameClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.TableNamesClauseContext;
@@ -69,6 +69,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.RenameColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.constraint.ConstraintDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.index.IndexSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.table.RenameTableDefinitionSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.DataTypeSegment;
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
@@ -165,12 +166,10 @@ public final class PostgreSQLDDLStatementSQLVisitor 
extends PostgreSQLStatementS
                     
result.getDropColumnDefinitions().add((DropColumnDefinitionSegment) each);
                 } else if (each instanceof ConstraintDefinitionSegment) {
                     
result.getAddConstraintDefinitions().add((ConstraintDefinitionSegment) each);
+                } else if (each instanceof RenameTableDefinitionSegment) {
+                    result.setRenameTable(((RenameTableDefinitionSegment) 
each).getRenameTable());
                 }
             }
-            if (null != 
ctx.alterDefinitionClause().renameTableSpecification()) {
-                IdentifierContext identifier = 
ctx.alterDefinitionClause().renameTableSpecification().identifier();
-                result.setRenameTable(new 
SimpleTableSegment(identifier.start.getStartIndex(), 
identifier.stop.getStopIndex(), (IdentifierValue) visit(identifier)));
-            }
         }
         return result;
     }
@@ -196,6 +195,16 @@ public final class PostgreSQLDDLStatementSQLVisitor 
extends PostgreSQLStatementS
                 }
             }
         }
+        if (null != ctx.renameTableSpecification()) {
+            result.getValue().add((RenameTableDefinitionSegment) 
visit(ctx.renameTableSpecification()));
+        }
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitRenameTableSpecification(final 
RenameTableSpecificationContext ctx) {
+        RenameTableDefinitionSegment result = new 
RenameTableDefinitionSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex());
+        result.setRenameTable(new 
SimpleTableSegment(ctx.identifier().start.getStartIndex(), 
ctx.identifier().stop.getStopIndex(), (IdentifierValue) 
visit(ctx.identifier())));
         return result;
     }
     
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/table/RenameTableDefinitionSegment.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/table/RenameTableDefinitionSegment.java
new file mode 100644
index 0000000..b5ce491
--- /dev/null
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/ddl/table/RenameTableDefinitionSegment.java
@@ -0,0 +1,39 @@
+/*
+ * 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.sql.common.segment.ddl.table;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.AlterDefinitionSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+
+/**
+ * Rename table definition segment.
+ */
+@RequiredArgsConstructor
+@Getter
+@Setter
+public final class RenameTableDefinitionSegment implements 
AlterDefinitionSegment {
+    
+    private final int startIndex;
+    
+    private final int stopIndex;
+    
+    private SimpleTableSegment renameTable;
+}
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
index 3fb9fcf..e45bb29 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/ddl/impl/AlterTableStatementAssert.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.
 import 
org.apache.shardingsphere.sql.parser.sql.common.segment.ddl.column.alter.ModifyColumnDefinitionSegment;
 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.AlterTableStatement;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
 import 
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.column.ColumnAssert;
@@ -40,11 +41,14 @@ import 
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Optional;
 
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Alter table statement assert.
@@ -61,12 +65,23 @@ 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);
         assertAddColumnDefinitions(assertContext, actual, expected);
         assertAddConstraintDefinitions(assertContext, actual, expected);
         assertModifyColumnDefinitions(assertContext, actual, expected);
         assertDropColumns(assertContext, actual, expected);
     }
     
+    private static void assertRenameTable(final SQLCaseAssertContext 
assertContext, final AlterTableStatement actual, final 
AlterTableStatementTestCase expected) {
+        Optional<SimpleTableSegment> tableSegment = actual.getRenameTable();
+        if (null != expected.getRenameTable()) {
+            assertTrue(assertContext.getText("Actual table segment should 
exist."), tableSegment.isPresent());
+            TableAssert.assertIs(assertContext, tableSegment.get(), 
expected.getRenameTable());
+        } else {
+            assertFalse(assertContext.getText("Actual table segment should not 
exist."), tableSegment.isPresent());
+        }
+    }
+    
     private static void assertTable(final SQLCaseAssertContext assertContext, 
final AlterTableStatement actual, final AlterTableStatementTestCase expected) {
         TableAssert.assertIs(assertContext, actual.getTable(), 
expected.getTable());
     }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
index f14ced8..ae618fb 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/ddl/AlterTableStatementTestCase.java
@@ -40,6 +40,9 @@ public final class AlterTableStatementTestCase extends 
SQLParserTestCase {
     @XmlElement(name = "table")
     private ExpectedSimpleTable table;
     
+    @XmlElement(name = "rename-table")
+    private ExpectedSimpleTable renameTable;
+    
     @XmlElement(name = "add-column")
     private final List<ExpectedAddColumnDefinition> addColumns = new 
LinkedList<>();
     
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/ddl/alter-table.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/ddl/alter-table.xml
index ebb1f51..043c24f 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/ddl/alter-table.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/ddl/alter-table.xml
@@ -857,6 +857,12 @@
     
     <alter-table sql-case-id="alter_table_rename_table">
         <table name="t_order" start-index="12" stop-index="18" />
+        <rename-table name="t_order1" start-index="30" stop-index="37" />
+    </alter-table>
+
+    <alter-table sql-case-id="alter_table_rename_multi_tables">
+        <table name="t_order" start-index="12" stop-index="18" />
+        <rename-table name="t_order2" start-index="50" stop-index="57" />
     </alter-table>
     
     <alter-table sql-case-id="alter_table_rename_column">
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/alter.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/alter.xml
index e7eedbf..3c942e3 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/alter.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/alter.xml
@@ -96,7 +96,8 @@
     <sql-case id="alter_table_add_foreign_key_with_cascade" value="ALTER TABLE 
t_order_item ADD CONSTRAINT fk_order_id FOREIGN KEY (order_id) REFERENCES 
t_order (order_id) ON UPDATE CASCADE ON DELETE CASCADE" db-types="PostgreSQL" />
     <sql-case id="alter_table_drop_constraints_postgresql" value="ALTER TABLE 
t_order DROP CONSTRAINT pk_order_id, DROP CONSTRAINT uk_order_id, DROP 
CONSTRAINT order_index" db-types="PostgreSQL" />
     <sql-case id="alter_table_rename_constraints" value="ALTER TABLE t_order 
RENAME CONSTRAINT order_index_bak TO order_index" db-types="PostgreSQL" />
-    <sql-case id="alter_table_rename_table" value="ALTER TABLE t_order RENAME 
to t_order1" db-types="PostgreSQL" />
+    <sql-case id="alter_table_rename_table" value="ALTER TABLE t_order RENAME 
TO t_order1" db-types="MySQL,PostgreSQL" />
+    <sql-case id="alter_table_rename_multi_tables" value="ALTER TABLE t_order 
RENAME TO t_order1, RENAME TO t_order2" db-types="MySQL" />
     <sql-case id="alter_table_rename_column" value="ALTER TABLE t_order RENAME 
COLUMN user_id to user_id1" db-types="PostgreSQL" />
     <sql-case id="alter_table_with_exist_index" value="ALTER TABLE t_order ADD 
PRIMARY KEY USING INDEX order_index" db-types="PostgreSQL" />
     <sql-case id="alter_table_with_bracket" value="ALTER TABLE [t_order] 
REBUILD" db-types="SQLServer" />

Reply via email to