You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2020/12/16 11:20:46 UTC

[shardingsphere] branch master updated: Split RDLBackendHandler and RDLDetailsBackendHandler (#8654)

This is an automated email from the ASF dual-hosted git repository.

panjuan 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 dc79298  Split RDLBackendHandler and RDLDetailsBackendHandler (#8654)
dc79298 is described below

commit dc792981eee92391bf5b7b54a5a71828cd569e31
Author: Liang Zhang <te...@163.com>
AuthorDate: Wed Dec 16 19:20:13 2020 +0800

    Split RDLBackendHandler and RDLDetailsBackendHandler (#8654)
    
    * Add CreateDatabaseBackendHandler
    
    * Add AddResourceBackendHandler
    
    * Add CreateShardingRuleBackendHandler
    
    * Add CreateShardingRuleBackendHandler
    
    * Add DropDatabaseBackendHandler
    
    * Refactor RDLBackendHandler
    
    * Fix typo
---
 .../distsql/parser/core/DistSQLVisitor.java        |  4 +-
 ...cesStatement.java => AddResourceStatement.java} |  2 +-
 ...ntext.java => AddResourceStatementContext.java} |  6 +-
 .../text/distsql/rdl/RDLBackendHandler.java        | 83 +++++-----------------
 .../distsql/rdl/SchemaRequiredBackendHandler.java  |  1 +
 .../rdl/detail/AddResourceBackendHandler.java      | 49 +++++++++++++
 .../rdl/detail/CreateDatabaseBackendHandler.java   | 51 +++++++++++++
 .../detail/CreateShardingRuleBackendHandler.java   | 51 +++++++++++++
 .../rdl/detail/DropDatabaseBackendHandler.java     | 51 +++++++++++++
 .../DropShardingRuleBackendHandler.java            |  3 +-
 .../rdl/{ => detail}/RDLBackendDetailHandler.java  |  2 +-
 .../text/distsql/RDLBackendHandlerTest.java        |  6 +-
 ...CreateDataSourcesStatementContextConverter.java |  4 +-
 ...teDataSourcesStatementContextConverterTest.java |  8 +--
 .../command/query/PostgreSQLCommand.java           |  4 +-
 .../command/query/PostgreSQLCommandTest.java       |  4 +-
 16 files changed, 243 insertions(+), 86 deletions(-)

diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
index 944cae5..a50ace7 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/DistSQLVisitor.java
@@ -32,7 +32,7 @@ import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.S
 import org.apache.shardingsphere.distsql.parser.autogen.DistSQLStatementParser.TableNameContext;
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
 import org.apache.shardingsphere.distsql.parser.segment.TableRuleSegment;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourcesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropShardingRuleStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowResourcesStatement;
@@ -57,7 +57,7 @@ public final class DistSQLVisitor extends DistSQLStatementBaseVisitor<ASTNode> {
         for (DataSourceContext each : ctx.dataSource()) {
             connectionInfos.add((DataSourceSegment) visit(each));
         }
-        return new AddResourcesStatement(connectionInfos);
+        return new AddResourceStatement(connectionInfos);
     }
     
     @Override
diff --git a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/AddResourcesStatement.java b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/AddResourceStatement.java
similarity index 94%
rename from shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/AddResourcesStatement.java
rename to shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/AddResourceStatement.java
index 05eaff9..01c8a1c 100644
--- a/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/AddResourcesStatement.java
+++ b/shardingsphere-distsql-parser/shardingsphere-distsql-parser-statement/src/main/java/org/apache/shardingsphere/distsql/parser/statement/rdl/create/impl/AddResourceStatement.java
@@ -29,7 +29,7 @@ import java.util.Collection;
  */
 @RequiredArgsConstructor
 @Getter
-public final class AddResourcesStatement extends CreateRDLStatement {
+public final class AddResourceStatement extends CreateRDLStatement {
     
     private final Collection<DataSourceSegment> dataSources;
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/AddResourcesStatementContext.java b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/AddResourceStatementContext.java
similarity index 83%
rename from shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/AddResourcesStatementContext.java
rename to shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/AddResourceStatementContext.java
index 439bf50..4ed4093 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/AddResourcesStatementContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/rdl/AddResourceStatementContext.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.infra.binder.statement.rdl;
 
 import lombok.Getter;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourcesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
 import org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 
@@ -26,11 +26,11 @@ import org.apache.shardingsphere.infra.database.type.DatabaseType;
  * Add resource statement context.
  */
 @Getter
-public final class AddResourcesStatementContext extends CommonSQLStatementContext<AddResourcesStatement> {
+public final class AddResourceStatementContext extends CommonSQLStatementContext<AddResourceStatement> {
     
     private final DatabaseType databaseType;
     
-    public AddResourcesStatementContext(final AddResourcesStatement sqlStatement, final DatabaseType databaseType) {
+    public AddResourceStatementContext(final AddResourceStatement sqlStatement, final DatabaseType databaseType) {
         super(sqlStatement);
         this.databaseType = databaseType;
     }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/RDLBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/RDLBackendHandler.java
index e8e6d98..7633f99 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/RDLBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/RDLBackendHandler.java
@@ -18,43 +18,31 @@
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl;
 
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourcesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.drop.impl.DropShardingRuleStatement;
-import org.apache.shardingsphere.governance.core.event.model.datasource.DataSourcePersistEvent;
-import org.apache.shardingsphere.governance.core.event.model.rule.RuleConfigurationsPersistEvent;
-import org.apache.shardingsphere.governance.core.event.model.schema.SchemaNamePersistEvent;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.ddl.CreateDatabaseStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.ddl.DropDatabaseStatementContext;
-import org.apache.shardingsphere.infra.binder.statement.rdl.AddResourcesStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.rdl.AddResourceStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.rdl.CreateShardingRuleStatementContext;
 import org.apache.shardingsphere.infra.binder.statement.rdl.DropShardingRuleStatementContext;
-import org.apache.shardingsphere.infra.config.RuleConfiguration;
-import org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration;
 import org.apache.shardingsphere.infra.context.metadata.impl.StandardMetaDataContexts;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
-import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
-import org.apache.shardingsphere.proxy.backend.exception.DBCreateExistsException;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
-import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
-import org.apache.shardingsphere.proxy.config.util.DataSourceParameterConverter;
-import org.apache.shardingsphere.proxy.config.yaml.YamlDataSourceParameter;
-import org.apache.shardingsphere.proxy.converter.CreateDataSourcesStatementContextConverter;
-import org.apache.shardingsphere.sharding.converter.CreateShardingRuleStatementContextConverter;
-import org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail.AddResourceBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail.CreateDatabaseBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail.CreateShardingRuleBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail.DropDatabaseBackendHandler;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail.DropShardingRuleBackendHandler;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateDatabaseStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropDatabaseStatement;
 
 import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
 
 /**
  * RDL backend handler.
@@ -71,42 +59,7 @@ public final class RDLBackendHandler implements TextProtocolBackendHandler {
         if (!isRegistryCenterExisted()) {
             throw new SQLException(String.format("No Registry center to execute `%s` SQL", sqlStatement.getClass().getSimpleName()));
         }
-        return getResponseHeader(backendConnection.getSchemaName(), getSQLStatementContext());
-    }
-    
-    private ResponseHeader execute(final CreateDatabaseStatementContext context) {
-        if (ProxyContext.getInstance().getAllSchemaNames().contains(context.getSqlStatement().getDatabaseName())) {
-            throw new DBCreateExistsException(context.getSqlStatement().getDatabaseName());
-        }
-        // TODO Need to get the executed feedback from registry center for returning.
-        ShardingSphereEventBus.getInstance().post(new SchemaNamePersistEvent(context.getSqlStatement().getDatabaseName(), false));
-        return new UpdateResponseHeader(context.getSqlStatement());
-    }
-    
-    private ResponseHeader execute(final AddResourcesStatementContext context) {
-        Map<String, YamlDataSourceParameter> parameters = CreateDataSourcesStatementContextConverter.convert(context);
-        Map<String, DataSourceConfiguration> dataSources = DataSourceParameterConverter.getDataSourceConfigurationMap(
-                DataSourceParameterConverter.getDataSourceParameterMapFromYamlConfiguration(parameters));
-        // TODO Need to get the executed feedback from registry center for returning.
-        ShardingSphereEventBus.getInstance().post(new DataSourcePersistEvent(backendConnection.getSchemaName(), dataSources));
-        return new UpdateResponseHeader(context.getSqlStatement());
-    }
-    
-    private ResponseHeader execute(final CreateShardingRuleStatementContext context) {
-        YamlShardingRuleConfiguration config = CreateShardingRuleStatementContextConverter.convert(context);
-        Collection<RuleConfiguration> rules = new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(Collections.singleton(config));
-        // TODO Need to get the executed feedback from registry center for returning.
-        ShardingSphereEventBus.getInstance().post(new RuleConfigurationsPersistEvent(backendConnection.getSchemaName(), rules));
-        return new UpdateResponseHeader(context.getSqlStatement());
-    }
-    
-    private ResponseHeader execute(final DropDatabaseStatementContext context) {
-        if (!ProxyContext.getInstance().getAllSchemaNames().contains(context.getSqlStatement().getDatabaseName())) {
-            throw new DBCreateExistsException(context.getSqlStatement().getDatabaseName());
-        }
-        // TODO Need to get the executed feedback from registry center for returning.
-        ShardingSphereEventBus.getInstance().post(new SchemaNamePersistEvent(context.getSqlStatement().getDatabaseName(), true));
-        return new UpdateResponseHeader(context.getSqlStatement());
+        return getResponseHeader(getSQLStatementContext());
     }
     
     private boolean isRegistryCenterExisted() {
@@ -115,8 +68,8 @@ public final class RDLBackendHandler implements TextProtocolBackendHandler {
     
     private SQLStatementContext<?> getSQLStatementContext() {
         DatabaseType databaseType = ProxyContext.getInstance().getMetaDataContexts().getMetaData(backendConnection.getSchemaName()).getResource().getDatabaseType();
-        if (sqlStatement instanceof AddResourcesStatement) {
-            return new AddResourcesStatementContext((AddResourcesStatement) sqlStatement, databaseType);
+        if (sqlStatement instanceof AddResourceStatement) {
+            return new AddResourceStatementContext((AddResourceStatement) sqlStatement, databaseType);
         }
         if (sqlStatement instanceof CreateShardingRuleStatement) {
             return new CreateShardingRuleStatementContext((CreateShardingRuleStatement) sqlStatement);
@@ -133,21 +86,21 @@ public final class RDLBackendHandler implements TextProtocolBackendHandler {
         throw new UnsupportedOperationException(sqlStatement.getClass().getName());
     }
     
-    private ResponseHeader getResponseHeader(final String schemaName, final SQLStatementContext<?> context) {
-        if (context instanceof CreateDatabaseStatementContext) {
-            return execute((CreateDatabaseStatementContext) context);
+    private ResponseHeader getResponseHeader(final SQLStatementContext<?> context) {
+        if (context instanceof AddResourceStatementContext) {
+            return new AddResourceBackendHandler().execute(backendConnection, (AddResourceStatementContext) context);
         }
-        if (context instanceof AddResourcesStatementContext) {
-            return execute((AddResourcesStatementContext) context);
+        if (context instanceof CreateDatabaseStatementContext) {
+            return new CreateDatabaseBackendHandler().execute(backendConnection, (CreateDatabaseStatementContext) context);
         }
         if (context instanceof CreateShardingRuleStatementContext) {
-            return execute((CreateShardingRuleStatementContext) context);
+            return new CreateShardingRuleBackendHandler().execute(backendConnection, (CreateShardingRuleStatementContext) context);
         }
         if (context instanceof DropDatabaseStatementContext) {
-            return execute((DropDatabaseStatementContext) context);
+            return new DropDatabaseBackendHandler().execute(backendConnection, (DropDatabaseStatementContext) context);
         }
         if (context instanceof DropShardingRuleStatementContext) {
-            new DropShardingRuleBackendHandler().execute(schemaName, (DropShardingRuleStatementContext) context);
+            new DropShardingRuleBackendHandler().execute(backendConnection, (DropShardingRuleStatementContext) context);
         }
         throw new UnsupportedOperationException(context.getClass().getName());
     }
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/SchemaRequiredBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/SchemaRequiredBackendHandler.java
index bc78778..1fdfead 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/SchemaRequiredBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/SchemaRequiredBackendHandler.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.exception.NoDatabaseSelectedException;
 import org.apache.shardingsphere.proxy.backend.exception.UnknownDatabaseException;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail.RDLBackendDetailHandler;
 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.SchemaSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.available.FromSchemaAvailable;
 
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/AddResourceBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/AddResourceBackendHandler.java
new file mode 100644
index 0000000..f328ca5
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/AddResourceBackendHandler.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail;
+
+import org.apache.shardingsphere.governance.core.event.model.datasource.DataSourcePersistEvent;
+import org.apache.shardingsphere.infra.binder.statement.rdl.AddResourceStatementContext;
+import org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
+import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
+import org.apache.shardingsphere.proxy.config.util.DataSourceParameterConverter;
+import org.apache.shardingsphere.proxy.converter.CreateDataSourcesStatementContextConverter;
+
+import java.util.Map;
+
+/**
+ * Add resource backend handler.
+ */
+public final class AddResourceBackendHandler implements RDLBackendDetailHandler<AddResourceStatementContext> {
+    
+    @Override
+    public ResponseHeader execute(final BackendConnection backendConnection, final AddResourceStatementContext sqlStatementContext) {
+        Map<String, DataSourceConfiguration> dataSources = DataSourceParameterConverter.getDataSourceConfigurationMap(
+                DataSourceParameterConverter.getDataSourceParameterMapFromYamlConfiguration(CreateDataSourcesStatementContextConverter.convert(sqlStatementContext)));
+        post(backendConnection, dataSources);
+        return new UpdateResponseHeader(sqlStatementContext.getSqlStatement());
+    }
+    
+    private void post(final BackendConnection backendConnection, final Map<String, DataSourceConfiguration> dataSources) {
+        // TODO Need to get the executed feedback from registry center for returning.
+        ShardingSphereEventBus.getInstance().post(new DataSourcePersistEvent(backendConnection.getSchemaName(), dataSources));
+    }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/CreateDatabaseBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/CreateDatabaseBackendHandler.java
new file mode 100644
index 0000000..58bdce2
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/CreateDatabaseBackendHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail;
+
+import org.apache.shardingsphere.governance.core.event.model.schema.SchemaNamePersistEvent;
+import org.apache.shardingsphere.infra.binder.statement.ddl.CreateDatabaseStatementContext;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
+import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.exception.DBCreateExistsException;
+import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
+
+/**
+ * Create database backend handler.
+ */
+public final class CreateDatabaseBackendHandler implements RDLBackendDetailHandler<CreateDatabaseStatementContext> {
+    
+    @Override
+    public ResponseHeader execute(final BackendConnection backendConnection, final CreateDatabaseStatementContext sqlStatementContext) {
+        check(sqlStatementContext);
+        post(sqlStatementContext);
+        return new UpdateResponseHeader(sqlStatementContext.getSqlStatement());
+    }
+    
+    private void check(final CreateDatabaseStatementContext sqlStatementContext) {
+        if (ProxyContext.getInstance().getAllSchemaNames().contains(sqlStatementContext.getSqlStatement().getDatabaseName())) {
+            throw new DBCreateExistsException(sqlStatementContext.getSqlStatement().getDatabaseName());
+        }
+    }
+    
+    private void post(final CreateDatabaseStatementContext sqlStatementContext) {
+        // TODO Need to get the executed feedback from registry center for returning.
+        ShardingSphereEventBus.getInstance().post(new SchemaNamePersistEvent(sqlStatementContext.getSqlStatement().getDatabaseName(), false));
+    }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/CreateShardingRuleBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/CreateShardingRuleBackendHandler.java
new file mode 100644
index 0000000..5d2c538
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/CreateShardingRuleBackendHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail;
+
+import org.apache.shardingsphere.governance.core.event.model.rule.RuleConfigurationsPersistEvent;
+import org.apache.shardingsphere.infra.binder.statement.rdl.CreateShardingRuleStatementContext;
+import org.apache.shardingsphere.infra.config.RuleConfiguration;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
+import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine;
+import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.SchemaRequiredBackendHandler;
+import org.apache.shardingsphere.sharding.converter.CreateShardingRuleStatementContextConverter;
+import org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * Create sharding rule backend handler.
+ */
+public final class CreateShardingRuleBackendHandler extends SchemaRequiredBackendHandler<CreateShardingRuleStatementContext> {
+    
+    @Override
+    public ResponseHeader execute(final String schemaName, final CreateShardingRuleStatementContext sqlStatementContext) {
+        YamlShardingRuleConfiguration config = CreateShardingRuleStatementContextConverter.convert(sqlStatementContext);
+        Collection<RuleConfiguration> rules = new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(Collections.singleton(config));
+        post(schemaName, rules);
+        return new UpdateResponseHeader(sqlStatementContext.getSqlStatement());
+    }
+    
+    private void post(final String schemaName, final Collection<RuleConfiguration> rules) {
+        ShardingSphereEventBus.getInstance().post(new RuleConfigurationsPersistEvent(schemaName, rules));
+        // TODO Need to get the executed feedback from registry center for returning.
+    }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/DropDatabaseBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/DropDatabaseBackendHandler.java
new file mode 100644
index 0000000..7b76343
--- /dev/null
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/DropDatabaseBackendHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail;
+
+import org.apache.shardingsphere.governance.core.event.model.schema.SchemaNamePersistEvent;
+import org.apache.shardingsphere.infra.binder.statement.ddl.DropDatabaseStatementContext;
+import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
+import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.exception.DBCreateExistsException;
+import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
+import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
+
+/**
+ * Drop database backend handler.
+ */
+public final class DropDatabaseBackendHandler implements RDLBackendDetailHandler<DropDatabaseStatementContext> {
+    
+    @Override
+    public ResponseHeader execute(final BackendConnection backendConnection, final DropDatabaseStatementContext sqlStatementContext) {
+        check(sqlStatementContext);
+        post(sqlStatementContext);
+        return new UpdateResponseHeader(sqlStatementContext.getSqlStatement());
+    }
+    
+    private void check(final DropDatabaseStatementContext sqlStatementContext) {
+        if (!ProxyContext.getInstance().getAllSchemaNames().contains(sqlStatementContext.getSqlStatement().getDatabaseName())) {
+            throw new DBCreateExistsException(sqlStatementContext.getSqlStatement().getDatabaseName());
+        }
+    }
+    
+    private void post(final DropDatabaseStatementContext sqlStatementContext) {
+        // TODO Need to get the executed feedback from registry center for returning.
+        ShardingSphereEventBus.getInstance().post(new SchemaNamePersistEvent(sqlStatementContext.getSqlStatement().getDatabaseName(), true));
+    }
+}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/DropShardingRuleBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/DropShardingRuleBackendHandler.java
similarity index 98%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/DropShardingRuleBackendHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/DropShardingRuleBackendHandler.java
index c8e836e..0c40e72 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/DropShardingRuleBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/DropShardingRuleBackendHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rdl;
+package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail;
 
 import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.governance.core.event.model.rule.RuleConfigurationsPersistEvent;
@@ -27,6 +27,7 @@ import org.apache.shardingsphere.proxy.backend.exception.ShardingTableRuleNotExi
 import org.apache.shardingsphere.proxy.backend.exception.TablesInUsedException;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
+import org.apache.shardingsphere.proxy.backend.text.distsql.rdl.SchemaRequiredBackendHandler;
 import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/RDLBackendDetailHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/RDLBackendDetailHandler.java
similarity index 99%
rename from shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/RDLBackendDetailHandler.java
rename to shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/RDLBackendDetailHandler.java
index cd40ae5..1b7e0cc 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/RDLBackendDetailHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/detail/RDLBackendDetailHandler.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.proxy.backend.text.distsql.rdl;
+package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.detail;
 
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/RDLBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/RDLBackendHandlerTest.java
index 12df1f6..f7de396 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/RDLBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/RDLBackendHandlerTest.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.text.distsql;
 
 import lombok.SneakyThrows;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourcesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
 import org.apache.shardingsphere.infra.auth.builtin.DefaultAuthentication;
 import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
@@ -155,11 +155,11 @@ public final class RDLBackendHandlerTest {
     public void assertExecuteDataSourcesContext() throws SQLException {
         BackendConnection connection = mock(BackendConnection.class);
         when(connection.getSchemaName()).thenReturn("schema");
-        RDLBackendHandler executeEngine = new RDLBackendHandler(mock(AddResourcesStatement.class), connection);
+        RDLBackendHandler executeEngine = new RDLBackendHandler(mock(AddResourceStatement.class), connection);
         try {
             executeEngine.execute();
         } catch (final SQLException ex) {
-            assertThat(ex.getMessage(), is("No Registry center to execute `AddResourcesStatement` SQL"));
+            assertThat(ex.getMessage(), is("No Registry center to execute `AddResourceStatement` SQL"));
         }
         setGovernanceMetaDataContexts(true);
         ResponseHeader response = executeEngine.execute();
diff --git a/shardingsphere-proxy/shardingsphere-proxy-common/src/main/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverter.java b/shardingsphere-proxy/shardingsphere-proxy-common/src/main/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverter.java
index d05516e..30a2e1a 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-common/src/main/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverter.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-common/src/main/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverter.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.proxy.converter;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
-import org.apache.shardingsphere.infra.binder.statement.rdl.AddResourcesStatementContext;
+import org.apache.shardingsphere.infra.binder.statement.rdl.AddResourceStatementContext;
 import org.apache.shardingsphere.infra.config.datasource.DataSourceParameter;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.proxy.config.yaml.YamlDataSourceParameter;
@@ -40,7 +40,7 @@ public final class CreateDataSourcesStatementContextConverter {
      * @param sqlStatementContext create data source statement context
      * @return YAML data source parameter map
      */
-    public static Map<String, YamlDataSourceParameter> convert(final AddResourcesStatementContext sqlStatementContext) {
+    public static Map<String, YamlDataSourceParameter> convert(final AddResourceStatementContext sqlStatementContext) {
         Map<String, YamlDataSourceParameter> result = new LinkedHashMap<>(sqlStatementContext.getSqlStatement().getDataSources().size(), 1);
         for (DataSourceSegment each : sqlStatementContext.getSqlStatement().getDataSources()) {
             DataSourceParameter parameter = new DataSourceParameter();
diff --git a/shardingsphere-proxy/shardingsphere-proxy-common/src/test/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverterTest.java b/shardingsphere-proxy/shardingsphere-proxy-common/src/test/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverterTest.java
index be38950..95a01ae 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-common/src/test/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverterTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-common/src/test/java/org/apache/shardingsphere/proxy/converter/CreateDataSourcesStatementContextConverterTest.java
@@ -18,8 +18,8 @@
 package org.apache.shardingsphere.proxy.converter;
 
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourcesStatement;
-import org.apache.shardingsphere.infra.binder.statement.rdl.AddResourcesStatementContext;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
+import org.apache.shardingsphere.infra.binder.statement.rdl.AddResourceStatementContext;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.proxy.config.yaml.YamlDataSourceParameter;
 import org.junit.Before;
@@ -36,11 +36,11 @@ import static org.junit.Assert.assertTrue;
 
 public final class CreateDataSourcesStatementContextConverterTest {
     
-    private AddResourcesStatementContext sqlStatement;
+    private AddResourceStatementContext sqlStatement;
     
     @Before
     public void setUp() {
-        sqlStatement = new AddResourcesStatementContext(new AddResourcesStatement(createDataSourceConnectionSegments()), new MySQLDatabaseType());
+        sqlStatement = new AddResourceStatementContext(new AddResourceStatement(createDataSourceConnectionSegments()), new MySQLDatabaseType());
     }
     
     private Collection<DataSourceSegment> createDataSourceConnectionSegments() {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommand.java b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommand.java
index 096c3cb..13e58f6 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommand.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommand.java
@@ -18,7 +18,7 @@
 package org.apache.shardingsphere.proxy.frontend.postgresql.command.query;
 
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourcesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateDatabaseStatement;
@@ -50,7 +50,7 @@ public final class PostgreSQLCommand {
         if (sqlStatement instanceof UpdateStatement) {
             return "UPDATE";
         }
-        if (sqlStatement instanceof CreateDatabaseStatement || sqlStatement instanceof AddResourcesStatement || sqlStatement instanceof CreateShardingRuleStatement) {
+        if (sqlStatement instanceof CreateDatabaseStatement || sqlStatement instanceof AddResourceStatement || sqlStatement instanceof CreateShardingRuleStatement) {
             return "CREATE";
         }
         if (sqlStatement instanceof DropDatabaseStatement) {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommandTest.java b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommandTest.java
index 66a1507..01fbd78 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommandTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/PostgreSQLCommandTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.proxy.frontend.postgresql.command.query;
 
-import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourcesStatement;
+import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.AddResourceStatement;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.impl.CreateShardingRuleStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateDatabaseStatement;
@@ -65,7 +65,7 @@ public final class PostgreSQLCommandTest {
     
     @Test
     public void assertPostgreSQLCommandWhenSQLStatementInstanceOfCreateDataSourcesStatement() {
-        assertThat(new PostgreSQLCommand(mock(AddResourcesStatement.class)).getSQLCommand(), is("CREATE"));
+        assertThat(new PostgreSQLCommand(mock(AddResourceStatement.class)).getSQLCommand(), is("CREATE"));
     }
     
     @Test