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

chengzhang 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 4d30358a266 Move tableless route in single to 
TablelessRouteEngineFactory and refactor single validator (#33830)
4d30358a266 is described below

commit 4d30358a2664183993e75711491d874afe1a1b7c
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Nov 27 17:23:22 2024 +0800

    Move tableless route in single to TablelessRouteEngineFactory and refactor 
single validator (#33830)
    
    * Move tableless route in single to TablelessRouteEngineFactory and 
refactor single validator
    
    * fix unit test
---
 .../EncryptOrderByItemSupportedChecker.java        |  5 +-
 .../EncryptPredicateColumnSupportedChecker.java    |  7 ++-
 ...ryptInsertSelectProjectionSupportedChecker.java |  5 +-
 .../EncryptSelectProjectionSupportedChecker.java   |  3 +-
 .../EncryptOrderByItemSupportedCheckerTest.java    |  6 +-
 ...EncryptPredicateColumnSupportedCheckerTest.java |  6 +-
 ...InsertSelectProjectionSupportedCheckerTest.java |  4 +-
 ...ncryptSelectProjectionSupportedCheckerTest.java |  6 +-
 .../infra/checker/SupportedSQLCheckEngine.java     | 12 ++--
 .../infra/checker/SupportedSQLChecker.java         |  6 +-
 .../infra/connection/kernel/KernelProcessor.java   |  2 +-
 .../tableless/TablelessRouteEngineFactory.java     | 14 ++++-
 .../tableless/TablelessRouteEngineFactoryTest.java | 27 +++++++++
 .../SingleRuleConfigurationEmptyChecker.java       |  2 +-
 .../sql/SingleSupportedSQLCheckersBuilder.java     | 51 ++++++++++++++++
 .../schema/SingleDropSchemaSupportedChecker.java}  | 17 ++++--
 .../table/SingleDropTableSupportedChecker.java}    | 18 ++++--
 .../single/route/SingleSQLRouter.java              | 24 ++++----
 .../engine/SingleDatabaseBroadcastRouteEngine.java | 38 ------------
 .../route/engine/SingleRouteEngineFactory.java     | 17 +-----
 .../{ => standard}/SingleStandardRouteEngine.java  |  3 +-
 .../route/validator/SingleMetaDataValidator.java   | 37 ------------
 .../validator/SingleMetaDataValidatorFactory.java  | 51 ----------------
 ...here.infra.checker.SupportedSQLCheckersBuilder} |  2 +-
 ...ule.scope.DatabaseRuleConfigurationEmptyChecker |  2 +-
 .../SingleRuleConfigurationEmptyCheckerTest.java   |  2 +-
 .../sql/SingleDropSchemaSupportedCheckerTest.java} | 23 ++++----
 .../sql/SingleDropTableSupportedCheckerTest.java}  | 37 +++++-------
 .../SingleDatabaseBroadcastRouteEngineTest.java    | 69 ----------------------
 .../route/engine/SingleRouteEngineFactoryTest.java | 18 ------
 .../SingleStandardRouteEngineTest.java             |  3 +-
 .../SingleMetaDataValidatorFactoryTest.java        | 39 ------------
 32 files changed, 199 insertions(+), 357 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java
index b53b9b352de..f12994d2ea1 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedChecker.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.checker.SupportedSQLChecker;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.order.item.ColumnOrderByItemSegment;
@@ -60,10 +61,10 @@ public final class EncryptOrderByItemSupportedChecker 
implements SupportedSQLChe
     }
     
     @Override
-    public void check(final EncryptRule rule, final ShardingSphereSchema 
schema, final SelectStatementContext sqlStatementContext) {
+    public void check(final EncryptRule rule, final ShardingSphereDatabase 
database, final ShardingSphereSchema currentSchema, final 
SelectStatementContext sqlStatementContext) {
         for (OrderByItem each : getOrderByItems(sqlStatementContext)) {
             if (each.getSegment() instanceof ColumnOrderByItemSegment) {
-                checkColumnOrderByItem(rule, schema, sqlStatementContext, 
((ColumnOrderByItemSegment) each.getSegment()).getColumn());
+                checkColumnOrderByItem(rule, currentSchema, 
sqlStatementContext, ((ColumnOrderByItemSegment) 
each.getSegment()).getColumn());
             }
         }
     }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java
index 73e9fbfc242..9938819dc23 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedChecker.java
@@ -30,13 +30,14 @@ import 
org.apache.shardingsphere.infra.binder.context.type.WhereAvailable;
 import org.apache.shardingsphere.infra.checker.SupportedSQLChecker;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.column.ColumnSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.BinaryOperationExpression;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.AndPredicate;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.predicate.WhereSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.extractor.ExpressionExtractor;
 
 import java.util.Collection;
 import java.util.Map;
@@ -54,12 +55,12 @@ public final class EncryptPredicateColumnSupportedChecker 
implements SupportedSQ
     }
     
     @Override
-    public void check(final EncryptRule rule, final ShardingSphereSchema 
schema, final SQLStatementContext sqlStatementContext) {
+    public void check(final EncryptRule rule, final ShardingSphereDatabase 
database, final ShardingSphereSchema currentSchema, final SQLStatementContext 
sqlStatementContext) {
         Collection<SelectStatementContext> allSubqueryContexts = 
SQLStatementContextExtractor.getAllSubqueryContexts(sqlStatementContext);
         Collection<BinaryOperationExpression> joinConditions = 
SQLStatementContextExtractor.getJoinConditions((WhereAvailable) 
sqlStatementContext, allSubqueryContexts);
         
ShardingSpherePreconditions.checkState(JoinConditionsEncryptorComparator.isSame(joinConditions,
 rule),
                 () -> new UnsupportedSQLOperationException("Can not use 
different encryptor in join condition"));
-        check(rule, schema, (WhereAvailable) sqlStatementContext);
+        check(rule, currentSchema, (WhereAvailable) sqlStatementContext);
     }
     
     private void check(final EncryptRule rule, final ShardingSphereSchema 
schema, final WhereAvailable sqlStatementContext) {
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedChecker.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedChecker.java
index 3e3208300a0..019bc6b3bb6 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedChecker.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedChecker.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
 import org.apache.shardingsphere.infra.checker.SupportedSQLChecker;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 
 /**
@@ -36,7 +37,7 @@ public final class 
EncryptInsertSelectProjectionSupportedChecker implements Supp
     }
     
     @Override
-    public void check(final EncryptRule rule, final ShardingSphereSchema 
schema, final InsertStatementContext sqlStatementContext) {
-        new EncryptSelectProjectionSupportedChecker().check(rule, schema, 
sqlStatementContext.getInsertSelectContext().getSelectStatementContext());
+    public void check(final EncryptRule rule, final ShardingSphereDatabase 
database, final ShardingSphereSchema currentSchema, final 
InsertStatementContext sqlStatementContext) {
+        new EncryptSelectProjectionSupportedChecker().check(rule, database, 
currentSchema, 
sqlStatementContext.getInsertSelectContext().getSelectStatementContext());
     }
 }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
index 03a2245507a..5cb206098d8 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedChecker.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.checker.SupportedSQLChecker;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.combine.CombineSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ProjectionSegment;
@@ -48,7 +49,7 @@ public final class EncryptSelectProjectionSupportedChecker 
implements SupportedS
     }
     
     @Override
-    public void check(final EncryptRule rule, final ShardingSphereSchema 
schema, final SelectStatementContext sqlStatementContext) {
+    public void check(final EncryptRule rule, final ShardingSphereDatabase 
database, final ShardingSphereSchema currentSchema, final 
SelectStatementContext sqlStatementContext) {
         checkSelectStatementContext(rule, sqlStatementContext);
         for (SelectStatementContext each : 
sqlStatementContext.getSubqueryContexts().values()) {
             checkSelectStatementContext(rule, each);
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java
index 229c43c0fb3..8fac0725822 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/orderby/EncryptOrderByItemSupportedCheckerTest.java
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.NullsOrderType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.OrderDirection;
@@ -95,12 +96,13 @@ class EncryptOrderByItemSupportedCheckerTest {
     @Test
     void assertCheckFailed() {
         assertThrows(UnsupportedEncryptSQLException.class,
-                () -> new 
EncryptOrderByItemSupportedChecker().check(mockEncryptRule(), 
mock(ShardingSphereSchema.class), mockSelectStatementContext("foo_tbl")));
+                () -> new 
EncryptOrderByItemSupportedChecker().check(mockEncryptRule(), 
mock(ShardingSphereDatabase.class), mock(ShardingSphereSchema.class), 
mockSelectStatementContext("foo_tbl")));
     }
     
     @Test
     void assertCheckSuccess() {
-        assertDoesNotThrow(() -> new 
EncryptOrderByItemSupportedChecker().check(mockEncryptRule(), 
mock(ShardingSphereSchema.class), mockSelectStatementContext("bar_tbl")));
+        assertDoesNotThrow(
+                () -> new 
EncryptOrderByItemSupportedChecker().check(mockEncryptRule(), 
mock(ShardingSphereDatabase.class), mock(ShardingSphereSchema.class), 
mockSelectStatementContext("bar_tbl")));
     }
     
     private EncryptRule mockEncryptRule() {
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
index 1c6c1e87845..0504b9a939d 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/predicate/EncryptPredicateColumnSupportedCheckerTest.java
@@ -62,7 +62,7 @@ class EncryptPredicateColumnSupportedCheckerTest {
     @Test
     void assertCheckWithDifferentEncryptorsInJoinCondition() {
         assertThrows(UnsupportedSQLOperationException.class, () -> new 
EncryptPredicateColumnSupportedChecker()
-                .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), 
null, mockSelectStatementContextWithDifferentEncryptorsInJoinCondition()));
+                .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), 
null, null, 
mockSelectStatementContextWithDifferentEncryptorsInJoinCondition()));
     }
     
     private SQLStatementContext 
mockSelectStatementContextWithDifferentEncryptorsInJoinCondition() {
@@ -80,7 +80,7 @@ class EncryptPredicateColumnSupportedCheckerTest {
     @Test
     void assertCheckWithNotMatchedLikeQueryEncryptor() {
         assertThrows(MissingMatchedEncryptQueryAlgorithmException.class, () -> 
new EncryptPredicateColumnSupportedChecker()
-                .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), 
null, mockSelectStatementContextWithLike()));
+                .check(EncryptGeneratorFixtureBuilder.createEncryptRule(), 
null, null, mockSelectStatementContextWithLike()));
     }
     
     private SQLStatementContext mockSelectStatementContextWithLike() {
@@ -98,7 +98,7 @@ class EncryptPredicateColumnSupportedCheckerTest {
     
     @Test
     void assertCheckSuccess() {
-        assertDoesNotThrow(() -> new 
EncryptPredicateColumnSupportedChecker().check(EncryptGeneratorFixtureBuilder.createEncryptRule(),
 null, mockSelectStatementContextWithEqual()));
+        assertDoesNotThrow(() -> new 
EncryptPredicateColumnSupportedChecker().check(EncryptGeneratorFixtureBuilder.createEncryptRule(),
 null, null, mockSelectStatementContextWithEqual()));
     }
     
     private SQLStatementContext mockSelectStatementContextWithEqual() {
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedCheckerTest.java
index b83eaad74f3..062f5094936 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptInsertSelectProjectionSupportedCheckerTest.java
@@ -21,6 +21,7 @@ import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.values.InsertSelectContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.InsertStatementContext;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.junit.jupiter.api.Test;
 
@@ -55,6 +56,7 @@ class EncryptInsertSelectProjectionSupportedCheckerTest {
     @Test
     void assertCheckSuccess() {
         assertDoesNotThrow(
-                () -> new 
EncryptInsertSelectProjectionSupportedChecker().check(mock(EncryptRule.class), 
mock(ShardingSphereSchema.class), mock(InsertStatementContext.class, 
RETURNS_DEEP_STUBS)));
+                () -> new 
EncryptInsertSelectProjectionSupportedChecker().check(mock(EncryptRule.class), 
mock(ShardingSphereDatabase.class), mock(ShardingSphereSchema.class),
+                        mock(InsertStatementContext.class, 
RETURNS_DEEP_STUBS)));
     }
 }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
index 10157dd52c5..023781df499 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
@@ -70,19 +70,19 @@ class EncryptSelectProjectionSupportedCheckerTest {
         SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.containsTableSubquery()).thenReturn(true);
         
when(sqlStatementContext.getSqlStatement().getProjections().getProjections()).thenReturn(Collections.singleton(new
 ShorthandProjectionSegment(0, 0)));
-        assertThrows(UnsupportedSQLOperationException.class, () -> new 
EncryptSelectProjectionSupportedChecker().check(mock(EncryptRule.class, 
RETURNS_DEEP_STUBS), null, sqlStatementContext));
+        assertThrows(UnsupportedSQLOperationException.class, () -> new 
EncryptSelectProjectionSupportedChecker().check(mock(EncryptRule.class, 
RETURNS_DEEP_STUBS), null, null, sqlStatementContext));
     }
     
     @Test
     void assertCheckWhenCombineStatementContainsEncryptColumn() {
         SelectStatementContext sqlStatementContext = 
mockSelectStatementContext();
-        assertThrows(UnsupportedSQLOperationException.class, () -> new 
EncryptSelectProjectionSupportedChecker().check(mock(EncryptRule.class, 
RETURNS_DEEP_STUBS), null, sqlStatementContext));
+        assertThrows(UnsupportedSQLOperationException.class, () -> new 
EncryptSelectProjectionSupportedChecker().check(mock(EncryptRule.class, 
RETURNS_DEEP_STUBS), null, null, sqlStatementContext));
     }
     
     @Test
     void assertCheckSuccess() {
         SelectStatementContext sqlStatementContext = 
mockSelectStatementContext();
-        assertDoesNotThrow(() -> new 
EncryptSelectProjectionSupportedChecker().check(mockEncryptRule(), null, 
sqlStatementContext));
+        assertDoesNotThrow(() -> new 
EncryptSelectProjectionSupportedChecker().check(mockEncryptRule(), null, null, 
sqlStatementContext));
     }
     
     private SelectStatementContext mockSelectStatementContext() {
diff --git 
a/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLCheckEngine.java
 
b/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLCheckEngine.java
index da53593db4e..dd562faae12 100644
--- 
a/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLCheckEngine.java
+++ 
b/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLCheckEngine.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.checker;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
@@ -38,23 +39,22 @@ public final class SupportedSQLCheckEngine {
      *
      * @param rules rules
      * @param sqlStatementContext to be checked SQL statement context
-     * @param schemas schemas
-     * @param databaseName database name
+     * @param database database
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
-    public void checkSQL(final Collection<ShardingSphereRule> rules, final 
SQLStatementContext sqlStatementContext, final Map<String, 
ShardingSphereSchema> schemas, final String databaseName) {
-        ShardingSphereSchema schema = getSchema(sqlStatementContext, schemas, 
databaseName);
+    public void checkSQL(final Collection<ShardingSphereRule> rules, final 
SQLStatementContext sqlStatementContext, final ShardingSphereDatabase database) 
{
+        ShardingSphereSchema currentSchema = 
getCurrentSchema(sqlStatementContext, database.getSchemas(), 
database.getName());
         for (Entry<ShardingSphereRule, SupportedSQLCheckersBuilder> entry : 
OrderedSPILoader.getServices(SupportedSQLCheckersBuilder.class, 
rules).entrySet()) {
             Collection<SupportedSQLChecker> checkers = 
entry.getValue().getSupportedSQLCheckers();
             for (SupportedSQLChecker each : checkers) {
                 if (each.isCheck(sqlStatementContext)) {
-                    each.check(entry.getKey(), schema, sqlStatementContext);
+                    each.check(entry.getKey(), database, currentSchema, 
sqlStatementContext);
                 }
             }
         }
     }
     
-    private ShardingSphereSchema getSchema(final SQLStatementContext 
sqlStatementContext, final Map<String, ShardingSphereSchema> schemas, final 
String databaseName) {
+    private ShardingSphereSchema getCurrentSchema(final SQLStatementContext 
sqlStatementContext, final Map<String, ShardingSphereSchema> schemas, final 
String databaseName) {
         ShardingSphereSchema defaultSchema = schemas.get(new 
DatabaseTypeRegistry(sqlStatementContext.getDatabaseType()).getDefaultSchemaName(databaseName));
         return sqlStatementContext instanceof TableAvailable ? 
((TableAvailable) 
sqlStatementContext).getTablesContext().getSchemaName().map(schemas::get).orElse(defaultSchema)
 : defaultSchema;
     }
diff --git 
a/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLChecker.java
 
b/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLChecker.java
index 438d65c2801..c3c0a6cf6e5 100644
--- 
a/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLChecker.java
+++ 
b/infra/checker/src/main/java/org/apache/shardingsphere/infra/checker/SupportedSQLChecker.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.infra.checker;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
@@ -41,8 +42,9 @@ public interface SupportedSQLChecker<T extends 
SQLStatementContext, R extends Sh
      * Check SQL.
      *
      * @param rule rule
-     * @param schema schema
+     * @param database database
+     * @param currentSchema current schema
      * @param sqlStatementContext to be checked SQL statement context
      */
-    void check(R rule, ShardingSphereSchema schema, T sqlStatementContext);
+    void check(R rule, ShardingSphereDatabase database, ShardingSphereSchema 
currentSchema, T sqlStatementContext);
 }
diff --git 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/kernel/KernelProcessor.java
 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/kernel/KernelProcessor.java
index 3880067d6f0..46b4d24771a 100644
--- 
a/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/kernel/KernelProcessor.java
+++ 
b/infra/context/src/main/java/org/apache/shardingsphere/infra/connection/kernel/KernelProcessor.java
@@ -57,7 +57,7 @@ public final class KernelProcessor {
     
     private void check(final QueryContext queryContext) {
         ShardingSphereDatabase database = queryContext.getUsedDatabase();
-        new 
SupportedSQLCheckEngine().checkSQL(database.getRuleMetaData().getRules(), 
queryContext.getSqlStatementContext(), database.getSchemas(), 
database.getName());
+        new 
SupportedSQLCheckEngine().checkSQL(database.getRuleMetaData().getRules(), 
queryContext.getSqlStatementContext(), database);
     }
     
     private RouteContext route(final QueryContext queryContext, final 
RuleMetaData globalRuleMetaData, final ConfigurationProperties props) {
diff --git 
a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
 
b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
index ddac7f3d707..3123ef1e68e 100644
--- 
a/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
+++ 
b/infra/route/src/main/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactory.java
@@ -39,11 +39,14 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowDat
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowTableStatusStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.ShowTablesStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterFunctionStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterTablespaceStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateFunctionStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTablespaceStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropFunctionStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTablespaceStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement;
 
@@ -97,13 +100,20 @@ public final class TablelessRouteEngineFactory {
             return getCursorRouteEngine(sqlStatementContext);
         }
         SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
-        boolean functionStatement = sqlStatement instanceof 
CreateFunctionStatement || sqlStatement instanceof AlterFunctionStatement || 
sqlStatement instanceof DropFunctionStatement;
-        if (functionStatement) {
+        if (isFunctionDDLStatement(sqlStatement) || 
isSchemaDDLStatement(sqlStatement)) {
             return new DataSourceBroadcastRouteEngine();
         }
         return new IgnoreRouteEngine();
     }
     
+    private static boolean isFunctionDDLStatement(final SQLStatement 
sqlStatement) {
+        return sqlStatement instanceof CreateFunctionStatement || sqlStatement 
instanceof AlterFunctionStatement || sqlStatement instanceof 
DropFunctionStatement;
+    }
+    
+    private static boolean isSchemaDDLStatement(final SQLStatement 
sqlStatement) {
+        return sqlStatement instanceof CreateSchemaStatement || sqlStatement 
instanceof AlterSchemaStatement || sqlStatement instanceof DropSchemaStatement;
+    }
+    
     private static TablelessRouteEngine getCursorRouteEngine(final 
SQLStatementContext sqlStatementContext) {
         if (sqlStatementContext instanceof CloseStatementContext && 
((CloseStatementContext) sqlStatementContext).getSqlStatement().isCloseAll()) {
             return new DataSourceBroadcastRouteEngine();
diff --git 
a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
 
b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
index 8bc50eb1390..e6eae87c041 100644
--- 
a/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
+++ 
b/infra/route/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/TablelessRouteEngineFactoryTest.java
@@ -31,6 +31,9 @@ import 
org.apache.shardingsphere.infra.route.engine.tableless.type.broadcast.Ins
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterSchemaStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateSchemaStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLCreateResourceGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLSetResourceGroupStatement;
@@ -149,4 +152,28 @@ class TablelessRouteEngineFactoryTest {
         TablelessRouteEngine actual = 
TablelessRouteEngineFactory.newInstance(queryContext);
         assertThat(actual, instanceOf(DataSourceBroadcastRouteEngine.class));
     }
+    
+    @Test
+    void assertNewInstanceForCreateSchemaStatement() {
+        QueryContext queryContext = mock(QueryContext.class, 
RETURNS_DEEP_STUBS);
+        
when(queryContext.getSqlStatementContext().getSqlStatement()).thenReturn(mock(CreateSchemaStatement.class));
+        TablelessRouteEngine actual = 
TablelessRouteEngineFactory.newInstance(queryContext);
+        assertThat(actual, instanceOf(DataSourceBroadcastRouteEngine.class));
+    }
+    
+    @Test
+    void assertNewInstanceForAlterSchemaStatement() {
+        QueryContext queryContext = mock(QueryContext.class, 
RETURNS_DEEP_STUBS);
+        
when(queryContext.getSqlStatementContext().getSqlStatement()).thenReturn(mock(AlterSchemaStatement.class));
+        TablelessRouteEngine actual = 
TablelessRouteEngineFactory.newInstance(queryContext);
+        assertThat(actual, instanceOf(DataSourceBroadcastRouteEngine.class));
+    }
+    
+    @Test
+    void assertNewInstanceForDropSchemaStatement() {
+        QueryContext queryContext = mock(QueryContext.class, 
RETURNS_DEEP_STUBS);
+        
when(queryContext.getSqlStatementContext().getSqlStatement()).thenReturn(mock(DropSchemaStatement.class));
+        TablelessRouteEngine actual = 
TablelessRouteEngineFactory.newInstance(queryContext);
+        assertThat(actual, instanceOf(DataSourceBroadcastRouteEngine.class));
+    }
 }
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/SingleRuleConfigurationEmptyChecker.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/config/SingleRuleConfigurationEmptyChecker.java
similarity index 96%
rename from 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/SingleRuleConfigurationEmptyChecker.java
rename to 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/config/SingleRuleConfigurationEmptyChecker.java
index 912f58d3e3f..f738a29ea21 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/SingleRuleConfigurationEmptyChecker.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/config/SingleRuleConfigurationEmptyChecker.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.checker;
+package org.apache.shardingsphere.single.checker.config;
 
 import 
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker;
 import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/SingleSupportedSQLCheckersBuilder.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/SingleSupportedSQLCheckersBuilder.java
new file mode 100644
index 00000000000..fde27a63f1b
--- /dev/null
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/SingleSupportedSQLCheckersBuilder.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.single.checker.sql;
+
+import org.apache.shardingsphere.infra.checker.SupportedSQLChecker;
+import org.apache.shardingsphere.infra.checker.SupportedSQLCheckersBuilder;
+import 
org.apache.shardingsphere.single.checker.sql.schema.SingleDropSchemaSupportedChecker;
+import 
org.apache.shardingsphere.single.checker.sql.table.SingleDropTableSupportedChecker;
+import org.apache.shardingsphere.single.constant.SingleOrder;
+import org.apache.shardingsphere.single.rule.SingleRule;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+/**
+ * Single SQL supported checker factory.
+ */
+public final class SingleSupportedSQLCheckersBuilder implements 
SupportedSQLCheckersBuilder<SingleRule> {
+    
+    @Override
+    public Collection<SupportedSQLChecker<?, SingleRule>> 
getSupportedSQLCheckers() {
+        return Arrays.asList(
+                new SingleDropSchemaSupportedChecker(),
+                new SingleDropTableSupportedChecker());
+    }
+    
+    @Override
+    public int getOrder() {
+        return SingleOrder.ORDER;
+    }
+    
+    @Override
+    public Class<SingleRule> getTypeClass() {
+        return SingleRule.class;
+    }
+}
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidator.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/schema/SingleDropSchemaSupportedChecker.java
similarity index 74%
rename from 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidator.java
rename to 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/schema/SingleDropSchemaSupportedChecker.java
index 291a8db8875..13f5e62bdc0 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidator.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/schema/SingleDropSchemaSupportedChecker.java
@@ -15,26 +15,33 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.route.validator.ddl;
+package org.apache.shardingsphere.single.checker.sql.schema;
 
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.checker.SupportedSQLChecker;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.single.exception.DropNotEmptySchemaException;
-import 
org.apache.shardingsphere.single.route.validator.SingleMetaDataValidator;
 import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 /**
- * Single drop schema meta data validator.
+ * Drop schema supported checker for single.
  */
-public final class SingleDropSchemaMetaDataValidator implements 
SingleMetaDataValidator {
+@HighFrequencyInvocation
+public final class SingleDropSchemaSupportedChecker implements 
SupportedSQLChecker<SQLStatementContext, SingleRule> {
     
     @Override
-    public void validate(final SingleRule rule, final SQLStatementContext 
sqlStatementContext, final ShardingSphereDatabase database) {
+    public boolean isCheck(final SQLStatementContext sqlStatementContext) {
+        return sqlStatementContext.getSqlStatement() instanceof 
DropSchemaStatement;
+    }
+    
+    @Override
+    public void check(final SingleRule rule, final ShardingSphereDatabase 
database, final ShardingSphereSchema currentSchema, final SQLStatementContext 
sqlStatementContext) {
         DropSchemaStatement dropSchemaStatement = (DropSchemaStatement) 
sqlStatementContext.getSqlStatement();
         boolean containsCascade = dropSchemaStatement.isContainsCascade();
         for (IdentifierValue each : dropSchemaStatement.getSchemaNames()) {
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropTableValidator.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/table/SingleDropTableSupportedChecker.java
similarity index 62%
rename from 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropTableValidator.java
rename to 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/table/SingleDropTableSupportedChecker.java
index 8bf723dce75..1abf65ba2eb 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropTableValidator.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/checker/sql/table/SingleDropTableSupportedChecker.java
@@ -15,22 +15,30 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.route.validator.ddl;
+package org.apache.shardingsphere.single.checker.sql.table;
 
+import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.checker.SupportedSQLChecker;
 import 
org.apache.shardingsphere.infra.exception.kernel.syntax.UnsupportedDropCascadeTableException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.single.route.validator.SingleMetaDataValidator;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement;
 
 /**
- * Single drop table validator.
+ * Drop table supported checker for single.
  */
-public final class SingleDropTableValidator implements SingleMetaDataValidator 
{
+@HighFrequencyInvocation
+public final class SingleDropTableSupportedChecker implements 
SupportedSQLChecker<SQLStatementContext, SingleRule> {
     
     @Override
-    public void validate(final SingleRule rule, final SQLStatementContext 
sqlStatementContext, final ShardingSphereDatabase database) {
+    public boolean isCheck(final SQLStatementContext sqlStatementContext) {
+        return sqlStatementContext.getSqlStatement() instanceof 
DropTableStatement;
+    }
+    
+    @Override
+    public void check(final SingleRule rule, final ShardingSphereDatabase 
database, final ShardingSphereSchema currentSchema, final SQLStatementContext 
sqlStatementContext) {
         if (((DropTableStatement) 
sqlStatementContext.getSqlStatement()).isContainsCascade()) {
             throw new UnsupportedDropCascadeTableException();
         }
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
index f278ff34854..e7fd34700a0 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/SingleSQLRouter.java
@@ -33,7 +33,6 @@ import 
org.apache.shardingsphere.infra.route.type.TableSQLRouter;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.single.constant.SingleOrder;
 import org.apache.shardingsphere.single.route.engine.SingleRouteEngineFactory;
-import 
org.apache.shardingsphere.single.route.validator.SingleMetaDataValidatorFactory;
 import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
 
@@ -54,24 +53,18 @@ public final class SingleSQLRouter implements 
EntranceSQLRouter<SingleRule>, Dec
             return createSingleDataSourceRouteContext(rule, database, 
queryContext);
         }
         RouteContext result = new RouteContext();
-        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
-        
SingleMetaDataValidatorFactory.newInstance(sqlStatementContext.getSqlStatement()).ifPresent(optional
 -> optional.validate(rule, sqlStatementContext, database));
-        Collection<QualifiedTable> singleTables = getSingleTables(database, 
rule, result, sqlStatementContext);
-        SingleRouteEngineFactory.newInstance(singleTables, 
sqlStatementContext.getSqlStatement(), 
queryContext.getHintValueContext()).ifPresent(optional -> 
optional.route(result, rule));
+        Collection<QualifiedTable> singleTables = getSingleTables(database, 
rule, result, queryContext.getSqlStatementContext());
+        SingleRouteEngineFactory.newInstance(singleTables, 
queryContext.getSqlStatementContext().getSqlStatement(), 
queryContext.getHintValueContext())
+                .ifPresent(optional -> optional.route(result, rule));
         return result;
     }
     
-    private Collection<QualifiedTable> getSingleTables(final 
ShardingSphereDatabase database, final SingleRule rule, final RouteContext 
routeContext, final SQLStatementContext sqlStatementContext) {
-        Collection<QualifiedTable> qualifiedTables = 
rule.getQualifiedTables(sqlStatementContext, database);
-        return routeContext.getRouteUnits().isEmpty() && 
sqlStatementContext.getSqlStatement() instanceof CreateTableStatement ? 
qualifiedTables : rule.getSingleTables(qualifiedTables);
-    }
-    
     @Override
     public void decorateRouteContext(final RouteContext routeContext, final 
QueryContext queryContext, final ShardingSphereDatabase database,
                                      final SingleRule rule, final 
Collection<String> tableNames, final ConfigurationProperties props) {
-        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
-        Collection<QualifiedTable> singleTables = getSingleTables(database, 
rule, routeContext, sqlStatementContext);
-        SingleRouteEngineFactory.newInstance(singleTables, 
sqlStatementContext.getSqlStatement(), 
queryContext.getHintValueContext()).ifPresent(optional -> 
optional.route(routeContext, rule));
+        Collection<QualifiedTable> singleTables = getSingleTables(database, 
rule, routeContext, queryContext.getSqlStatementContext());
+        SingleRouteEngineFactory.newInstance(singleTables, 
queryContext.getSqlStatementContext().getSqlStatement(), 
queryContext.getHintValueContext())
+                .ifPresent(optional -> optional.route(routeContext, rule));
     }
     
     private RouteContext createSingleDataSourceRouteContext(final SingleRule 
rule, final ShardingSphereDatabase database, final QueryContext queryContext) {
@@ -93,6 +86,11 @@ public final class SingleSQLRouter implements 
EntranceSQLRouter<SingleRule>, Dec
         return result;
     }
     
+    private Collection<QualifiedTable> getSingleTables(final 
ShardingSphereDatabase database, final SingleRule rule, final RouteContext 
routeContext, final SQLStatementContext sqlStatementContext) {
+        Collection<QualifiedTable> qualifiedTables = 
rule.getQualifiedTables(sqlStatementContext, database);
+        return routeContext.getRouteUnits().isEmpty() && 
sqlStatementContext.getSqlStatement() instanceof CreateTableStatement ? 
qualifiedTables : rule.getSingleTables(qualifiedTables);
+    }
+    
     @Override
     public int getOrder() {
         return SingleOrder.ORDER;
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleDatabaseBroadcastRouteEngine.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleDatabaseBroadcastRouteEngine.java
deleted file mode 100644
index 6df1e847cea..00000000000
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleDatabaseBroadcastRouteEngine.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.single.route.engine;
-
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteMapper;
-import org.apache.shardingsphere.infra.route.context.RouteUnit;
-import org.apache.shardingsphere.single.rule.SingleRule;
-
-import java.util.Collections;
-
-/**
- * Single databases broadcast route engine.
- */
-public final class SingleDatabaseBroadcastRouteEngine implements 
SingleRouteEngine {
-    
-    @Override
-    public void route(final RouteContext routeContext, final SingleRule 
singleRule) {
-        for (String each : singleRule.getDataSourceNames()) {
-            routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper(each, each), Collections.emptyList()));
-        }
-    }
-}
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactory.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactory.java
index b230ac6010c..cb8dd5bc3b5 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactory.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactory.java
@@ -21,10 +21,8 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
+import 
org.apache.shardingsphere.single.route.engine.standard.SingleStandardRouteEngine;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterSchemaStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateSchemaStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
 
 import java.util.Collection;
 import java.util.Optional;
@@ -44,17 +42,6 @@ public final class SingleRouteEngineFactory {
      * @return created instance
      */
     public static Optional<SingleRouteEngine> newInstance(final 
Collection<QualifiedTable> singleTables, final SQLStatement sqlStatement, final 
HintValueContext hintValueContext) {
-        if (!singleTables.isEmpty()) {
-            return Optional.of(new SingleStandardRouteEngine(singleTables, 
sqlStatement, hintValueContext));
-        }
-        // TODO move this logic to common route logic
-        if (isSchemaDDLStatement(sqlStatement)) {
-            return Optional.of(new SingleDatabaseBroadcastRouteEngine());
-        }
-        return Optional.empty();
-    }
-    
-    private static boolean isSchemaDDLStatement(final SQLStatement 
sqlStatement) {
-        return sqlStatement instanceof CreateSchemaStatement || sqlStatement 
instanceof AlterSchemaStatement || sqlStatement instanceof DropSchemaStatement;
+        return singleTables.isEmpty() ? Optional.empty() : Optional.of(new 
SingleStandardRouteEngine(singleTables, sqlStatement, hintValueContext));
     }
 }
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngine.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/standard/SingleStandardRouteEngine.java
similarity index 98%
rename from 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngine.java
rename to 
kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/standard/SingleStandardRouteEngine.java
index e8026039b81..02ea6cfef44 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngine.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/standard/SingleStandardRouteEngine.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.route.engine;
+package org.apache.shardingsphere.single.route.engine.standard;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.datanode.DataNode;
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.infra.route.context.RouteMapper;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
 import org.apache.shardingsphere.single.exception.SingleTableNotFoundException;
+import org.apache.shardingsphere.single.route.engine.SingleRouteEngine;
 import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidator.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidator.java
deleted file mode 100644
index aa3a3fed348..00000000000
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.single.route.validator;
-
-import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.single.rule.SingleRule;
-
-/**
- * Single meta data validator.
- */
-public interface SingleMetaDataValidator {
-    
-    /**
-     * Validate single table meta data.
-     *
-     * @param rule single rule
-     * @param sqlStatementContext SQL statement context
-     * @param database database
-     */
-    void validate(SingleRule rule, SQLStatementContext sqlStatementContext, 
ShardingSphereDatabase database);
-}
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidatorFactory.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidatorFactory.java
deleted file mode 100644
index 9d8c0d336b4..00000000000
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidatorFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.single.route.validator;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import 
org.apache.shardingsphere.single.route.validator.ddl.SingleDropSchemaMetaDataValidator;
-import 
org.apache.shardingsphere.single.route.validator.ddl.SingleDropTableValidator;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTableStatement;
-
-import java.util.Optional;
-
-/**
- * Single meta data validator factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class SingleMetaDataValidatorFactory {
-    
-    /**
-     * New instance of single meta data validator.
-     *
-     * @param sqlStatement SQL statement
-     * @return created instance
-     */
-    public static Optional<SingleMetaDataValidator> newInstance(final 
SQLStatement sqlStatement) {
-        if (sqlStatement instanceof DropSchemaStatement) {
-            return Optional.of(new SingleDropSchemaMetaDataValidator());
-        }
-        if (sqlStatement instanceof DropTableStatement) {
-            return Optional.of(new SingleDropTableValidator());
-        }
-        return Optional.empty();
-    }
-}
diff --git 
a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker
 
b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.checker.SupportedSQLCheckersBuilder
similarity index 90%
copy from 
kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker
copy to 
kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.checker.SupportedSQLCheckersBuilder
index 4a0c35b255e..ab0224ef84c 100644
--- 
a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker
+++ 
b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.checker.SupportedSQLCheckersBuilder
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.single.checker.SingleRuleConfigurationEmptyChecker
+org.apache.shardingsphere.single.checker.sql.SingleSupportedSQLCheckersBuilder
diff --git 
a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker
 
b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker
index 4a0c35b255e..d22cfbeb1cd 100644
--- 
a/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker
+++ 
b/kernel/single/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-org.apache.shardingsphere.single.checker.SingleRuleConfigurationEmptyChecker
+org.apache.shardingsphere.single.checker.config.SingleRuleConfigurationEmptyChecker
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/SingleRuleConfigurationEmptyCheckerTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/config/SingleRuleConfigurationEmptyCheckerTest.java
similarity index 97%
rename from 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/SingleRuleConfigurationEmptyCheckerTest.java
rename to 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/config/SingleRuleConfigurationEmptyCheckerTest.java
index a1c087b23a3..b37f4dfc6f0 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/SingleRuleConfigurationEmptyCheckerTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/config/SingleRuleConfigurationEmptyCheckerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.checker;
+package org.apache.shardingsphere.single.checker.config;
 
 import 
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurationEmptyChecker;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidatorTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropSchemaSupportedCheckerTest.java
similarity index 76%
copy from 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidatorTest.java
copy to 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropSchemaSupportedCheckerTest.java
index 94302a0efdc..950215c2da9 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidatorTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropSchemaSupportedCheckerTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.route.validator.ddl;
+package org.apache.shardingsphere.single.checker.sql;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.UnknownSQLStatementContext;
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundE
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import 
org.apache.shardingsphere.single.checker.sql.schema.SingleDropSchemaSupportedChecker;
 import org.apache.shardingsphere.single.exception.DropNotEmptySchemaException;
 import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -38,25 +39,27 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-class SingleDropSchemaMetaDataValidatorTest {
+class SingleDropSchemaSupportedCheckerTest {
     
     @Test
-    void assertValidateWithoutCascadeSchema() {
+    void assertCheckWithoutCascadeSchema() {
         assertThrows(DropNotEmptySchemaException.class,
-                () -> new 
SingleDropSchemaMetaDataValidator().validate(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), createSQLStatementContext("foo_schema", false), 
mockDatabase()));
+                () -> new 
SingleDropSchemaSupportedChecker().check(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), mockDatabase(), mock(ShardingSphereSchema.class),
+                        createSQLStatementContext("foo_schema", false)));
     }
     
     @Test
-    void assertValidateWithNotExistedSchema() {
+    void assertCheckWithNotExistedSchema() {
         ShardingSphereDatabase database = mockDatabase();
         when(database.getSchema("not_existed_schema")).thenReturn(null);
         assertThrows(SchemaNotFoundException.class,
-                () -> new 
SingleDropSchemaMetaDataValidator().validate(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), createSQLStatementContext("not_existed_schema", true), 
database));
+                () -> new 
SingleDropSchemaSupportedChecker().check(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), database, mock(ShardingSphereSchema.class),
+                        createSQLStatementContext("not_existed_schema", 
true)));
     }
     
     @Test
-    void assertValidate() {
-        new 
SingleDropSchemaMetaDataValidator().validate(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), createSQLStatementContext("foo_schema", true), 
mockDatabase());
+    void assertCheck() {
+        new SingleDropSchemaSupportedChecker().check(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), mockDatabase(), mock(ShardingSphereSchema.class), 
createSQLStatementContext("foo_schema", true));
     }
     
     private ShardingSphereDatabase mockDatabase() {
@@ -67,9 +70,9 @@ class SingleDropSchemaMetaDataValidatorTest {
         return result;
     }
     
-    private SQLStatementContext createSQLStatementContext(final String 
schemaName, final boolean isCascade) {
+    private SQLStatementContext createSQLStatementContext(final String 
schemaName, final boolean containsCascade) {
         PostgreSQLDropSchemaStatement dropSchemaStatement = 
mock(PostgreSQLDropSchemaStatement.class, RETURNS_DEEP_STUBS);
-        when(dropSchemaStatement.isContainsCascade()).thenReturn(isCascade);
+        
when(dropSchemaStatement.isContainsCascade()).thenReturn(containsCascade);
         
when(dropSchemaStatement.getSchemaNames()).thenReturn(Collections.singleton(new 
IdentifierValue(schemaName)));
         return new UnknownSQLStatementContext(dropSchemaStatement);
     }
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidatorTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropTableSupportedCheckerTest.java
similarity index 61%
rename from 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidatorTest.java
rename to 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropTableSupportedCheckerTest.java
index 94302a0efdc..07814448f7b 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/ddl/SingleDropSchemaMetaDataValidatorTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/checker/sql/SingleDropTableSupportedCheckerTest.java
@@ -15,20 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.route.validator.ddl;
+package org.apache.shardingsphere.single.checker.sql;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.UnknownSQLStatementContext;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.TableType;
-import 
org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException;
+import 
org.apache.shardingsphere.infra.exception.kernel.syntax.UnsupportedDropCascadeTableException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
-import org.apache.shardingsphere.single.exception.DropNotEmptySchemaException;
+import 
org.apache.shardingsphere.single.checker.sql.table.SingleDropTableSupportedChecker;
 import org.apache.shardingsphere.single.rule.SingleRule;
-import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
-import 
org.apache.shardingsphere.sql.parser.statement.postgresql.ddl.PostgreSQLDropSchemaStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.postgresql.ddl.PostgreSQLDropTableStatement;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
@@ -38,25 +37,18 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-class SingleDropSchemaMetaDataValidatorTest {
+class SingleDropTableSupportedCheckerTest {
     
     @Test
-    void assertValidateWithoutCascadeSchema() {
-        assertThrows(DropNotEmptySchemaException.class,
-                () -> new 
SingleDropSchemaMetaDataValidator().validate(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), createSQLStatementContext("foo_schema", false), 
mockDatabase()));
+    void assertCheckWithCascade() {
+        assertThrows(UnsupportedDropCascadeTableException.class,
+                () -> new 
SingleDropTableSupportedChecker().check(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), mockDatabase(), mock(ShardingSphereSchema.class),
+                        createSQLStatementContext(true)));
     }
     
     @Test
-    void assertValidateWithNotExistedSchema() {
-        ShardingSphereDatabase database = mockDatabase();
-        when(database.getSchema("not_existed_schema")).thenReturn(null);
-        assertThrows(SchemaNotFoundException.class,
-                () -> new 
SingleDropSchemaMetaDataValidator().validate(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), createSQLStatementContext("not_existed_schema", true), 
database));
-    }
-    
-    @Test
-    void assertValidate() {
-        new 
SingleDropSchemaMetaDataValidator().validate(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), createSQLStatementContext("foo_schema", true), 
mockDatabase());
+    void assertCheckWithoutCascade() {
+        new SingleDropTableSupportedChecker().check(mock(SingleRule.class, 
RETURNS_DEEP_STUBS), mockDatabase(), mock(ShardingSphereSchema.class), 
createSQLStatementContext(false));
     }
     
     private ShardingSphereDatabase mockDatabase() {
@@ -67,10 +59,9 @@ class SingleDropSchemaMetaDataValidatorTest {
         return result;
     }
     
-    private SQLStatementContext createSQLStatementContext(final String 
schemaName, final boolean isCascade) {
-        PostgreSQLDropSchemaStatement dropSchemaStatement = 
mock(PostgreSQLDropSchemaStatement.class, RETURNS_DEEP_STUBS);
-        when(dropSchemaStatement.isContainsCascade()).thenReturn(isCascade);
-        
when(dropSchemaStatement.getSchemaNames()).thenReturn(Collections.singleton(new 
IdentifierValue(schemaName)));
+    private SQLStatementContext createSQLStatementContext(final boolean 
containsCascade) {
+        PostgreSQLDropTableStatement dropSchemaStatement = 
mock(PostgreSQLDropTableStatement.class, RETURNS_DEEP_STUBS);
+        
when(dropSchemaStatement.isContainsCascade()).thenReturn(containsCascade);
         return new UnknownSQLStatementContext(dropSchemaStatement);
     }
 }
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleDatabaseBroadcastRouteEngineTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleDatabaseBroadcastRouteEngineTest.java
deleted file mode 100644
index 4a1552cdf67..00000000000
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleDatabaseBroadcastRouteEngineTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * 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.single.route.engine;
-
-import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
-import org.apache.shardingsphere.infra.database.h2.type.H2DatabaseType;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteUnit;
-import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
-import org.apache.shardingsphere.single.rule.SingleRule;
-import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
-import org.junit.jupiter.api.Test;
-
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-class SingleDatabaseBroadcastRouteEngineTest {
-    
-    @Test
-    void assertRoute() throws SQLException {
-        SingleRule singleRule = new SingleRule(new SingleRuleConfiguration(), 
DefaultDatabase.LOGIC_NAME, new H2DatabaseType(), createDataSourceMap(), 
Collections.emptyList());
-        RouteContext routeContext = new RouteContext();
-        SingleDatabaseBroadcastRouteEngine engine = new 
SingleDatabaseBroadcastRouteEngine();
-        engine.route(routeContext, singleRule);
-        List<RouteUnit> routeUnits = new 
ArrayList<>(routeContext.getRouteUnits());
-        assertThat(routeContext.getRouteUnits().size(), is(2));
-        assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(), 
is("ds_0"));
-        assertTrue(routeUnits.get(0).getTableMappers().isEmpty());
-        assertThat(routeUnits.get(1).getDataSourceMapper().getActualName(), 
is("ds_1"));
-        assertTrue(routeUnits.get(1).getTableMappers().isEmpty());
-    }
-    
-    private Map<String, DataSource> createDataSourceMap() throws SQLException {
-        Map<String, DataSource> result = new LinkedHashMap<>(2, 1F);
-        Connection connection = mock(Connection.class, RETURNS_DEEP_STUBS);
-        when(connection.getMetaData().getURL()).thenReturn("jdbc:h2:mem:db");
-        result.put("ds_0", new MockedDataSource(connection));
-        result.put("ds_1", new MockedDataSource(connection));
-        return result;
-    }
-}
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactoryTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactoryTest.java
index c04b8448c1a..d81bb51ccf9 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactoryTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactoryTest.java
@@ -20,9 +20,6 @@ package org.apache.shardingsphere.single.route.engine;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterSchemaStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateSchemaStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
 import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
@@ -38,21 +35,6 @@ class SingleRouteEngineFactoryTest {
         
assertTrue(SingleRouteEngineFactory.newInstance(Collections.singleton(new 
QualifiedTable("demo_ds", "t_order")), mock(SQLStatement.class), 
mock(HintValueContext.class)).isPresent());
     }
     
-    @Test
-    void assertNewInstanceWithEmptySingleTableNameAndCreateSchemaStatement() {
-        
assertTrue(SingleRouteEngineFactory.newInstance(Collections.emptyList(), 
mock(CreateSchemaStatement.class), mock(HintValueContext.class)).isPresent());
-    }
-    
-    @Test
-    void assertNewInstanceWithEmptySingleTableNameAndAlterSchemaStatement() {
-        
assertTrue(SingleRouteEngineFactory.newInstance(Collections.emptyList(), 
mock(AlterSchemaStatement.class), mock(HintValueContext.class)).isPresent());
-    }
-    
-    @Test
-    void assertNewInstanceWithEmptySingleTableNameAndDropSchemaStatement() {
-        
assertTrue(SingleRouteEngineFactory.newInstance(Collections.emptyList(), 
mock(DropSchemaStatement.class), mock(HintValueContext.class)).isPresent());
-    }
-    
     @Test
     void assertNewInstanceWithEmptySingleTableNameAndOtherStatement() {
         
assertFalse(SingleRouteEngineFactory.newInstance(Collections.emptyList(), 
mock(SQLStatement.class), mock(HintValueContext.class)).isPresent());
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngineTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleStandardRouteEngineTest.java
similarity index 98%
rename from 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngineTest.java
rename to 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleStandardRouteEngineTest.java
index c7d5669859c..4f52e8efe31 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleStandardRouteEngineTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleStandardRouteEngineTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.single.route.engine;
+package org.apache.shardingsphere.single.route.engine.engine;
 
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.TableExistsException;
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRu
 import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
 import org.apache.shardingsphere.single.config.SingleRuleConfiguration;
+import 
org.apache.shardingsphere.single.route.engine.standard.SingleStandardRouteEngine;
 import org.apache.shardingsphere.single.rule.SingleRule;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidatorFactoryTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidatorFactoryTest.java
deleted file mode 100644
index 7d88ed996ff..00000000000
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/validator/SingleMetaDataValidatorFactoryTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.single.route.validator;
-
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropSchemaStatement;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-
-class SingleMetaDataValidatorFactoryTest {
-    
-    @Test
-    void assertNewInstanceForDropSchemaStatement() {
-        
assertTrue(SingleMetaDataValidatorFactory.newInstance(mock(DropSchemaStatement.class)).isPresent());
-    }
-    
-    @Test
-    void assertNewInstanceForNotDropSchemaStatement() {
-        
assertFalse(SingleMetaDataValidatorFactory.newInstance(mock(SQLStatement.class)).isPresent());
-    }
-}

Reply via email to