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