This is an automated email from the ASF dual-hosted git repository. zhangliang pushed a commit to branch revert-35703-dev in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
commit c4c12ccd6e5c5cc8b421d636c1a1f9f89f0aa32e Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Sat Jun 14 07:37:43 2025 +0800 Revert "Merge CreateProcedureStatementContext and TableAvailableSQLStatementC…" This reverts commit 320dd2c067ca2bc962acc87ee04a97ed10b4797b. --- .../ShardingCreateProcedureSupportedChecker.java | 10 ++--- ...hardingCreateProcedureSupportedCheckerTest.java | 26 +++++------ .../statement/SQLStatementContextFactory.java | 5 +-- .../type/ddl/CreateProcedureStatementContext.java | 52 ++++++++++++++++++++++ .../ddl/CreateProcedureStatementContextTest.java | 35 +++++++++++++++ 5 files changed, 104 insertions(+), 24 deletions(-) diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedChecker.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedChecker.java index 7283abc214f..d07ce6c6d8b 100644 --- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedChecker.java +++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedChecker.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.sharding.checker.sql.ddl; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; -import org.apache.shardingsphere.infra.binder.context.statement.TableAvailableSQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CreateProcedureStatementContext; import org.apache.shardingsphere.infra.checker.SupportedSQLChecker; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema; @@ -35,16 +35,16 @@ import java.util.Optional; /** * Create procedure supported checker for sharding. */ -public final class ShardingCreateProcedureSupportedChecker implements SupportedSQLChecker<TableAvailableSQLStatementContext, ShardingRule> { +public final class ShardingCreateProcedureSupportedChecker implements SupportedSQLChecker<CreateProcedureStatementContext, ShardingRule> { @Override public boolean isCheck(final SQLStatementContext sqlStatementContext) { - return sqlStatementContext.getSqlStatement() instanceof CreateProcedureStatement; + return sqlStatementContext instanceof CreateProcedureStatementContext; } @Override - public void check(final ShardingRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final TableAvailableSQLStatementContext sqlStatementContext) { - CreateProcedureStatement createProcedureStatement = (CreateProcedureStatement) sqlStatementContext.getSqlStatement(); + public void check(final ShardingRule rule, final ShardingSphereDatabase database, final ShardingSphereSchema currentSchema, final CreateProcedureStatementContext sqlStatementContext) { + CreateProcedureStatement createProcedureStatement = sqlStatementContext.getSqlStatement(); Optional<RoutineBodySegment> routineBodySegment = createProcedureStatement.getRoutineBody(); if (!routineBodySegment.isPresent()) { return; diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java index e274518d6c6..6c466c80f32 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/checker/sql/ddl/ShardingCreateProcedureSupportedCheckerTest.java @@ -17,7 +17,7 @@ package org.apache.shardingsphere.sharding.checker.sql.ddl; -import org.apache.shardingsphere.infra.binder.context.statement.TableAvailableSQLStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CreateProcedureStatementContext; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.NoSuchTableException; import org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.TableExistsException; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; @@ -37,7 +37,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Arrays; import java.util.Optional; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -55,11 +54,9 @@ class ShardingCreateProcedureSupportedCheckerTest { @Test void assertCheck() { SelectStatement selectStatement = new SelectStatement(); - SimpleTableSegment fromTable = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("bar_tbl"))); - selectStatement.setFrom(fromTable); + selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("bar_tbl")))); CreateTableStatement createTableStatement = mock(CreateTableStatement.class); - SimpleTableSegment table = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl"))); - when(createTableStatement.getTable()).thenReturn(table); + when(createTableStatement.getTable()).thenReturn(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(createTableStatement); ValidStatementSegment selectValidStatementSegment = new ValidStatementSegment(0, 0); @@ -73,22 +70,21 @@ class ShardingCreateProcedureSupportedCheckerTest { ShardingSphereSchema schema = mock(ShardingSphereSchema.class); when(schema.containsTable("bar_tbl")).thenReturn(true); when(rule.isShardingTable("bar_tbl")).thenReturn(false); - TableAvailableSQLStatementContext sqlStatementContext = new TableAvailableSQLStatementContext(mock(), sqlStatement, Arrays.asList(fromTable, table)); + CreateProcedureStatementContext sqlStatementContext = new CreateProcedureStatementContext(mock(), sqlStatement); assertDoesNotThrow(() -> new ShardingCreateProcedureSupportedChecker().check(rule, database, schema, sqlStatementContext)); } @Test void assertCheckWithShardingTable() { SelectStatement selectStatement = new SelectStatement(); - SimpleTableSegment fromTable = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl"))); - selectStatement.setFrom(fromTable); + selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(selectStatement); RoutineBodySegment routineBody = new RoutineBodySegment(0, 0); routineBody.getValidStatements().add(validStatementSegment); CreateProcedureStatement sqlStatement = new CreateProcedureStatement(); sqlStatement.setRoutineBody(routineBody); - TableAvailableSQLStatementContext sqlStatementContext = new TableAvailableSQLStatementContext(mock(), sqlStatement, fromTable); + CreateProcedureStatementContext sqlStatementContext = new CreateProcedureStatementContext(mock(), sqlStatement); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); when(rule.isShardingTable("foo_tbl")).thenReturn(true); assertThrows(UnsupportedShardingOperationException.class, () -> new ShardingCreateProcedureSupportedChecker().check(rule, database, mock(), sqlStatementContext)); @@ -97,15 +93,14 @@ class ShardingCreateProcedureSupportedCheckerTest { @Test void assertCheckWithNoSuchTable() { SelectStatement selectStatement = new SelectStatement(); - SimpleTableSegment fromTable = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl"))); - selectStatement.setFrom(fromTable); + selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(selectStatement); RoutineBodySegment routineBody = new RoutineBodySegment(0, 0); routineBody.getValidStatements().add(validStatementSegment); CreateProcedureStatement sqlStatement = mock(CreateProcedureStatement.class); when(sqlStatement.getRoutineBody()).thenReturn(Optional.of(routineBody)); - TableAvailableSQLStatementContext sqlStatementContext = new TableAvailableSQLStatementContext(mock(), sqlStatement, fromTable); + CreateProcedureStatementContext sqlStatementContext = new CreateProcedureStatementContext(mock(), sqlStatement); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); assertThrows(NoSuchTableException.class, () -> new ShardingCreateProcedureSupportedChecker().check(rule, database, mock(), sqlStatementContext)); } @@ -113,15 +108,14 @@ class ShardingCreateProcedureSupportedCheckerTest { @Test void assertCheckWithTableExists() { CreateTableStatement createTableStatement = new CreateTableStatement(); - SimpleTableSegment fromTable = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl"))); - createTableStatement.setTable(fromTable); + createTableStatement.setTable(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("foo_tbl")))); ValidStatementSegment validStatementSegment = new ValidStatementSegment(0, 0); validStatementSegment.setSqlStatement(createTableStatement); RoutineBodySegment routineBody = new RoutineBodySegment(0, 0); routineBody.getValidStatements().add(validStatementSegment); CreateProcedureStatement sqlStatement = mock(CreateProcedureStatement.class); when(sqlStatement.getRoutineBody()).thenReturn(Optional.of(routineBody)); - TableAvailableSQLStatementContext sqlStatementContext = new TableAvailableSQLStatementContext(mock(), sqlStatement, fromTable); + CreateProcedureStatementContext sqlStatementContext = new CreateProcedureStatementContext(mock(), sqlStatement); ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS); ShardingSphereSchema schema = mock(ShardingSphereSchema.class); when(schema.containsTable("foo_tbl")).thenReturn(true); diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java index 4d632d29a67..8ba016d86c3 100644 --- a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java +++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/SQLStatementContextFactory.java @@ -30,6 +30,7 @@ import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.AlterTa import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.AlterViewStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CloseStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CreateIndexStatementContext; +import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CreateProcedureStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CreateTableStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CreateViewStatementContext; import org.apache.shardingsphere.infra.binder.context.statement.type.ddl.CursorStatementContext; @@ -47,7 +48,6 @@ import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; -import org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor; import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.statement.core.statement.dal.AnalyzeTableStatement; @@ -200,8 +200,7 @@ public final class SQLStatementContextFactory { return new TableAvailableSQLStatementContext(databaseType, sqlStatement, ((CreateFunctionStatement) sqlStatement).getTables()); } if (sqlStatement instanceof CreateProcedureStatement) { - return new TableAvailableSQLStatementContext(databaseType, sqlStatement, - ((CreateProcedureStatement) sqlStatement).getRoutineBody().map(optional -> new TableExtractor().extractExistTableFromRoutineBody(optional)).orElseGet(Collections::emptyList)); + return new CreateProcedureStatementContext(databaseType, (CreateProcedureStatement) sqlStatement); } if (sqlStatement instanceof CreateViewStatement) { return new CreateViewStatementContext(metaData, databaseType, params, (CreateViewStatement) sqlStatement, currentDatabaseName); diff --git a/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateProcedureStatementContext.java b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateProcedureStatementContext.java new file mode 100644 index 00000000000..c7bcbc71ed0 --- /dev/null +++ b/infra/binder/core/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateProcedureStatementContext.java @@ -0,0 +1,52 @@ +/* + * 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.context.statement.type.ddl; + +import lombok.Getter; +import org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext; +import org.apache.shardingsphere.infra.binder.context.statement.CommonSQLStatementContext; +import org.apache.shardingsphere.infra.database.core.type.DatabaseType; +import org.apache.shardingsphere.sql.parser.statement.core.extractor.TableExtractor; +import org.apache.shardingsphere.sql.parser.statement.core.segment.ddl.routine.RoutineBodySegment; +import org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment; +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateProcedureStatement; + +import java.util.Collection; +import java.util.Collections; +import java.util.Optional; + +/** + * Create procedure statement context. + */ +@Getter +public final class CreateProcedureStatementContext extends CommonSQLStatementContext { + + private final TablesContext tablesContext; + + public CreateProcedureStatementContext(final DatabaseType databaseType, final CreateProcedureStatement sqlStatement) { + super(databaseType, sqlStatement); + Optional<RoutineBodySegment> routineBodySegment = sqlStatement.getRoutineBody(); + Collection<SimpleTableSegment> tables = routineBodySegment.map(optional -> new TableExtractor().extractExistTableFromRoutineBody(optional)).orElseGet(Collections::emptyList); + tablesContext = new TablesContext(tables); + } + + @Override + public CreateProcedureStatement getSqlStatement() { + return (CreateProcedureStatement) super.getSqlStatement(); + } +} diff --git a/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateProcedureStatementContextTest.java b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateProcedureStatementContextTest.java new file mode 100644 index 00000000000..a29961e7c84 --- /dev/null +++ b/infra/binder/core/src/test/java/org/apache/shardingsphere/infra/binder/context/statement/type/ddl/CreateProcedureStatementContextTest.java @@ -0,0 +1,35 @@ +/* + * 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.context.statement.type.ddl; + +import org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateProcedureStatement; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; + +class CreateProcedureStatementContextTest { + + @Test + void assertNewInstance() { + CreateProcedureStatement sqlStatement = mock(CreateProcedureStatement.class); + CreateProcedureStatementContext actual = new CreateProcedureStatementContext(mock(), sqlStatement); + assertThat(actual.getSqlStatement(), is(sqlStatement)); + } +}