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 {
 }

Reply via email to