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 01dfad96dc0 Adjust single, encrypt and broadcast order and simply 
broadcast sql router (#33839)
01dfad96dc0 is described below

commit 01dfad96dc07f93462183edbe837ab72453bc6e9
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Fri Nov 29 18:22:12 2024 +0800

    Adjust single, encrypt and broadcast order and simply broadcast sql router 
(#33839)
    
    * Adjust single, encrypt and broadcast order and simply broadcast sql router
    
    * revert some dev config
    
    * fix unit test
    
    * fix unit test
    
    * modify e2e case
---
 .../broadcast/constant/BroadcastOrder.java         |   2 +-
 .../broadcast/route/BroadcastSQLRouter.java        | 130 ++------------------
 .../route/engine/BroadcastRouteEngineFactory.java  |  71 +++--------
 .../route/engine/type/BroadcastRouteEngine.java    |   3 +-
 .../BroadcastDatabaseBroadcastRouteEngine.java     |   7 +-
 .../BroadcastInstanceBroadcastRouteEngine.java     |  50 --------
 .../BroadcastTableBroadcastRouteEngine.java        |   9 +-
 .../type/ignore/BroadcastIgnoreRouteEngine.java    |  33 -----
 .../type/unicast/BroadcastUnicastRouteEngine.java  |   7 +-
 .../broadcast/rule/BroadcastRule.java              |  17 ++-
 .../broadcast/route/BroadcastSQLRouterTest.java    |  64 +---------
 .../engine/BroadcastRouteEngineFactoryTest.java    | 100 +++------------
 .../BroadcastDatabaseBroadcastRouteEngineTest.java |   2 +-
 .../BroadcastInstanceBroadcastRouteEngineTest.java |  52 --------
 .../BroadcastTableBroadcastRouteEngineTest.java    |   8 +-
 .../ignore/BroadcastIgnoreRouteEngineTest.java     |  35 ------
 .../unicast/BroadcastUnicastRouteEngineTest.java   |   4 +-
 .../broadcast/rule/BroadcastRuleTest.java          |   4 +-
 .../encrypt/constant/EncryptOrder.java             |   2 +-
 .../standard/assertion/ShardingRouteAssert.java    |  12 +-
 .../single/constant/SingleOrder.java               |   2 +-
 .../single/route/SingleSQLRouter.java              |  45 +++++--
 .../single/route/engine/SingleRouteEngine.java     | 111 ++++++++++++++++-
 .../route/engine/SingleRouteEngineFactory.java     |  47 -------
 .../engine/standard/SingleStandardRouteEngine.java | 136 ---------------------
 .../single/route/SingleSQLRouterTest.java          |  14 +--
 .../route/engine/SingleRouteEngineFactoryTest.java |  42 -------
 ...eEngineTest.java => SingleRouteEngineTest.java} |  18 +--
 .../resources/cases/dql/e2e-dql-select-join.xml    |  10 ++
 .../scenario/sharding/case/ddl/create-table.xml    |  21 +++-
 30 files changed, 276 insertions(+), 782 deletions(-)

diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/constant/BroadcastOrder.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/constant/BroadcastOrder.java
index 4745ee15c62..d2b240abd45 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/constant/BroadcastOrder.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/constant/BroadcastOrder.java
@@ -29,5 +29,5 @@ public final class BroadcastOrder {
     /**
      * Broadcast order.
      */
-    public static final int ORDER = 5;
+    public static final int ORDER = 15;
 }
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
index 7b44e74d57d..e9926f0b89b 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouter.java
@@ -19,148 +19,32 @@ package org.apache.shardingsphere.broadcast.route;
 
 import org.apache.shardingsphere.broadcast.constant.BroadcastOrder;
 import 
org.apache.shardingsphere.broadcast.route.engine.BroadcastRouteEngineFactory;
-import 
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastDatabaseBroadcastRouteEngine;
-import 
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastInstanceBroadcastRouteEngine;
 import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
-import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
-import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CloseStatementContext;
-import org.apache.shardingsphere.infra.binder.context.type.CursorAvailable;
-import org.apache.shardingsphere.infra.binder.context.type.IndexAvailable;
-import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 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.infra.route.type.DecorateSQLRouter;
 import org.apache.shardingsphere.infra.route.type.EntranceSQLRouter;
 import org.apache.shardingsphere.infra.route.type.TableSQLRouter;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DCLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterFunctionStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.AlterProcedureStatement;
-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.CreateProcedureStatement;
-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.DropProcedureStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DropTablespaceStatement;
-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;
 
 import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashSet;
 
 /**
  * Broadcast SQL router.
  */
 @HighFrequencyInvocation
-public final class BroadcastSQLRouter implements 
EntranceSQLRouter<BroadcastRule>, DecorateSQLRouter<BroadcastRule>, 
TableSQLRouter<BroadcastRule> {
+public final class BroadcastSQLRouter implements 
EntranceSQLRouter<BroadcastRule>, TableSQLRouter<BroadcastRule> {
     
     @Override
-    public RouteContext createRouteContext(final QueryContext queryContext, 
final RuleMetaData globalRuleMetaData,
-                                           final ShardingSphereDatabase 
database, final BroadcastRule rule, final Collection<String> tableNames, final 
ConfigurationProperties props) {
-        return BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext).route(new RouteContext(), rule);
-    }
-    
-    @Override
-    public void decorateRouteContext(final RouteContext routeContext, final 
QueryContext queryContext,
-                                     final ShardingSphereDatabase database, 
final BroadcastRule rule, final Collection<String> tableNames, final 
ConfigurationProperties props) {
-        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
-        SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
-        if (sqlStatement instanceof TCLStatement) {
-            decorateRouteContextWhenTCLStatement(routeContext, rule);
-        } else if (sqlStatement instanceof DDLStatement) {
-            decorateRouteContextWhenDDLStatement(routeContext, queryContext, 
database, rule);
-        } else if (sqlStatement instanceof DALStatement && 
isResourceGroupStatement(sqlStatement)) {
-            doInstanceBroadcastRoute(routeContext, database, rule);
-        } else if (sqlStatement instanceof DCLStatement && 
!isDCLForSingleTable(queryContext.getSqlStatementContext())) {
-            doInstanceBroadcastRoute(routeContext, database, rule);
-        }
-    }
-    
-    private void decorateRouteContextWhenTCLStatement(final RouteContext 
routeContext, final BroadcastRule rule) {
-        doDatabaseBroadcastRoute(routeContext, rule);
-    }
-    
-    private void decorateRouteContextWhenDDLStatement(final RouteContext 
routeContext, final QueryContext queryContext, final ShardingSphereDatabase 
database, final BroadcastRule rule) {
-        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
-        if (sqlStatementContext instanceof CursorAvailable) {
-            if (sqlStatementContext instanceof CloseStatementContext && 
((CloseStatementContext) sqlStatementContext).getSqlStatement().isCloseAll()) {
-                doDatabaseBroadcastRoute(routeContext, rule);
-            }
-            return;
-        }
-        if (sqlStatementContext instanceof IndexAvailable && 
!routeContext.getRouteUnits().isEmpty()) {
-            putAllBroadcastTables(routeContext, rule, sqlStatementContext);
-        }
-        SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
-        boolean functionStatement = sqlStatement instanceof 
CreateFunctionStatement || sqlStatement instanceof AlterFunctionStatement || 
sqlStatement instanceof DropFunctionStatement;
-        boolean procedureStatement = sqlStatement instanceof 
CreateProcedureStatement || sqlStatement instanceof AlterProcedureStatement || 
sqlStatement instanceof DropProcedureStatement;
-        if (functionStatement || procedureStatement) {
-            doDatabaseBroadcastRoute(routeContext, rule);
-            return;
-        }
-        // TODO BEGIN extract db route logic to common database router, eg: 
DCL in instance route @duanzhengqiang
-        if (sqlStatement instanceof CreateTablespaceStatement || sqlStatement 
instanceof AlterTablespaceStatement || sqlStatement instanceof 
DropTablespaceStatement) {
-            doInstanceBroadcastRoute(routeContext, database, rule);
+    public RouteContext createRouteContext(final QueryContext queryContext, 
final RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database,
+                                           final BroadcastRule rule, final 
Collection<String> tableNames, final ConfigurationProperties props) {
+        Collection<String> broadcastTableNames = 
rule.getBroadcastTableNames(tableNames);
+        if (broadcastTableNames.isEmpty()) {
+            return new RouteContext();
         }
-        // TODO END extract db route logic to common database router, eg: DCL 
in instance route
-        Collection<String> tableNames = sqlStatementContext instanceof 
TableAvailable ? getTableNames((TableAvailable) sqlStatementContext) : 
Collections.emptyList();
-        if (rule.isAllBroadcastTables(tableNames)) {
-            doInstanceBroadcastRoute(routeContext, database, rule);
-        }
-    }
-    
-    private Collection<String> getTableNames(final TableAvailable 
sqlStatementContext) {
-        Collection<SimpleTableSegment> tableSegments = 
sqlStatementContext.getTablesContext().getSimpleTables();
-        Collection<String> result = new LinkedHashSet<>(tableSegments.size());
-        for (SimpleTableSegment each : tableSegments) {
-            result.add(each.getTableName().getIdentifier().getValue());
-        }
-        return result;
-    }
-    
-    private void putAllBroadcastTables(final RouteContext routeContext, final 
BroadcastRule rule, final SQLStatementContext sqlStatementContext) {
-        Collection<String> tableNames = sqlStatementContext instanceof 
TableAvailable ? ((TableAvailable) 
sqlStatementContext).getTablesContext().getTableNames() : 
Collections.emptyList();
-        for (String each : rule.filterBroadcastTableNames(tableNames)) {
-            for (RouteUnit routeUnit : routeContext.getRouteUnits()) {
-                routeUnit.getTableMappers().add(new RouteMapper(each, each));
-            }
-        }
-    }
-    
-    private boolean isResourceGroupStatement(final SQLStatement sqlStatement) {
-        // TODO add dropResourceGroupStatement, alterResourceGroupStatement
-        return sqlStatement instanceof MySQLCreateResourceGroupStatement || 
sqlStatement instanceof MySQLSetResourceGroupStatement;
-    }
-    
-    private boolean isDCLForSingleTable(final SQLStatementContext 
sqlStatementContext) {
-        if (sqlStatementContext instanceof TableAvailable) {
-            TableAvailable tableSegmentsAvailable = (TableAvailable) 
sqlStatementContext;
-            return 1 == 
tableSegmentsAvailable.getTablesContext().getSimpleTables().size()
-                    && 
!"*".equals(tableSegmentsAvailable.getTablesContext().getSimpleTables().iterator().next().getTableName().getIdentifier().getValue());
-        }
-        return false;
-    }
-    
-    private void doDatabaseBroadcastRoute(final RouteContext routeContext, 
final BroadcastRule rule) {
-        routeContext.getRouteUnits().clear();
-        routeContext.getRouteUnits().addAll(new 
BroadcastDatabaseBroadcastRouteEngine().route(new RouteContext(), 
rule).getRouteUnits());
-    }
-    
-    private void doInstanceBroadcastRoute(final RouteContext routeContext, 
final ShardingSphereDatabase database, final BroadcastRule rule) {
-        routeContext.getRouteUnits().clear();
-        routeContext.getRouteUnits().addAll(new 
BroadcastInstanceBroadcastRouteEngine(database.getResourceMetaData()).route(new 
RouteContext(), rule).getRouteUnits());
+        return BroadcastRouteEngineFactory.newInstance(queryContext, 
broadcastTableNames).route(rule);
     }
     
     @Override
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactory.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactory.java
index 6237e1e0b4c..887f45e5ee6 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactory.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactory.java
@@ -22,16 +22,10 @@ import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.broadcast.route.engine.type.BroadcastRouteEngine;
 import 
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastDatabaseBroadcastRouteEngine;
 import 
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastTableBroadcastRouteEngine;
-import 
org.apache.shardingsphere.broadcast.route.engine.type.ignore.BroadcastIgnoreRouteEngine;
 import 
org.apache.shardingsphere.broadcast.route.engine.type.unicast.BroadcastUnicastRouteEngine;
-import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
-import 
org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
-import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CloseStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.CursorAvailable;
-import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 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.SQLStatement;
@@ -39,7 +33,6 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStat
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DCLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement;
 
 import java.util.Collection;
 
@@ -53,70 +46,42 @@ public final class BroadcastRouteEngineFactory {
     /**
      * Create new instance of broadcast routing engine.
      *
-     * @param rule broadcast rule
-     * @param database database
      * @param queryContext query context
+     * @param broadcastTableNames broadcast table names
      * @return broadcast route engine
      */
-    public static BroadcastRouteEngine newInstance(final BroadcastRule rule, 
final ShardingSphereDatabase database, final QueryContext queryContext) {
+    public static BroadcastRouteEngine newInstance(final QueryContext 
queryContext, final Collection<String> broadcastTableNames) {
         SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
         SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
-        if (sqlStatement instanceof TCLStatement) {
-            return new BroadcastDatabaseBroadcastRouteEngine();
-        }
         if (sqlStatement instanceof DDLStatement) {
-            return sqlStatementContext instanceof CursorAvailable
-                    ? getCursorRouteEngine(rule, sqlStatementContext, 
queryContext.getConnectionContext())
-                    : getDDLRouteEngine(rule, database, sqlStatementContext);
-        }
-        if (!(sqlStatementContext instanceof TableAvailable)) {
-            return new BroadcastIgnoreRouteEngine();
-        }
-        Collection<String> tableNames = ((TableAvailable) 
sqlStatementContext).getTablesContext().getTableNames();
-        if (tableNames.isEmpty()) {
-            return new BroadcastIgnoreRouteEngine();
+            return getDDLRouteEngine(queryContext, broadcastTableNames, 
sqlStatementContext);
         }
         if (sqlStatement instanceof DALStatement) {
-            return getDALRouteEngine(rule, tableNames);
+            return getDALRouteEngine(broadcastTableNames);
         }
         if (sqlStatement instanceof DCLStatement) {
-            return getDCLRouteEngine(rule, tableNames);
-        }
-        return getDMLRouteEngine(rule, sqlStatementContext, 
queryContext.getConnectionContext(), tableNames);
-    }
-    
-    private static BroadcastRouteEngine getCursorRouteEngine(final 
BroadcastRule rule, final SQLStatementContext sqlStatementContext, final 
ConnectionContext connectionContext) {
-        if (sqlStatementContext instanceof CloseStatementContext && 
((CloseStatementContext) sqlStatementContext).getSqlStatement().isCloseAll()) {
-            return new BroadcastDatabaseBroadcastRouteEngine();
+            return getDCLRouteEngine(broadcastTableNames);
         }
-        if (sqlStatementContext instanceof TableAvailable) {
-            Collection<String> tableNames = ((TableAvailable) 
sqlStatementContext).getTablesContext().getTableNames();
-            return rule.isAllBroadcastTables(tableNames) ? new 
BroadcastUnicastRouteEngine(sqlStatementContext, tableNames, connectionContext) 
: new BroadcastIgnoreRouteEngine();
-        }
-        return new BroadcastIgnoreRouteEngine();
+        return getDMLRouteEngine(sqlStatementContext, 
queryContext.getConnectionContext(), broadcastTableNames);
     }
     
-    private static BroadcastRouteEngine getDDLRouteEngine(final BroadcastRule 
rule, final ShardingSphereDatabase database, final SQLStatementContext 
sqlStatementContext) {
-        Collection<String> tableNames = 
SQLStatementContextExtractor.getTableNames(database, sqlStatementContext);
-        return rule.isAllBroadcastTables(tableNames) ? new 
BroadcastTableBroadcastRouteEngine(tableNames) : new 
BroadcastIgnoreRouteEngine();
+    private static BroadcastRouteEngine getDDLRouteEngine(final QueryContext 
queryContext, final Collection<String> broadcastTableNames, final 
SQLStatementContext sqlStatementContext) {
+        return sqlStatementContext instanceof CursorAvailable
+                ? new BroadcastUnicastRouteEngine(sqlStatementContext, 
broadcastTableNames, queryContext.getConnectionContext())
+                : new BroadcastTableBroadcastRouteEngine(broadcastTableNames);
     }
     
-    private static BroadcastRouteEngine getDALRouteEngine(final BroadcastRule 
rule, final Collection<String> tableNames) {
-        return new 
BroadcastTableBroadcastRouteEngine(rule.filterBroadcastTableNames(tableNames));
+    private static BroadcastRouteEngine getDALRouteEngine(final 
Collection<String> broadcastTableNames) {
+        return new BroadcastTableBroadcastRouteEngine(broadcastTableNames);
     }
     
-    private static BroadcastRouteEngine getDCLRouteEngine(final BroadcastRule 
rule, final Collection<String> tableNames) {
-        Collection<String> broadcastTableNames = 
rule.filterBroadcastTableNames(tableNames);
-        return broadcastTableNames.isEmpty() ? new 
BroadcastIgnoreRouteEngine() : new 
BroadcastTableBroadcastRouteEngine(broadcastTableNames);
+    private static BroadcastRouteEngine getDCLRouteEngine(final 
Collection<String> broadcastTableNames) {
+        return new BroadcastTableBroadcastRouteEngine(broadcastTableNames);
     }
     
-    private static BroadcastRouteEngine getDMLRouteEngine(final BroadcastRule 
rule, final SQLStatementContext sqlStatementContext,
-                                                          final 
ConnectionContext connectionContext, final Collection<String> tableNames) {
-        if (rule.isAllBroadcastTables(tableNames)) {
-            return sqlStatementContext.getSqlStatement() instanceof 
SelectStatement
-                    ? new BroadcastUnicastRouteEngine(sqlStatementContext, 
tableNames, connectionContext)
-                    : new BroadcastDatabaseBroadcastRouteEngine();
-        }
-        return new BroadcastIgnoreRouteEngine();
+    private static BroadcastRouteEngine getDMLRouteEngine(final 
SQLStatementContext sqlStatementContext, final ConnectionContext 
connectionContext, final Collection<String> broadcastTableNames) {
+        return sqlStatementContext.getSqlStatement() instanceof SelectStatement
+                ? new BroadcastUnicastRouteEngine(sqlStatementContext, 
broadcastTableNames, connectionContext)
+                : new BroadcastDatabaseBroadcastRouteEngine();
     }
 }
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/BroadcastRouteEngine.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/BroadcastRouteEngine.java
index 76e493fbb64..0825f9ffceb 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/BroadcastRouteEngine.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/BroadcastRouteEngine.java
@@ -28,9 +28,8 @@ public interface BroadcastRouteEngine {
     /**
      * Route.
      *
-     * @param routeContext route context
      * @param broadcastRule broadcast rule
      * @return route context
      */
-    RouteContext route(RouteContext routeContext, BroadcastRule broadcastRule);
+    RouteContext route(BroadcastRule broadcastRule);
 }
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngine.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngine.java
index 9269f64e419..03a49f52475 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngine.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngine.java
@@ -33,10 +33,11 @@ import java.util.Collections;
 public final class BroadcastDatabaseBroadcastRouteEngine implements 
BroadcastRouteEngine {
     
     @Override
-    public RouteContext route(final RouteContext routeContext, final 
BroadcastRule rule) {
+    public RouteContext route(final BroadcastRule rule) {
+        RouteContext result = new RouteContext();
         for (String each : rule.getDataSourceNames()) {
-            routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper(each, each), Collections.emptyList()));
+            result.getRouteUnits().add(new RouteUnit(new RouteMapper(each, 
each), Collections.emptyList()));
         }
-        return routeContext;
+        return result;
     }
 }
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRouteEngine.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRouteEngine.java
deleted file mode 100644
index 3cb9ae7af77..00000000000
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRouteEngine.java
+++ /dev/null
@@ -1,50 +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.broadcast.route.engine.type.broadcast;
-
-import lombok.RequiredArgsConstructor;
-import 
org.apache.shardingsphere.broadcast.route.engine.type.BroadcastRouteEngine;
-import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
-import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
-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 java.util.Collections;
-
-/**
- * Broadcast route engine for database instance.
- */
-@HighFrequencyInvocation
-@RequiredArgsConstructor
-public final class BroadcastInstanceBroadcastRouteEngine implements 
BroadcastRouteEngine {
-    
-    private final ResourceMetaData resourceMetaData;
-    
-    @Override
-    public RouteContext route(final RouteContext routeContext, final 
BroadcastRule rule) {
-        RouteContext result = new RouteContext();
-        for (String each : rule.getDataSourceNames()) {
-            if 
(resourceMetaData.getAllInstanceDataSourceNames().contains(each)) {
-                result.getRouteUnits().add(new RouteUnit(new RouteMapper(each, 
each), Collections.emptyList()));
-            }
-        }
-        return result;
-    }
-}
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngine.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngine.java
index 98d59ee2068..a24b7169d1a 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngine.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngine.java
@@ -39,11 +39,12 @@ public final class BroadcastTableBroadcastRouteEngine 
implements BroadcastRouteE
     private final Collection<String> broadcastTableNames;
     
     @Override
-    public RouteContext route(final RouteContext routeContext, final 
BroadcastRule rule) {
-        Collection<String> logicTableNames = 
rule.filterBroadcastTableNames(broadcastTableNames);
+    public RouteContext route(final BroadcastRule rule) {
+        RouteContext result = new RouteContext();
+        Collection<String> logicTableNames = 
rule.getBroadcastTableNames(broadcastTableNames);
         RouteContext toBeAddedRouteContext = logicTableNames.isEmpty() ? 
getRouteContext(rule) : getRouteContext(rule, logicTableNames);
-        
routeContext.getRouteUnits().addAll(toBeAddedRouteContext.getRouteUnits());
-        return routeContext;
+        result.getRouteUnits().addAll(toBeAddedRouteContext.getRouteUnits());
+        return result;
     }
     
     private RouteContext getRouteContext(final BroadcastRule rule) {
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRouteEngine.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRouteEngine.java
deleted file mode 100644
index 4dc1a749507..00000000000
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRouteEngine.java
+++ /dev/null
@@ -1,33 +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.broadcast.route.engine.type.ignore;
-
-import 
org.apache.shardingsphere.broadcast.route.engine.type.BroadcastRouteEngine;
-import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-
-/**
- * Broadcast ignore route engine.
- */
-public final class BroadcastIgnoreRouteEngine implements BroadcastRouteEngine {
-    
-    @Override
-    public RouteContext route(final RouteContext routeContext, final 
BroadcastRule rule) {
-        return routeContext;
-    }
-}
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngine.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngine.java
index 444116de5a0..aa4472cc34f 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngine.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngine.java
@@ -49,10 +49,11 @@ public final class BroadcastUnicastRouteEngine implements 
BroadcastRouteEngine {
     private final ConnectionContext connectionContext;
     
     @Override
-    public RouteContext route(final RouteContext routeContext, final 
BroadcastRule rule) {
+    public RouteContext route(final BroadcastRule rule) {
+        RouteContext result = new RouteContext();
         RouteMapper dataSourceMapper = 
getDataSourceRouteMapper(rule.getDataSourceNames());
-        routeContext.getRouteUnits().add(new RouteUnit(dataSourceMapper, 
createTableRouteMappers()));
-        return routeContext;
+        result.getRouteUnits().add(new RouteUnit(dataSourceMapper, 
createTableRouteMappers()));
+        return result;
     }
     
     private RouteMapper getDataSourceRouteMapper(final Collection<String> 
dataSourceNames) {
diff --git 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/BroadcastRule.java
 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/BroadcastRule.java
index d40ab1e88fe..64431426ac0 100644
--- 
a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/BroadcastRule.java
+++ 
b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/rule/BroadcastRule.java
@@ -34,7 +34,6 @@ import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 /**
  * Broadcast rule.
@@ -85,13 +84,19 @@ public final class BroadcastRule implements DatabaseRule {
     }
     
     /**
-     * Filter broadcast table names.
+     * Get broadcast table names.
      *
-     * @param logicTableNames to be filtered logic table names
-     * @return filtered broadcast table names
+     * @param logicTableNames all logic table names
+     * @return broadcast table names
      */
-    public Collection<String> filterBroadcastTableNames(final 
Collection<String> logicTableNames) {
-        return 
logicTableNames.stream().filter(tables::contains).collect(Collectors.toSet());
+    public Collection<String> getBroadcastTableNames(final Collection<String> 
logicTableNames) {
+        Collection<String> result = new CaseInsensitiveSet<>();
+        for (String each : logicTableNames) {
+            if (tables.contains(each)) {
+                result.add(each);
+            }
+        }
+        return result;
     }
     
     /**
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouterTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouterTest.java
index 26ce3cc15a2..27407ce4115 100644
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouterTest.java
+++ 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/BroadcastSQLRouterTest.java
@@ -17,48 +17,24 @@
 
 package org.apache.shardingsphere.broadcast.route;
 
-import com.google.common.collect.Lists;
-import org.apache.shardingsphere.broadcast.config.BroadcastRuleConfiguration;
 import 
org.apache.shardingsphere.broadcast.route.engine.BroadcastRouteEngineFactory;
 import 
org.apache.shardingsphere.broadcast.route.engine.type.BroadcastRouteEngine;
 import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
-import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateTableStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
-import org.apache.shardingsphere.infra.hint.HintValueContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.route.SQLRouter;
-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.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
-import 
org.apache.shardingsphere.sql.parser.statement.mysql.ddl.MySQLCreateTableStatement;
-import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Optional;
 import java.util.Properties;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -71,47 +47,15 @@ class BroadcastSQLRouterTest {
     void assertCreateRouteContext() {
         QueryContext queryContext = mock(QueryContext.class);
         BroadcastRule rule = mock(BroadcastRule.class);
+        
when(rule.getBroadcastTableNames(Collections.singleton("t_config"))).thenReturn(Collections.singleton("t_config"));
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
         BroadcastRouteEngine routeEngine = mock(BroadcastRouteEngine.class);
-        when(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext)).thenReturn(routeEngine);
-        getSQLRouter(rule).createRouteContext(queryContext, 
mock(RuleMetaData.class), database, rule, Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
-        verify(routeEngine).route(any(), eq(rule));
-    }
-    
-    @Test
-    void assertDecorateBroadcastRouteContextWithSingleDataSource() {
-        BroadcastRuleConfiguration currentConfig = 
mock(BroadcastRuleConfiguration.class);
-        
when(currentConfig.getTables()).thenReturn(Collections.singleton("t_order"));
-        BroadcastRule rule = new BroadcastRule(currentConfig, 
Collections.singletonMap("foo_ds", new MockedDataSource()), 
Collections.emptyList());
-        RouteContext routeContext = new RouteContext();
-        routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper("foo_ds", "foo_ds"), Lists.newArrayList()));
-        BroadcastSQLRouter sqlRouter = getSQLRouter(rule);
-        sqlRouter.decorateRouteContext(routeContext, createQueryContext(), 
mockSingleDatabase(), rule, Collections.emptyList(), new 
ConfigurationProperties(new Properties()));
-        Iterator<String> routedDataSourceNames = 
routeContext.getActualDataSourceNames().iterator();
-        assertThat(routedDataSourceNames.next(), is("foo_ds"));
+        when(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.singleton("t_config"))).thenReturn(routeEngine);
+        getSQLRouter(rule).createRouteContext(queryContext, 
mock(RuleMetaData.class), database, rule, Collections.singleton("t_config"), 
new ConfigurationProperties(new Properties()));
+        verify(routeEngine).route(eq(rule));
     }
     
     private BroadcastSQLRouter getSQLRouter(final BroadcastRule rule) {
         return (BroadcastSQLRouter) 
OrderedSPILoader.getServices(SQLRouter.class, 
Collections.singleton(rule)).get(rule);
     }
-    
-    private ShardingSphereDatabase mockSingleDatabase() {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
-        
when(result.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
 mock(StorageUnit.class)));
-        
when(result.getResourceMetaData().getAllInstanceDataSourceNames()).thenReturn(Collections.singletonList("foo_ds"));
-        return result;
-    }
-    
-    private QueryContext createQueryContext() {
-        CreateTableStatement createTableStatement = new 
MySQLCreateTableStatement(false);
-        createTableStatement.setTable(new SimpleTableSegment(new 
TableNameSegment(1, 2, new IdentifierValue("t_order"))));
-        return new QueryContext(new 
CreateTableStatementContext(createTableStatement, DefaultDatabase.LOGIC_NAME), 
"CREATE TABLE", new LinkedList<>(), new HintValueContext(),
-                mockConnectionContext(), mock(ShardingSphereMetaData.class));
-    }
-    
-    private ConnectionContext mockConnectionContext() {
-        ConnectionContext result = mock(ConnectionContext.class);
-        
when(result.getCurrentDatabaseName()).thenReturn(Optional.of(DefaultDatabase.LOGIC_NAME));
-        return result;
-    }
 }
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactoryTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactoryTest.java
index f88f78184dc..ca641d5dc2b 100644
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactoryTest.java
+++ 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/BroadcastRouteEngineFactoryTest.java
@@ -19,14 +19,12 @@ package org.apache.shardingsphere.broadcast.route.engine;
 
 import 
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastDatabaseBroadcastRouteEngine;
 import 
org.apache.shardingsphere.broadcast.route.engine.type.broadcast.BroadcastTableBroadcastRouteEngine;
-import 
org.apache.shardingsphere.broadcast.route.engine.type.ignore.BroadcastIgnoreRouteEngine;
 import 
org.apache.shardingsphere.broadcast.route.engine.type.unicast.BroadcastUnicastRouteEngine;
 import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
 import 
org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor;
 import 
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CloseStatementContext;
-import org.apache.shardingsphere.infra.binder.context.type.CursorAvailable;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -34,11 +32,9 @@ import 
org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.TableNameSegment;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dcl.DCLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.DMLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.UpdateStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement;
@@ -78,45 +74,22 @@ class BroadcastRouteEngineFactoryTest {
     
     @BeforeEach
     void setUp() {
-        
when(rule.filterBroadcastTableNames(Collections.singleton("foo_tbl"))).thenReturn(Collections.singleton("foo_tbl"));
+        
when(rule.getBroadcastTableNames(Collections.singleton("foo_tbl"))).thenReturn(Collections.singleton("foo_tbl"));
         
when(rule.isAllBroadcastTables(Collections.singleton("foo_tbl"))).thenReturn(true);
     }
     
     @Test
     void assertNewInstanceWithTCLStatement() {
         
when(queryContext.getSqlStatementContext().getSqlStatement()).thenReturn(mock(TCLStatement.class));
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastDatabaseBroadcastRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithCloseStatementContextAndCloseAll() {
-        CloseStatementContext sqlStatementContext = 
mock(CloseStatementContext.class, RETURNS_DEEP_STUBS);
-        
when(sqlStatementContext.getSqlStatement().isCloseAll()).thenReturn(true);
-        
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastDatabaseBroadcastRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithCursorAvailableAndIsNotAllBroadcastTables() {
-        CloseStatementContext sqlStatementContext = 
mock(CloseStatementContext.class, RETURNS_DEEP_STUBS);
-        
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastIgnoreRouteEngine.class));
+        assertThat(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.emptyList()), 
instanceOf(BroadcastDatabaseBroadcastRouteEngine.class));
     }
     
     @Test
     void assertNewInstanceWithCursorAvailableAndIsAllBroadcastTables() {
         CloseStatementContext sqlStatementContext = 
mock(CloseStatementContext.class, RETURNS_DEEP_STUBS);
-        
when(sqlStatementContext.getTablesContext()).thenReturn(createTablesContext("foo_tbl"));
-        
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastUnicastRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithCursorAvailableAndNotTableAvailable() {
-        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(CursorAvailable.class));
-        
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DDLStatement.class));
+        
when(sqlStatementContext.getTablesContext()).thenReturn(createTablesContext());
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastIgnoreRouteEngine.class));
+        assertThat(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.emptyList()), instanceOf(BroadcastUnicastRouteEngine.class));
     }
     
     @Test
@@ -125,92 +98,47 @@ class BroadcastRouteEngineFactoryTest {
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DDLStatement.class));
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
         when(SQLStatementContextExtractor.getTableNames(database, 
sqlStatementContext)).thenReturn(Collections.singleton("foo_tbl"));
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastTableBroadcastRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithDDLStatementAndIsNotAllBroadcastTables() {
-        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class);
-        
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DDLStatement.class));
-        
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastIgnoreRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithoutTableAvailableStatement() {
-        
when(queryContext.getSqlStatementContext().getSqlStatement()).thenReturn(mock(SQLStatement.class));
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastIgnoreRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithEmptyTables() {
-        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(TableAvailable.class));
-        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext());
-        
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastIgnoreRouteEngine.class));
+        assertThat(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.emptyList()), instanceOf(BroadcastTableBroadcastRouteEngine.class));
     }
     
     @Test
     void assertNewInstanceWithDALStatement() {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(TableAvailable.class));
-        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext("foo_tbl"));
+        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext());
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DALStatement.class));
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastTableBroadcastRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithDCLStatementWithoutBroadcastTables() {
-        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(TableAvailable.class));
-        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext("bar_tbl"));
-        
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DCLStatement.class));
-        
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastIgnoreRouteEngine.class));
+        assertThat(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.emptyList()), instanceOf(BroadcastTableBroadcastRouteEngine.class));
     }
     
     @Test
     void assertNewInstanceWithDCLStatementWithBroadcastTables() {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(TableAvailable.class));
-        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext("foo_tbl"));
+        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext());
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DCLStatement.class));
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastTableBroadcastRouteEngine.class));
-    }
-    
-    @Test
-    void assertNewInstanceWithDMLStatementAndIsNotAllBroadcastTables() {
-        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(TableAvailable.class));
-        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext("bar_tbl"));
-        
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DMLStatement.class));
-        
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastIgnoreRouteEngine.class));
+        assertThat(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.emptyList()), instanceOf(BroadcastTableBroadcastRouteEngine.class));
     }
     
     @Test
     void assertNewInstanceWithSelectStatementAndIsAllBroadcastTables() {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(TableAvailable.class));
-        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext("foo_tbl"));
+        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext());
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(SelectStatement.class));
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastUnicastRouteEngine.class));
+        assertThat(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.emptyList()), instanceOf(BroadcastUnicastRouteEngine.class));
     }
     
     @Test
     void assertNewInstanceWithUpdateStatementAndIsAllBroadcastTables() {
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, 
withSettings().extraInterfaces(TableAvailable.class));
-        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext("foo_tbl"));
+        when(((TableAvailable) 
sqlStatementContext).getTablesContext()).thenReturn(createTablesContext());
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(UpdateStatement.class));
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        assertThat(BroadcastRouteEngineFactory.newInstance(rule, database, 
queryContext), instanceOf(BroadcastDatabaseBroadcastRouteEngine.class));
+        assertThat(BroadcastRouteEngineFactory.newInstance(queryContext, 
Collections.emptyList()), 
instanceOf(BroadcastDatabaseBroadcastRouteEngine.class));
     }
     
     private TablesContext createTablesContext() {
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
-        return new TablesContext(Collections.emptyList(), databaseType, null);
-    }
-    
-    private TablesContext createTablesContext(final String tableName) {
-        DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
-        return new TablesContext(Collections.singleton(new 
SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue(tableName)))), databaseType, null);
+        return new TablesContext(Collections.singleton(new 
SimpleTableSegment(new TableNameSegment(0, 0, new 
IdentifierValue("foo_tbl")))), databaseType, null);
     }
 }
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngineTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngineTest.java
index 23572825334..66c7c488495 100644
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngineTest.java
+++ 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastDatabaseBroadcastRouteEngineTest.java
@@ -37,7 +37,7 @@ class BroadcastDatabaseBroadcastRouteEngineTest {
         BroadcastRule rule = mock(BroadcastRule.class);
         when(rule.getDataSourceNames()).thenReturn(Arrays.asList("ds_0", 
"ds_1"));
         BroadcastDatabaseBroadcastRouteEngine engine = new 
BroadcastDatabaseBroadcastRouteEngine();
-        RouteContext routeContext = engine.route(new RouteContext(), rule);
+        RouteContext routeContext = engine.route(rule);
         assertThat(routeContext.getRouteUnits().size(), is(2));
         Iterator<RouteUnit> iterator = routeContext.getRouteUnits().iterator();
         assertDataSourceRouteMapper(iterator.next(), "ds_0");
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRouteEngineTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRouteEngineTest.java
deleted file mode 100644
index 1b6e5ca87d4..00000000000
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastInstanceBroadcastRouteEngineTest.java
+++ /dev/null
@@ -1,52 +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.broadcast.route.engine.type.broadcast;
-
-import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
-import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.apache.shardingsphere.infra.route.context.RouteUnit;
-import org.junit.jupiter.api.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-class BroadcastInstanceBroadcastRouteEngineTest {
-    
-    @Test
-    void assertRoute() {
-        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
-        
when(resourceMetaData.getAllInstanceDataSourceNames()).thenReturn(Collections.singleton("ds_0"));
-        BroadcastInstanceBroadcastRouteEngine engine = new 
BroadcastInstanceBroadcastRouteEngine(resourceMetaData);
-        BroadcastRule rule = mock(BroadcastRule.class);
-        when(rule.getDataSourceNames()).thenReturn(Arrays.asList("ds_0", 
"ds_1"));
-        RouteContext routeContext = engine.route(new RouteContext(), rule);
-        assertThat(routeContext.getRouteUnits().size(), is(1));
-        
assertDataSourceRouteMapper(routeContext.getRouteUnits().iterator().next(), 
"ds_0");
-    }
-    
-    private void assertDataSourceRouteMapper(final RouteUnit routeUnit, final 
String expected) {
-        assertThat(routeUnit.getDataSourceMapper().getLogicName(), 
is(expected));
-        assertThat(routeUnit.getDataSourceMapper().getActualName(), 
is(expected));
-    }
-}
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngineTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngineTest.java
index f3a11136f1f..b2095f60deb 100644
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngineTest.java
+++ 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/broadcast/BroadcastTableBroadcastRouteEngineTest.java
@@ -42,8 +42,8 @@ class BroadcastTableBroadcastRouteEngineTest {
         BroadcastTableBroadcastRouteEngine engine = new 
BroadcastTableBroadcastRouteEngine(broadcastRuleTableNames);
         BroadcastRule rule = mock(BroadcastRule.class);
         when(rule.getDataSourceNames()).thenReturn(Arrays.asList("ds_0", 
"ds_1"));
-        
when(rule.filterBroadcastTableNames(any())).thenReturn(Collections.singleton("t_address"));
-        RouteContext routeContext = engine.route(new RouteContext(), rule);
+        
when(rule.getBroadcastTableNames(any())).thenReturn(Collections.singleton("t_address"));
+        RouteContext routeContext = engine.route(rule);
         assertThat(routeContext.getRouteUnits().size(), is(2));
         Iterator<RouteUnit> iterator = routeContext.getRouteUnits().iterator();
         assertRouteMapper(iterator.next(), "ds_0", "t_address");
@@ -56,8 +56,8 @@ class BroadcastTableBroadcastRouteEngineTest {
         BroadcastTableBroadcastRouteEngine engine = new 
BroadcastTableBroadcastRouteEngine(broadcastRuleTableNames);
         BroadcastRule rule = mock(BroadcastRule.class);
         when(rule.getDataSourceNames()).thenReturn(Arrays.asList("ds_0", 
"ds_1"));
-        
when(rule.filterBroadcastTableNames(any())).thenReturn(Collections.emptyList());
-        RouteContext routeContext = engine.route(new RouteContext(), rule);
+        
when(rule.getBroadcastTableNames(any())).thenReturn(Collections.emptyList());
+        RouteContext routeContext = engine.route(rule);
         assertThat(routeContext.getRouteUnits().size(), is(2));
         Iterator<RouteUnit> iterator = routeContext.getRouteUnits().iterator();
         assertRouteMapper(iterator.next(), "ds_0", "");
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRouteEngineTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRouteEngineTest.java
deleted file mode 100644
index 6bb667aa832..00000000000
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/ignore/BroadcastIgnoreRouteEngineTest.java
+++ /dev/null
@@ -1,35 +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.broadcast.route.engine.type.ignore;
-
-import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
-import org.apache.shardingsphere.infra.route.context.RouteContext;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-
-class BroadcastIgnoreRouteEngineTest {
-    
-    @Test
-    void assertRoute() {
-        BroadcastIgnoreRouteEngine engine = new BroadcastIgnoreRouteEngine();
-        RouteContext routeContext = engine.route(new RouteContext(), 
mock(BroadcastRule.class));
-        assertTrue(routeContext.getRouteUnits().isEmpty());
-    }
-}
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngineTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngineTest.java
index 18a815a0c1e..f35175c1a60 100644
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngineTest.java
+++ 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/route/engine/type/unicast/BroadcastUnicastRouteEngineTest.java
@@ -93,7 +93,7 @@ class BroadcastUnicastRouteEngineTest {
     @SafeVarargs
     private final void assertRoute(final SQLStatementContext 
sqlStatementContext, final Matcher<String>... matchers) {
         BroadcastUnicastRouteEngine engine = new 
BroadcastUnicastRouteEngine(sqlStatementContext, 
Collections.singleton("foo_tbl"), connectionContext);
-        RouteContext actual = engine.route(new RouteContext(), rule);
+        RouteContext actual = engine.route(rule);
         assertThat(actual.getRouteUnits().size(), is(1));
         RouteMapper actualDataSourceRouteMapper = 
actual.getRouteUnits().iterator().next().getDataSourceMapper();
         assertThat(actualDataSourceRouteMapper.getLogicName(), 
anyOf(matchers));
@@ -111,7 +111,7 @@ class BroadcastUnicastRouteEngineTest {
     @Test
     void assertRouteWithEmptyTables() {
         BroadcastUnicastRouteEngine engine = new 
BroadcastUnicastRouteEngine(mock(SQLStatementContext.class), 
Collections.emptyList(), connectionContext);
-        RouteContext actual = engine.route(new RouteContext(), rule);
+        RouteContext actual = engine.route(rule);
         assertThat(actual.getRouteUnits().size(), is(1));
         Collection<RouteMapper> actualTableRouteMappers = 
actual.getRouteUnits().iterator().next().getTableMappers();
         assertTrue(actualTableRouteMappers.isEmpty());
diff --git 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/BroadcastRuleTest.java
 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/BroadcastRuleTest.java
index 19a604ef2c4..95a1383b95b 100644
--- 
a/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/BroadcastRuleTest.java
+++ 
b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/rule/BroadcastRuleTest.java
@@ -67,9 +67,9 @@ class BroadcastRuleTest {
     }
     
     @Test
-    void assertFilterBroadcastTableNames() {
+    void assertGetBroadcastTableNames() {
         BroadcastRule rule = new BroadcastRule(new 
BroadcastRuleConfiguration(Collections.singleton("foo_tbl")), 
Collections.emptyMap(), Collections.emptyList());
-        assertThat(rule.filterBroadcastTableNames(Arrays.asList("foo_tbl", 
"bar_tbl")), is(Collections.singleton("foo_tbl")));
+        assertThat(rule.getBroadcastTableNames(Arrays.asList("foo_tbl", 
"bar_tbl")), is(Collections.singleton("foo_tbl")));
     }
     
     @Test
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/constant/EncryptOrder.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/constant/EncryptOrder.java
index dbbf4f28117..649d5d672d4 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/constant/EncryptOrder.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/constant/EncryptOrder.java
@@ -29,5 +29,5 @@ public final class EncryptOrder {
     /**
      * Encrypt order.
      */
-    public static final int ORDER = 15;
+    public static final int ORDER = 10;
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
index 4d6e8a3774a..2699dc95554 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/assertion/ShardingRouteAssert.java
@@ -35,6 +35,8 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import 
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -50,10 +52,12 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 /**
  * Sharding route assert.
@@ -74,16 +78,20 @@ public final class ShardingRouteAssert {
         SingleRule singleRule = 
ShardingRouteEngineFixtureBuilder.createSingleRule(Collections.singleton(shardingRule));
         TimestampServiceRule timestampServiceRule = 
ShardingRouteEngineFixtureBuilder.createTimeServiceRule();
         Map<String, ShardingSphereSchema> schemas = buildSchemas();
-        ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
         SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine(databaseType,
                 new CacheOption(2000, 65535L), new CacheOption(128, 1024L));
-        RuleMetaData ruleMetaData = new 
RuleMetaData(Arrays.asList(shardingRule, singleRule, timestampServiceRule));
+        ShardingSphereRule broadcastRule = mock(ShardingSphereRule.class, 
RETURNS_DEEP_STUBS);
+        TableMapperRuleAttribute ruleAttribute = 
mock(TableMapperRuleAttribute.class);
+        
when(ruleAttribute.getDistributedTableNames()).thenReturn(Collections.singleton("t_product"));
+        
when(broadcastRule.getAttributes().findAttribute(TableMapperRuleAttribute.class)).thenReturn(Optional.of(ruleAttribute));
+        RuleMetaData ruleMetaData = new 
RuleMetaData(Arrays.asList(shardingRule, broadcastRule, singleRule, 
timestampServiceRule));
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME, databaseType, 
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS), ruleMetaData, schemas);
         ShardingSphereMetaData metaData = 
createShardingSphereMetaData(database);
         SQLStatementContext sqlStatementContext = new SQLBindEngine(metaData, 
DefaultDatabase.LOGIC_NAME, new 
HintValueContext()).bind(sqlStatementParserEngine.parse(sql, false), params);
         ConnectionContext connectionContext = new 
ConnectionContext(Collections::emptySet);
         connectionContext.setCurrentDatabaseName(DefaultDatabase.LOGIC_NAME);
         QueryContext queryContext = new QueryContext(sqlStatementContext, sql, 
params, new HintValueContext(), connectionContext, metaData);
+        ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
         return new SQLRouteEngine(Arrays.asList(shardingRule, singleRule), 
props).route(queryContext, mock(RuleMetaData.class), database);
     }
     
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/constant/SingleOrder.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/constant/SingleOrder.java
index b11706fa32c..69d9cbd4a47 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/constant/SingleOrder.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/constant/SingleOrder.java
@@ -29,5 +29,5 @@ public final class SingleOrder {
     /**
      * Single order.
      */
-    public static final int ORDER = 10;
+    public static final int ORDER = 5;
 }
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 e7fd34700a0..24523813990 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.single.route;
 
+import com.cedarsoftware.util.CaseInsensitiveSet;
 import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
@@ -30,11 +31,11 @@ import 
org.apache.shardingsphere.infra.route.context.RouteUnit;
 import org.apache.shardingsphere.infra.route.type.DecorateSQLRouter;
 import org.apache.shardingsphere.infra.route.type.EntranceSQLRouter;
 import org.apache.shardingsphere.infra.route.type.TableSQLRouter;
+import 
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
 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.engine.SingleRouteEngine;
 import org.apache.shardingsphere.single.rule.SingleRule;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.CreateTableStatement;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -52,19 +53,24 @@ public final class SingleSQLRouter implements 
EntranceSQLRouter<SingleRule>, Dec
         if (1 == database.getResourceMetaData().getStorageUnits().size()) {
             return createSingleDataSourceRouteContext(rule, database, 
queryContext);
         }
-        RouteContext result = new RouteContext();
-        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;
+        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
+        RouteContext routeContext = new RouteContext();
+        Collection<QualifiedTable> singleTables = getSingleTables(database, 
rule, sqlStatementContext);
+        if (singleTables.isEmpty()) {
+            return routeContext;
+        }
+        return new SingleRouteEngine(singleTables, 
sqlStatementContext.getSqlStatement(), 
queryContext.getHintValueContext()).route(routeContext, rule);
     }
     
     @Override
     public void decorateRouteContext(final RouteContext routeContext, final 
QueryContext queryContext, final ShardingSphereDatabase database,
                                      final SingleRule rule, final 
Collection<String> tableNames, final ConfigurationProperties props) {
-        Collection<QualifiedTable> singleTables = getSingleTables(database, 
rule, routeContext, queryContext.getSqlStatementContext());
-        SingleRouteEngineFactory.newInstance(singleTables, 
queryContext.getSqlStatementContext().getSqlStatement(), 
queryContext.getHintValueContext())
-                .ifPresent(optional -> optional.route(routeContext, rule));
+        SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
+        Collection<QualifiedTable> singleTables = getSingleTables(database, 
rule, sqlStatementContext);
+        if (singleTables.isEmpty()) {
+            return;
+        }
+        new SingleRouteEngine(singleTables, 
sqlStatementContext.getSqlStatement(), 
queryContext.getHintValueContext()).route(routeContext, rule);
     }
     
     private RouteContext createSingleDataSourceRouteContext(final SingleRule 
rule, final ShardingSphereDatabase database, final QueryContext queryContext) {
@@ -86,9 +92,24 @@ 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) {
+    private Collection<QualifiedTable> getSingleTables(final 
ShardingSphereDatabase database, final SingleRule rule, final 
SQLStatementContext sqlStatementContext) {
         Collection<QualifiedTable> qualifiedTables = 
rule.getQualifiedTables(sqlStatementContext, database);
-        return routeContext.getRouteUnits().isEmpty() && 
sqlStatementContext.getSqlStatement() instanceof CreateTableStatement ? 
qualifiedTables : rule.getSingleTables(qualifiedTables);
+        Collection<String> distributedTableNames = 
getDistributedTableNames(database);
+        Collection<QualifiedTable> result = new LinkedList<>();
+        for (QualifiedTable each : qualifiedTables) {
+            if (!distributedTableNames.contains(each.getTableName())) {
+                result.add(each);
+            }
+        }
+        return result;
+    }
+    
+    private Collection<String> getDistributedTableNames(final 
ShardingSphereDatabase database) {
+        Collection<String> result = new CaseInsensitiveSet<>();
+        for (TableMapperRuleAttribute each : 
database.getRuleMetaData().getAttributes(TableMapperRuleAttribute.class)) {
+            result.addAll(each.getDistributedTableNames());
+        }
+        return result;
     }
     
     @Override
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngine.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngine.java
index 64de553484a..4223fbc364a 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngine.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngine.java
@@ -17,19 +17,126 @@
 
 package org.apache.shardingsphere.single.route.engine;
 
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.datanode.DataNode;
+import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.TableExistsException;
+import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
+import org.apache.shardingsphere.infra.hint.HintValueContext;
+import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
 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.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
+import org.apache.shardingsphere.single.exception.SingleTableNotFoundException;
 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;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * Single route engine.
  */
-public interface SingleRouteEngine {
+@RequiredArgsConstructor
+public final class SingleRouteEngine {
+    
+    private final Collection<QualifiedTable> singleTables;
+    
+    private final SQLStatement sqlStatement;
+    
+    private final HintValueContext hintValueContext;
     
     /**
      * Route.
      *
      * @param routeContext route context
      * @param singleRule single rule
+     * @return route context
      */
-    void route(RouteContext routeContext, SingleRule singleRule);
+    public RouteContext route(final RouteContext routeContext, final 
SingleRule singleRule) {
+        if (routeContext.getRouteUnits().isEmpty() || sqlStatement instanceof 
SelectStatement) {
+            routeStatement(routeContext, singleRule);
+        } else {
+            RouteContext newRouteContext = new RouteContext();
+            routeStatement(newRouteContext, singleRule);
+            combineRouteContext(routeContext, newRouteContext);
+        }
+        return routeContext;
+    }
+    
+    private void routeStatement(final RouteContext routeContext, final 
SingleRule rule) {
+        if (sqlStatement instanceof DDLStatement) {
+            routeDDLStatement(routeContext, rule);
+        } else {
+            boolean allTablesInSameComputeNode = 
rule.isAllTablesInSameComputeNode(getDataNodes(routeContext), singleTables);
+            ShardingSpherePreconditions.checkState(allTablesInSameComputeNode, 
() -> new UnsupportedSQLOperationException("all tables must be in the same 
compute node"));
+            fillRouteContext(rule, routeContext, singleTables);
+        }
+    }
+    
+    private Collection<DataNode> getDataNodes(final RouteContext routeContext) 
{
+        Collection<DataNode> result = new LinkedList<>();
+        for (Collection<DataNode> each : routeContext.getOriginalDataNodes()) {
+            result.addAll(each);
+        }
+        return result;
+    }
+    
+    private void routeDDLStatement(final RouteContext routeContext, final 
SingleRule rule) {
+        if (sqlStatement instanceof CreateTableStatement) {
+            QualifiedTable table = singleTables.iterator().next();
+            Optional<DataNode> dataNode = 
rule.getAttributes().getAttribute(MutableDataNodeRuleAttribute.class).findTableDataNode(table.getSchemaName(),
 table.getTableName());
+            boolean containsIfNotExists = ((CreateTableStatement) 
sqlStatement).isIfNotExists();
+            if (dataNode.isPresent()) {
+                routeDDLStatementWithExistTable(routeContext, 
containsIfNotExists, dataNode.get(), table);
+            } else {
+                String dataSourceName = rule.assignNewDataSourceName();
+                routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper(dataSourceName, dataSourceName), Collections.singleton(new 
RouteMapper(table.getTableName(), table.getTableName()))));
+            }
+        } else {
+            fillRouteContext(rule, routeContext, singleTables);
+        }
+    }
+    
+    private void routeDDLStatementWithExistTable(final RouteContext 
routeContext, final boolean containsIfNotExists, final DataNode dataNode, final 
QualifiedTable table) {
+        if (containsIfNotExists || hintValueContext.isSkipMetadataValidate()) {
+            String dataSourceName = dataNode.getDataSourceName();
+            routeContext.getRouteUnits()
+                    .add(new RouteUnit(new RouteMapper(dataSourceName, 
dataSourceName), Collections.singleton(new RouteMapper(table.getTableName(), 
table.getTableName()))));
+        } else {
+            throw new TableExistsException(table.getTableName());
+        }
+    }
+    
+    private void fillRouteContext(final SingleRule singleRule, final 
RouteContext routeContext, final Collection<QualifiedTable> logicTables) {
+        for (QualifiedTable each : logicTables) {
+            String tableName = each.getTableName();
+            DataNode dataNode = 
singleRule.getAttributes().getAttribute(MutableDataNodeRuleAttribute.class).findTableDataNode(each.getSchemaName(),
 tableName)
+                    .orElseThrow(() -> new 
SingleTableNotFoundException(tableName));
+            String dataSource = dataNode.getDataSourceName();
+            routeContext.putRouteUnit(new RouteMapper(dataSource, dataSource), 
Collections.singletonList(new RouteMapper(tableName, tableName)));
+        }
+    }
+    
+    private void combineRouteContext(final RouteContext routeContext, final 
RouteContext newRouteContext) {
+        Map<String, RouteUnit> dataSourceRouteUnits = 
getDataSourceRouteUnits(newRouteContext);
+        routeContext.getRouteUnits().removeIf(each -> 
!dataSourceRouteUnits.containsKey(each.getDataSourceMapper().getLogicName()));
+        for (Entry<String, RouteUnit> entry : dataSourceRouteUnits.entrySet()) 
{
+            routeContext.putRouteUnit(entry.getValue().getDataSourceMapper(), 
entry.getValue().getTableMappers());
+        }
+    }
+    
+    private Map<String, RouteUnit> getDataSourceRouteUnits(final RouteContext 
newRouteContext) {
+        return 
newRouteContext.getRouteUnits().stream().collect(Collectors.toMap(each -> 
each.getDataSourceMapper().getLogicName(), Function.identity()));
+    }
 }
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
deleted file mode 100644
index cb8dd5bc3b5..00000000000
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactory.java
+++ /dev/null
@@ -1,47 +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 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 java.util.Collection;
-import java.util.Optional;
-
-/**
- * Single route engine factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class SingleRouteEngineFactory {
-    
-    /**
-     * Create new instance of single route engine.
-     *
-     * @param singleTables single tables
-     * @param sqlStatement SQL statement
-     * @param hintValueContext hint value context
-     * @return created instance
-     */
-    public static Optional<SingleRouteEngine> newInstance(final 
Collection<QualifiedTable> singleTables, final SQLStatement sqlStatement, final 
HintValueContext hintValueContext) {
-        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/standard/SingleStandardRouteEngine.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/standard/SingleStandardRouteEngine.java
deleted file mode 100644
index 02ea6cfef44..00000000000
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/route/engine/standard/SingleStandardRouteEngine.java
+++ /dev/null
@@ -1,136 +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.standard;
-
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.infra.datanode.DataNode;
-import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
-import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.table.TableExistsException;
-import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
-import org.apache.shardingsphere.infra.hint.HintValueContext;
-import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
-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.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;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.ddl.DDLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dml.SelectStatement;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-/**
- * Single standard route engine.
- */
-@RequiredArgsConstructor
-public final class SingleStandardRouteEngine implements SingleRouteEngine {
-    
-    private final Collection<QualifiedTable> singleTables;
-    
-    private final SQLStatement sqlStatement;
-    
-    private final HintValueContext hintValueContext;
-    
-    @Override
-    public void route(final RouteContext routeContext, final SingleRule 
singleRule) {
-        if (routeContext.getRouteUnits().isEmpty() || sqlStatement instanceof 
SelectStatement) {
-            routeStatement(routeContext, singleRule);
-        } else {
-            RouteContext newRouteContext = new RouteContext();
-            routeStatement(newRouteContext, singleRule);
-            combineRouteContext(routeContext, newRouteContext);
-        }
-    }
-    
-    private void routeStatement(final RouteContext routeContext, final 
SingleRule rule) {
-        if (sqlStatement instanceof DDLStatement) {
-            routeDDLStatement(routeContext, rule);
-        } else {
-            boolean allTablesInSameComputeNode = 
rule.isAllTablesInSameComputeNode(getDataNodes(routeContext), singleTables);
-            ShardingSpherePreconditions.checkState(allTablesInSameComputeNode, 
() -> new UnsupportedSQLOperationException("all tables must be in the same 
compute node"));
-            fillRouteContext(rule, routeContext, singleTables);
-        }
-    }
-    
-    private Collection<DataNode> getDataNodes(final RouteContext routeContext) 
{
-        Collection<DataNode> result = new LinkedList<>();
-        for (Collection<DataNode> each : routeContext.getOriginalDataNodes()) {
-            result.addAll(each);
-        }
-        return result;
-    }
-    
-    private void routeDDLStatement(final RouteContext routeContext, final 
SingleRule rule) {
-        if (sqlStatement instanceof CreateTableStatement) {
-            QualifiedTable table = singleTables.iterator().next();
-            Optional<DataNode> dataNode = 
rule.getAttributes().getAttribute(MutableDataNodeRuleAttribute.class).findTableDataNode(table.getSchemaName(),
 table.getTableName());
-            boolean containsIfNotExists = ((CreateTableStatement) 
sqlStatement).isIfNotExists();
-            if (dataNode.isPresent()) {
-                routeDDLStatementWithExistTable(routeContext, 
containsIfNotExists, dataNode.get(), table);
-            } else {
-                String dataSourceName = rule.assignNewDataSourceName();
-                routeContext.getRouteUnits().add(new RouteUnit(new 
RouteMapper(dataSourceName, dataSourceName), Collections.singleton(new 
RouteMapper(table.getTableName(), table.getTableName()))));
-            }
-        } else {
-            fillRouteContext(rule, routeContext, singleTables);
-        }
-    }
-    
-    private void routeDDLStatementWithExistTable(final RouteContext 
routeContext, final boolean containsIfNotExists, final DataNode dataNode, final 
QualifiedTable table) {
-        if (containsIfNotExists || hintValueContext.isSkipMetadataValidate()) {
-            String dataSourceName = dataNode.getDataSourceName();
-            routeContext.getRouteUnits()
-                    .add(new RouteUnit(new RouteMapper(dataSourceName, 
dataSourceName), Collections.singleton(new RouteMapper(table.getTableName(), 
table.getTableName()))));
-        } else {
-            throw new TableExistsException(table.getTableName());
-        }
-    }
-    
-    private void fillRouteContext(final SingleRule singleRule, final 
RouteContext routeContext, final Collection<QualifiedTable> logicTables) {
-        for (QualifiedTable each : logicTables) {
-            String tableName = each.getTableName();
-            DataNode dataNode = 
singleRule.getAttributes().getAttribute(MutableDataNodeRuleAttribute.class).findTableDataNode(each.getSchemaName(),
 tableName)
-                    .orElseThrow(() -> new 
SingleTableNotFoundException(tableName));
-            String dataSource = dataNode.getDataSourceName();
-            routeContext.putRouteUnit(new RouteMapper(dataSource, dataSource), 
Collections.singletonList(new RouteMapper(tableName, tableName)));
-        }
-    }
-    
-    private void combineRouteContext(final RouteContext routeContext, final 
RouteContext newRouteContext) {
-        Map<String, RouteUnit> dataSourceRouteUnits = 
getDataSourceRouteUnits(newRouteContext);
-        routeContext.getRouteUnits().removeIf(each -> 
!dataSourceRouteUnits.containsKey(each.getDataSourceMapper().getLogicName()));
-        for (Entry<String, RouteUnit> entry : dataSourceRouteUnits.entrySet()) 
{
-            routeContext.putRouteUnit(entry.getValue().getDataSourceMapper(), 
entry.getValue().getTableMappers());
-        }
-    }
-    
-    private Map<String, RouteUnit> getDataSourceRouteUnits(final RouteContext 
newRouteContext) {
-        return 
newRouteContext.getRouteUnits().stream().collect(Collectors.toMap(each -> 
each.getDataSourceMapper().getLogicName(), Function.identity()));
-    }
-}
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
index fa0beb370a4..41dd0a61f90 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/SingleSQLRouterTest.java
@@ -58,7 +58,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -69,6 +68,7 @@ import java.util.Properties;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
@@ -197,7 +197,8 @@ class SingleSQLRouterTest {
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME, mock(DatabaseType.class), 
mock(ResourceMetaData.class, RETURNS_DEEP_STUBS),
                 new RuleMetaData(Collections.singleton(rule)), 
Collections.emptyMap());
         sqlRouter.decorateRouteContext(routeContext, createQueryContext(), 
database, rule, Collections.singletonList("t_order"), new 
ConfigurationProperties(new Properties()));
-        assertThat(routeContext.getActualDataSourceNames(), is(new 
HashSet<>(Arrays.asList("write_ds", "readwrite_ds"))));
+        assertThat(routeContext.getActualDataSourceNames().size(), is(1));
+        assertTrue(Arrays.asList("write_ds", 
"readwrite_ds").contains(routeContext.getActualDataSourceNames().iterator().next()));
     }
     
     @Test
@@ -207,11 +208,10 @@ class SingleSQLRouterTest {
         routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper("ds_0", 
"ds_0"), Collections.emptyList()));
         routeContext.getRouteUnits().add(new RouteUnit(new RouteMapper("ds_1", 
"ds_1"), Collections.emptyList()));
         SingleSQLRouter sqlRouter = (SingleSQLRouter) 
OrderedSPILoader.getServices(SQLRouter.class, 
Collections.singleton(rule)).get(rule);
-        sqlRouter.decorateRouteContext(
-                routeContext, createQueryContext(), 
mockDatabaseWithMultipleResources(), rule, 
Collections.singletonList("t_order"), new ConfigurationProperties(new 
Properties()));
-        Iterator<String> routedDataSourceNames = 
routeContext.getActualDataSourceNames().iterator();
-        assertThat(routedDataSourceNames.next(), is("ds_1"));
-        assertThat(routedDataSourceNames.next(), is("ds_0"));
+        sqlRouter.decorateRouteContext(routeContext, createQueryContext(), 
mockDatabaseWithMultipleResources(), rule, Collections.singletonList("t_order"),
+                new ConfigurationProperties(new Properties()));
+        assertThat(routeContext.getActualDataSourceNames().size(), is(1));
+        assertTrue(Arrays.asList("ds_0", 
"ds_1").contains(routeContext.getActualDataSourceNames().iterator().next()));
     }
     
     private QueryContext createQueryContext() {
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
deleted file mode 100644
index d81bb51ccf9..00000000000
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineFactoryTest.java
+++ /dev/null
@@ -1,42 +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.hint.HintValueContext;
-import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
-import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
-import org.junit.jupiter.api.Test;
-
-import java.util.Collections;
-
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-
-class SingleRouteEngineFactoryTest {
-    
-    @Test
-    void assertNewInstanceWithNotEmptySingleTables() {
-        
assertTrue(SingleRouteEngineFactory.newInstance(Collections.singleton(new 
QualifiedTable("demo_ds", "t_order")), mock(SQLStatement.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/engine/SingleStandardRouteEngineTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleRouteEngineTest.java
similarity index 89%
rename from 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleStandardRouteEngineTest.java
rename to 
kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleRouteEngineTest.java
index 4f52e8efe31..14751984b2d 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleStandardRouteEngineTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/engine/SingleRouteEngineTest.java
@@ -30,7 +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.route.engine.SingleRouteEngine;
 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;
@@ -61,11 +61,11 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-class SingleStandardRouteEngineTest {
+class SingleRouteEngineTest {
     
     @Test
     void assertRouteInSameDataSource() throws SQLException {
-        SingleStandardRouteEngine engine = new 
SingleStandardRouteEngine(mockQualifiedTables(), null, 
mock(HintValueContext.class));
+        SingleRouteEngine engine = new 
SingleRouteEngine(mockQualifiedTables(), null, mock(HintValueContext.class));
         SingleRule singleRule = new SingleRule(new SingleRuleConfiguration(), 
DefaultDatabase.LOGIC_NAME, new MySQLDatabaseType(), createDataSourceMap(), 
Collections.emptyList());
         
singleRule.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes().put("t_order",
 Collections.singleton(mockDataNode("t_order")));
         
singleRule.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes().put("t_order_item",
 Collections.singleton(mockDataNode("t_order_item")));
@@ -96,7 +96,7 @@ class SingleStandardRouteEngineTest {
     
     @Test
     void assertRouteWithoutSingleRule() throws SQLException {
-        SingleStandardRouteEngine engine = new 
SingleStandardRouteEngine(mockQualifiedTables(), new 
MySQLCreateTableStatement(false), mock(HintValueContext.class));
+        SingleRouteEngine engine = new 
SingleRouteEngine(mockQualifiedTables(), new MySQLCreateTableStatement(false), 
mock(HintValueContext.class));
         SingleRule singleRule = new SingleRule(new SingleRuleConfiguration(), 
DefaultDatabase.LOGIC_NAME, new MySQLDatabaseType(), createDataSourceMap(), 
Collections.emptyList());
         RouteContext routeContext = new RouteContext();
         engine.route(routeContext, singleRule);
@@ -111,7 +111,7 @@ class SingleStandardRouteEngineTest {
     
     @Test
     void assertRouteWithDefaultSingleRule() throws SQLException {
-        SingleStandardRouteEngine engine = new 
SingleStandardRouteEngine(mockQualifiedTables(), new 
MySQLCreateTableStatement(false), mock(HintValueContext.class));
+        SingleRouteEngine engine = new 
SingleRouteEngine(mockQualifiedTables(), new MySQLCreateTableStatement(false), 
mock(HintValueContext.class));
         SingleRule singleRule =
                 new SingleRule(new 
SingleRuleConfiguration(Collections.emptyList(), "ds_0"), 
DefaultDatabase.LOGIC_NAME, new MySQLDatabaseType(), createDataSourceMap(), 
Collections.emptyList());
         RouteContext routeContext = new RouteContext();
@@ -137,15 +137,15 @@ class SingleStandardRouteEngineTest {
     
     @Test
     void assertRouteDuplicateSingleTable() {
-        SingleStandardRouteEngine engine =
-                new SingleStandardRouteEngine(Collections.singleton(new 
QualifiedTable(DefaultDatabase.LOGIC_NAME, "t_order")), mockStatement(false), 
mock(HintValueContext.class));
+        SingleRouteEngine engine =
+                new SingleRouteEngine(Collections.singleton(new 
QualifiedTable(DefaultDatabase.LOGIC_NAME, "t_order")), mockStatement(false), 
mock(HintValueContext.class));
         assertThrows(TableExistsException.class, () -> engine.route(new 
RouteContext(), mockSingleRule()));
     }
     
     @Test
     void assertRouteIfNotExistsDuplicateSingleTable() {
-        SingleStandardRouteEngine engine =
-                new SingleStandardRouteEngine(Collections.singleton(new 
QualifiedTable(DefaultDatabase.LOGIC_NAME, "t_order")), mockStatement(true), 
mock(HintValueContext.class));
+        SingleRouteEngine engine =
+                new SingleRouteEngine(Collections.singleton(new 
QualifiedTable(DefaultDatabase.LOGIC_NAME, "t_order")), mockStatement(true), 
mock(HintValueContext.class));
         assertDoesNotThrow(() -> engine.route(new RouteContext(), 
mockSingleRule()));
     }
     
diff --git a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-join.xml 
b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-join.xml
index 6a6da2083b0..952981fc24d 100644
--- a/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-join.xml
+++ b/test/e2e/sql/src/test/resources/cases/dql/e2e-dql-select-join.xml
@@ -87,6 +87,16 @@
     <test-case sql="SELECT i.* FROM t_order o JOIN t_order_item i 
USING(order_id) WHERE o.order_id = ?" db-types="MySQL,PostgreSQL" 
scenario-types="tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">
         <assertion parameters="1000:int" 
expected-data-source-name="read_dataset" />
     </test-case>
+
+    <!-- Test single, broadcast and sharding join begin -->
+    <test-case sql="SELECT * FROM t_product p INNER JOIN t_product_category c 
ON p.category_id = c.category_id WHERE p.product_id = ?" 
scenario-types="db,dbtbl_with_readwrite_splitting">
+        <assertion parameters="1:int" expected-data-source-name="read_dataset" 
/>
+    </test-case>
+
+    <test-case sql="SELECT * FROM t_product_category c INNER JOIN t_order_item 
i ON c.category_id = i.product_id WHERE i.product_id = ?" 
scenario-types="db,dbtbl_with_readwrite_splitting">
+        <assertion parameters="1:int" expected-data-source-name="read_dataset" 
/>
+    </test-case>
+    <!-- Test single, broadcast and sharding join end -->
     
     <test-case sql="SELECT * FROM t_order o NATURAL JOIN t_merchant m WHERE 
o.user_id = ? ORDER BY o.order_id" db-types="MySQL,PostgreSQL,openGauss" 
scenario-types="db_tbl_sql_federation">
         <assertion parameters="10:int" 
expected-data-source-name="read_dataset" />
diff --git 
a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml
 
b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml
index 842faf0edb1..c2772527943 100644
--- 
a/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml
+++ 
b/test/it/rewriter/src/test/resources/scenario/sharding/case/ddl/create-table.xml
@@ -21,68 +21,83 @@
         <input sql="CREATE TABLE t_order_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk FOREIGN KEY (order_id) REFERENCES t_order_item 
(order_id))" />
         <output sql="CREATE TABLE t_order_new_0(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk_t_order_new_0 FOREIGN KEY (order_id) REFERENCES 
t_order_item_0 (order_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_single_data_node_unbinding_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_order_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk FOREIGN KEY (order_id) REFERENCES t_order_extend 
(order_id))" />
         <output sql="CREATE TABLE t_order_new_0(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk_t_order_new_0 FOREIGN KEY (order_id) REFERENCES 
t_order_extend_0 (order_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_multi_data_node_and_single_data_node_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_account_detail_new(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk FOREIGN KEY (account_id) REFERENCES t_order_new 
(account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_0(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_0 FOREIGN KEY (account_id) 
REFERENCES t_order_new_0 (account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_1(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_1 FOREIGN KEY (account_id) 
REFERENCES t_order_new_0 (account_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_multi_data_node_binding_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_account_detail_new(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk FOREIGN KEY (account_id) REFERENCES 
t_account_detail_new (account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_0(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_0 FOREIGN KEY (account_id) 
REFERENCES t_account_detail_new_0 (account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_1(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_1 FOREIGN KEY (account_id) 
REFERENCES t_account_detail_new_1 (account_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_single_data_node_and_broadcast_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_order_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk FOREIGN KEY (order_id) REFERENCES t_config_new 
(order_id))" />
         <output sql="CREATE TABLE t_order_new_0(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk_t_order_new_0 FOREIGN KEY (order_id) REFERENCES 
t_config_new (order_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_multi_data_node_and_broadcast_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_account_detail_new(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk FOREIGN KEY (account_id) REFERENCES t_config_new 
(account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_0(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_0 FOREIGN KEY (account_id) 
REFERENCES t_config_new (account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_1(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_1 FOREIGN KEY (account_id) 
REFERENCES t_config_new (account_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_single_data_node_and_single_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_order_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk FOREIGN KEY (order_id) REFERENCES t_single_new 
(order_id))" />
         <output sql="CREATE TABLE t_order_new_0(order_id INT PRIMARY KEY, 
CONSTRAINT t_order_new_fk_t_order_new_0 FOREIGN KEY (order_id) REFERENCES 
t_single_new (order_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_multi_data_node_and_single_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_account_detail_new(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk FOREIGN KEY (account_id) REFERENCES t_single_new 
(account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_0(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_0 FOREIGN KEY (account_id) 
REFERENCES t_single_new (account_id))" />
         <output sql="CREATE TABLE t_account_detail_new_1(order_id INT PRIMARY 
KEY, CONSTRAINT t_account_fk_t_account_detail_new_1 FOREIGN KEY (account_id) 
REFERENCES t_single_new (account_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_broadcast_and_single_data_node_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_config_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_config_new_fk FOREIGN KEY (order_id) REFERENCES t_order_new 
(order_id))" />
-        <output sql="CREATE TABLE t_config_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_config_new_fk_t_config_new FOREIGN KEY (order_id) REFERENCES 
t_order_new_0 (order_id))" />
+        <output sql="CREATE TABLE t_config_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_config_new_fk FOREIGN KEY (order_id) REFERENCES t_order_new_0 
(order_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_broadcast_table_with_add_foreign_constraint" 
db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_config_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_config_new_fk FOREIGN KEY (order_id) REFERENCES t_order_new_type 
(order_id))" />
         <output sql="CREATE TABLE t_config_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_config_new_fk FOREIGN KEY (order_id) REFERENCES t_order_new_type 
(order_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_broadcast_and_single_table_with_add_foreign_constraint" 
db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_config_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_config_new_fk FOREIGN KEY (order_id) REFERENCES t_single_new 
(order_id))" />
         <output sql="CREATE TABLE t_config_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_config_new_fk FOREIGN KEY (order_id) REFERENCES t_single_new 
(order_id))" />
     </rewrite-assertion>
-    <rewrite-assertion 
id="create_table_with_single_and_single_data_node_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
+
+    <!--<rewrite-assertion 
id="create_table_with_single_and_single_data_node_table_with_add_foreign_constraint"
 db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_single_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_single_new_fk FOREIGN KEY (order_id) REFERENCES t_order_new 
(order_id))" />
         <output sql="CREATE TABLE t_single_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_single_new_fk FOREIGN KEY (order_id) REFERENCES t_order_new_0 
(order_id))" />
-    </rewrite-assertion>
+    </rewrite-assertion>-->
+
     <!-- TODO fix me #26299 -->
     <!--    <rewrite-assertion 
id="create_table_with_single_and_broadcast_table_with_add_foreign_constraint" 
db-types="MySQL,PostgreSQL,openGauss">-->
     <!--        <input sql="CREATE TABLE t_single_new(order_id INT PRIMARY 
KEY, CONSTRAINT t_single_new_fk FOREIGN KEY (order_id) REFERENCES t_config_new 
(order_id))" />-->
     <!--        <output sql="CREATE TABLE t_single_new(order_id INT PRIMARY 
KEY, CONSTRAINT t_single_new_fk FOREIGN KEY (order_id) REFERENCES t_config_new 
(order_id))" />-->
     <!--    </rewrite-assertion>-->
+
     <rewrite-assertion 
id="create_table_with_single_table_with_add_foreign_constraint" 
db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE TABLE t_single_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_single_new_fk FOREIGN KEY (order_id) REFERENCES t_single_extend 
(order_id))" />
         <output sql="CREATE TABLE t_single_new(order_id INT PRIMARY KEY, 
CONSTRAINT t_single_new_fk FOREIGN KEY (order_id) REFERENCES t_single_extend 
(order_id))" />
     </rewrite-assertion>
+
     <rewrite-assertion 
id="create_table_with_multi_data_node_with_storage_parameter" 
db-types="openGauss">
         <input sql="CREATE TABLE t_account_detail_new (order_id INT,account_id 
INT) WITH (FILLFACTOR = 80, ORIENTATION=ROW)" />
         <output sql="CREATE TABLE t_account_detail_new_0 (order_id 
INT,account_id INT) WITH (FILLFACTOR = 80, ORIENTATION=ROW)" />
         <output sql="CREATE TABLE t_account_detail_new_1 (order_id 
INT,account_id INT) WITH (FILLFACTOR = 80, ORIENTATION=ROW)" />
     </rewrite-assertion>
+
     <rewrite-assertion id="create_view_with_sharding_table" 
db-types="MySQL,PostgreSQL,openGauss">
         <input sql="CREATE VIEW t_account_view AS SELECT account_id, amount 
FROM t_account WHERE status = 'OK'" />
         <output sql="CREATE VIEW t_account_view_0 AS SELECT account_id, amount 
FROM t_account_0 WHERE status = 'OK'" />

Reply via email to