From 7f8fa57bce9b0c2c35b24fdc16ad20f4028135db Mon Sep 17 00:00:00 2001 From: Zhengqiang Duan Date: Fri, 27 Dec 2024 07:41:54 +0800 Subject: [PATCH] Support create view, alter view, drop view sql bind logic (#34167) * Support create view, alter view, drop view sql bind logic * Support create view, alter view, drop view sql bind logic * Support create view, alter view, drop view sql bind logic * update release note * fix rewrite it --- RELEASE-NOTES.md | 1 + .../ShardingAlterViewSupportedChecker.java | 2 +- .../ddl/AlterViewStatementContext.java | 2 +- .../from/type/SimpleTableSegmentBinder.java | 21 ++++++- .../ddl/AlterIndexStatementBinder.java | 2 +- .../ddl/AlterViewStatementBinder.java | 56 +++++++++++++++++++ .../ddl/CreateViewStatementBinder.java | 54 ++++++++++++++++++ .../ddl/DropIndexStatementBinder.java | 2 +- .../ddl/DropViewStatementBinder.java | 51 +++++++++++++++++ .../engine/type/DDLStatementBindEngine.java | 25 +++++++-- .../statement/ddl/AlterViewStatement.java | 34 ++++++++++- .../doris/ddl/DorisAlterViewStatement.java | 2 +- .../mysql/ddl/MySQLAlterViewStatement.java | 2 +- .../ddl/SQLServerAlterViewStatement.java | 2 +- .../test/it/sql/binder/SQLBinderIT.java | 7 +++ .../test/resources/cases/ddl/alter-view.xml | 48 ++++++++++++++++ .../test/resources/cases/ddl/create-view.xml | 48 ++++++++++++++++ .../test/resources/cases/ddl/drop-index.xml | 2 + .../test/resources/cases/ddl/drop-view.xml | 28 ++++++++++ .../test/resources/sqls/ddl/alter-view.xml | 21 +++++++ .../test/resources/sqls/ddl/create-view.xml | 21 +++++++ .../src/test/resources/sqls/ddl/drop-view.xml | 21 +++++++ .../ddl/impl/AlterViewStatementAssert.java | 6 +- .../sharding/case/ddl/create-table.xml | 2 +- 24 files changed, 442 insertions(+), 18 deletions(-) create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java create mode 100644 infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java create mode 100644 test/it/binder/src/test/resources/cases/ddl/alter-view.xml create mode 100644 test/it/binder/src/test/resources/cases/ddl/create-view.xml create mode 100644 test/it/binder/src/test/resources/cases/ddl/drop-view.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/alter-view.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/create-view.xml create mode 100644 test/it/binder/src/test/resources/sqls/ddl/drop-view.xml diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 92a9855fedaa1..943a601cf47c0 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -44,6 +44,7 @@ 1. SQL Binder: Support rename table statement sql bind and split segment bind to ddl and dml package - [#34158](https://github.com/apache/shardingsphere/pull/34158) 1. SQL Binder: Support copy statement sql bind and add bind test case - [#34159](https://github.com/apache/shardingsphere/pull/34159) 1. SQL Binder: Support truncate table sql bind and add test case - [#34162](https://github.com/apache/shardingsphere/pull/34162) +1. SQL Binder: Support create view, alter view, drop view sql bind logic - [#34167](https://github.com/apache/shardingsphere/pull/34167) ### Bug Fixes diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java index 81ade5d0cb6d5..7fb9b59180bb0 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingAlterViewSupportedChecker.java @@ -47,7 +47,7 @@ public boolean isCheck(final SQLStatementContext sqlStatementContext) { @Override public void check(final ShardingRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final AlterViewStatementContext sqlStatementContext) { AlterViewStatement alterViewStatement = sqlStatementContext.getSqlStatement(); - Optional selectStatement = alterViewStatement.getSelectStatement(); + Optional selectStatement = alterViewStatement.getSelect(); String originView = alterViewStatement.getView().getTableName().getIdentifier().getValue(); selectStatement.ifPresent(optional -> checkAlterViewShardingTables(rule, optional, originView)); alterViewStatement.getRenameView().ifPresent(optional -> checkBroadcastShardingView(rule, originView, optional.getTableName().getIdentifier().getValue())); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java index 1b0e25a3c07b0..21ed040858f1f 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/ddl/AlterViewStatementContext.java @@ -42,7 +42,7 @@ public AlterViewStatementContext(final AlterViewStatement sqlStatement) { super(sqlStatement); Collection tables = new LinkedList<>(); tables.add(sqlStatement.getView()); - Optional selectStatement = sqlStatement.getSelectStatement(); + Optional selectStatement = sqlStatement.getSelect(); selectStatement.ifPresent(optional -> { TableExtractor extractor = new TableExtractor(); extractor.extractTablesFromSelect(optional); diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java index 6b2561ce90a15..3ed26ac9e9902 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/segment/dml/from/type/SimpleTableSegmentBinder.java @@ -51,7 +51,9 @@ 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.AlterViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue; @@ -129,7 +131,8 @@ private static IdentifierValue getSchemaName(final SimpleTableSegment segment, f } private static void checkTableExists(final SQLStatementBinderContext binderContext, final ShardingSphereSchema schema, final String schemaName, final String tableName) { - if (binderContext.getSqlStatement() instanceof CreateTableStatement) { + // TODO refactor table exists check with spi @duanzhengqiang + if (binderContext.getSqlStatement() instanceof CreateTableStatement && isCreateTable(((CreateTableStatement) binderContext.getSqlStatement()).getTable(), tableName)) { ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || ((CreateTableStatement) binderContext.getSqlStatement()).isIfNotExists() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); return; @@ -146,6 +149,14 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); return; } + if (binderContext.getSqlStatement() instanceof CreateViewStatement && isCreateTable(((CreateViewStatement) binderContext.getSqlStatement()).getView(), tableName)) { + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } + if (binderContext.getSqlStatement() instanceof AlterViewStatement && isRenameView((AlterViewStatement) binderContext.getSqlStatement(), tableName)) { + ShardingSpherePreconditions.checkState(binderContext.getHintValueContext().isSkipMetadataValidate() || !schema.containsTable(tableName), () -> new TableExistsException(tableName)); + return; + } if ("DUAL".equalsIgnoreCase(tableName)) { return; } @@ -158,6 +169,10 @@ private static void checkTableExists(final SQLStatementBinderContext binderConte ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> new TableNotFoundException(tableName)); } + private static boolean isCreateTable(final SimpleTableSegment simpleTableSegment, final String tableName) { + return simpleTableSegment.getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); + } + private static boolean isRenameTable(final AlterTableStatement alterTableStatement, final String tableName) { return alterTableStatement.getRenameTable().isPresent() && alterTableStatement.getRenameTable().get().getTableName().getIdentifier().getValue().equalsIgnoreCase(tableName); } @@ -171,6 +186,10 @@ private static boolean isRenameTable(final RenameTableStatement renameTableState return false; } + private static boolean isRenameView(final AlterViewStatement alterViewStatement, final String tableName) { + return alterViewStatement.getRenameView().isPresent() && alterViewStatement.getRenameView().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/AlterIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java index 848755e5ac1e6..55533ab06ed4c 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterIndexStatementBinder.java @@ -30,7 +30,7 @@ /** * Alter index statement binder. */ -public class AlterIndexStatementBinder implements SQLStatementBinder { +public final class AlterIndexStatementBinder implements SQLStatementBinder { @Override public AlterIndexStatement bind(final AlterIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java new file mode 100644 index 0000000000000..ba455bf020435 --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/AlterViewStatementBinder.java @@ -0,0 +1,56 @@ +/* + * 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.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.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.infra.binder.engine.statement.dml.SelectStatementBinder; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement; + +/** + * Alter view statement binder. + */ +public final class AlterViewStatementBinder implements SQLStatementBinder { + + @Override + public AlterViewStatement bind(final AlterViewStatement sqlStatement, final SQLStatementBinderContext binderContext) { + AlterViewStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setView(SimpleTableSegmentBinder.bind(sqlStatement.getView(), binderContext, tableBinderContexts)); + sqlStatement.getSelect().ifPresent(optional -> result.setSelect(new SelectStatementBinder().bind(optional, binderContext))); + sqlStatement.getRenameView().ifPresent(optional -> result.setRenameView(SimpleTableSegmentBinder.bind(optional, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static AlterViewStatement copy(final AlterViewStatement sqlStatement) { + AlterViewStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + sqlStatement.getViewDefinition().ifPresent(result::setViewDefinition); + sqlStatement.getConstraintDefinition().ifPresent(result::setConstraintDefinition); + 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/CreateViewStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java new file mode 100644 index 0000000000000..91befad6c2f8f --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/CreateViewStatementBinder.java @@ -0,0 +1,54 @@ +/* + * 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.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.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.infra.binder.engine.statement.dml.SelectStatementBinder; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateViewStatement; + +/** + * Create view statement binder. + */ +public final class CreateViewStatementBinder implements SQLStatementBinder { + + @Override + public CreateViewStatement bind(final CreateViewStatement sqlStatement, final SQLStatementBinderContext binderContext) { + CreateViewStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + result.setView(SimpleTableSegmentBinder.bind(sqlStatement.getView(), binderContext, tableBinderContexts)); + result.setSelect(new SelectStatementBinder().bind(sqlStatement.getSelect(), binderContext)); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static CreateViewStatement copy(final CreateViewStatement sqlStatement) { + CreateViewStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + result.setViewDefinition(sqlStatement.getViewDefinition()); + 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/DropIndexStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java index 10d8ecb292606..56b7ec3b13995 100644 --- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropIndexStatementBinder.java @@ -30,7 +30,7 @@ /** * Drop index statement binder. */ -public class DropIndexStatementBinder implements SQLStatementBinder { +public final class DropIndexStatementBinder implements SQLStatementBinder { @Override public DropIndexStatement bind(final DropIndexStatement sqlStatement, final SQLStatementBinderContext binderContext) { diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java new file mode 100644 index 0000000000000..1e9d2e579068d --- /dev/null +++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/statement/ddl/DropViewStatementBinder.java @@ -0,0 +1,51 @@ +/* + * 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.dml.from.context.TableSegmentBinderContext; +import org.apache.shardingsphere.infra.binder.engine.segment.dml.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.DropViewStatement; + +/** + * Drop view statement binder. + */ +public final class DropViewStatementBinder implements SQLStatementBinder { + + @Override + public DropViewStatement bind(final DropViewStatement sqlStatement, final SQLStatementBinderContext binderContext) { + DropViewStatement result = copy(sqlStatement); + Multimap tableBinderContexts = LinkedHashMultimap.create(); + sqlStatement.getViews().forEach(each -> result.getViews().add(SimpleTableSegmentBinder.bind(each, binderContext, tableBinderContexts))); + return result; + } + + @SneakyThrows(ReflectiveOperationException.class) + private static DropViewStatement copy(final DropViewStatement sqlStatement) { + DropViewStatement result = sqlStatement.getClass().getDeclaredConstructor().newInstance(); + 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 1860554f46b4e..f579afbf8ab12 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 @@ -21,23 +21,29 @@ import org.apache.shardingsphere.infra.binder.engine.statement.SQLStatementBinderContext; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterIndexStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.AlterViewStatementBinder; 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.CreateViewStatementBinder; 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.binder.engine.statement.ddl.DropIndexStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropTableStatementBinder; +import org.apache.shardingsphere.infra.binder.engine.statement.ddl.DropViewStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.RenameTableStatementBinder; import org.apache.shardingsphere.infra.binder.engine.statement.ddl.TruncateStatementBinder; import org.apache.shardingsphere.infra.hint.HintValueContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterIndexStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterViewStatement; 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.CreateViewStatement; 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; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropIndexStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropViewStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.RenameTableStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.TruncateStatement; @@ -82,12 +88,21 @@ public DDLStatement bind(final DDLStatement statement) { if (statement instanceof AlterIndexStatement) { return new AlterIndexStatementBinder().bind((AlterIndexStatement) statement, binderContext); } - if (statement instanceof TruncateStatement) { - return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); - } if (statement instanceof DropIndexStatement) { return new DropIndexStatementBinder().bind((DropIndexStatement) statement, binderContext); } + if (statement instanceof CreateViewStatement) { + return new CreateViewStatementBinder().bind((CreateViewStatement) statement, binderContext); + } + if (statement instanceof AlterViewStatement) { + return new AlterViewStatementBinder().bind((AlterViewStatement) statement, binderContext); + } + if (statement instanceof DropViewStatement) { + return new DropViewStatementBinder().bind((DropViewStatement) statement, binderContext); + } + if (statement instanceof TruncateStatement) { + return new TruncateStatementBinder().bind((TruncateStatement) statement, binderContext); + } return statement; } } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java index efe898d40bffc..33d2761c9d3c8 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/ddl/AlterViewStatement.java @@ -40,10 +40,18 @@ public abstract class AlterViewStatement extends AbstractSQLStatement implements * * @return select statement */ - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.empty(); } + /** + * Set select statement. + * + * @param select select statement + */ + public void setSelect(final SelectStatement select) { + } + /** * Get view definition. * @@ -53,6 +61,14 @@ public Optional getViewDefinition() { return Optional.empty(); } + /** + * Get view definition. + * + * @param viewDefinition view definition + */ + public void setViewDefinition(final String viewDefinition) { + } + /** * Get rename view. * @@ -62,6 +78,14 @@ public Optional getRenameView() { return Optional.empty(); } + /** + * Get rename view. + * + * @param renameView rename view + */ + public void setRenameView(final SimpleTableSegment renameView) { + } + /** * Get constraint definition. * @@ -70,4 +94,12 @@ public Optional getRenameView() { public Optional getConstraintDefinition() { return Optional.empty(); } + + /** + * Get constraint definition. + * + * @param constraintDefinition constraint definition + */ + public void setConstraintDefinition(final ConstraintDefinitionSegment constraintDefinition) { + } } diff --git a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java index 989b20fafe641..9922da33dc408 100644 --- a/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java +++ b/parser/sql/statement/type/doris/src/main/java/org/apache/shardingsphere/sql/parser/statement/doris/ddl/DorisAlterViewStatement.java @@ -35,7 +35,7 @@ public final class DorisAlterViewStatement extends AlterViewStatement implements private String viewDefinition; @Override - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.ofNullable(select); } diff --git a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java index e39847195e862..e7382e3dadeef 100644 --- a/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java +++ b/parser/sql/statement/type/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/ddl/MySQLAlterViewStatement.java @@ -35,7 +35,7 @@ public final class MySQLAlterViewStatement extends AlterViewStatement implements private String viewDefinition; @Override - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.ofNullable(select); } diff --git a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java index 88211af3f58f8..dbe144a505c20 100644 --- a/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java +++ b/parser/sql/statement/type/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/statement/sqlserver/ddl/SQLServerAlterViewStatement.java @@ -35,7 +35,7 @@ public final class SQLServerAlterViewStatement extends AlterViewStatement implem private String viewDefinition; @Override - public Optional getSelectStatement() { + public Optional getSelect() { return Optional.ofNullable(select); } diff --git a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java index 657bc809b5384..5a2fa8de9f90a 100644 --- a/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java +++ b/test/it/binder/src/test/java/org/apache/shardingsphere/test/it/sql/binder/SQLBinderIT.java @@ -130,6 +130,13 @@ private Collection mockFooDB1Tables() { new ShardingSphereColumn("business_code", Types.VARCHAR, false, false, false, true, false, false), new ShardingSphereColumn("telephone", Types.CHAR, false, false, false, true, false, false), new ShardingSphereColumn("creation_date", Types.DATE, false, false, false, true, false, false)), Collections.emptyList(), Collections.emptyList())); + result.add(new ShardingSphereTable("t_order_view", 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 result; } diff --git a/test/it/binder/src/test/resources/cases/ddl/alter-view.xml b/test/it/binder/src/test/resources/cases/ddl/alter-view.xml new file mode 100644 index 0000000000000..b35529ede6326 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/alter-view.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/cases/ddl/create-view.xml b/test/it/binder/src/test/resources/cases/ddl/create-view.xml new file mode 100644 index 0000000000000..62682e07a1fcd --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/create-view.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-index.xml b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml index 73f8237cc432a..37e3d1e976484 100644 --- a/test/it/binder/src/test/resources/cases/ddl/drop-index.xml +++ b/test/it/binder/src/test/resources/cases/ddl/drop-index.xml @@ -26,6 +26,7 @@ + @@ -35,6 +36,7 @@
+ diff --git a/test/it/binder/src/test/resources/cases/ddl/drop-view.xml b/test/it/binder/src/test/resources/cases/ddl/drop-view.xml new file mode 100644 index 0000000000000..ba9d8a9227f52 --- /dev/null +++ b/test/it/binder/src/test/resources/cases/ddl/drop-view.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/alter-view.xml b/test/it/binder/src/test/resources/sqls/ddl/alter-view.xml new file mode 100644 index 0000000000000..8cd292f6cad31 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/alter-view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/create-view.xml b/test/it/binder/src/test/resources/sqls/ddl/create-view.xml new file mode 100644 index 0000000000000..922a64857e1bb --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/create-view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/binder/src/test/resources/sqls/ddl/drop-view.xml b/test/it/binder/src/test/resources/sqls/ddl/drop-view.xml new file mode 100644 index 0000000000000..6c003b3bcfeb7 --- /dev/null +++ b/test/it/binder/src/test/resources/sqls/ddl/drop-view.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java index dabfc8ca361d7..b3fb97249681e 100644 --- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java +++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/ddl/impl/AlterViewStatementAssert.java @@ -70,10 +70,10 @@ private static void assertViewDefinition(final SQLCaseAssertContext assertContex private static void assertSelect(final SQLCaseAssertContext assertContext, final AlterViewStatement actual, final AlterViewStatementTestCase expected) { if (null == expected.getSelectStatement()) { - assertFalse(actual.getSelectStatement().isPresent(), "actual select statement should not exist"); + assertFalse(actual.getSelect().isPresent(), "actual select statement should not exist"); } else { - assertTrue(actual.getSelectStatement().isPresent(), "actual select statement should exist"); - SelectStatementAssert.assertIs(assertContext, actual.getSelectStatement().get(), expected.getSelectStatement()); + assertTrue(actual.getSelect().isPresent(), "actual select statement should exist"); + SelectStatementAssert.assertIs(assertContext, actual.getSelect().get(), expected.getSelectStatement()); } } diff --git a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml index c277252794350..b4d2b8de0fed3 100644 --- a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml +++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml @@ -99,7 +99,7 @@ - +