This is an automated email from the ASF dual-hosted git repository. chengzhang 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 8aaa7c7d029 Support alter table, drop table sql bind and add test case (#34154) 8aaa7c7d029 is described below commit 8aaa7c7d029e42dace3b3576da1a688af01bbfb8 Author: Zhengqiang Duan <duanzhengqi...@apache.org> AuthorDate: Thu Dec 26 11:49:45 2024 +0800 Support alter table, drop table sql bind and add test case (#34154) * Support sql bind for select with current select projection reference * update release note * fix unit test * fix unit test * fix unit test * fix unit test * Support alter table, drop table sql bind and add test case * update release note * fix rewrite it --- RELEASE-NOTES.md | 1 + .../ddl/ShardingDropTableSupportedCheckerTest.java | 2 +- .../ShardingDropTableRouteContextCheckerTest.java | 8 +- .../from/type/SimpleTableSegmentBinder.java | 14 +++ .../statement/ddl/AlterTableStatementBinder.java | 66 ++++++++++ .../statement/ddl/DropTableStatementBinder.java | 53 ++++++++ .../binder/engine/type/DDLStatementBindEngine.java | 10 ++ .../statement/type/DorisDDLStatementVisitor.java | 3 +- .../statement/type/MySQLDDLStatementVisitor.java | 3 +- .../type/OpenGaussDDLStatementVisitor.java | 4 +- .../type/PostgreSQLDDLStatementVisitor.java | 4 +- .../statement/type/PrestoDDLStatementVisitor.java | 3 +- .../type/SQLServerDDLStatementVisitor.java | 3 +- .../core/statement/ddl/AlterTableStatement.java | 8 ++ .../core/statement/ddl/DropTableStatement.java | 16 +++ .../doris/ddl/DorisDropTableStatement.java | 4 +- .../mysql/ddl/MySQLDropTableStatement.java | 4 +- .../opengauss/ddl/OpenGaussDropTableStatement.java | 6 +- .../ddl/PostgreSQLDropTableStatement.java | 6 +- .../presto/ddl/PrestoDropTableStatement.java | 4 +- .../sqlserver/ddl/SQLServerDropTableStatement.java | 4 +- .../prepare/MySQLComStmtPrepareCheckerTest.java | 3 +- .../it/sql/binder/dialect/doris/DorisBinderIT.java | 18 +-- .../src/test/resources/cases/ddl/alter-table.xml | 50 ++++++++ .../src/test/resources/cases/ddl/create-table.xml | 139 +++++++++++++++++++++ .../src/test/resources/cases/ddl/drop-table.xml | 49 ++++++++ .../sqls/ddl/{create-table.xml => alter-table.xml} | 3 +- .../src/test/resources/sqls/ddl/create-table.xml | 2 + .../sqls/ddl/{create-table.xml => drop-table.xml} | 3 +- .../engine/scenario/ShardingSQLRewriterIT.java | 7 ++ .../scenario/sharding/case/ddl/alter-table.xml | 4 +- 31 files changed, 466 insertions(+), 38 deletions(-) diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 5e23492b00d..0db9cb1685a 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -40,6 +40,7 @@ 1. SQL Binder: Remove TablesContext#findTableNames method and implement select order by, group by bind logic - [#34123](https://github.com/apache/shardingsphere/pull/34123) 1. SQL Binder: Support select with statement sql bind and add bind test case - [#34141](https://github.com/apache/shardingsphere/pull/34141) 1. SQL Binder: Support sql bind for select with current select projection reference - [#34151](https://github.com/apache/shardingsphere/pull/34151) +1. SQL Binder: Support alter table, drop table sql bind and add test case - [#34154](https://github.com/apache/shardingsphere/pull/34154) ### Bug Fixes diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java index 5223b63b374..35726fd7e22 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingDropTableSupportedCheckerTest.java @@ -62,7 +62,7 @@ class ShardingDropTableSupportedCheckerTest { @Test void assertCheckForMySQL() { - MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(false); + MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order_item")))); DropTableStatementContext sqlStatementContext = new DropTableStatementContext(sqlStatement); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java index 4a26cb3d8af..4c57935c353 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/ddl/ShardingDropTableRouteContextCheckerTest.java @@ -80,7 +80,7 @@ class ShardingDropTableRouteContextCheckerTest { @Test void assertCheckWhenDropTableInUsedForMySQL() { - MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(false); + MySQLDropTableStatement sqlStatement = new MySQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order_item")))); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(database.getName()).thenReturn("db_schema"); @@ -119,7 +119,7 @@ class ShardingDropTableRouteContextCheckerTest { @Test void assertCheckWithSameRouteResultShardingTableForPostgreSQL() { - PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(false, false); + PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(shardingRule.isShardingTable("t_order")).thenReturn(true); when(shardingRule.getShardingTable("t_order")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order")); @@ -134,7 +134,7 @@ class ShardingDropTableRouteContextCheckerTest { @Test void assertCheckWithDifferentRouteResultShardingTableForPostgreSQL() { - PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(false, false); + PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order")))); when(shardingRule.isShardingTable("t_order")).thenReturn(true); when(shardingRule.getShardingTable("t_order")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_order")); @@ -148,7 +148,7 @@ class ShardingDropTableRouteContextCheckerTest { @Test void assertCheckWithSameRouteResultBroadcastTableForPostgreSQL() { - PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(false, false); + PostgreSQLDropTableStatement sqlStatement = new PostgreSQLDropTableStatement(); sqlStatement.getTables().add(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_config")))); when(shardingRule.getShardingTable("t_config")).thenReturn(new ShardingTable(Arrays.asList("ds_0", "ds_1"), "t_config")); Collection<RouteUnit> routeUnits = new LinkedList<>(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java index d471cb8cf01..a7b91988747 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/from/type/SimpleTableSegmentBinder.java @@ -49,7 +49,9 @@ import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; import java.util.Collection; @@ -130,6 +132,14 @@ public final class SimpleTableSegmentBinder { || ((CreateTableStatement) binderContext.getSqlStatement()).isIfNotExists() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); return; } + if (binderContext.getSqlStatement() instanceof AlterTableStatement && isRenameTable((AlterTableStatement) binderContext.getSqlStatement(), tableName)) { + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } + if (binderContext.getSqlStatement() instanceof DropTableStatement) { + ShardingSpherePreconditions.checkState(((DropTableStatement) binderContext.getSqlStatement()).isIfExists() || schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); + return; + } if ("DUAL".equalsIgnoreCase(tableName)) { return; } @@ -142,6 +152,10 @@ public final class SimpleTableSegmentBinder { ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); } + private static boolean isRenameTable(final AlterTableStatement alterTableStatement, final String tableName) { + return alterTableStatement.getRenameTable().isPresent() && alterTableStatement.getRenameTable().get().getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); + } + private static SimpleTableSegmentBinderContext createSimpleTableBinderContext(final SimpleTableSegment segment, final ShardingSphereSchema schema, final IdentifierValue databaseName, final IdentifierValue schemaName, final SQLStatementBinderContext binderContext) { IdentifierValue tableName = segment.getTableName().getIdentifier(); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java new file mode 100644 index 00000000000..4a3f1e31b12 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterTableStatementBinder.java @@ -0,0 +1,66 @@ +/* + * 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.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; + +/** + * Alter table statement binder. + */ +public final class AlterTableStatementBinder implements SQLStatementBinder<AlterTableStatement> { + + @Override + public AlterTableStatement bind(final AlterTableStatement sqlStatement, final SQLStatementBinderContext binderContext) { + AlterTableStatement result = copy(sqlStatement); + Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts = LinkedHashMultimap.create(); + result.setTable(SimpleTableSegmentBinder.bind(sqlStatement.getTable(), binderContext, tableBinderContexts)); + sqlStatement.getRenameTable().ifPresent(optional -> result.setRenameTable(SimpleTableSegmentBinder.bind(optional, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static AlterTableStatement copy(final AlterTableStatement sqlStatement) { + AlterTableStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + // TODO bind column and reference table if kernel need use them + sqlStatement.getConvertTableDefinition().ifPresent(result::setConvertTableDefinition); + result.getAddColumnDefinitions().addAll(sqlStatement.getAddColumnDefinitions()); + result.getModifyColumnDefinitions().addAll(sqlStatement.getModifyColumnDefinitions()); + result.getChangeColumnDefinitions().addAll(sqlStatement.getChangeColumnDefinitions()); + result.getDropColumnDefinitions().addAll(sqlStatement.getDropColumnDefinitions()); + result.getAddConstraintDefinitions().addAll(sqlStatement.getAddConstraintDefinitions()); + result.getValidateConstraintDefinitions().addAll(sqlStatement.getValidateConstraintDefinitions()); + result.getModifyConstraintDefinitions().addAll(sqlStatement.getModifyConstraintDefinitions()); + result.getDropConstraintDefinitions().addAll(sqlStatement.getDropConstraintDefinitions()); + result.getDropIndexDefinitions().addAll(sqlStatement.getDropIndexDefinitions()); + result.getRenameColumnDefinitions().addAll(sqlStatement.getRenameColumnDefinitions()); + result.getRenameIndexDefinitions().addAll(sqlStatement.getRenameIndexDefinitions()); + sqlStatement.getModifyCollectionRetrieval().ifPresent(result::setModifyCollectionRetrieval); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java new file mode 100644 index 00000000000..c54d2ce00bd --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropTableStatementBinder.java @@ -0,0 +1,53 @@ +/* + * 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.infra.binder.engine.statement.ddl; + +import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.engine.segment.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.from.type.SimpleTableSegmentBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; + +/** + * Drop table statement binder. + */ +public final class DropTableStatementBinder implements SQLStatementBinder<DropTableStatement> { + + @Override + public DropTableStatement bind(final DropTableStatement sqlStatement, final SQLStatementBinderContext binderContext) { + DropTableStatement result = copy(sqlStatement); + Multimap<CaseInsensitiveString, TableSegmentBinderContext> tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getTables().forEach(each -> result.getTables().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static DropTableStatement copy(final DropTableStatement sqlStatement) { + DropTableStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.setIfExists(sqlStatement.isIfExists()); + result.setContainsCascade(sqlStatement.isContainsCascade()); + result.addParameterMarkerSegments(sqlStatement.getParameterMarkerSegments()); + result.getCommentSegments().addAll(sqlStatement.getCommentSegments()); + result.getVariableNames().addAll(sqlStatement.getVariableNames()); + return result; + } +} diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java index 6665fc27ec5..2792f3fc62c 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/type/DDLStatementBindEngine.java @@ -19,15 +19,19 @@ package org.apache.shardingsphere.infra.binder.engine.type; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CreateTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.CursorStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CursorStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; /** * DDL statement bind engine. @@ -55,6 +59,12 @@ public final class DDLStatementBindEngine { if (statement instanceof CreateTableStatement) { return new CreateTableStatementBinder().bind((CreateTableStatement) statement, binderContext); } + if (statement instanceof AlterTableStatement) { + return new AlterTableStatementBinder().bind((AlterTableStatement) statement, binderContext); + } + if (statement instanceof DropTableStatement) { + return new DropTableStatementBinder().bind((DropTableStatement) statement, binderContext); + } if (statement instanceof CreateIndexStatement) { return new CreateIndexStatementBinder().bind((CreateIndexStatement) statement, binderContext); } diff --git a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java index 70609a71732..9c18804dcf9 100644 --- a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java +++ b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisDDLStatementVisitor.java @@ -664,7 +664,8 @@ public final class DorisDDLStatementVisitor extends DorisStatementVisitor implem @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - DorisDropTableStatement result = new DorisDropTableStatement(null != ctx.ifExists()); + DorisDropTableStatement result = new DorisDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableList())).getValue()); return result; } 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 97188a7353d..9f6e311a4b5 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 @@ -671,7 +671,8 @@ public final class MySQLDDLStatementVisitor extends MySQLStatementVisitor implem @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - MySQLDropTableStatement result = new MySQLDropTableStatement(null != ctx.ifExists()); + MySQLDropTableStatement result = new MySQLDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableList())).getValue()); return result; } diff --git a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java index f0940ad4a0d..7fad41cc99f 100644 --- a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java +++ b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussDDLStatementVisitor.java @@ -512,7 +512,9 @@ public final class OpenGaussDDLStatementVisitor extends OpenGaussStatementVisito @Override public ASTNode visitDropTable(final DropTableContext ctx) { boolean containsCascade = null != ctx.dropTableOpt() && null != ctx.dropTableOpt().CASCADE(); - OpenGaussDropTableStatement result = new OpenGaussDropTableStatement(null != ctx.ifExists(), containsCascade); + OpenGaussDropTableStatement result = new OpenGaussDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); + result.setContainsCascade(containsCascade); result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue()); return result; } diff --git a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java index 6a23b13361f..5bf935cb3ff 100644 --- a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java +++ b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLDDLStatementVisitor.java @@ -627,7 +627,9 @@ public final class PostgreSQLDDLStatementVisitor extends PostgreSQLStatementVisi @Override public ASTNode visitDropTable(final DropTableContext ctx) { boolean containsCascade = null != ctx.dropTableOpt() && null != ctx.dropTableOpt().CASCADE(); - PostgreSQLDropTableStatement result = new PostgreSQLDropTableStatement(null != ctx.ifExists(), containsCascade); + PostgreSQLDropTableStatement result = new PostgreSQLDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); + result.setContainsCascade(containsCascade); result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue()); return result; } diff --git a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java index 2fe88595fb6..d2b73e1c0be 100644 --- a/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java +++ b/parser/sql/dialect/presto/src/main/java/org/apache/shardingsphere/sql/parser/presto/visitor/statement/type/PrestoDDLStatementVisitor.java @@ -119,7 +119,8 @@ public final class PrestoDDLStatementVisitor extends PrestoStatementVisitor impl @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - PrestoDropTableStatement result = new PrestoDropTableStatement(null != ctx.ifExists()); + PrestoDropTableStatement result = new PrestoDropTableStatement(); + result.setIfExists(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableList())).getValue()); return result; } diff --git a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java index 0180b750bf3..59841bf11bc 100644 --- a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java +++ b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerDDLStatementVisitor.java @@ -309,7 +309,8 @@ public final class SQLServerDDLStatementVisitor extends SQLServerStatementVisito @SuppressWarnings("unchecked") @Override public ASTNode visitDropTable(final DropTableContext ctx) { - SQLServerDropTableStatement result = new SQLServerDropTableStatement(null != ctx.ifExists()); + SQLServerDropTableStatement result = new SQLServerDropTableStatement(); + result.setContainsCascade(null != ctx.ifExists()); result.getTables().addAll(((CollectionValue<SimpleTableSegment>) visit(ctx.tableNames())).getValue()); return result; } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java index f7fec12bc6a..400345f5792 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterTableStatement.java @@ -92,6 +92,14 @@ public abstract class AlterTableStatement extends AbstractSQLStatement implement return Optional.ofNullable(convertTableDefinition); } + /** + * Set modify collection retrieval. + * + * @param modifyCollectionRetrieval modify collection retrieval + */ + public void setModifyCollectionRetrieval(final ModifyCollectionRetrievalSegment modifyCollectionRetrieval) { + } + /** * Get modify collection retrieval. * diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java index c82b5b323a9..933f46bb550 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/DropTableStatement.java @@ -32,6 +32,14 @@ public abstract class DropTableStatement extends AbstractSQLStatement implements private final Collection<SimpleTableSegment> tables = new LinkedList<>(); + /** + * Set if exists. + * + * @param ifExists if exists or not + */ + public void setIfExists(final boolean ifExists) { + } + /** * Judge whether contains if exists. * @@ -41,6 +49,14 @@ public abstract class DropTableStatement extends AbstractSQLStatement implements return false; } + /** + * Set contains cascade. + * + * @param containsCascade contains cascade or not + */ + public void setContainsCascade(final boolean containsCascade) { + } + /** * Judge whether contains cascade. * diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java index 8a12cd4ff5a..7c9ba41ddcf 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java +++ b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.sql.parser.statement.doris.ddl; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.doris.DorisStatement; @@ -27,7 +28,8 @@ import org.apache.shardingsphere.sql.parser.statement.doris.DorisStatement; */ @RequiredArgsConstructor @Getter +@Setter public final class DorisDropTableStatement extends DropTableStatement implements DorisStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java index 40ece242d7e..289e86eeaf7 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLDropTableStatement.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.sql.parser.statement.mysql.ddl; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement; @@ -27,7 +28,8 @@ import org.apache.shardingsphere.sql.parser.statement.mysql.MySQLStatement; */ @RequiredArgsConstructor @Getter +@Setter public final class MySQLDropTableStatement extends DropTableStatement implements MySQLStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java index c10040398d8..d9d36b5ce49 100644 --- a/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java +++ b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/ddl/OpenGaussDropTableStatement.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.sql.parser.statement.opengauss.ddl; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.opengauss.OpenGaussStatement; @@ -27,9 +28,10 @@ import org.apache.shardingsphere.sql.parser.statement.opengauss.OpenGaussStateme */ @RequiredArgsConstructor @Getter +@Setter public final class OpenGaussDropTableStatement extends DropTableStatement implements OpenGaussStatement { - private final boolean ifExists; + private boolean ifExists; - private final boolean containsCascade; + private boolean containsCascade; } diff --git a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java index 917e24e8146..983761915bd 100644 --- a/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java +++ b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/ddl/PostgreSQLDropTableStatement.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.sql.parser.statement.postgresql.ddl; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.postgresql.PostgreSQLStatement; @@ -27,9 +28,10 @@ import org.apache.shardingsphere.sql.parser.statement.postgresql.PostgreSQLState */ @RequiredArgsConstructor @Getter +@Setter public final class PostgreSQLDropTableStatement extends DropTableStatement implements PostgreSQLStatement { - private final boolean ifExists; + private boolean ifExists; - private final boolean containsCascade; + private boolean containsCascade; } diff --git a/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java b/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java index 0df13bf5aa4..9170d069319 100644 --- a/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java +++ b/parser/sql/statement/type/presto/src/main/java/org/apache/shardingsphere/sql/parser/statement/presto/ddl/PrestoDropTableStatement.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.sql.parser.statement.presto.ddl; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.presto.PrestoStatement; @@ -27,7 +28,8 @@ import org.apache.shardingsphere.sql.parser.statement.presto.PrestoStatement; */ @RequiredArgsConstructor @Getter +@Setter public final class PrestoDropTableStatement extends DropTableStatement implements PrestoStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java index 436fe796b1f..9036747d792 100644 --- a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java +++ b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerDropTableStatement.java @@ -19,6 +19,7 @@ package org.apache.shardingsphere.sql.parser.statement.sqlserver.ddl; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.sqlserver.SQLServerStatement; @@ -27,7 +28,8 @@ import org.apache.shardingsphere.sql.parser.statement.sqlserver.SQLServerStateme */ @RequiredArgsConstructor @Getter +@Setter public final class SQLServerDropTableStatement extends DropTableStatement implements SQLServerStatement { - private final boolean ifExists; + private boolean ifExists; } diff --git a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java index 223001a592d..29223c817c9 100644 --- a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java +++ b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareCheckerTest.java @@ -85,12 +85,11 @@ class MySQLComStmtPrepareCheckerTest { @Test void assertIsStatementAllowed() { MySQLCreateTableStatement createTableStatement = new MySQLCreateTableStatement(); - createTableStatement.setIfNotExists(false); Collection<SQLStatement> sqlStatements = Arrays.asList( new MySQLAlterTableStatement(), new MySQLAlterUserStatement(), new MySQLAnalyzeTableStatement(), new MySQLCacheIndexStatement(), new MySQLCallStatement(), new MySQLChangeMasterStatement(), new MySQLChecksumTableStatement(), new MySQLCommitStatement(), new MySQLCreateIndexStatement(), new MySQLDropIndexStatement(), new MySQLCreateDatabaseStatement(), new MySQLDropDatabaseStatement(), createTableStatement, - new MySQLDropTableStatement(false), new MySQLCreateUserStatement(), new MySQLRenameUserStatement(), new MySQLDropUserStatement(), + new MySQLDropTableStatement(), new MySQLCreateUserStatement(), new MySQLRenameUserStatement(), new MySQLDropUserStatement(), new MySQLCreateViewStatement(), new MySQLDropViewStatement(), new MySQLDeleteStatement(), new MySQLDoStatement(), new MySQLFlushStatement(), new MySQLGrantStatement(), new MySQLInsertStatement(), new MySQLInstallPluginStatement(), new MySQLKillStatement(), new MySQLLoadIndexInfoStatement(), new MySQLOptimizeTableStatement(), new MySQLRenameTableStatement(), new MySQLRepairTableStatement(), diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/doris/DorisBinderIT.java similarity index 61% copy from parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java copy to test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/doris/DorisBinderIT.java index 8a12cd4ff5a..18adc1a3b6a 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisDropTableStatement.java +++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/dialect/doris/DorisBinderIT.java @@ -15,19 +15,11 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.statement.doris.ddl; +package org.apache.shardingsphere.test.it.sql.binder.dialect.doris; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; -import org.apache.shardingsphere.sql.parser.statement.doris.DorisStatement; +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderIT; +import org.apache.shardingsphere.test.it.sql.binder.SQLBinderITSettings; -/** - * Doris drop table statement. - */ -@RequiredArgsConstructor -@Getter -public final class DorisDropTableStatement extends DropTableStatement implements DorisStatement { - - private final boolean ifExists; +@SQLBinderITSettings("Doris") +class DorisBinderIT extends SQLBinderIT { } diff --git a/test/it/binder/src/test/resources/cases/ddl/alter-table.xml b/test/it/binder/src/test/resources/cases/ddl/alter-table.xml new file mode 100644 index 00000000000..01ad10052f1 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/alter-table.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ 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. + --> + +<sql-parser-test-cases> + <alter-table sql-case-id="alter_table_rename_to"> + <table name="t_order" start-index="12" stop-index="18"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + <rename-table name="t_order_tmp" start-index="30" stop-index="40"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </rename-table> + </alter-table> + + <alter-table sql-case-id="alter_table_rename_to_with_skip_metadata_validate"> + <comment start-index="0" stop-index="53" text="/* SHARDINGSPHERE_HINT: SKIP_METADATA_VALIDATE=true */" /> + <table name="t_order" start-index="67" stop-index="73"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + <rename-table name="t_order_item" start-index="85" stop-index="96"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </rename-table> + </alter-table> +</sql-parser-test-cases> diff --git a/test/it/binder/src/test/resources/cases/ddl/create-table.xml b/test/it/binder/src/test/resources/cases/ddl/create-table.xml index 59815b36015..7d9a3c1e94f 100644 --- a/test/it/binder/src/test/resources/cases/ddl/create-table.xml +++ b/test/it/binder/src/test/resources/cases/ddl/create-table.xml @@ -85,4 +85,143 @@ </column> </column-definition> </create-table> + + <create-table sql-case-id="create_table_with_if_not_exists"> + <table name="t_order" start-index="27" stop-index="33"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + <column-definition type="BIGINT" primary-key="true" start-index="36" stop-index="62"> + <column name="order_id"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="order_id" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="INT" not-null="true" start-index="65" stop-index="84"> + <column name="user_id"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="user_id" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="VARCHAR" not-null="true" start-index="87" stop-index="113"> + <column name="status"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="status" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="INT" start-index="116" stop-index="130"> + <column name="merchant_id"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="merchant_id" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="VARCHAR" not-null="true" start-index="133" stop-index="159"> + <column name="remark"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="remark" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="DATE" not-null="true" start-index="162" stop-index="188"> + <column name="creation_date"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="creation_date" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + </create-table> + + <create-table sql-case-id="create_table_with_skip_metadata_validate"> + <comment start-index="0" stop-index="53" text="/* SHARDINGSPHERE_HINT: SKIP_METADATA_VALIDATE=true */" /> + <table name="t_order" start-index="68" stop-index="74"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + <column-definition type="BIGINT" primary-key="true" start-index="77" stop-index="103"> + <column name="order_id"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="order_id" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="INT" not-null="true" start-index="106" stop-index="125"> + <column name="user_id"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="user_id" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="VARCHAR" not-null="true" start-index="128" stop-index="154"> + <column name="status"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="status" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="INT" start-index="157" stop-index="171"> + <column name="merchant_id"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="merchant_id" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="VARCHAR" not-null="true" start-index="174" stop-index="200"> + <column name="remark"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="remark" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + <column-definition type="DATE" not-null="true" start-index="203" stop-index="229"> + <column name="creation_date"> + <column-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + <original-table name="t_order" /> + <original-column name="creation_date" start-delimiter="`" end-delimiter="`" /> + </column-bound> + </column> + </column-definition> + </create-table> </sql-parser-test-cases> diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-table.xml b/test/it/binder/src/test/resources/cases/ddl/drop-table.xml new file mode 100644 index 00000000000..b4c6b8a2958 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/drop-table.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ 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. + --> + +<sql-parser-test-cases> + <drop-table sql-case-id="drop_table"> + <table name="t_order" start-index="11" stop-index="17"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + <table name="t_order_item" start-index="20" stop-index="31"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + </drop-table> + + <drop-table sql-case-id="drop_table_with_if_exists"> + <table name="t_order" start-index="21" stop-index="27"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + <table name="t_order_tmp" start-index="30" stop-index="40"> + <table-bound> + <original-database name="foo_db_1" /> + <original-schema name="foo_db_1" /> + </table-bound> + </table> + </drop-table> +</sql-parser-test-cases> diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml b/test/it/binder/src/test/resources/sqls/ddl/alter-table.xml similarity index 73% copy from test/it/binder/src/test/resources/sqls/ddl/create-table.xml copy to test/it/binder/src/test/resources/sqls/ddl/alter-table.xml index 35e75c68f61..85facde2b03 100644 --- a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml +++ b/test/it/binder/src/test/resources/sqls/ddl/alter-table.xml @@ -17,5 +17,6 @@ --> <sql-cases> - <sql-case id="create_table" value="CREATE TABLE t_order_tmp (order_id BIGINT PRIMARY KEY, user_id INT NOT NULL, status VARCHAR(50) NOT NULL, merchant_id INT, remark VARCHAR(50) NOT NULL, creation_date DATE NOT NULL)" db-types="MySQL,Doris" /> + <sql-case id="alter_table_rename_to" value="ALTER TABLE t_order RENAME TO t_order_tmp" db-types="MySQL,Doris" /> + <sql-case id="alter_table_rename_to_with_skip_metadata_validate" value="/* SHARDINGSPHERE_HINT: SKIP_METADATA_VALIDATE=true */ ALTER TABLE t_order RENAME TO t_order_item" db-types="MySQL,Doris" /> </sql-cases> diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml b/test/it/binder/src/test/resources/sqls/ddl/create-table.xml index 35e75c68f61..901b5bd167f 100644 --- a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml +++ b/test/it/binder/src/test/resources/sqls/ddl/create-table.xml @@ -18,4 +18,6 @@ <sql-cases> <sql-case id="create_table" value="CREATE TABLE t_order_tmp (order_id BIGINT PRIMARY KEY, user_id INT NOT NULL, status VARCHAR(50) NOT NULL, merchant_id INT, remark VARCHAR(50) NOT NULL, creation_date DATE NOT NULL)" db-types="MySQL,Doris" /> + <sql-case id="create_table_with_if_not_exists" value="CREATE TABLE IF NOT EXISTS t_order (order_id BIGINT PRIMARY KEY, user_id INT NOT NULL, status VARCHAR(50) NOT NULL, merchant_id INT, remark VARCHAR(50) NOT NULL, creation_date DATE NOT NULL)" db-types="MySQL,Doris" /> + <sql-case id="create_table_with_skip_metadata_validate" value="/* SHARDINGSPHERE_HINT: SKIP_METADATA_VALIDATE=true */ CREATE TABLE t_order (order_id BIGINT PRIMARY KEY, user_id INT NOT NULL, status VARCHAR(50) NOT NULL, merchant_id INT, remark VARCHAR(50) NOT NULL, creation_date DATE NOT NULL)" db-types="MySQL,Doris" /> </sql-cases> diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml b/test/it/binder/src/test/resources/sqls/ddl/drop-table.xml similarity index 78% copy from test/it/binder/src/test/resources/sqls/ddl/create-table.xml copy to test/it/binder/src/test/resources/sqls/ddl/drop-table.xml index 35e75c68f61..7ee357740b8 100644 --- a/test/it/binder/src/test/resources/sqls/ddl/create-table.xml +++ b/test/it/binder/src/test/resources/sqls/ddl/drop-table.xml @@ -17,5 +17,6 @@ --> <sql-cases> - <sql-case id="create_table" value="CREATE TABLE t_order_tmp (order_id BIGINT PRIMARY KEY, user_id INT NOT NULL, status VARCHAR(50) NOT NULL, merchant_id INT, remark VARCHAR(50) NOT NULL, creation_date DATE NOT NULL)" db-types="MySQL,Doris" /> + <sql-case id="drop_table" value="DROP TABLE t_order, t_order_item" db-types="MySQL,Doris" /> + <sql-case id="drop_table_with_if_exists" value="DROP TABLE IF EXISTS t_order, t_order_tmp" db-types="MySQL,Doris" /> </sql-cases> diff --git a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java index 0c939beff96..29164a346a4 100644 --- a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java +++ b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/scenario/ShardingSQLRewriterIT.java @@ -103,6 +103,13 @@ class ShardingSQLRewriterIT extends SQLRewriterIT { tables.add(new ShardingSphereTable("t_account_view", Arrays.asList( new ShardingSphereColumn("id", Types.INTEGER, false, false, false, true, false, false), new ShardingSphereColumn("account_id", Types.INTEGER, false, false, false, true, false, false)), Collections.emptyList(), Collections.emptyList())); + tables.add(new ShardingSphereTable("t_order", Arrays.asList( + new ShardingSphereColumn("order_id", Types.BIGINT, true, false, false, true, false, false), + new ShardingSphereColumn("user_id", Types.INTEGER, false, false, false, true, false, false), + new ShardingSphereColumn("status", Types.VARCHAR, false, false, false, true, false, false), + new ShardingSphereColumn("merchant_id", Types.INTEGER, false, false, false, true, false, true), + new ShardingSphereColumn("remark", Types.VARCHAR, false, false, false, true, false, false), + new ShardingSphereColumn("creation_date", Types.DATE, false, false, false, true, false, false)), Collections.emptyList(), Collections.emptyList())); return Collections.singleton(new ShardingSphereSchema(schemaName, tables, Collections.emptyList())); } diff --git a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml index 3e78878bc49..e33dcd23c75 100644 --- a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml +++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/alter-table.xml @@ -70,8 +70,8 @@ <output sql="ALTER TABLE t_single ADD CONSTRAINT t_single_fk FOREIGN KEY (order_id) REFERENCES t_single_extend (order_id)" /> </rewrite-assertion> <rewrite-assertion id="alter_table_with_single_table_with_rename_table" db-types="MySQL,PostgreSQL,openGauss"> - <input sql="ALTER TABLE t_single RENAME TO t_single_extend" /> - <output sql="ALTER TABLE t_single RENAME TO t_single_extend" /> + <input sql="ALTER TABLE t_single RENAME TO t_single_tmp" /> + <output sql="ALTER TABLE t_single RENAME TO t_single_tmp" /> </rewrite-assertion> <rewrite-assertion id="alter_table_with_multi_data_node_drop_constraint" db-types="MySQL,PostgreSQL,openGauss"> <input sql="ALTER TABLE t_account DROP CONSTRAINT t_account_fk" />