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 bb52b258a1c Decouple sql-federation-core in sharding and broadcast 
module, and refactor sql federation logic (#31698)
bb52b258a1c is described below

commit bb52b258a1ccfb297b06ac80eadd4af5851ac89a
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Jun 18 09:14:13 2024 +0800

    Decouple sql-federation-core in sharding and broadcast module, and refactor 
sql federation logic (#31698)
    
    * Decouple sql-federation-core in sharding and broadcast module, and 
refactor sql federation logic
    
    * remove useless route logic
    
    * remove useless route logic
    
    * remove sql federation rule
    
    * fix unit test
    
    * fix build error
    
    * comment sql federation view e2e test case
    
    * comment sql federation view e2e test case
    
    * fix unit test
    
    * fix unit test
    
    * optimize sql federation decide logic for system table
    
    * fix unit test
    
    * fix checkstyle
---
 features/broadcast/core/pom.xml                    |  5 --
 features/sharding/core/pom.xml                     |  2 +-
 .../decider/ShardingSQLFederationDecider.java      | 29 ++-----
 .../sharding/route/engine/ShardingSQLRouter.java   |  4 +-
 .../engine/type/ShardingRouteEngineFactory.java    | 18 +---
 .../ShardingStatementValidatorFactory.java         | 10 +--
 .../impl/ShardingCreateViewStatementValidator.java |  7 +-
 .../decider/ShardingSQLFederationDeciderTest.java  | 49 ++++++-----
 .../type/ShardingRouteEngineFactoryTest.java       | 99 ++++++++++------------
 .../ShardingCreateViewStatementValidatorTest.java  | 19 +----
 .../single/decider/SingleSQLFederationDecider.java | 19 ++++-
 .../sqlfederation/engine/SQLFederationEngine.java  | 53 ++++++++----
 .../engine/SQLFederationEngineTest.java            |  7 +-
 .../exception/SQLFederationSQLException.java       |  4 +
 .../SQLFederationUnsupportedSQLException.java      |  4 +-
 .../proxy/backend/connector/DatabaseConnector.java |  6 +-
 .../proxy/backend/connector/ProxySQLExecutor.java  |  6 +-
 .../connector/DatabaseConnectorFactoryTest.java    |  2 +
 .../backend/connector/DatabaseConnectorTest.java   |  1 +
 .../dql/dql-integration-select-expression.xml      |  5 +-
 .../cases/dql/dql-integration-select-order-by.xml  |  7 +-
 ...gration-select-pagination-group-by-order-by.xml | 14 +--
 .../dql/dql-integration-select-pagination.xml      |  5 +-
 .../resources/cases/dql/dql-integration-select.xml |  5 +-
 .../actual/init-sql/mysql/actual-logic_db-init.sql | 18 ++--
 .../init-sql/opengauss/actual-logic_db-init.sql    | 18 ++--
 .../init-sql/postgresql/actual-logic_db-init.sql   | 18 ++--
 .../expected/init-sql/mysql/01-expected-init.sql   |  9 +-
 .../init-sql/opengauss/01-expected-init.sql        | 17 ++--
 .../init-sql/postgresql/01-expected-init.sql       | 17 ++--
 .../test/it/rewrite/engine/SQLRewriterIT.java      |  4 -
 31 files changed, 247 insertions(+), 234 deletions(-)

diff --git a/features/broadcast/core/pom.xml b/features/broadcast/core/pom.xml
index 1e8ad2960b3..0b64ca60169 100644
--- a/features/broadcast/core/pom.xml
+++ b/features/broadcast/core/pom.xml
@@ -33,11 +33,6 @@
             <version>${project.version}</version>
         </dependency>
         
-        <dependency>
-            <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>shardingsphere-sql-federation-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
             <artifactId>shardingsphere-infra-binder</artifactId>
diff --git a/features/sharding/core/pom.xml b/features/sharding/core/pom.xml
index 14095ffe6a4..39c588c061b 100644
--- a/features/sharding/core/pom.xml
+++ b/features/sharding/core/pom.xml
@@ -70,7 +70,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>shardingsphere-sql-federation-core</artifactId>
+            <artifactId>shardingsphere-sql-federation-api</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
index a82c0e3bdc3..7a6036121f3 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDecider.java
@@ -17,15 +17,12 @@
 
 package org.apache.shardingsphere.sharding.decider;
 
-import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.datanode.DataNode;
+import org.apache.shardingsphere.infra.datanode.DataNodes;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.sharding.constant.ShardingOrder;
-import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
-import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditions;
-import 
org.apache.shardingsphere.sharding.route.engine.condition.engine.ShardingConditionEngine;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.sqlfederation.spi.SQLFederationDecider;
 
@@ -45,11 +42,7 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         if (tableNames.isEmpty()) {
             return false;
         }
-        includedDataNodes.addAll(getTableDataNodes(rule, tableNames));
-        ShardingConditions shardingConditions = 
getMergedShardingConditions(selectStatementContext, parameters, 
globalRuleMetaData, database, rule);
-        if (shardingConditions.isNeedMerge() && 
shardingConditions.isSameShardingCondition()) {
-            return false;
-        }
+        includedDataNodes.addAll(getTableDataNodes(rule, tableNames, 
database));
         if (selectStatementContext.isContainsSubquery() || 
selectStatementContext.isContainsHaving()
                 || selectStatementContext.isContainsCombine() || 
selectStatementContext.isContainsPartialDistinctAggregation()) {
             return true;
@@ -57,24 +50,16 @@ public final class ShardingSQLFederationDecider implements 
SQLFederationDecider<
         if (!selectStatementContext.isContainsJoinQuery() || 
rule.isAllTablesInSameDataSource(tableNames)) {
             return false;
         }
+        if (1 == tableNames.size() && 
selectStatementContext.isContainsJoinQuery() && 
!rule.isAllBindingTables(database, selectStatementContext, tableNames)) {
+            return true;
+        }
         return tableNames.size() > 1 && !rule.isAllBindingTables(database, 
selectStatementContext, tableNames);
     }
     
-    private Collection<DataNode> getTableDataNodes(final ShardingRule rule, 
final Collection<String> tableNames) {
+    private Collection<DataNode> getTableDataNodes(final ShardingRule rule, 
final Collection<String> tableNames, final ShardingSphereDatabase database) {
         Collection<DataNode> result = new HashSet<>();
         for (String each : tableNames) {
-            rule.findShardingTable(each).ifPresent(optional -> 
result.addAll(optional.getActualDataNodes()));
-        }
-        return result;
-    }
-    
-    private ShardingConditions getMergedShardingConditions(final 
SQLStatementContext sqlStatementContext, final List<Object> parameters,
-                                                           final RuleMetaData 
globalRuleMetaData, final ShardingSphereDatabase database, final ShardingRule 
rule) {
-        List<ShardingCondition> shardingConditions = new 
ShardingConditionEngine(
-                globalRuleMetaData, database, 
rule).createShardingConditions(sqlStatementContext, parameters);
-        ShardingConditions result = new ShardingConditions(shardingConditions, 
sqlStatementContext, rule);
-        if (result.isNeedMerge()) {
-            result.merge();
+            rule.findShardingTable(each).ifPresent(optional -> 
result.addAll(new 
DataNodes(database.getRuleMetaData().getRules()).getDataNodes(each)));
         }
         return result;
     }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
index 78bdaf66728..ea0ba7bea16 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/ShardingSQLRouter.java
@@ -65,12 +65,12 @@ public final class ShardingSQLRouter implements 
SQLRouter<ShardingRule> {
                                              final ConfigurationProperties 
props, final ConnectionContext connectionContext) {
         SQLStatement sqlStatement = 
queryContext.getSqlStatementContext().getSqlStatement();
         ShardingConditions shardingConditions = 
createShardingConditions(queryContext, globalRuleMetaData, database, rule);
-        Optional<ShardingStatementValidator> validator = 
ShardingStatementValidatorFactory.newInstance(sqlStatement, shardingConditions, 
globalRuleMetaData);
+        Optional<ShardingStatementValidator> validator = 
ShardingStatementValidatorFactory.newInstance(sqlStatement, shardingConditions);
         validator.ifPresent(optional -> optional.preValidate(rule, 
queryContext.getSqlStatementContext(), queryContext.getParameters(), database, 
props));
         if (sqlStatement instanceof DMLStatement && 
shardingConditions.isNeedMerge()) {
             shardingConditions.merge();
         }
-        RouteContext result = ShardingRouteEngineFactory.newInstance(rule, 
database, queryContext, shardingConditions, props, connectionContext, 
globalRuleMetaData).route(rule);
+        RouteContext result = ShardingRouteEngineFactory.newInstance(rule, 
database, queryContext, shardingConditions, props, 
connectionContext).route(rule);
         validator.ifPresent(optional -> optional.postValidate(rule, 
queryContext.getSqlStatementContext(), queryContext.getHintValueContext(), 
queryContext.getParameters(), database, props, result));
         return result;
     }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
index 67c54d712d6..aa21ec7a5de 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactory.java
@@ -26,7 +26,6 @@ import 
org.apache.shardingsphere.infra.binder.context.type.TableAvailable;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
@@ -50,16 +49,13 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.DCLStatemen
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterFunctionStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterProcedureStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterTablespaceStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.AlterViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateFunctionStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateProcedureStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTablespaceStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DDLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropFunctionStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropProcedureStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropTablespaceStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.tcl.TCLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLCreateResourceGroupStatement;
@@ -67,7 +63,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQ
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLSetResourceGroupStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowDatabasesStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLUseStatement;
-import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -88,12 +83,10 @@ public final class ShardingRouteEngineFactory {
      * @param shardingConditions shardingConditions
      * @param props ShardingSphere properties
      * @param connectionContext connection context
-     * @param globalRuleMetaData global rule meta data
      * @return created instance
      */
     public static ShardingRouteEngine newInstance(final ShardingRule 
shardingRule, final ShardingSphereDatabase database, final QueryContext 
queryContext,
-                                                  final ShardingConditions 
shardingConditions, final ConfigurationProperties props, final 
ConnectionContext connectionContext,
-                                                  final RuleMetaData 
globalRuleMetaData) {
+                                                  final ShardingConditions 
shardingConditions, final ConfigurationProperties props, final 
ConnectionContext connectionContext) {
         SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
         SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
         if (sqlStatement instanceof TCLStatement) {
@@ -103,7 +96,7 @@ public final class ShardingRouteEngineFactory {
             if (sqlStatementContext instanceof CursorAvailable) {
                 return getCursorRouteEngine(shardingRule, database, 
sqlStatementContext, queryContext.getHintValueContext(), shardingConditions, 
props);
             }
-            return getDDLRoutingEngine(shardingRule, database, 
sqlStatementContext, connectionContext, globalRuleMetaData);
+            return getDDLRoutingEngine(shardingRule, database, 
sqlStatementContext, connectionContext);
         }
         if (sqlStatement instanceof DALStatement) {
             return getDALRoutingEngine(shardingRule, database, 
sqlStatementContext, connectionContext);
@@ -115,7 +108,7 @@ public final class ShardingRouteEngineFactory {
     }
     
     private static ShardingRouteEngine getDDLRoutingEngine(final ShardingRule 
shardingRule, final ShardingSphereDatabase database, final SQLStatementContext 
sqlStatementContext,
-                                                           final 
ConnectionContext connectionContext, final RuleMetaData globalRuleMetaData) {
+                                                           final 
ConnectionContext connectionContext) {
         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;
@@ -129,11 +122,6 @@ public final class ShardingRouteEngineFactory {
                 ? ((TableAvailable) 
sqlStatementContext).getTablesContext().getSimpleTables().stream().map(each -> 
each.getTableName().getIdentifier().getValue()).collect(Collectors.toSet())
                 : Collections.emptyList();
         Collection<String> shardingRuleTableNames = 
shardingRule.getShardingRuleTableNames(tableNames);
-        // TODO remove this logic when jdbc adapter can support executing 
create logic view
-        boolean sqlFederationEnabled = 
globalRuleMetaData.getSingleRule(SQLFederationRule.class).getConfiguration().isSqlFederationEnabled();
-        if (sqlFederationEnabled && (sqlStatement instanceof 
CreateViewStatement || sqlStatement instanceof AlterViewStatement || 
sqlStatement instanceof DropViewStatement)) {
-            return new ShardingUnicastRoutingEngine(sqlStatementContext, 
shardingRuleTableNames, connectionContext);
-        }
         if (!tableNames.isEmpty() && shardingRuleTableNames.isEmpty()) {
             return new ShardingIgnoreRoutingEngine();
         }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
index 906a67431cb..1eb36fe2e60 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ShardingStatementValidatorFactory.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.sharding.route.engine.validator;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingConditions;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.ddl.impl.ShardingAlterIndexStatementValidator;
 import 
org.apache.shardingsphere.sharding.route.engine.validator.ddl.impl.ShardingAlterTableStatementValidator;
@@ -74,12 +73,11 @@ public final class ShardingStatementValidatorFactory {
      * 
      * @param sqlStatement SQL statement
      * @param shardingConditions sharding conditions
-     * @param globalRuleMetaData global rule meta data
      * @return created instance
      */
-    public static Optional<ShardingStatementValidator> newInstance(final 
SQLStatement sqlStatement, final ShardingConditions shardingConditions, final 
RuleMetaData globalRuleMetaData) {
+    public static Optional<ShardingStatementValidator> newInstance(final 
SQLStatement sqlStatement, final ShardingConditions shardingConditions) {
         if (sqlStatement instanceof DDLStatement) {
-            return getDDLStatementValidator(sqlStatement, globalRuleMetaData);
+            return getDDLStatementValidator(sqlStatement);
         }
         if (sqlStatement instanceof DMLStatement) {
             return getDMLStatementValidator(sqlStatement, shardingConditions);
@@ -87,7 +85,7 @@ public final class ShardingStatementValidatorFactory {
         return Optional.empty();
     }
     
-    private static Optional<ShardingStatementValidator> 
getDDLStatementValidator(final SQLStatement sqlStatement, final RuleMetaData 
globalRuleMetaData) {
+    private static Optional<ShardingStatementValidator> 
getDDLStatementValidator(final SQLStatement sqlStatement) {
         if (sqlStatement instanceof CreateTableStatement) {
             return Optional.of(new ShardingCreateTableStatementValidator());
         }
@@ -98,7 +96,7 @@ public final class ShardingStatementValidatorFactory {
             return Optional.of(new 
ShardingCreateProcedureStatementValidator());
         }
         if (sqlStatement instanceof CreateViewStatement) {
-            return Optional.of(new 
ShardingCreateViewStatementValidator(globalRuleMetaData));
+            return Optional.of(new ShardingCreateViewStatementValidator());
         }
         if (sqlStatement instanceof CreateIndexStatement) {
             return Optional.of(new ShardingCreateIndexStatementValidator());
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
index 0e80e1a5399..d68fe4dbd10 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/impl/ShardingCreateViewStatementValidator.java
@@ -22,7 +22,6 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 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.sharding.exception.metadata.EngagedViewException;
 import 
org.apache.shardingsphere.sharding.exception.syntax.UnsupportedCreateViewException;
@@ -35,7 +34,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.Sim
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.handler.dml.SelectStatementHandler;
-import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -47,16 +45,13 @@ import java.util.List;
 @RequiredArgsConstructor
 public final class ShardingCreateViewStatementValidator extends 
ShardingDDLStatementValidator {
     
-    private final RuleMetaData globalRuleMetaData;
-    
     @Override
     public void preValidate(final ShardingRule shardingRule, final 
SQLStatementContext sqlStatementContext,
                             final List<Object> params, final 
ShardingSphereDatabase database, final ConfigurationProperties props) {
         TableExtractor extractor = new TableExtractor();
         extractor.extractTablesFromSelect(((CreateViewStatement) 
sqlStatementContext.getSqlStatement()).getSelect());
         Collection<SimpleTableSegment> tableSegments = 
extractor.getRewriteTables();
-        boolean sqlFederationEnabled = 
globalRuleMetaData.getSingleRule(SQLFederationRule.class).getConfiguration().isSqlFederationEnabled();
-        if (!sqlFederationEnabled && 
isShardingTablesWithoutBinding(shardingRule, sqlStatementContext, 
tableSegments)) {
+        if (isShardingTablesWithoutBinding(shardingRule, sqlStatementContext, 
tableSegments)) {
             throw new EngagedViewException("sharding");
         }
     }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
index 5491b54fe39..81b63babb01 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/decider/ShardingSQLFederationDeciderTest.java
@@ -23,6 +23,7 @@ import 
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import 
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.sharding.rule.BindingTableRule;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
@@ -49,6 +50,8 @@ class ShardingSQLFederationDeciderTest {
     void assertDecideWhenNotContainsShardingTable() {
         ShardingRule rule = mock(ShardingRule.class);
         when(rule.getShardingLogicTableNames(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(Collections.emptyList());
+        
when(rule.findShardingTable("t_order")).thenReturn(Optional.of(mock(ShardingTable.class)));
+        
when(rule.findShardingTable("t_order_item")).thenReturn(Optional.of(mock(ShardingTable.class)));
         Collection<DataNode> includedDataNodes = new HashSet<>();
         assertFalse(new ShardingSQLFederationDecider().decide(
                 createStatementContext(), Collections.emptyList(), 
mock(RuleMetaData.class), mock(ShardingSphereDatabase.class), rule, 
includedDataNodes));
@@ -60,7 +63,8 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsSubquery()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(), 
createShardingRule(), includedDataNodes));
+        ShardingRule shardingRule = createShardingRule();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
@@ -69,7 +73,8 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsSubquery()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(), 
createShardingRule(), includedDataNodes));
+        ShardingRule shardingRule = createShardingRule();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
@@ -78,7 +83,8 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsHaving()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(), 
createShardingRule(), includedDataNodes));
+        ShardingRule shardingRule = createShardingRule();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
@@ -87,7 +93,8 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsCombine()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(), 
createShardingRule(), includedDataNodes));
+        ShardingRule shardingRule = createShardingRule();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
@@ -96,7 +103,8 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsPartialDistinctAggregation()).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(), 
createShardingRule(), includedDataNodes));
+        ShardingRule shardingRule = createShardingRule();
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
@@ -107,7 +115,7 @@ class ShardingSQLFederationDeciderTest {
         ShardingRule shardingRule = createShardingRule();
         when(shardingRule.isAllTablesInSameDataSource(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), createDatabase(), 
shardingRule, includedDataNodes));
+        assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), 
createDatabase(shardingRule), shardingRule, includedDataNodes));
         assertThat(includedDataNodes.size(), is(4));
     }
     
@@ -116,7 +124,7 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsJoinQuery()).thenReturn(true);
         ShardingRule shardingRule = createShardingRule();
-        ShardingSphereDatabase database = createDatabase();
+        ShardingSphereDatabase database = createDatabase(shardingRule);
         when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(true);
         Collection<DataNode> includedDataNodes = new HashSet<>();
         assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
@@ -128,7 +136,7 @@ class ShardingSQLFederationDeciderTest {
         SelectStatementContext select = createStatementContext();
         when(select.isContainsJoinQuery()).thenReturn(true);
         ShardingRule shardingRule = createShardingRule();
-        ShardingSphereDatabase database = createDatabase();
+        ShardingSphereDatabase database = createDatabase(shardingRule);
         when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
         Collection<DataNode> includedDataNodes = new HashSet<>();
         assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
@@ -142,10 +150,11 @@ class ShardingSQLFederationDeciderTest {
         when(select.isContainsJoinQuery()).thenReturn(true);
         ShardingRule shardingRule = createShardingRule();
         
when(shardingRule.getShardingLogicTableNames(Collections.singletonList("t_order"))).thenReturn(Collections.singletonList("t_order"));
-        ShardingSphereDatabase database = createDatabase();
+        ShardingSphereDatabase database = createDatabase(shardingRule);
         when(shardingRule.isAllBindingTables(database, select, 
Collections.singletonList("t_order"))).thenReturn(false);
         Collection<DataNode> includedDataNodes = new HashSet<>();
-        assertFalse(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
+        assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
+        assertThat(includedDataNodes.size(), is(2));
     }
     
     @Test
@@ -154,7 +163,7 @@ class ShardingSQLFederationDeciderTest {
         when(select.isContainsJoinQuery()).thenReturn(true);
         when(select.getPaginationContext().isHasPagination()).thenReturn(true);
         ShardingRule shardingRule = createShardingRule();
-        ShardingSphereDatabase database = createDatabase();
+        ShardingSphereDatabase database = createDatabase(shardingRule);
         when(shardingRule.isAllBindingTables(database, select, 
Arrays.asList("t_order", "t_order_item"))).thenReturn(false);
         Collection<DataNode> includedDataNodes = new HashSet<>();
         assertTrue(new ShardingSQLFederationDecider().decide(select, 
Collections.emptyList(), mock(RuleMetaData.class), database, shardingRule, 
includedDataNodes));
@@ -168,20 +177,22 @@ class ShardingSQLFederationDeciderTest {
         return result;
     }
     
-    private ShardingSphereDatabase createDatabase() {
-        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+    private ShardingSphereDatabase createDatabase(final ShardingRule 
shardingRule) {
+        ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(result.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
+        
when(result.getRuleMetaData().getRules()).thenReturn(Collections.singletonList(shardingRule));
         return result;
     }
     
     private ShardingRule createShardingRule() {
-        ShardingRule result = mock(ShardingRule.class);
+        ShardingRule result = mock(ShardingRule.class, RETURNS_DEEP_STUBS);
         when(result.getShardingLogicTableNames(Arrays.asList("t_order", 
"t_order_item"))).thenReturn(Arrays.asList("t_order", "t_order_item"));
-        ShardingTable shardingTable = mock(ShardingTable.class);
-        when(shardingTable.getActualDataNodes()).thenReturn(Arrays.asList(
-                new DataNode("ds_0", "t_order"), new DataNode("ds_1", 
"t_order"),
-                new DataNode("ds_0", "t_order_item"), new DataNode("ds_1", 
"t_order_item")));
-        
when(result.findShardingTable("t_order")).thenReturn(Optional.of(shardingTable));
+        DataNodeRuleAttribute dataNodeRuleAttribute = 
mock(DataNodeRuleAttribute.class);
+        
when(result.getAttributes().findAttribute(DataNodeRuleAttribute.class)).thenReturn(Optional.of(dataNodeRuleAttribute));
+        
when(dataNodeRuleAttribute.getDataNodesByTableName("t_order")).thenReturn(Arrays.asList(new
 DataNode("ds_0", "t_order"), new DataNode("ds_1", "t_order")));
+        
when(dataNodeRuleAttribute.getDataNodesByTableName("t_order_item")).thenReturn(Arrays.asList(new
 DataNode("ds_0", "t_order_item"), new DataNode("ds_1", "t_order_item")));
+        
when(result.findShardingTable("t_order")).thenReturn(Optional.of(mock(ShardingTable.class)));
+        
when(result.findShardingTable("t_order_item")).thenReturn(Optional.of(mock(ShardingTable.class)));
         BindingTableRule bindingTableRule = mock(BindingTableRule.class);
         when(bindingTableRule.hasLogicTable("t_order")).thenReturn(true);
         when(bindingTableRule.hasLogicTable("t_order_item")).thenReturn(true);
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
index 4051c2eb270..4c282ecc1f8 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ShardingRouteEngineFactoryTest.java
@@ -28,7 +28,6 @@ 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.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -67,7 +66,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dal
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.postgresql.dcl.PostgreSQLGrantStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sql92.dcl.SQL92GrantStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerGrantStatement;
-import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -127,7 +125,7 @@ class ShardingRouteEngineFactoryTest {
         when(sqlStatementContext.getSqlStatement()).thenReturn(tclStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
         ShardingRouteEngine actual =
-                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingDatabaseBroadcastRoutingEngine.class));
     }
     
@@ -135,12 +133,7 @@ class ShardingRouteEngineFactoryTest {
     void assertNewInstanceForDDLWithShardingRule() {
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(DDLStatement.class));
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
-        SQLFederationRule sqlFederationRule = mock(SQLFederationRule.class, 
RETURNS_DEEP_STUBS);
-        
when(globalRuleMetaData.getSingleRule(SQLFederationRule.class)).thenReturn(sqlFederationRule);
-        
when(sqlFederationRule.getConfiguration().isSqlFederationEnabled()).thenReturn(false);
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), globalRuleMetaData);
+        ShardingRouteEngine actual = 
ShardingRouteEngineFactory.newInstance(shardingRule, database, queryContext, 
shardingConditions, props, new ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingTableBroadcastRoutingEngine.class));
     }
     
@@ -151,8 +144,8 @@ class ShardingRouteEngineFactoryTest {
         DALStatement dalStatement = mock(DALStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
     }
     
@@ -161,8 +154,8 @@ class ShardingRouteEngineFactoryTest {
         DALStatement dalStatement = mock(DALStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingDataSourceGroupBroadcastRoutingEngine.class));
     }
     
@@ -171,8 +164,8 @@ class ShardingRouteEngineFactoryTest {
         DALStatement dalStatement = mock(MySQLShowDatabasesStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingDatabaseBroadcastRoutingEngine.class));
     }
     
@@ -189,8 +182,8 @@ class ShardingRouteEngineFactoryTest {
     private void assertNewInstanceForDALSet(final DALStatement dalStatement) {
         when(sqlStatementContext.getSqlStatement()).thenReturn(dalStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingDatabaseBroadcastRoutingEngine.class));
     }
     
@@ -228,8 +221,8 @@ class ShardingRouteEngineFactoryTest {
         grantStatement.getTables().add(new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("tbl"))));
         GrantStatementContext sqlStatementContext = new 
GrantStatementContext(grantStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingIgnoreRoutingEngine.class));
     }
     
@@ -237,8 +230,8 @@ class ShardingRouteEngineFactoryTest {
         grantStatement.getTables().add(new SimpleTableSegment(new 
TableNameSegment(0, 0, new IdentifierValue("tbl"))));
         GrantStatementContext sqlStatementContext = new 
GrantStatementContext(grantStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingIgnoreRoutingEngine.class));
     }
     
@@ -247,8 +240,8 @@ class ShardingRouteEngineFactoryTest {
         DCLStatement dclStatement = mock(DCLStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(dclStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingInstanceBroadcastRoutingEngine.class));
     }
     
@@ -257,8 +250,8 @@ class ShardingRouteEngineFactoryTest {
         SQLStatement sqlStatement = mock(MySQLSelectStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
     }
     
@@ -267,8 +260,8 @@ class ShardingRouteEngineFactoryTest {
         SQLStatement sqlStatement = mock(MySQLSelectStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
     }
     
@@ -277,8 +270,8 @@ class ShardingRouteEngineFactoryTest {
         SQLStatement sqlStatement = mock(SQLStatement.class);
         when(sqlStatementContext.getSqlStatement()).thenReturn(sqlStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
     }
     
@@ -290,8 +283,8 @@ class ShardingRouteEngineFactoryTest {
         when(shardingRule.getShardingLogicTableNames(((TableAvailable) 
sqlStatementContext).getTablesContext().getTableNames())).thenReturn(tableNames);
         when(shardingRule.isAllShardingTables(tableNames)).thenReturn(true);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingStandardRoutingEngine.class));
     }
     
@@ -303,8 +296,8 @@ class ShardingRouteEngineFactoryTest {
         tableNames.add("2");
         
when(shardingRule.getShardingLogicTableNames(tableNames)).thenReturn(tableNames);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingComplexRoutingEngine.class));
     }
     
@@ -315,8 +308,8 @@ class ShardingRouteEngineFactoryTest {
         tableNames.add("table_1");
         
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
     }
     
@@ -327,8 +320,8 @@ class ShardingRouteEngineFactoryTest {
         tableNames.add("table_1");
         
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingUnicastRoutingEngine.class));
     }
     
@@ -342,8 +335,8 @@ class ShardingRouteEngineFactoryTest {
         
when(shardingRule.getShardingTable("t_order").getActualDataSourceNames()).thenReturn(Arrays.asList("ds_0",
 "ds_1"));
         
when(shardingRule.isAllShardingTables(Collections.singletonList("t_order"))).thenReturn(true);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
mock(ConfigurationProperties.class), new 
ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual = 
ShardingRouteEngineFactory.newInstance(shardingRule, database, queryContext, 
shardingConditions, mock(ConfigurationProperties.class),
+                new ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingStandardRoutingEngine.class));
     }
     
@@ -352,8 +345,8 @@ class ShardingRouteEngineFactoryTest {
         MySQLCreateResourceGroupStatement resourceGroupStatement = 
mock(MySQLCreateResourceGroupStatement.class);
         
when(sqlStatementContext.getSqlStatement()).thenReturn(resourceGroupStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingInstanceBroadcastRoutingEngine.class));
     }
     
@@ -362,8 +355,8 @@ class ShardingRouteEngineFactoryTest {
         MySQLSetResourceGroupStatement resourceGroupStatement = 
mock(MySQLSetResourceGroupStatement.class);
         
when(sqlStatementContext.getSqlStatement()).thenReturn(resourceGroupStatement);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingInstanceBroadcastRoutingEngine.class));
     }
     
@@ -374,8 +367,8 @@ class ShardingRouteEngineFactoryTest {
         tableNames.add("table_1");
         
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingTableBroadcastRoutingEngine.class));
     }
     
@@ -386,8 +379,8 @@ class ShardingRouteEngineFactoryTest {
         tableNames.add("table_1");
         
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(Collections.emptyList());
         QueryContext queryContext = new QueryContext(sqlStatementContext, "", 
Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingIgnoreRoutingEngine.class));
     }
     
@@ -404,8 +397,8 @@ class ShardingRouteEngineFactoryTest {
         
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
         
when(shardingRule.getShardingLogicTableNames(tableNames)).thenReturn(tableNames);
         QueryContext queryContext = new QueryContext(cursorStatementContext, 
"", Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingStandardRoutingEngine.class));
     }
     
@@ -417,8 +410,8 @@ class ShardingRouteEngineFactoryTest {
         Collection<SimpleTableSegment> tableSegments = 
createSimpleTableSegments();
         
when(cursorStatementContext.getTablesContext().getSimpleTables()).thenReturn(tableSegments);
         QueryContext queryContext = new QueryContext(cursorStatementContext, 
"", Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, instanceOf(ShardingIgnoreRoutingEngine.class));
     }
     
@@ -432,8 +425,8 @@ class ShardingRouteEngineFactoryTest {
         
when(closeStatementContext.getSqlStatement()).thenReturn(closeStatement);
         
when(shardingRule.getShardingRuleTableNames(tableNames)).thenReturn(tableNames);
         QueryContext queryContext = new QueryContext(closeStatementContext, 
"", Collections.emptyList(), new HintValueContext());
-        ShardingRouteEngine actual = ShardingRouteEngineFactory.newInstance(
-                shardingRule, database, queryContext, shardingConditions, 
props, new ConnectionContext(Collections::emptySet), mock(RuleMetaData.class));
+        ShardingRouteEngine actual =
+                ShardingRouteEngineFactory.newInstance(shardingRule, database, 
queryContext, shardingConditions, props, new 
ConnectionContext(Collections::emptySet));
         assertThat(actual, 
instanceOf(ShardingDatabaseBroadcastRoutingEngine.class));
     }
     
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
index 2b32fbfba16..54b591b2b52 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/ddl/ShardingCreateViewStatementValidatorTest.java
@@ -21,7 +21,6 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.ddl.CreateViewSt
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.hint.HintValueContext;
 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.sharding.exception.metadata.EngagedViewException;
 import 
org.apache.shardingsphere.sharding.exception.syntax.UnsupportedCreateViewException;
@@ -33,7 +32,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.Tab
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateViewStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
-import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -49,7 +47,6 @@ import java.util.Optional;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -83,11 +80,7 @@ class ShardingCreateViewStatementValidatorTest {
     
     @Test
     void assertPreValidateCreateView() {
-        RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
-        SQLFederationRule sqlFederationRule = mock(SQLFederationRule.class, 
RETURNS_DEEP_STUBS);
-        
when(globalRuleMetaData.getSingleRule(SQLFederationRule.class)).thenReturn(sqlFederationRule);
-        
when(sqlFederationRule.getConfiguration().isSqlFederationEnabled()).thenReturn(false);
-        assertDoesNotThrow(() -> new 
ShardingCreateViewStatementValidator(globalRuleMetaData).preValidate(
+        assertDoesNotThrow(() -> new 
ShardingCreateViewStatementValidator().preValidate(
                 shardingRule, createViewStatementContext, 
Collections.emptyList(), mock(ShardingSphereDatabase.class), 
mock(ConfigurationProperties.class)));
     }
     
@@ -96,12 +89,8 @@ class ShardingCreateViewStatementValidatorTest {
         when(shardingRule.isShardingTable(any())).thenReturn(true);
         when(shardingRule.isAllBindingTables(any())).thenReturn(false);
         ConfigurationProperties props = mock(ConfigurationProperties.class);
-        RuleMetaData globalRuleMetaData = mock(RuleMetaData.class);
-        SQLFederationRule sqlFederationRule = mock(SQLFederationRule.class, 
RETURNS_DEEP_STUBS);
-        
when(globalRuleMetaData.getSingleRule(SQLFederationRule.class)).thenReturn(sqlFederationRule);
-        
when(sqlFederationRule.getConfiguration().isSqlFederationEnabled()).thenReturn(false);
         assertThrows(EngagedViewException.class,
-                () -> new 
ShardingCreateViewStatementValidator(globalRuleMetaData).preValidate(shardingRule,
 createViewStatementContext, Collections.emptyList(), 
mock(ShardingSphereDatabase.class),
+                () -> new 
ShardingCreateViewStatementValidator().preValidate(shardingRule, 
createViewStatementContext, Collections.emptyList(), 
mock(ShardingSphereDatabase.class),
                         props));
     }
     
@@ -109,7 +98,7 @@ class ShardingCreateViewStatementValidatorTest {
     void assertPostValidateCreateView() {
         ProjectionsSegment projectionsSegment = mock(ProjectionsSegment.class);
         when(selectStatement.getProjections()).thenReturn(projectionsSegment);
-        assertDoesNotThrow(() -> new 
ShardingCreateViewStatementValidator(mock(RuleMetaData.class)).postValidate(
+        assertDoesNotThrow(() -> new 
ShardingCreateViewStatementValidator().postValidate(
                 shardingRule, createViewStatementContext, new 
HintValueContext(), Collections.emptyList(), 
mock(ShardingSphereDatabase.class), mock(ConfigurationProperties.class), 
routeContext));
     }
     
@@ -119,7 +108,7 @@ class ShardingCreateViewStatementValidatorTest {
         when(projectionsSegment.isDistinctRow()).thenReturn(true);
         when(selectStatement.getProjections()).thenReturn(projectionsSegment);
         assertThrows(UnsupportedCreateViewException.class,
-                () -> new 
ShardingCreateViewStatementValidator(mock(RuleMetaData.class)).postValidate(shardingRule,
+                () -> new 
ShardingCreateViewStatementValidator().postValidate(shardingRule,
                         createViewStatementContext, new HintValueContext(), 
Collections.emptyList(), mock(ShardingSphereDatabase.class), 
mock(ConfigurationProperties.class), routeContext));
     }
 }
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
index 89963073110..76350d9f1f0 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decider/SingleSQLFederationDecider.java
@@ -25,6 +25,9 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
 import org.apache.shardingsphere.single.constant.SingleOrder;
 import org.apache.shardingsphere.single.rule.SingleRule;
+import org.apache.shardingsphere.sql.parser.sql.common.enums.JoinType;
+import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.JoinTableSegment;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
 import org.apache.shardingsphere.sqlfederation.spi.SQLFederationDecider;
 
 import java.util.Collection;
@@ -46,9 +49,21 @@ public final class SingleSQLFederationDecider implements 
SQLFederationDecider<Si
         if (containsView(database, singleTables)) {
             return true;
         }
-        boolean isAllTablesInSameComputeNode = 
rule.isAllTablesInSameComputeNode(includedDataNodes, singleTables);
+        if (!includedDataNodes.isEmpty() && 
!isInnerCommaJoin(selectStatementContext.getSqlStatement())) {
+            return true;
+        }
+        boolean result = rule.isAllTablesInSameComputeNode(includedDataNodes, 
singleTables);
         includedDataNodes.addAll(getTableDataNodes(rule, singleTables));
-        return !isAllTablesInSameComputeNode;
+        return !result;
+    }
+    
+    private boolean isInnerCommaJoin(final SelectStatement selectStatement) {
+        if (!selectStatement.getFrom().isPresent() || 
!(selectStatement.getFrom().get() instanceof JoinTableSegment)) {
+            return true;
+        }
+        return selectStatement.getFrom().isPresent() && 
selectStatement.getFrom().get() instanceof JoinTableSegment
+                && (JoinType.INNER.name().equalsIgnoreCase(((JoinTableSegment) 
selectStatement.getFrom().get()).getJoinType())
+                        || 
JoinType.COMMA.name().equalsIgnoreCase(((JoinTableSegment) 
selectStatement.getFrom().get()).getJoinType()));
     }
     
     private Collection<QualifiedTable> getSingleTables(final 
SelectStatementContext selectStatementContext, final ShardingSphereDatabase 
database, final SingleRule rule) {
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
index 17b2bebf1f7..18700233bd0 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngine.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.sqlfederation.engine;
 
+import com.cedarsoftware.util.CaseInsensitiveSet;
 import lombok.Getter;
 import org.apache.calcite.adapter.enumerable.EnumerableInterpretable;
 import org.apache.calcite.adapter.enumerable.EnumerableRel;
@@ -95,9 +96,9 @@ public final class SQLFederationEngine implements 
AutoCloseable {
     @SuppressWarnings("rawtypes")
     private final Map<ShardingSphereRule, SQLFederationDecider> deciders;
     
-    private final String databaseName;
+    private final String defaultDatabaseName;
     
-    private final String schemaName;
+    private final String defaultSchemaName;
     
     private final ShardingSphereMetaData metaData;
     
@@ -109,10 +110,11 @@ public final class SQLFederationEngine implements 
AutoCloseable {
     
     private ResultSet resultSet;
     
-    public SQLFederationEngine(final String databaseName, final String 
schemaName, final ShardingSphereMetaData metaData, final 
ShardingSphereStatistics statistics, final JDBCExecutor jdbcExecutor) {
-        deciders = OrderedSPILoader.getServices(SQLFederationDecider.class, 
metaData.getDatabase(databaseName).getRuleMetaData().getRules());
-        this.databaseName = databaseName;
-        this.schemaName = schemaName;
+    public SQLFederationEngine(final String defaultDatabaseName, final String 
defaultSchemaName, final ShardingSphereMetaData metaData, final 
ShardingSphereStatistics statistics,
+                               final JDBCExecutor jdbcExecutor) {
+        deciders = OrderedSPILoader.getServices(SQLFederationDecider.class, 
metaData.getDatabase(defaultDatabaseName).getRuleMetaData().getRules());
+        this.defaultDatabaseName = defaultDatabaseName;
+        this.defaultSchemaName = defaultSchemaName;
         this.metaData = metaData;
         this.statistics = statistics;
         this.jdbcExecutor = jdbcExecutor;
@@ -124,14 +126,14 @@ public final class SQLFederationEngine implements 
AutoCloseable {
      *
      * @param sqlStatementContext SQL statement context
      * @param parameters SQL parameters
-     * @param database ShardingSphere database
+     * @param defaultDatabase default database
      * @param globalRuleMetaData global rule meta data
      * @return use SQL federation or not
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    public boolean decide(final SQLStatementContext sqlStatementContext, final 
List<Object> parameters, final ShardingSphereDatabase database, final 
RuleMetaData globalRuleMetaData) {
+    public boolean decide(final SQLStatementContext sqlStatementContext, final 
List<Object> parameters, final ShardingSphereDatabase defaultDatabase, final 
RuleMetaData globalRuleMetaData) {
         // TODO BEGIN: move this logic to SQLFederationDecider implement class 
when we remove sql federation type
-        if (isQuerySystemSchema(sqlStatementContext, database)) {
+        if (isQuerySystemSchema(sqlStatementContext, defaultDatabase)) {
             return true;
         }
         // TODO END
@@ -143,9 +145,15 @@ public final class SQLFederationEngine implements 
AutoCloseable {
         if (allQueryUseSQLFederation) {
             return true;
         }
+        SelectStatementContext selectStatementContext = 
(SelectStatementContext) sqlStatementContext;
+        Collection<String> usedDatabaseNames = 
getUsedDatabaseNames(selectStatementContext, defaultDatabase);
+        if (usedDatabaseNames.size() > 1) {
+            return true;
+        }
+        ShardingSphereDatabase currentDatabase = 
metaData.getDatabase(usedDatabaseNames.iterator().next());
         Collection<DataNode> includedDataNodes = new HashSet<>();
         for (Entry<ShardingSphereRule, SQLFederationDecider> entry : 
deciders.entrySet()) {
-            boolean isUseSQLFederation = 
entry.getValue().decide((SelectStatementContext) sqlStatementContext, 
parameters, globalRuleMetaData, database, entry.getKey(), includedDataNodes);
+            boolean isUseSQLFederation = 
entry.getValue().decide(selectStatementContext, parameters, globalRuleMetaData, 
currentDatabase, entry.getKey(), includedDataNodes);
             if (isUseSQLFederation) {
                 return true;
             }
@@ -153,11 +161,20 @@ public final class SQLFederationEngine implements 
AutoCloseable {
         return false;
     }
     
-    private boolean isQuerySystemSchema(final SQLStatementContext 
sqlStatementContext, final ShardingSphereDatabase database) {
-        return sqlStatementContext instanceof SelectStatementContext
-                && 
(SystemSchemaUtils.containsSystemSchema(sqlStatementContext.getDatabaseType(), 
((SelectStatementContext) 
sqlStatementContext).getTablesContext().getSchemaNames(), database)
-                        || 
SystemSchemaUtils.isOpenGaussSystemCatalogQuery(sqlStatementContext.getDatabaseType(),
-                                ((SelectStatementContext) 
sqlStatementContext).getSqlStatement().getProjections().getProjections()));
+    private boolean isQuerySystemSchema(final SQLStatementContext 
sqlStatementContext, final ShardingSphereDatabase defaultDatabase) {
+        if (!(sqlStatementContext instanceof SelectStatementContext)) {
+            return false;
+        }
+        SelectStatementContext selectStatementContext = 
(SelectStatementContext) sqlStatementContext;
+        ShardingSphereDatabase database = 
selectStatementContext.getTablesContext().getDatabaseNames().stream().map(metaData::getDatabase).findFirst().orElse(defaultDatabase);
+        return 
SystemSchemaUtils.containsSystemSchema(sqlStatementContext.getDatabaseType(), 
selectStatementContext.getTablesContext().getSchemaNames(), database)
+                || 
SystemSchemaUtils.isOpenGaussSystemCatalogQuery(sqlStatementContext.getDatabaseType(),
 selectStatementContext.getSqlStatement().getProjections().getProjections());
+    }
+    
+    private Collection<String> getUsedDatabaseNames(final 
SelectStatementContext selectStatementContext, final ShardingSphereDatabase 
defaultDatabase) {
+        Collection<String> result = new 
CaseInsensitiveSet<>(selectStatementContext.getTablesContext().getDatabaseNames());
+        result.add(defaultDatabase.getName());
+        return result;
     }
     
     /**
@@ -172,8 +189,8 @@ public final class SQLFederationEngine implements 
AutoCloseable {
     public ResultSet executeQuery(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
                                   final JDBCExecutorCallback<? extends 
ExecuteResult> callback, final SQLFederationContext federationContext) {
         try {
-            String databaseName = 
federationContext.getQueryContext().getDatabaseNameFromSQLStatement().orElse(this.databaseName);
-            String schemaName = 
federationContext.getQueryContext().getSchemaNameFromSQLStatement().orElse(this.schemaName);
+            String databaseName = 
federationContext.getQueryContext().getDatabaseNameFromSQLStatement().orElse(defaultDatabaseName);
+            String schemaName = 
federationContext.getQueryContext().getSchemaNameFromSQLStatement().orElse(defaultSchemaName);
             OptimizerMetaData optimizerMetaData = 
sqlFederationRule.getOptimizerContext().getMetaData(databaseName);
             CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(sqlFederationRule.getOptimizerContext().getParserContext(databaseName).getDialectProps());
             CalciteCatalogReader catalogReader = 
SQLFederationPlannerUtils.createCatalogReader(schemaName, 
optimizerMetaData.getSchema(schemaName), DEFAULT_DATA_TYPE_FACTORY, 
connectionConfig);
@@ -189,7 +206,7 @@ public final class SQLFederationEngine implements 
AutoCloseable {
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
             // CHECKSTYLE:ON
-            throw new 
SQLFederationUnsupportedSQLException(federationContext.getQueryContext().getSql());
+            throw new 
SQLFederationUnsupportedSQLException(federationContext.getQueryContext().getSql(),
 ex);
         }
     }
     
diff --git 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
index 5336636087b..090facd17a3 100644
--- 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
+++ 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/engine/SQLFederationEngineTest.java
@@ -63,12 +63,13 @@ class SQLFederationEngineTest {
     void assertDecideWhenSelectStatementContainsSystemSchema() throws 
SQLException {
         Collection<ShardingSphereRule> globalRules =
                 Collections.singleton(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap()));
-        SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
Collections.emptyList());
         SelectStatementContext sqlStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
+        
when(sqlStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.singletonList("information_schema"));
         
when(sqlStatementContext.getTablesContext().getSchemaNames()).thenReturn(Collections.singletonList("information_schema"));
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 databaseType, mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), mock(RuleMetaData.class), Collections.emptyMap());
+        SQLFederationEngine engine = createSQLFederationEngine(globalRules, 
Collections.emptyList());
         assertTrue(engine.decide(sqlStatementContext, Collections.emptyList(), 
database, mock(RuleMetaData.class)));
         engine.close();
     }
@@ -102,6 +103,7 @@ class SQLFederationEngineTest {
         RuleMetaData globalRuleMetaData = new RuleMetaData(globalRules);
         SelectStatementContext selectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(selectStatementContext.getDatabaseType()).thenReturn(databaseType);
+        
when(selectStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
         assertTrue(engine.decide(selectStatementContext, 
Collections.emptyList(), database, globalRuleMetaData));
         engine.close();
     }
@@ -129,6 +131,7 @@ class SQLFederationEngineTest {
         RuleMetaData globalRuleMetaData = new RuleMetaData(globalRules);
         SelectStatementContext selectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(selectStatementContext.getDatabaseType()).thenReturn(databaseType);
+        
when(selectStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
         assertTrue(engine.decide(selectStatementContext, 
Collections.emptyList(), database, globalRuleMetaData));
         engine.close();
     }
@@ -143,6 +146,7 @@ class SQLFederationEngineTest {
                 databaseType, mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), new RuleMetaData(databaseRules), Collections.emptyMap());
         SelectStatementContext selectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(selectStatementContext.getDatabaseType()).thenReturn(databaseType);
+        
when(selectStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
         assertFalse(engine.decide(selectStatementContext, 
Collections.emptyList(), database, new RuleMetaData(globalRules)));
         engine.close();
     }
@@ -158,6 +162,7 @@ class SQLFederationEngineTest {
                 databaseType, mock(ResourceMetaData.class, 
RETURNS_DEEP_STUBS), new RuleMetaData(databaseRules), Collections.emptyMap());
         SelectStatementContext selectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(selectStatementContext.getDatabaseType()).thenReturn(databaseType);
+        
when(selectStatementContext.getTablesContext().getDatabaseNames()).thenReturn(Collections.emptyList());
         assertTrue(engine.decide(selectStatementContext, 
Collections.emptyList(), database, new RuleMetaData(globalRules)));
         engine.close();
     }
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationSQLException.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationSQLException.java
index 1e688aab921..c00c7a06a98 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationSQLException.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationSQLException.java
@@ -32,4 +32,8 @@ public abstract class SQLFederationSQLException extends 
FeatureSQLException {
     protected SQLFederationSQLException(final SQLState sqlState, final int 
errorCode, final String reason, final Object... messageArgs) {
         super(sqlState, FEATURE_CODE, errorCode, reason, messageArgs);
     }
+    
+    protected SQLFederationSQLException(final SQLState sqlState, final int 
errorCode, final Exception cause, final String reason, final Object... 
messageArgs) {
+        super(sqlState, FEATURE_CODE, errorCode, cause, reason, messageArgs);
+    }
 }
diff --git 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationUnsupportedSQLException.java
 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationUnsupportedSQLException.java
index c38fcfdc1f0..25a925cdf8a 100644
--- 
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationUnsupportedSQLException.java
+++ 
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/exception/SQLFederationUnsupportedSQLException.java
@@ -26,7 +26,7 @@ public final class SQLFederationUnsupportedSQLException 
extends SQLFederationSQL
     
     private static final long serialVersionUID = -8571244162760408846L;
     
-    public SQLFederationUnsupportedSQLException(final String sql) {
-        super(XOpenSQLState.SYNTAX_ERROR, 1, "SQL federation does not support 
SQL '%s'.", sql);
+    public SQLFederationUnsupportedSQLException(final String sql, final 
Exception cause) {
+        super(XOpenSQLState.SYNTAX_ERROR, 1, cause, "SQL federation does not 
support SQL '%s'.", sql);
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
index 3f1e06e8788..9b8baca5ff4 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnector.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.connector;
 
 import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 import 
org.apache.shardingsphere.infra.binder.context.aware.CursorDefinitionAware;
 import 
org.apache.shardingsphere.infra.binder.context.segment.insert.keygen.GeneratedKeyContext;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
@@ -166,7 +167,10 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     @Override
     public ResponseHeader execute() throws SQLException {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        if 
(proxySQLExecutor.getSqlFederationEngine().decide(queryContext.getSqlStatementContext(),
 queryContext.getParameters(), database, 
metaDataContexts.getMetaData().getGlobalRuleMetaData())) {
+        String defaultDatabaseName = 
databaseConnectionManager.getConnectionSession().getDefaultDatabaseName();
+        ShardingSphereDatabase defaultDatabase = 
Strings.isNullOrEmpty(defaultDatabaseName) ? database : 
metaDataContexts.getMetaData().getDatabase(defaultDatabaseName);
+        if 
(proxySQLExecutor.getSqlFederationEngine().decide(queryContext.getSqlStatementContext(),
 queryContext.getParameters(), defaultDatabase,
+                metaDataContexts.getMetaData().getGlobalRuleMetaData())) {
             ResultSet resultSet = doExecuteFederation(queryContext, 
metaDataContexts);
             return processExecuteFederation(resultSet, metaDataContexts);
         }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
index 0939af72cb3..0d9711ccafe 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/ProxySQLExecutor.java
@@ -103,9 +103,9 @@ public final class ProxySQLExecutor {
         regularExecutor = new ProxyJDBCExecutor(type, 
databaseConnectionManager.getConnectionSession(), databaseConnector, 
jdbcExecutor);
         rawExecutor = new RawExecutor(executorEngine, connectionContext);
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        String databaseName = 
databaseConnectionManager.getConnectionSession().getDatabaseName();
-        String schemaName = 
getSchemaName(queryContext.getSqlStatementContext(), 
metaDataContexts.getMetaData().getDatabase(databaseName));
-        sqlFederationEngine = new SQLFederationEngine(databaseName, 
schemaName, metaDataContexts.getMetaData(), metaDataContexts.getStatistics(), 
jdbcExecutor);
+        String defaultDatabaseName = 
databaseConnectionManager.getConnectionSession().getDefaultDatabaseName();
+        String defaultSchemaName = 
getSchemaName(queryContext.getSqlStatementContext(), 
metaDataContexts.getMetaData().getDatabase(defaultDatabaseName));
+        sqlFederationEngine = new SQLFederationEngine(defaultDatabaseName, 
defaultSchemaName, metaDataContexts.getMetaData(), 
metaDataContexts.getStatistics(), jdbcExecutor);
     }
     
     private String getSchemaName(final SQLStatementContext 
sqlStatementContext, final ShardingSphereDatabase database) {
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
index dac782a2aea..92785ca1d8f 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorFactoryTest.java
@@ -56,6 +56,7 @@ class DatabaseConnectorFactoryTest {
     void assertNewDatabaseConnectorWithoutParameter() {
         ProxyDatabaseConnectionManager databaseConnectionManager = 
mock(ProxyDatabaseConnectionManager.class, RETURNS_DEEP_STUBS);
         
when(databaseConnectionManager.getConnectionSession().getDatabaseName()).thenReturn("foo_db");
+        
when(databaseConnectionManager.getConnectionSession().getDefaultDatabaseName()).thenReturn("foo_db");
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
         QueryContext queryContext = new QueryContext(sqlStatementContext, 
"schemaName", Collections.emptyList(), new HintValueContext());
@@ -70,6 +71,7 @@ class DatabaseConnectorFactoryTest {
     void assertNewDatabaseConnectorWithParameters() {
         ProxyDatabaseConnectionManager databaseConnectionManager = 
mock(ProxyDatabaseConnectionManager.class, RETURNS_DEEP_STUBS);
         
when(databaseConnectionManager.getConnectionSession().getDatabaseName()).thenReturn("foo_db");
+        
when(databaseConnectionManager.getConnectionSession().getDefaultDatabaseName()).thenReturn("foo_db");
         SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class, RETURNS_DEEP_STUBS);
         when(sqlStatementContext.getDatabaseType()).thenReturn(databaseType);
         ShardingSphereDatabase database = mockDatabase();
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
index d8b6d724426..3642df5a7fd 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/connector/DatabaseConnectorTest.java
@@ -111,6 +111,7 @@ class DatabaseConnectorTest {
     @BeforeEach
     void setUp() {
         
when(databaseConnectionManager.getConnectionSession().getDatabaseName()).thenReturn("foo_db");
+        
when(databaseConnectionManager.getConnectionSession().getDefaultDatabaseName()).thenReturn("foo_db");
         ContextManager contextManager = mockContextManager();
         
when(ProxyContext.getInstance().getContextManager()).thenReturn(contextManager);
     }
diff --git 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
index 2e6f57ddc46..4c63bbcc7f5 100644
--- 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-expression.xml
@@ -107,9 +107,10 @@
         <assertion parameters="1000:int" />
     </test-case>-->
     
-    <test-case sql="SELECT * FROM t_order_item_join_view WHERE order_id > ?" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
+    <!-- TODO open this comment when refresh metadata support view without 
push down execute -->
+    <!--<test-case sql="SELECT * FROM t_order_item_join_view WHERE order_id > 
?" db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion parameters="1000:int" 
expected-data-source-name="read_dataset" />
-    </test-case>
+    </test-case>-->
 
     <!-- // TODO Until test cases support enabling for specific database 
version. -->
     <!--    <test-case sql="VALUES ROW(1,1)" db-types="MySQL" 
scenario-types="db,tbl,dbtbl_with_readwrite_splitting,readwrite_splitting">-->
diff --git 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-order-by.xml 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-order-by.xml
index f192d8bfa19..242f9c25174 100644
--- 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-order-by.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-order-by.xml
@@ -130,14 +130,15 @@
     </test-case>-->
     
     <test-case sql="SELECT o.item_id, o.order_id, o.creation_date, s.id FROM 
t_order_item o INNER JOIN t_single_table s ON o.order_id = s.id ORDER BY 
o.item_id " scenario-types="db,tbl" />
-    
-    <test-case sql="SELECT * FROM t_order_subquery_view ORDER BY order_id" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
+
+    <!-- TODO open this comment when refresh metadata support view without 
push down execute -->
+    <!--<test-case sql="SELECT * FROM t_order_subquery_view ORDER BY order_id" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion expected-data-source-name="read_dataset" />
     </test-case>
     
     <test-case sql="SELECT * FROM t_order_union_view ORDER BY order_id" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion expected-data-source-name="read_dataset" />
-    </test-case>
+    </test-case>-->
     
     <test-case sql="SELECT * FROM t_order ORDER BY merchant_id ASC, order_id 
ASC" db-types="MySQL,PostgreSQL,openGauss,Oracle,SQLServer" scenario-types="db">
         <assertion expected-data-source-name="read_dataset" />
diff --git 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination-group-by-order-by.xml
 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination-group-by-order-by.xml
index 8103051e3e9..f66b8de8493 100644
--- 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination-group-by-order-by.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination-group-by-order-by.xml
@@ -66,14 +66,15 @@
     <test-case sql="SELECT * FROM t_product p CROSS JOIN t_product_detail d 
WHERE p.product_id = ? ORDER BY d.product_id, 7 LIMIT 10, 10" 
db-types="MySQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion parameters="10:int" 
expected-data-source-name="read_dataset" />
     </test-case>
-    
-    <test-case sql="SELECT * FROM t_order_subquery_view ORDER BY order_id 
LIMIT 5, 2" db-types="MySQL,openGauss" scenario-types="db_tbl_sql_federation">
+
+    <!-- TODO open this comment when refresh metadata support view without 
push down execute -->
+    <!--<test-case sql="SELECT * FROM t_order_subquery_view ORDER BY order_id 
LIMIT 5, 2" db-types="MySQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion expected-data-source-name="read_dataset" />
     </test-case>
     
     <test-case sql="SELECT * FROM t_order_union_view ORDER BY order_id LIMIT 
5, 2" db-types="MySQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion expected-data-source-name="read_dataset" />
-    </test-case>
+    </test-case>-->
     
     <test-case sql="SELECT * FROM t_product p INNER JOIN t_product_detail d 
USING(product_id) WHERE p.product_id > ? ORDER BY p.product_id DESC FETCH NEXT 
3 ROW ONLY" db-types="PostgreSQL,openGauss" 
scenario-types="db_tbl_sql_federation"
                scenario-comments="Test select inner join fetch statement when 
use sharding feature and federation executor engine.">
@@ -90,8 +91,9 @@
                scenario-comments="Test select cross join fetch statement when 
use sharding feature and federation executor engine.">
         <assertion parameters="10:int" 
expected-data-source-name="read_dataset" />
     </test-case>
-    
-    <test-case sql="SELECT * FROM t_order_subquery_view ORDER BY order_id 
FETCH NEXT 3 ROW ONLY" db-types="PostgreSQL,openGauss" 
scenario-types="db_tbl_sql_federation"
+
+    <!-- TODO open this comment when refresh metadata support view without 
push down execute -->
+    <!--<test-case sql="SELECT * FROM t_order_subquery_view ORDER BY order_id 
FETCH NEXT 3 ROW ONLY" db-types="PostgreSQL,openGauss" 
scenario-types="db_tbl_sql_federation"
                scenario-comments="Test select ... from subquery view fetch 
statement when use sharding feature and federation executor engine.">
         <assertion expected-data-source-name="read_dataset" />
     </test-case>
@@ -99,5 +101,5 @@
     <test-case sql="SELECT * FROM t_order_union_view ORDER BY order_id FETCH 
NEXT 3 ROW ONLY" db-types="PostgreSQL,openGauss" 
scenario-types="db_tbl_sql_federation"
                scenario-comments="Test select ... from union view fetch 
statement when use sharding feature and federation executor engine.">
         <assertion expected-data-source-name="read_dataset" />
-    </test-case>
+    </test-case>-->
 </integration-test-cases>
diff --git 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination.xml
 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination.xml
index 13436f360b6..ee58f3ab64b 100644
--- 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select-pagination.xml
@@ -17,7 +17,8 @@
   -->
 
 <integration-test-cases>
-    <test-case sql="SELECT * FROM t_order_item_join_view LIMIT 5, 2" 
db-types="MySQL,openGauss" scenario-types="db_tbl_sql_federation">
+    <!-- TODO open this comment when refresh metadata support view without 
push down execute -->
+    <!--<test-case sql="SELECT * FROM t_order_item_join_view LIMIT 5, 2" 
db-types="MySQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion expected-data-source-name="read_dataset" />
     </test-case>
     
@@ -33,7 +34,7 @@
     <test-case sql="SELECT * FROM t_order_aggregation_view FETCH NEXT 3 ROW 
ONLY" db-types="PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation"
                scenario-comments="Test select ... from aggregation view fetch 
statement when use sharding feature and federation executor engine.">
         <assertion expected-data-source-name="read_dataset" />
-    </test-case>
+    </test-case>-->
     
     <!-- TODO Replace with standard table structure -->
     <!--<test-case sql="SELECT o.*, i.* FROM t_order_federate o, 
t_order_item_federate i WHERE o.order_id = ? AND i.item_id = ? LIMIT ?" 
scenario-types="db,dbtbl_with_readwrite_splitting,dbtbl_with_readwrite_splitting_and_encrypt,sharding_and_encrypt,encrypt_and_readwrite_splitting">
diff --git 
a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml 
b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml
index 5b29a32db6f..048be366fc7 100644
--- a/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml
+++ b/test/e2e/sql/src/test/resources/cases/dql/dql-integration-select.xml
@@ -180,7 +180,8 @@
     <!--        <assertion parameters="0:int" 
expected-data-source-name="shadow_dataset" />-->
     <!--    </test-case>-->
     
-    <test-case sql="SELECT * FROM t_order_item_join_view" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
+    <!-- TODO open this comment when refresh metadata support view without 
push down execute -->
+    <!--<test-case sql="SELECT * FROM t_order_item_join_view" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion expected-data-source-name="read_dataset" />
     </test-case>
     
@@ -198,7 +199,7 @@
     
     <test-case sql="SELECT * FROM t_order_union_view WHERE order_id = ?" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db_tbl_sql_federation">
         <assertion parameters="2500:int" 
expected-data-source-name="read_dataset" />
-    </test-case>
+    </test-case>-->
     
     <test-case sql="SELECT * FROM t_merchant WHERE business_code LIKE '%18'" 
db-types="MySQL,PostgreSQL,openGauss" scenario-types="db,encrypt"
                scenario-comments="Test single table's LIKE operator percentage 
wildcard in simple select statement when use sharding feature.|Test encrypt 
table's LIKE operator percentage wildcard in simple select statement when use 
encrypt feature.">
diff --git 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/mysql/actual-logic_db-init.sql
 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/mysql/actual-logic_db-init.sql
index e64ee300da9..be22da27b93 100644
--- 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/mysql/actual-logic_db-init.sql
+++ 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/mysql/actual-logic_db-init.sql
@@ -15,12 +15,14 @@
 -- limitations under the License.
 --
 
-DROP VIEW IF EXISTS t_order_item_join_view;
-DROP VIEW IF EXISTS t_order_subquery_view;
-DROP VIEW IF EXISTS t_order_aggregation_view;
-DROP VIEW IF EXISTS t_order_union_view;
+-- TODO open this comment when refresh metadata support view without push down 
execute
+-- DROP VIEW IF EXISTS t_order_item_join_view;
+-- DROP VIEW IF EXISTS t_order_subquery_view;
+-- DROP VIEW IF EXISTS t_order_aggregation_view;
+-- DROP VIEW IF EXISTS t_order_union_view;
 
-CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, i.item_id 
FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id ORDER BY 
o.order_id, i.item_id;
-CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE o.order_id 
IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
-CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
-CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 2000 
UNION SELECT * FROM t_order WHERE order_id > 1500;
+-- CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, 
i.item_id FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id 
ORDER BY o.order_id, i.item_id;
+-- CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE 
o.order_id IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
+-- CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
+-- CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 
2000 UNION SELECT * FROM t_order WHERE order_id > 1500;
+SELECT * FROM t_order;
diff --git 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/opengauss/actual-logic_db-init.sql
 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/opengauss/actual-logic_db-init.sql
index e64ee300da9..be22da27b93 100644
--- 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/opengauss/actual-logic_db-init.sql
+++ 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/opengauss/actual-logic_db-init.sql
@@ -15,12 +15,14 @@
 -- limitations under the License.
 --
 
-DROP VIEW IF EXISTS t_order_item_join_view;
-DROP VIEW IF EXISTS t_order_subquery_view;
-DROP VIEW IF EXISTS t_order_aggregation_view;
-DROP VIEW IF EXISTS t_order_union_view;
+-- TODO open this comment when refresh metadata support view without push down 
execute
+-- DROP VIEW IF EXISTS t_order_item_join_view;
+-- DROP VIEW IF EXISTS t_order_subquery_view;
+-- DROP VIEW IF EXISTS t_order_aggregation_view;
+-- DROP VIEW IF EXISTS t_order_union_view;
 
-CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, i.item_id 
FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id ORDER BY 
o.order_id, i.item_id;
-CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE o.order_id 
IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
-CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
-CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 2000 
UNION SELECT * FROM t_order WHERE order_id > 1500;
+-- CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, 
i.item_id FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id 
ORDER BY o.order_id, i.item_id;
+-- CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE 
o.order_id IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
+-- CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
+-- CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 
2000 UNION SELECT * FROM t_order WHERE order_id > 1500;
+SELECT * FROM t_order;
diff --git 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/postgresql/actual-logic_db-init.sql
 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/postgresql/actual-logic_db-init.sql
index e64ee300da9..be22da27b93 100644
--- 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/postgresql/actual-logic_db-init.sql
+++ 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/actual/init-sql/postgresql/actual-logic_db-init.sql
@@ -15,12 +15,14 @@
 -- limitations under the License.
 --
 
-DROP VIEW IF EXISTS t_order_item_join_view;
-DROP VIEW IF EXISTS t_order_subquery_view;
-DROP VIEW IF EXISTS t_order_aggregation_view;
-DROP VIEW IF EXISTS t_order_union_view;
+-- TODO open this comment when refresh metadata support view without push down 
execute
+-- DROP VIEW IF EXISTS t_order_item_join_view;
+-- DROP VIEW IF EXISTS t_order_subquery_view;
+-- DROP VIEW IF EXISTS t_order_aggregation_view;
+-- DROP VIEW IF EXISTS t_order_union_view;
 
-CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, i.item_id 
FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id ORDER BY 
o.order_id, i.item_id;
-CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE o.order_id 
IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
-CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
-CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 2000 
UNION SELECT * FROM t_order WHERE order_id > 1500;
+-- CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, 
i.item_id FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id 
ORDER BY o.order_id, i.item_id;
+-- CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE 
o.order_id IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
+-- CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
+-- CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 
2000 UNION SELECT * FROM t_order WHERE order_id > 1500;
+SELECT * FROM t_order;
diff --git 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/mysql/01-expected-init.sql
 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/mysql/01-expected-init.sql
index 379171e4705..949e082fea6 100644
--- 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/mysql/01-expected-init.sql
+++ 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/mysql/01-expected-init.sql
@@ -30,9 +30,10 @@ CREATE TABLE sql_federation.t_product_extend(extend_id INT 
PRIMARY KEY, product_
 CREATE TABLE sql_federation.t_product_detail (detail_id INT PRIMARY KEY, 
product_id INT NOT NULL, description VARCHAR(50) NOT NULL, creation_date DATE 
NOT NULL);
 CREATE TABLE sql_federation.t_product_category( category_id INT PRIMARY KEY, 
category_name VARCHAR(50) NOT NULL, parent_id INT NOT NULL, level INT NOT NULL, 
creation_date DATE NOT NULL);
 CREATE TABLE sql_federation.t_country (country_id INT PRIMARY KEY, 
country_name VARCHAR(50), continent_name VARCHAR(50), creation_date DATE NOT 
NULL);
-CREATE VIEW sql_federation.t_order_item_join_view AS SELECT o.order_id, 
o.user_id, i.item_id FROM sql_federation.t_order o INNER JOIN 
sql_federation.t_order_item i ON o.order_id = i.order_id ORDER BY o.order_id, 
i.item_id;
-CREATE VIEW sql_federation.t_order_subquery_view AS SELECT * FROM 
sql_federation.t_order o WHERE o.order_id IN (SELECT i.order_id FROM 
sql_federation.t_order_item i INNER JOIN sql_federation.t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
-CREATE VIEW sql_federation.t_order_aggregation_view AS SELECT MAX(p.price) AS 
max_price, MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) 
AS avg_price, COUNT(1) AS count FROM sql_federation.t_order o INNER JOIN 
sql_federation.t_order_item i ON o.order_id = i.order_id INNER JOIN 
sql_federation.t_product p ON i.product_id = p.product_id GROUP BY o.order_id 
HAVING SUM(p.price) > 10000 ORDER BY max_price;
-CREATE VIEW sql_federation.t_order_union_view AS SELECT * FROM 
sql_federation.t_order WHERE order_id > 2000 UNION SELECT * FROM 
sql_federation.t_order WHERE order_id > 1500;
+-- TODO open this comment when refresh metadata support view without push down 
execute
+-- CREATE VIEW sql_federation.t_order_item_join_view AS SELECT o.order_id, 
o.user_id, i.item_id FROM sql_federation.t_order o INNER JOIN 
sql_federation.t_order_item i ON o.order_id = i.order_id ORDER BY o.order_id, 
i.item_id;
+-- CREATE VIEW sql_federation.t_order_subquery_view AS SELECT * FROM 
sql_federation.t_order o WHERE o.order_id IN (SELECT i.order_id FROM 
sql_federation.t_order_item i INNER JOIN sql_federation.t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
+-- CREATE VIEW sql_federation.t_order_aggregation_view AS SELECT MAX(p.price) 
AS max_price, MIN(p.price) AS min_price, SUM(p.price) AS sum_price, 
AVG(p.price) AS avg_price, COUNT(1) AS count FROM sql_federation.t_order o 
INNER JOIN sql_federation.t_order_item i ON o.order_id = i.order_id INNER JOIN 
sql_federation.t_product p ON i.product_id = p.product_id GROUP BY o.order_id 
HAVING SUM(p.price) > 10000 ORDER BY max_price;
+-- CREATE VIEW sql_federation.t_order_union_view AS SELECT * FROM 
sql_federation.t_order WHERE order_id > 2000 UNION SELECT * FROM 
sql_federation.t_order WHERE order_id > 1500;
 
 CREATE INDEX order_index_t_order ON sql_federation.t_order (order_id);
diff --git 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/opengauss/01-expected-init.sql
 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/opengauss/01-expected-init.sql
index 28b4578921a..8464b97016b 100644
--- 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/opengauss/01-expected-init.sql
+++ 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/opengauss/01-expected-init.sql
@@ -30,10 +30,11 @@ DROP TABLE IF EXISTS t_product;
 DROP TABLE IF EXISTS t_product_detail;
 DROP TABLE IF EXISTS t_product_category;
 DROP TABLE IF EXISTS t_country;
-DROP VIEW IF EXISTS t_order_item_join_view;
-DROP VIEW IF EXISTS t_order_subquery_view;
-DROP VIEW IF EXISTS t_order_aggregation_view;
-DROP VIEW IF EXISTS t_order_union_view;
+-- TODO open this comment when refresh metadata support view without push down 
execute
+-- DROP VIEW IF EXISTS t_order_item_join_view;
+-- DROP VIEW IF EXISTS t_order_subquery_view;
+-- DROP VIEW IF EXISTS t_order_aggregation_view;
+-- DROP VIEW IF EXISTS t_order_union_view;
 
 CREATE TABLE t_order(order_id INT PRIMARY KEY, user_id INT NOT NULL, status 
VARCHAR(50) NOT NULL, merchant_id INT NOT NULL, remark VARCHAR(50) NOT NULL, 
creation_date DATE NOT NULL);
 CREATE TABLE t_order_item(item_id INT PRIMARY KEY, order_id INT NOT NULL, 
user_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, 
creation_date DATE NOT NULL);
@@ -43,9 +44,9 @@ CREATE TABLE t_product (product_id INT PRIMARY KEY, 
product_name VARCHAR(50) NOT
 CREATE TABLE t_product_detail (detail_id INT PRIMARY KEY, product_id INT NOT 
NULL, description VARCHAR(50) NOT NULL, creation_date DATE NOT NULL);
 CREATE TABLE t_product_category( category_id INT PRIMARY KEY, category_name 
VARCHAR(50) NOT NULL, parent_id INT NOT NULL, level INT NOT NULL, creation_date 
DATE NOT NULL);
 CREATE TABLE t_country (country_id INT PRIMARY KEY, country_name VARCHAR(50), 
continent_name VARCHAR(50), creation_date DATE NOT NULL);
-CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, i.item_id 
FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id ORDER BY 
o.order_id, i.item_id;
-CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE o.order_id 
IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
-CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
-CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 2000 
UNION SELECT * FROM t_order WHERE order_id > 1500;
+-- CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, 
i.item_id FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id 
ORDER BY o.order_id, i.item_id;
+-- CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE 
o.order_id IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
+-- CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
+-- CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 
2000 UNION SELECT * FROM t_order WHERE order_id > 1500;
 
 CREATE INDEX order_index_t_order ON t_order (order_id);
diff --git 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/postgresql/01-expected-init.sql
 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/postgresql/01-expected-init.sql
index 28b4578921a..8464b97016b 100644
--- 
a/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/postgresql/01-expected-init.sql
+++ 
b/test/e2e/sql/src/test/resources/env/scenario/db_tbl_sql_federation/data/expected/init-sql/postgresql/01-expected-init.sql
@@ -30,10 +30,11 @@ DROP TABLE IF EXISTS t_product;
 DROP TABLE IF EXISTS t_product_detail;
 DROP TABLE IF EXISTS t_product_category;
 DROP TABLE IF EXISTS t_country;
-DROP VIEW IF EXISTS t_order_item_join_view;
-DROP VIEW IF EXISTS t_order_subquery_view;
-DROP VIEW IF EXISTS t_order_aggregation_view;
-DROP VIEW IF EXISTS t_order_union_view;
+-- TODO open this comment when refresh metadata support view without push down 
execute
+-- DROP VIEW IF EXISTS t_order_item_join_view;
+-- DROP VIEW IF EXISTS t_order_subquery_view;
+-- DROP VIEW IF EXISTS t_order_aggregation_view;
+-- DROP VIEW IF EXISTS t_order_union_view;
 
 CREATE TABLE t_order(order_id INT PRIMARY KEY, user_id INT NOT NULL, status 
VARCHAR(50) NOT NULL, merchant_id INT NOT NULL, remark VARCHAR(50) NOT NULL, 
creation_date DATE NOT NULL);
 CREATE TABLE t_order_item(item_id INT PRIMARY KEY, order_id INT NOT NULL, 
user_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, 
creation_date DATE NOT NULL);
@@ -43,9 +44,9 @@ CREATE TABLE t_product (product_id INT PRIMARY KEY, 
product_name VARCHAR(50) NOT
 CREATE TABLE t_product_detail (detail_id INT PRIMARY KEY, product_id INT NOT 
NULL, description VARCHAR(50) NOT NULL, creation_date DATE NOT NULL);
 CREATE TABLE t_product_category( category_id INT PRIMARY KEY, category_name 
VARCHAR(50) NOT NULL, parent_id INT NOT NULL, level INT NOT NULL, creation_date 
DATE NOT NULL);
 CREATE TABLE t_country (country_id INT PRIMARY KEY, country_name VARCHAR(50), 
continent_name VARCHAR(50), creation_date DATE NOT NULL);
-CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, i.item_id 
FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id ORDER BY 
o.order_id, i.item_id;
-CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE o.order_id 
IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
-CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
-CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 2000 
UNION SELECT * FROM t_order WHERE order_id > 1500;
+-- CREATE VIEW t_order_item_join_view AS SELECT o.order_id, o.user_id, 
i.item_id FROM t_order o INNER JOIN t_order_item i ON o.order_id = i.order_id 
ORDER BY o.order_id, i.item_id;
+-- CREATE VIEW t_order_subquery_view AS SELECT * FROM t_order o WHERE 
o.order_id IN (SELECT i.order_id FROM t_order_item i INNER JOIN t_product p ON 
i.product_id = p.product_id WHERE p.product_id = 10);
+-- CREATE VIEW t_order_aggregation_view AS SELECT MAX(p.price) AS max_price, 
MIN(p.price) AS min_price, SUM(p.price) AS sum_price, AVG(p.price) AS 
avg_price, COUNT(1) AS count FROM t_order o INNER JOIN t_order_item i ON 
o.order_id = i.order_id INNER JOIN t_product p ON i.product_id = p.product_id 
GROUP BY o.order_id HAVING SUM(p.price) > 10000 ORDER BY max_price;
+-- CREATE VIEW t_order_union_view AS SELECT * FROM t_order WHERE order_id > 
2000 UNION SELECT * FROM t_order WHERE order_id > 1500;
 
 CREATE INDEX order_index_t_order ON t_order (order_id);
diff --git 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
index 77a9ae270f0..f792aacb4e5 100644
--- 
a/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
+++ 
b/test/it/rewriter/src/test/java/org/apache/shardingsphere/test/it/rewrite/engine/SQLRewriterIT.java
@@ -57,10 +57,7 @@ import 
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigur
 import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
-import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import 
org.apache.shardingsphere.sqlfederation.api.config.SQLFederationRuleConfiguration;
-import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
 import org.apache.shardingsphere.sqltranslator.rule.SQLTranslatorRule;
 import 
org.apache.shardingsphere.sqltranslator.rule.builder.DefaultSQLTranslatorRuleConfigurationBuilder;
 import 
org.apache.shardingsphere.test.it.rewrite.engine.parameter.SQLRewriteEngineTestParameters;
@@ -171,7 +168,6 @@ public abstract class SQLRewriterIT {
     private Collection<ShardingSphereRule> createGlobalRules() {
         Collection<ShardingSphereRule> result = new LinkedList<>();
         result.add(new SQLTranslatorRule(new 
DefaultSQLTranslatorRuleConfigurationBuilder().build()));
-        result.add(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, false, mock(CacheOption.class)), 
Collections.emptyMap()));
         result.add(new 
TimestampServiceRule(mock(TimestampServiceRuleConfiguration.class)));
         return result;
     }

Reply via email to