This is an automated email from the ASF dual-hosted git repository. duanzhengqiang 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 476e7e5c2f0 Support create schema for PG/openGauss (#17052) 476e7e5c2f0 is described below commit 476e7e5c2f0055a4e5dae73269b7e788c1006bb3 Author: zhaojinchao <zhaojinc...@apache.org> AuthorDate: Mon Apr 25 09:04:24 2022 +0800 Support create schema for PG/openGauss (#17052) * Add schemaName param when execute DDL sql. * Fixed unit test * update * fixed * Add create schema refresher. * fix ci * merge master * Fix ci * Fix ci * Format code. --- .../infra/binder/SQLStatementContextFactory.java | 5 ++++ .../ddl/CreateSchemaStatementContext.java | 17 ++++++------- .../metadata/schema/event/AddSchemaEvent.java | 22 ++++++++++------- .../context/refresher/MetaDataRefreshEngine.java | 17 +++++++++---- .../infra/context/refresher/MetaDataRefresher.java | 3 ++- .../type/AlterIndexStatementSchemaRefresher.java | 9 ++++--- .../type/AlterTableStatementSchemaRefresher.java | 18 ++++++-------- .../type/AlterViewStatementSchemaRefresher.java | 28 ++++++++++------------ .../type/CreateIndexStatementSchemaRefresher.java | 9 ++++--- .../CreateSchemaStatementSchemaRefresher.java} | 22 ++++++++++++----- .../type/CreateTableStatementSchemaRefresher.java | 13 ++++------ .../type/CreateViewStatementSchemaRefresher.java | 13 ++++------ .../type/DropIndexStatementSchemaRefresher.java | 9 ++++--- .../type/DropTableStatementSchemaRefresher.java | 9 ++++--- .../type/DropViewStatementSchemaRefresher.java | 7 +++--- .../type/RenameTableStatementSchemaRefresher.java | 28 ++++++++++------------ ...phere.infra.context.refresher.MetaDataRefresher | 1 + .../refresher/MetaDataRefreshEngineTest.java | 26 ++++++++++++++------ .../type/DummyDropDatabaseMetaDataRefresher.java | 2 +- .../RenameTableStatementSchemaRefresherTest.java | 4 ++-- .../driver/executor/DriverJDBCExecutor.java | 13 +++++----- .../service/SchemaMetaDataPersistService.java | 22 ++++++++++++++++- .../service/SchemaMetaDataPersistServiceTest.java | 6 ++--- .../SchemaMetaDataRegistrySubscriber.java | 11 +++++++++ .../SchemaMetaDataRegistrySubscriberTest.java | 8 +++++++ .../communication/DatabaseCommunicationEngine.java | 3 +-- .../impl/PostgreSQLDDLStatementSQLVisitor.java | 5 +++- .../statement/ddl/CreateSchemaStatement.java} | 15 ++++++------ .../ddl/PostgreSQLCreateSchemaStatement.java | 6 +++-- 29 files changed, 207 insertions(+), 144 deletions(-) diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/SQLStatementContextFactory.java b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/SQLStatementContextFactory.java index cbf1d6a0ab4..ccd6d2de69a 100644 --- a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/SQLStatementContextFactory.java +++ b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/SQLStatementContextFactory.java @@ -45,6 +45,7 @@ import org.apache.shardingsphere.infra.binder.statement.ddl.CreateViewStatementC import org.apache.shardingsphere.infra.binder.statement.ddl.DropIndexStatementContext; import org.apache.shardingsphere.infra.binder.statement.ddl.DropTableStatementContext; import org.apache.shardingsphere.infra.binder.statement.ddl.DropViewStatementContext; +import org.apache.shardingsphere.infra.binder.statement.ddl.CreateSchemaStatementContext; import org.apache.shardingsphere.infra.binder.statement.ddl.PrepareStatementContext; import org.apache.shardingsphere.infra.binder.statement.ddl.RenameTableStatementContext; import org.apache.shardingsphere.infra.binder.statement.ddl.TruncateStatementContext; @@ -72,6 +73,7 @@ import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateIndex import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateProcedureStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement; +import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateSchemaStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropIndexStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropTableStatement; @@ -166,6 +168,9 @@ public final class SQLStatementContextFactory { } private static SQLStatementContext<?> getDDLStatementContext(final DDLStatement sqlStatement) { + if (sqlStatement instanceof CreateSchemaStatement) { + return new CreateSchemaStatementContext((CreateSchemaStatement) sqlStatement); + } if (sqlStatement instanceof CreateTableStatement) { return new CreateTableStatementContext((CreateTableStatement) sqlStatement); } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CreateSchemaStatementContext.java similarity index 64% copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java copy to shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CreateSchemaStatementContext.java index 32f3b7d2df3..d2ee9e78938 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java +++ b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/ddl/CreateSchemaStatementContext.java @@ -15,16 +15,17 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl; +package org.apache.shardingsphere.infra.binder.statement.ddl; -import lombok.ToString; -import org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement; -import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement; -import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement; +import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext; +import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateSchemaStatement; /** - * PostgreSQL create schema statement. + * Create schema statement context. */ -@ToString -public final class PostgreSQLCreateSchemaStatement extends AbstractSQLStatement implements DDLStatement, PostgreSQLStatement { +public final class CreateSchemaStatementContext extends CommonSQLStatementContext<CreateSchemaStatement> { + + public CreateSchemaStatementContext(final CreateSchemaStatement sqlStatement) { + super(sqlStatement); + } } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/event/AddSchemaEvent.java similarity index 59% copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java copy to shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/event/AddSchemaEvent.java index 32f3b7d2df3..6b8d3ea91af 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java +++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/event/AddSchemaEvent.java @@ -15,16 +15,22 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl; +package org.apache.shardingsphere.infra.metadata.schema.event; -import lombok.ToString; -import org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement; -import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement; -import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement; +import lombok.Getter; /** - * PostgreSQL create schema statement. + * add schema event. */ -@ToString -public final class PostgreSQLCreateSchemaStatement extends AbstractSQLStatement implements DDLStatement, PostgreSQLStatement { +@Getter +public final class AddSchemaEvent { + + private final String databaseName; + + private final String schemaName; + + public AddSchemaEvent(final String databaseName, final String schemaName) { + this.databaseName = databaseName; + this.schemaName = schemaName; + } } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java index 503d2957be0..021b8d64f2d 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngine.java @@ -18,7 +18,11 @@ package org.apache.shardingsphere.infra.context.refresher; import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; +import org.apache.shardingsphere.infra.database.type.DatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType; +import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; @@ -58,21 +62,26 @@ public final class MetaDataRefreshEngine { /** * Refresh. * - * @param sqlStatement SQL statement + * @param sqlStatementContext SQL statement context * @param logicDataSourceNamesSupplier logic data source names supplier * @throws SQLException SQL exception */ @SuppressWarnings({"unchecked", "rawtypes"}) - public void refresh(final SQLStatement sqlStatement, final Supplier<Collection<String>> logicDataSourceNamesSupplier) throws SQLException { - Class<? extends SQLStatement> sqlStatementClass = sqlStatement.getClass(); + public void refresh(final SQLStatementContext<?> sqlStatementContext, final Supplier<Collection<String>> logicDataSourceNamesSupplier) throws SQLException { + Class<? extends SQLStatement> sqlStatementClass = sqlStatementContext.getSqlStatement().getClass(); if (IGNORABLE_SQL_STATEMENT_CLASSES.contains(sqlStatementClass)) { return; } Optional<MetaDataRefresher> schemaRefresher = TypedSPIRegistry.findRegisteredService(MetaDataRefresher.class, sqlStatementClass.getSuperclass().getName()); if (schemaRefresher.isPresent()) { - schemaRefresher.get().refresh(schemaMetaData, federationMetaData, optimizerPlanners, logicDataSourceNamesSupplier.get(), sqlStatement, props); + String schemaName = sqlStatementContext.getTablesContext().getSchemaName().orElse(getSchemaName(sqlStatementContext.getDatabaseType(), schemaMetaData.getDatabaseName())); + schemaRefresher.get().refresh(schemaMetaData, federationMetaData, optimizerPlanners, logicDataSourceNamesSupplier.get(), schemaName, sqlStatementContext.getSqlStatement(), props); } else { IGNORABLE_SQL_STATEMENT_CLASSES.add(sqlStatementClass); } } + + private String getSchemaName(final DatabaseType databaseType, final String databaseName) { + return databaseType instanceof PostgreSQLDatabaseType || databaseType instanceof OpenGaussDatabaseType ? "public" : databaseName; + } } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java index 5c1cd150d75..f0466690e17 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefresher.java @@ -42,10 +42,11 @@ public interface MetaDataRefresher<T extends SQLStatement> extends StatelessType * @param database federation database meta data * @param optimizerPlanners optimizer planners * @param logicDataSourceNames route data source names + * @param schemaName schema name * @param sqlStatement SQL statement * @param props configuration properties * @throws SQLException SQL exception */ void refresh(ShardingSphereMetaData schemaMetaData, FederationDatabaseMetaData database, Map<String, OptimizerPlannerContext> optimizerPlanners, - Collection<String> logicDataSourceNames, T sqlStatement, ConfigurationProperties props) throws SQLException; + Collection<String> logicDataSourceNames, String schemaName, T sqlStatement, ConfigurationProperties props) throws SQLException; } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java index d69fded975b..cb7bd9ff354 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterIndexStatementSchemaRefresher.java @@ -46,21 +46,20 @@ public final class AlterIndexStatementSchemaRefresher implements MetaDataRefresh @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final AlterIndexStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final AlterIndexStatement sqlStatement, final ConfigurationProperties props) throws SQLException { Optional<IndexSegment> renameIndex = AlterIndexStatementHandler.getRenameIndexSegment(sqlStatement); if (!sqlStatement.getIndex().isPresent() || !renameIndex.isPresent()) { return; } String indexName = sqlStatement.getIndex().get().getIdentifier().getValue(); - Optional<String> logicTableName = findLogicTableName(schemaMetaData.getDefaultSchema(), indexName); + Optional<String> logicTableName = findLogicTableName(schemaMetaData.getSchemaByName(schemaName), indexName); if (logicTableName.isPresent()) { - TableMetaData tableMetaData = schemaMetaData.getDefaultSchema().get(logicTableName.get()); + TableMetaData tableMetaData = schemaMetaData.getSchemaByName(schemaName).get(logicTableName.get()); Preconditions.checkNotNull(tableMetaData, "Can not get the table '%s' metadata!", logicTableName.get()); tableMetaData.getIndexes().remove(indexName); String renameIndexName = renameIndex.get().getIdentifier().getValue(); tableMetaData.getIndexes().put(renameIndexName, new IndexMetaData(renameIndexName)); - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); event.getAlteredTables().add(tableMetaData); ShardingSphereEventBus.getInstance().post(event); } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java index e34b0cc8640..9446da4e9b6 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterTableStatementSchemaRefresher.java @@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.context.refresher.type; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher; -import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType; -import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory; @@ -50,18 +48,17 @@ public final class AlterTableStatementSchemaRefresher implements MetaDataRefresh @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final AlterTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final AlterTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); if (sqlStatement.getRenameTable().isPresent()) { String renameTable = sqlStatement.getRenameTable().get().getTableName().getIdentifier().getValue(); - putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, renameTable, props); + putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, schemaName, renameTable, props); removeTableMetaData(schemaMetaData, database, optimizerPlanners, tableName); event.getAlteredTables().add(schemaMetaData.getDefaultSchema().get(renameTable)); event.getDroppedTables().add(tableName); } else { - putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, tableName, props); + putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, schemaName, tableName, props); event.getAlteredTables().add(schemaMetaData.getDefaultSchema().get(tableName)); } ShardingSphereEventBus.getInstance().post(event); @@ -76,17 +73,16 @@ public final class AlterTableStatementSchemaRefresher implements MetaDataRefresh } private void putTableMetaData(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final String tableName, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final String tableName, final ConfigurationProperties props) throws SQLException { if (!containsInDataNodeContainedRule(tableName, schemaMetaData)) { schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(tableName, logicDataSourceNames.iterator().next())); } SchemaBuilderMaterials materials = new SchemaBuilderMaterials( - schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaMetaData.getDatabaseName()); + schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaName); Map<String, SchemaMetaData> schemaMetaDataMap = TableMetaDataBuilder.load(Collections.singletonList(tableName), materials); - String schemaName = materials.getDatabaseType() instanceof PostgreSQLDatabaseType || materials.getDatabaseType() instanceof OpenGaussDatabaseType ? "public" : schemaMetaData.getDatabaseName(); Optional<TableMetaData> actualTableMetaData = Optional.ofNullable(schemaMetaDataMap.get(schemaName)).map(optional -> optional.getTables().get(tableName)); actualTableMetaData.ifPresent(tableMetaData -> { - schemaMetaData.getDefaultSchema().put(tableName, tableMetaData); + schemaMetaData.getSchemaByName(schemaName).put(tableName, tableMetaData); database.put(tableMetaData); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); }); diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java index c0e1a138b9d..9ee88c3b318 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/AlterViewStatementSchemaRefresher.java @@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.context.refresher.type; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher; -import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType; -import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory; @@ -52,45 +50,43 @@ public final class AlterViewStatementSchemaRefresher implements MetaDataRefreshe @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final AlterViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final AlterViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException { String viewName = sqlStatement.getView().getTableName().getIdentifier().getValue(); - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); Optional<SimpleTableSegment> renameView = AlterViewStatementHandler.getRenameView(sqlStatement); if (renameView.isPresent()) { String renameViewName = renameView.get().getTableName().getIdentifier().getValue(); - putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, renameViewName, props); - removeTableMetaData(schemaMetaData, database, optimizerPlanners, viewName); - event.getAlteredTables().add(schemaMetaData.getDefaultSchema().get(renameViewName)); + putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, schemaName, renameViewName, props); + removeTableMetaData(schemaMetaData, database, optimizerPlanners, schemaName, viewName); + event.getAlteredTables().add(schemaMetaData.getSchemaByName(schemaName).get(renameViewName)); event.getDroppedTables().add(viewName); } else { - putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, viewName, props); + putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, schemaName, viewName, props); event.getAlteredTables().add(schemaMetaData.getDefaultSchema().get(viewName)); } ShardingSphereEventBus.getInstance().post(event); } private void removeTableMetaData(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, - final Map<String, OptimizerPlannerContext> optimizerPlanners, final String viewName) { - schemaMetaData.getDefaultSchema().remove(viewName); + final Map<String, OptimizerPlannerContext> optimizerPlanners, final String schemaName, final String viewName) { + schemaMetaData.getSchemaByName(schemaName).remove(viewName); schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.remove(viewName)); database.remove(viewName); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); } private void putTableMetaData(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final String viewName, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final String viewName, final ConfigurationProperties props) throws SQLException { if (!containsInDataNodeContainedRule(viewName, schemaMetaData)) { schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(viewName, logicDataSourceNames.iterator().next())); } SchemaBuilderMaterials materials = new SchemaBuilderMaterials( - schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaMetaData.getDatabaseName()); + schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaName); Map<String, SchemaMetaData> schemaMetaDataMap = TableMetaDataBuilder.load(Collections.singletonList(viewName), materials); - String schemaName = materials.getDatabaseType() instanceof PostgreSQLDatabaseType || materials.getDatabaseType() instanceof OpenGaussDatabaseType ? "public" : schemaMetaData.getDatabaseName(); Optional<TableMetaData> actualViewMetaData = Optional.ofNullable(schemaMetaDataMap.get(schemaName)).map(optional -> optional.getTables().get(viewName)); actualViewMetaData.ifPresent(viewMetaData -> { - schemaMetaData.getDefaultSchema().put(viewName, viewMetaData); - database.put(viewMetaData); + schemaMetaData.getSchemaByName(schemaName).put(viewName, viewMetaData); + database.put(schemaName, viewMetaData); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); }); } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java index 041de589228..810b099e0bc 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateIndexStatementSchemaRefresher.java @@ -42,16 +42,15 @@ public final class CreateIndexStatementSchemaRefresher implements MetaDataRefres @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final CreateIndexStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final CreateIndexStatement sqlStatement, final ConfigurationProperties props) throws SQLException { String indexName = null != sqlStatement.getIndex() ? sqlStatement.getIndex().getIdentifier().getValue() : IndexMetaDataUtil.getGeneratedLogicIndexName(sqlStatement.getColumns()); if (Strings.isNullOrEmpty(indexName)) { return; } String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); - schemaMetaData.getDefaultSchema().get(tableName).getIndexes().put(indexName, new IndexMetaData(indexName)); - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); - event.getAlteredTables().add(schemaMetaData.getDefaultSchema().get(tableName)); + schemaMetaData.getSchemaByName(schemaName).get(tableName).getIndexes().put(indexName, new IndexMetaData(indexName)); + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); + event.getAlteredTables().add(schemaMetaData.getSchemaByName(schemaName).get(tableName)); ShardingSphereEventBus.getInstance().post(event); } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java similarity index 60% copy from shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java copy to shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java index 067a92aacf8..a15a8c7e77a 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateSchemaStatementSchemaRefresher.java @@ -19,27 +19,37 @@ package org.apache.shardingsphere.infra.context.refresher.type; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher; +import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; +import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory; import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; -import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropDatabaseStatement; +import org.apache.shardingsphere.infra.metadata.schema.event.AddSchemaEvent; +import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData; +import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateSchemaStatement; +import java.sql.SQLException; import java.util.Collection; import java.util.Map; /** - * MetaDataRefresher for testing. + * Schema refresher for create schema statement. */ -public final class DummyDropDatabaseMetaDataRefresher implements MetaDataRefresher<DropDatabaseStatement> { +public final class CreateSchemaStatementSchemaRefresher implements MetaDataRefresher<CreateSchemaStatement> { + + private static final String TYPE = CreateSchemaStatement.class.getName(); @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final DropDatabaseStatement sqlStatement, final ConfigurationProperties props) { - sqlStatement.getDatabaseName(); + final Collection<String> logicDataSourceNames, final String schemaName, final CreateSchemaStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + database.put(sqlStatement.getSchemaName(), new TableMetaData()); + optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); + AddSchemaEvent event = new AddSchemaEvent(schemaMetaData.getDatabaseName(), sqlStatement.getSchemaName()); + ShardingSphereEventBus.getInstance().post(event); } @Override public String getType() { - return DropDatabaseStatement.class.getName(); + return TYPE; } } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java index 6259342c63b..d7b0037e3e7 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateTableStatementSchemaRefresher.java @@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.context.refresher.type; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher; -import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType; -import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory; @@ -50,23 +48,20 @@ public final class CreateTableStatementSchemaRefresher implements MetaDataRefres @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final CreateTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final CreateTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { String tableName = sqlStatement.getTable().getTableName().getIdentifier().getValue(); if (!containsInDataNodeContainedRule(tableName, schemaMetaData)) { schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(tableName, logicDataSourceNames.iterator().next())); } - String databaseName = schemaMetaData.getDatabaseName(); SchemaBuilderMaterials materials = new SchemaBuilderMaterials( - schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, databaseName); + schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaName); Map<String, SchemaMetaData> schemaMetaDataMap = TableMetaDataBuilder.load(Collections.singletonList(tableName), materials); - String schemaName = materials.getDatabaseType() instanceof PostgreSQLDatabaseType || materials.getDatabaseType() instanceof OpenGaussDatabaseType ? "public" : databaseName; Optional<TableMetaData> actualTableMetaData = Optional.ofNullable(schemaMetaDataMap.get(schemaName)).map(optional -> optional.getTables().get(tableName)); actualTableMetaData.ifPresent(tableMetaData -> { - schemaMetaData.getDefaultSchema().put(tableName, tableMetaData); + schemaMetaData.getSchemaByName(schemaName).put(tableName, tableMetaData); database.put(tableMetaData); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(databaseName, databaseName); + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); event.getAlteredTables().add(tableMetaData); ShardingSphereEventBus.getInstance().post(event); }); diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java index 67868f19b5a..b73d0133524 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/CreateViewStatementSchemaRefresher.java @@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.context.refresher.type; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher; -import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType; -import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory; @@ -50,22 +48,21 @@ public final class CreateViewStatementSchemaRefresher implements MetaDataRefresh @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final CreateViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final CreateViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException { String viewName = sqlStatement.getView().getTableName().getIdentifier().getValue(); if (!containsInDataNodeContainedRule(viewName, schemaMetaData)) { schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(viewName, logicDataSourceNames.iterator().next())); } SchemaBuilderMaterials materials = new SchemaBuilderMaterials( - schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaMetaData.getDatabaseName()); + schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaName); Map<String, SchemaMetaData> schemaMetaDataMap = TableMetaDataBuilder.load(Collections.singletonList(viewName), materials); - String schemaName = materials.getDatabaseType() instanceof PostgreSQLDatabaseType || materials.getDatabaseType() instanceof OpenGaussDatabaseType ? "public" : schemaMetaData.getDatabaseName(); Optional<TableMetaData> actualViewMetaData = Optional.ofNullable(schemaMetaDataMap.get(schemaName)).map(optional -> optional.getTables().get(viewName)); actualViewMetaData.ifPresent(viewMetaData -> { - schemaMetaData.getDefaultSchema().put(viewName, viewMetaData); - database.put(viewMetaData); + schemaMetaData.getSchemaByName(schemaName).put(viewName, viewMetaData); + database.put(schemaName, viewMetaData); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); event.getAlteredTables().add(viewMetaData); ShardingSphereEventBus.getInstance().post(event); }); diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java index 9095bb70b04..997563ccfd6 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropIndexStatementSchemaRefresher.java @@ -46,15 +46,14 @@ public final class DropIndexStatementSchemaRefresher implements MetaDataRefreshe @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final DropIndexStatement sqlStatement, final ConfigurationProperties props) throws SQLException { - String logicTableName = getLogicTableName(schemaMetaData.getDefaultSchema(), sqlStatement).orElse(""); - TableMetaData tableMetaData = schemaMetaData.getDefaultSchema().get(logicTableName); + final Collection<String> logicDataSourceNames, final String schemaName, final DropIndexStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + String logicTableName = getLogicTableName(schemaMetaData.getSchemaByName(schemaName), sqlStatement).orElse(""); + TableMetaData tableMetaData = schemaMetaData.getSchemaByName(schemaName).get(logicTableName); if (null != tableMetaData) { for (String each : getIndexNames(sqlStatement)) { tableMetaData.getIndexes().remove(each); } - // TODO Get real schema name - post(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName(), tableMetaData); + post(schemaMetaData.getDatabaseName(), schemaName, tableMetaData); } } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java index 5a7e72cf645..d9bf3089e81 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropTableStatementSchemaRefresher.java @@ -42,12 +42,11 @@ public final class DropTableStatementSchemaRefresher implements MetaDataRefreshe @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final DropTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); + final Collection<String> logicDataSourceNames, final String schemaName, final DropTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); sqlStatement.getTables().forEach(each -> { - schemaMetaData.getDefaultSchema().remove(each.getTableName().getIdentifier().getValue()); - database.remove(each.getTableName().getIdentifier().getValue()); + schemaMetaData.getSchemaByName(schemaName).remove(each.getTableName().getIdentifier().getValue()); + database.remove(schemaName, each.getTableName().getIdentifier().getValue()); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); event.getDroppedTables().add(each.getTableName().getIdentifier().getValue()); }); diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java index f4406f3b143..4915ea7e574 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/DropViewStatementSchemaRefresher.java @@ -41,11 +41,10 @@ public final class DropViewStatementSchemaRefresher implements MetaDataRefresher @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final DropViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException { - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); + final Collection<String> logicDataSourceNames, final String schemaName, final DropViewStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); sqlStatement.getViews().forEach(each -> { - schemaMetaData.getDefaultSchema().remove(each.getTableName().getIdentifier().getValue()); + schemaMetaData.getSchemaByName(schemaName).remove(each.getTableName().getIdentifier().getValue()); event.getDroppedTables().add(each.getTableName().getIdentifier().getValue()); }); Collection<MutableDataNodeRule> rules = schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class); diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java index 770f19f697e..445dfdab896 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresher.java @@ -19,8 +19,6 @@ package org.apache.shardingsphere.infra.context.refresher.type; import org.apache.shardingsphere.infra.config.props.ConfigurationProperties; import org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher; -import org.apache.shardingsphere.infra.database.type.dialect.OpenGaussDatabaseType; -import org.apache.shardingsphere.infra.database.type.dialect.PostgreSQLDatabaseType; import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext; import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory; @@ -51,41 +49,39 @@ public final class RenameTableStatementSchemaRefresher implements MetaDataRefres @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final RenameTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { - // TODO Get real schema name - SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaMetaData.getDatabaseName()); + final Collection<String> logicDataSourceNames, final String schemaName, final RenameTableStatement sqlStatement, final ConfigurationProperties props) throws SQLException { + SchemaAlteredEvent event = new SchemaAlteredEvent(schemaMetaData.getDatabaseName(), schemaName); for (RenameTableDefinitionSegment each : sqlStatement.getRenameTables()) { String tableName = each.getTable().getTableName().getIdentifier().getValue(); String renameTable = each.getRenameTable().getTableName().getIdentifier().getValue(); - putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, renameTable, props); - removeTableMetaData(schemaMetaData, database, optimizerPlanners, tableName); - event.getAlteredTables().add(schemaMetaData.getDefaultSchema().get(renameTable)); + putTableMetaData(schemaMetaData, database, optimizerPlanners, logicDataSourceNames, schemaName, renameTable, props); + removeTableMetaData(schemaMetaData, database, optimizerPlanners, schemaName, tableName); + event.getAlteredTables().add(schemaMetaData.getSchemaByName(schemaName).get(renameTable)); event.getDroppedTables().add(tableName); } ShardingSphereEventBus.getInstance().post(event); } private void removeTableMetaData(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, - final Map<String, OptimizerPlannerContext> optimizerPlanners, final String tableName) { - schemaMetaData.getDefaultSchema().remove(tableName); + final Map<String, OptimizerPlannerContext> optimizerPlanners, final String schemaName, final String tableName) { + schemaMetaData.getSchemaByName(schemaName).remove(tableName); schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.remove(tableName)); - database.remove(tableName); + database.remove(schemaName, tableName); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); } private void putTableMetaData(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final String tableName, final ConfigurationProperties props) throws SQLException { + final Collection<String> logicDataSourceNames, final String schemaName, final String tableName, final ConfigurationProperties props) throws SQLException { if (!containsInDataNodeContainedRule(tableName, schemaMetaData)) { schemaMetaData.getRuleMetaData().findRules(MutableDataNodeRule.class).forEach(each -> each.put(tableName, logicDataSourceNames.iterator().next())); } SchemaBuilderMaterials materials = new SchemaBuilderMaterials( - schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaMetaData.getDatabaseName()); + schemaMetaData.getResource().getDatabaseType(), schemaMetaData.getResource().getDataSources(), schemaMetaData.getRuleMetaData().getRules(), props, schemaName); Map<String, SchemaMetaData> schemaMetaDataMap = TableMetaDataBuilder.load(Collections.singletonList(tableName), materials); - String schemaName = materials.getDatabaseType() instanceof PostgreSQLDatabaseType || materials.getDatabaseType() instanceof OpenGaussDatabaseType ? "public" : schemaMetaData.getDatabaseName(); Optional<TableMetaData> actualTableMetaData = Optional.ofNullable(schemaMetaDataMap.get(schemaName)).map(optional -> optional.getTables().get(tableName)); actualTableMetaData.ifPresent(tableMetaData -> { - schemaMetaData.getDefaultSchema().put(tableName, tableMetaData); - database.put(tableMetaData); + schemaMetaData.getSchemaByName(schemaName).put(tableName, tableMetaData); + database.put(schemaName, tableMetaData); optimizerPlanners.put(database.getName(), OptimizerPlannerContextFactory.create(database)); }); } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher b/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher index 9144043ed32..5995fdbf2c0 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher +++ b/shardingsphere-infra/shardingsphere-infra-context/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.context.refresher.MetaDataRefresher @@ -19,6 +19,7 @@ org.apache.shardingsphere.infra.context.refresher.type.AlterIndexStatementSchema org.apache.shardingsphere.infra.context.refresher.type.AlterTableStatementSchemaRefresher org.apache.shardingsphere.infra.context.refresher.type.AlterViewStatementSchemaRefresher org.apache.shardingsphere.infra.context.refresher.type.CreateIndexStatementSchemaRefresher +org.apache.shardingsphere.infra.context.refresher.type.CreateSchemaStatementSchemaRefresher org.apache.shardingsphere.infra.context.refresher.type.CreateTableStatementSchemaRefresher org.apache.shardingsphere.infra.context.refresher.type.CreateViewStatementSchemaRefresher org.apache.shardingsphere.infra.context.refresher.type.DropIndexStatementSchemaRefresher diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java index f78b43f376d..fb686ebbe25 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/MetaDataRefreshEngineTest.java @@ -18,6 +18,9 @@ package org.apache.shardingsphere.infra.context.refresher; import lombok.SneakyThrows; +import org.apache.shardingsphere.infra.binder.segment.table.TablesContext; +import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext; +import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropDatabaseStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement; @@ -35,6 +38,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public final class MetaDataRefreshEngineTest { @@ -43,20 +47,28 @@ public final class MetaDataRefreshEngineTest { private MetaDataRefreshEngine metaDataRefreshEngine; @Test - public void assertRefreshNonIgnorableSQLStatement() throws SQLException { + public void assertRefreshNonIgnorableSQLStatement() throws Exception { final int dropTimes = 10; - DropDatabaseStatement dropDatabaseStatement = mock(DropDatabaseStatement.class); + SQLStatementContext<DropDatabaseStatement> sqlStatementContext = mock(SQLStatementContext.class); + when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DropDatabaseStatement.class)); + when(sqlStatementContext.getTablesContext()).thenReturn(mock(TablesContext.class)); + ShardingSphereMetaData shardingSphereMetaData = mock(ShardingSphereMetaData.class); + when(shardingSphereMetaData.getDatabaseName()).thenReturn("database"); + Field field = metaDataRefreshEngine.getClass().getDeclaredField("schemaMetaData"); + field.setAccessible(true); + field.set(metaDataRefreshEngine, shardingSphereMetaData); for (int i = 0; i < dropTimes; i++) { - metaDataRefreshEngine.refresh(dropDatabaseStatement, Collections::emptyList); + metaDataRefreshEngine.refresh(sqlStatementContext, Collections::emptyList); } - verify(dropDatabaseStatement, times(dropTimes)).getDatabaseName(); + verify(sqlStatementContext.getSqlStatement(), times(dropTimes)).getDatabaseName(); } @Test public void assertRefreshIgnorableSQLStatement() throws SQLException { - SelectStatement selectStatement = mock(SelectStatement.class); - metaDataRefreshEngine.refresh(selectStatement, Collections::emptyList); - assertTrue(getIgnorableSQLStatementClasses().contains(selectStatement.getClass())); + SQLStatementContext<SelectStatement> sqlStatementContext = mock(SQLStatementContext.class); + when(sqlStatementContext.getSqlStatement()).thenReturn(mock(SelectStatement.class)); + metaDataRefreshEngine.refresh(sqlStatementContext, Collections::emptyList); + assertTrue(getIgnorableSQLStatementClasses().contains(sqlStatementContext.getSqlStatement().getClass())); } @SneakyThrows diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java index 067a92aacf8..3e5a15e4988 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/DummyDropDatabaseMetaDataRefresher.java @@ -34,7 +34,7 @@ public final class DummyDropDatabaseMetaDataRefresher implements MetaDataRefresh @Override public void refresh(final ShardingSphereMetaData schemaMetaData, final FederationDatabaseMetaData database, final Map<String, OptimizerPlannerContext> optimizerPlanners, - final Collection<String> logicDataSourceNames, final DropDatabaseStatement sqlStatement, final ConfigurationProperties props) { + final Collection<String> logicDataSourceNames, final String schemaName, final DropDatabaseStatement sqlStatement, final ConfigurationProperties props) { sqlStatement.getDatabaseName(); } diff --git a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java index 77abbef7450..8a3f874e211 100644 --- a/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java +++ b/shardingsphere-infra/shardingsphere-infra-context/src/test/java/org/apache/shardingsphere/infra/context/refresher/type/RenameTableStatementSchemaRefresherTest.java @@ -54,7 +54,7 @@ public final class RenameTableStatementSchemaRefresherTest { RenameTableLister listener = new RenameTableLister(2); ShardingSphereEventBus.getInstance().register(listener); new RenameTableStatementSchemaRefresher().refresh(createShardingSphereMetaData(), new FederationDatabaseMetaData("foo_database", Collections.emptyMap()), - new HashMap<>(), Collections.singleton("foo_ds"), createRenameTableStatement(), mock(ConfigurationProperties.class)); + new HashMap<>(), Collections.singleton("foo_ds"), "foo_schema", createRenameTableStatement(), mock(ConfigurationProperties.class)); assertThat(listener.getActualCount(), is(listener.getRenameCount())); ShardingSphereEventBus.getInstance().unregister(listener); } @@ -75,7 +75,7 @@ public final class RenameTableStatementSchemaRefresherTest { private ShardingSphereMetaData createShardingSphereMetaData() { return new ShardingSphereMetaData("foo_database", - mockShardingSphereResource(), new ShardingSphereRuleMetaData(new LinkedList<>(), new LinkedList<>()), Collections.singletonMap("foo_database", mock(ShardingSphereSchema.class))); + mockShardingSphereResource(), new ShardingSphereRuleMetaData(new LinkedList<>(), new LinkedList<>()), Collections.singletonMap("foo_schema", mock(ShardingSphereSchema.class))); } private ShardingSphereResource mockShardingSphereResource() { diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java index 403badcfa67..9aad27ae7ef 100644 --- a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java +++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/executor/DriverJDBCExecutor.java @@ -32,7 +32,6 @@ import org.apache.shardingsphere.infra.route.context.RouteUnit; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; -import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement; import java.sql.SQLException; import java.util.ArrayList; @@ -99,7 +98,7 @@ public final class DriverJDBCExecutor { try { ExecuteProcessEngine.initialize(logicSQL, executionGroupContext, metaDataContexts.getProps()); SQLStatementContext<?> sqlStatementContext = logicSQL.getSqlStatementContext(); - List<Integer> results = doExecute(executionGroupContext, sqlStatementContext.getSqlStatement(), routeUnits, callback); + List<Integer> results = doExecute(executionGroupContext, sqlStatementContext, routeUnits, callback); int result = isNeedAccumulate(metaDataContexts.getMetaData(schemaName).getRuleMetaData().getRules(), sqlStatementContext) ? accumulate(results) : results.get(0); ExecuteProcessEngine.finish(executionGroupContext.getExecutionID()); return result; @@ -139,7 +138,7 @@ public final class DriverJDBCExecutor { final Collection<RouteUnit> routeUnits, final JDBCExecutorCallback<Boolean> callback) throws SQLException { try { ExecuteProcessEngine.initialize(logicSQL, executionGroupContext, metaDataContexts.getProps()); - List<Boolean> results = doExecute(executionGroupContext, logicSQL.getSqlStatementContext().getSqlStatement(), routeUnits, callback); + List<Boolean> results = doExecute(executionGroupContext, logicSQL.getSqlStatementContext(), routeUnits, callback); boolean result = null != results && !results.isEmpty() && null != results.get(0) && results.get(0); ExecuteProcessEngine.finish(executionGroupContext.getExecutionID()); return result; @@ -148,15 +147,15 @@ public final class DriverJDBCExecutor { } } - private <T> List<T> doExecute(final ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext, final SQLStatement sqlStatement, final Collection<RouteUnit> routeUnits, + private <T> List<T> doExecute(final ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext, final SQLStatementContext<?> sqlStatementContext, final Collection<RouteUnit> routeUnits, final JDBCExecutorCallback<T> callback) throws SQLException { List<T> results = jdbcExecutor.execute(executionGroupContext, callback); - refreshMetaData(sqlStatement, routeUnits); + refreshMetaData(sqlStatementContext, routeUnits); return results; } - private void refreshMetaData(final SQLStatement sqlStatement, final Collection<RouteUnit> routeUnits) throws SQLException { - metadataRefreshEngine.refresh(sqlStatement, () -> routeUnits.stream() + private void refreshMetaData(final SQLStatementContext<?> sqlStatementContext, final Collection<RouteUnit> routeUnits) throws SQLException { + metadataRefreshEngine.refresh(sqlStatementContext, () -> routeUnits.stream() .map(each -> each.getDataSourceMapper().getLogicName()).collect(Collectors.toCollection(() -> new ArrayList<>(routeUnits.size())))); } } diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistService.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistService.java index d2a373fc123..d9dce5acea7 100644 --- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistService.java +++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistService.java @@ -76,7 +76,17 @@ public final class SchemaMetaDataPersistService { * @param databaseName database name */ public void persist(final String databaseName) { - repository.persist(DatabaseMetaDataNode.getMetaDataTablesPath(databaseName, databaseName), ""); + repository.persist(DatabaseMetaDataNode.getDatabaseNamePath(databaseName), ""); + } + + /** + * Persist schema. + * + * @param databaseName database name + * @param schemaName schema name + */ + public void persist(final String databaseName, final String schemaName) { + repository.persist(DatabaseMetaDataNode.getMetaDataTablesPath(databaseName, schemaName), ""); } private void compareAndPersist(final String databaseName, final String schemaName, final ShardingSphereSchema schema, final ShardingSphereSchema originalSchema) { @@ -111,6 +121,16 @@ public final class SchemaMetaDataPersistService { repository.delete(DatabaseMetaDataNode.getDatabaseNamePath(databaseName)); } + /** + * Delete schema. + * + * @param databaseName database name + * @param schemaName schema name + */ + public void delete(final String databaseName, final String schemaName) { + repository.delete(DatabaseMetaDataNode.getMetaDataTablesPath(databaseName, schemaName)); + } + /** * Delete table meta data. * diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistServiceTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistServiceTest.java index 098e09283a6..368b4c0dddf 100644 --- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistServiceTest.java +++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/service/SchemaMetaDataPersistServiceTest.java @@ -65,13 +65,13 @@ public final class SchemaMetaDataPersistServiceTest { } @Test - public void assertPersistSchemaTables() { + public void assertPersistDatabase() { new SchemaMetaDataPersistService(repository).persist("foo_db"); - verify(repository).persist(eq("/metadata/foo_db/schemas/foo_db/tables"), anyString()); + verify(repository).persist(eq("/metadata/foo_db"), anyString()); } @Test - public void assertDelete() { + public void assertDeleteDatabase() { new SchemaMetaDataPersistService(repository).delete("foo_db"); verify(repository).delete("/metadata/foo_db"); } diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySu [...] index 44499c2da16..6f6bf231f92 100644 --- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java +++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriber.java @@ -18,6 +18,7 @@ package org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.subscriber; import com.google.common.eventbus.Subscribe; +import org.apache.shardingsphere.infra.metadata.schema.event.AddSchemaEvent; import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository; import org.apache.shardingsphere.mode.metadata.persist.service.SchemaMetaDataPersistService; import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus; @@ -45,4 +46,14 @@ public final class SchemaMetaDataRegistrySubscriber { event.getAlteredTables().forEach(each -> persistService.persist(event.getDatabaseName(), event.getSchemaName(), each)); event.getDroppedTables().forEach(each -> persistService.delete(event.getDatabaseName(), event.getSchemaName(), each)); } + + /** + * Add schema. + * + * @param event schema add event + */ + @Subscribe + public void addSchema(final AddSchemaEvent event) { + persistService.persist(event.getDatabaseName(), event.getSchemaName()); + } } diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegist [...] index 7ef804e4af7..a2a4f42beb8 100644 --- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java +++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/subscriber/SchemaMetaDataRegistrySubscriberTest.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.subscriber; +import org.apache.shardingsphere.infra.metadata.schema.event.AddSchemaEvent; import org.apache.shardingsphere.infra.metadata.schema.event.SchemaAlteredEvent; import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData; import org.apache.shardingsphere.mode.metadata.persist.service.SchemaMetaDataPersistService; @@ -58,4 +59,11 @@ public final class SchemaMetaDataRegistrySubscriberTest { verify(persistService).persist("foo_db", "foo_schema", tableMetaData); verify(persistService).delete("foo_db", "foo_schema", "foo_table"); } + + @Test + public void assertAddSchemaEvent() { + AddSchemaEvent event = new AddSchemaEvent("foo_db", "foo_schema"); + schemaMetaDataRegistrySubscriber.addSchema(event); + verify(persistService).persist("foo_db", "foo_schema"); + } } diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java index 380e16a513c..c0b499fe978 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java +++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/DatabaseCommunicationEngine.java @@ -103,8 +103,7 @@ public abstract class DatabaseCommunicationEngine<T> { public abstract T execute(); protected void refreshMetaData(final ExecutionContext executionContext) throws SQLException { - SQLStatement sqlStatement = executionContext.getSqlStatementContext().getSqlStatement(); - metadataRefreshEngine.refresh(sqlStatement, () -> executionContext.getRouteContext().getRouteUnits().stream() + metadataRefreshEngine.refresh(executionContext.getSqlStatementContext(), () -> executionContext.getRouteContext().getRouteUnits().stream() .map(each -> each.getDataSourceMapper().getLogicName()).collect(Collectors.toList())); } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java index 36175b03043..ed15f364eef 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/impl/PostgreSQLDDLStatementSQLVisitor.java @@ -228,6 +228,7 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLPrepareStatement; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLTruncateStatement; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLDropServerStatement; +import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl.PostgreSQLCreateSchemaStatement; import java.util.Collection; import java.util.Collections; @@ -799,7 +800,9 @@ public final class PostgreSQLDDLStatementSQLVisitor extends PostgreSQLStatementS @Override public ASTNode visitCreateSchema(final CreateSchemaContext ctx) { - return new PostgreSQLCreateLanguageStatement(); + PostgreSQLCreateSchemaStatement result = new PostgreSQLCreateSchemaStatement(); + result.setSchemaName(ctx.createSchemaClauses().colId().getText()); + return result; } @Override diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/CreateSchemaStatement.java similarity index 67% copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/CreateSchemaStatement.java index 32f3b7d2df3..2fe89a2dcb0 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/ddl/CreateSchemaStatement.java @@ -15,16 +15,17 @@ * limitations under the License. */ -package org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl; +package org.apache.shardingsphere.sql.parser.sql.common.statement.ddl; +import lombok.Getter; +import lombok.Setter; import lombok.ToString; import org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement; -import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement; -import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement; -/** - * PostgreSQL create schema statement. - */ +@Getter +@Setter @ToString -public final class PostgreSQLCreateSchemaStatement extends AbstractSQLStatement implements DDLStatement, PostgreSQLStatement { +public abstract class CreateSchemaStatement extends AbstractSQLStatement implements DDLStatement { + + private String schemaName; } diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java index 32f3b7d2df3..549ca57e552 100644 --- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java +++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/postgresql/ddl/PostgreSQLCreateSchemaStatement.java @@ -17,8 +17,9 @@ package org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.ddl; +import lombok.Setter; import lombok.ToString; -import org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement; +import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateSchemaStatement; import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement; import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.PostgreSQLStatement; @@ -26,5 +27,6 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.Pos * PostgreSQL create schema statement. */ @ToString -public final class PostgreSQLCreateSchemaStatement extends AbstractSQLStatement implements DDLStatement, PostgreSQLStatement { +@Setter +public final class PostgreSQLCreateSchemaStatement extends CreateSchemaStatement implements DDLStatement, PostgreSQLStatement { }