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

panjuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new cd3c06de226 Move optimizer context init logic to SQLFederationRule 
(#26263)
cd3c06de226 is described below

commit cd3c06de2269387197e7763080d85df40353581f
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Mon Jun 12 13:59:34 2023 +0800

    Move optimizer context init logic to SQLFederationRule (#26263)
---
 .../jdbc/adapter/PreparedStatementAdapterTest.java |  2 +-
 .../driver/jdbc/adapter/StatementAdapterTest.java  |  4 +-
 .../UnsupportedOperationPreparedStatementTest.java |  3 +-
 .../UnsupportedOperationStatementTest.java         |  3 +-
 .../executor/SQLFederationExecutor.java            | 58 ++++++++++------------
 .../executor/TranslatableTableScanExecutor.java    |  2 +-
 .../executor/resultset/SQLFederationResultSet.java |  6 +--
 .../resultset/SQLFederationResultSetMetaData.java  | 16 +++---
 .../optimizer/SQLFederationCompiler.java           |  3 ++
 .../optimizer/context/OptimizerContextFactory.java | 16 +++---
 .../context/planner/OptimizerPlannerContext.java   |  8 +++
 .../planner/OptimizerPlannerContextFactory.java    | 46 ++++++++++++++++-
 .../metadata/schema/SQLFederationDatabase.java     |  2 +-
 .../metadata/schema/SQLFederationSchema.java       | 11 ++--
 .../metadata/schema/SQLFederationTable.java        |  8 +--
 .../sqlfederation/rule/SQLFederationRule.java      | 28 ++++-------
 .../rule/builder/SQLFederationRuleBuilder.java     |  2 +-
 .../engine/SQLFederationDecideEngineTest.java      | 21 +++++---
 .../optimizer/context/OptimizerContextTest.java    | 15 ++----
 .../optimizer/it/SQLFederationCompilerIT.java      |  2 +-
 .../proxy/backend/connector/DatabaseConnector.java |  2 +-
 .../handler/distsql/rul/sql/PreviewExecutor.java   |  2 +-
 .../test/it/rewrite/engine/SQLRewriterIT.java      |  2 +-
 23 files changed, 153 insertions(+), 109 deletions(-)

diff --git 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
index 8e7317b09a4..a6ea52f8028 100644
--- 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
+++ 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/PreparedStatementAdapterTest.java
@@ -70,7 +70,7 @@ class PreparedStatementAdapterTest {
                 new ShardingSphereRuleMetaData(Arrays.asList(
                         new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()),
                         new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build()))));
+                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase(connection.getDatabaseName()).getProtocolType()).thenReturn(new
 MySQLDatabaseType());
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase(connection.getDatabaseName()).getResourceMetaData().getStorageTypes())
diff --git 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
index e8a623763e4..bfc41e0954b 100644
--- 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
+++ 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/StatementAdapterTest.java
@@ -236,7 +236,7 @@ class StatementAdapterTest {
         ShardingSphereConnection connection = 
mock(ShardingSphereConnection.class, RETURNS_DEEP_STUBS);
         ShardingSphereRuleMetaData globalRuleMetaData = new 
ShardingSphereRuleMetaData(Arrays.asList(
                 new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build()),
+                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)),
                 new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build())));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(globalRuleMetaData);
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
@@ -254,7 +254,7 @@ class StatementAdapterTest {
         when(connection.getDatabaseName()).thenReturn("db");
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new
 ShardingSphereRuleMetaData(Arrays.asList(
                 new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build()),
+                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)),
                 new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
         ShardingSphereStatement result = new 
ShardingSphereStatement(connection);
diff --git 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
index 542211084fb..a76e5818a41 100644
--- 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
+++ 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationPreparedStatementTest.java
@@ -37,6 +37,7 @@ import java.sql.NClob;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Properties;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -55,7 +56,7 @@ class UnsupportedOperationPreparedStatementTest {
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new
 ShardingSphereRuleMetaData(Arrays.asList(
                 new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()),
                 new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build()))));
+                new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getDatabase(connection.getDatabaseName()).getProtocolType()).thenReturn(new
 MySQLDatabaseType());
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
         shardingSpherePreparedStatement = new 
ShardingSpherePreparedStatement(connection, "SELECT 1");
diff --git 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
index 54f1c97b7f6..4b111857826 100644
--- 
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
+++ 
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationStatementTest.java
@@ -32,6 +32,7 @@ import org.junit.jupiter.api.Test;
 
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Properties;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -49,7 +50,7 @@ class UnsupportedOperationStatementTest {
         when(connection.getDatabaseName()).thenReturn("db");
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData()).thenReturn(new
 ShardingSphereRuleMetaData(
                 Arrays.asList(new TrafficRule(new 
DefaultTrafficRuleConfigurationBuilder().build()),
-                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build()),
+                        new SQLFederationRule(new 
DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyMap(), 
mock(ConfigurationProperties.class)),
                         new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()))));
         
when(connection.getContextManager().getMetaDataContexts().getMetaData().getProps()).thenReturn(new
 ConfigurationProperties(new Properties()));
         shardingSphereStatement = new ShardingSphereStatement(connection);
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/SQLFederationExecutor.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/SQLFederationExecutor.java
index 1ade1d00f02..30f32a2aa0f 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/SQLFederationExecutor.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/SQLFederationExecutor.java
@@ -20,21 +20,15 @@ package org.apache.shardingsphere.sqlfederation.executor;
 import com.google.common.base.Preconditions;
 import org.apache.calcite.adapter.enumerable.EnumerableInterpretable;
 import org.apache.calcite.adapter.enumerable.EnumerableRel;
-import org.apache.calcite.adapter.java.JavaTypeFactory;
-import org.apache.calcite.config.CalciteConnectionConfig;
-import org.apache.calcite.config.CalciteConnectionConfigImpl;
-import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
 import org.apache.calcite.linq4j.Enumerator;
-import org.apache.calcite.plan.RelOptPlanner;
-import org.apache.calcite.prepare.CalciteCatalogReader;
 import org.apache.calcite.runtime.Bindable;
-import org.apache.calcite.schema.impl.AbstractSchema;
+import org.apache.calcite.schema.Schema;
+import org.apache.calcite.schema.Table;
 import org.apache.calcite.sql.validate.SqlValidator;
 import org.apache.calcite.sql2rel.SqlToRelConverter;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
@@ -49,11 +43,10 @@ import 
org.apache.shardingsphere.sqlfederation.executor.resultset.SQLFederationR
 import org.apache.shardingsphere.sqlfederation.optimizer.SQLFederationCompiler;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.SQLFederationExecutionPlan;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContextFactory;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContext;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.schema.SQLFederationSchema;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationPlannerUtils;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.schema.SQLFederationTable;
+import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
 
 import java.sql.Connection;
 import java.sql.ResultSet;
@@ -68,14 +61,10 @@ import java.util.Map;
  */
 public final class SQLFederationExecutor implements AutoCloseable {
     
-    private static final JavaTypeFactory JAVA_TYPE_FACTORY = new 
JavaTypeFactoryImpl();
-    
     private String databaseName;
     
     private String schemaName;
     
-    private OptimizerContext optimizerContext;
-    
     private ShardingSphereRuleMetaData globalRuleMetaData;
     
     private ConfigurationProperties props;
@@ -98,7 +87,6 @@ public final class SQLFederationExecutor implements 
AutoCloseable {
     public void init(final String databaseName, final String schemaName, final 
ShardingSphereMetaData metaData, final ShardingSphereData data, final 
JDBCExecutor jdbcExecutor) {
         this.databaseName = databaseName;
         this.schemaName = schemaName;
-        this.optimizerContext = 
OptimizerContextFactory.create(metaData.getDatabases(), 
metaData.getGlobalRuleMetaData());
         this.globalRuleMetaData = metaData.getGlobalRuleMetaData();
         this.props = metaData.getProps();
         this.data = data;
@@ -119,9 +107,11 @@ public final class SQLFederationExecutor implements 
AutoCloseable {
         Preconditions.checkArgument(sqlStatementContext instanceof 
SelectStatementContext, "SQL statement context must be select statement 
context.");
         ShardingSphereDatabase database = 
federationContext.getMetaData().getDatabase(databaseName);
         ShardingSphereSchema schema = database.getSchema(schemaName);
-        AbstractSchema sqlFederationSchema = 
createSQLFederationSchema(prepareEngine, database.getProtocolType(), schema, 
callback, federationContext);
+        OptimizerContext optimizerContext = 
globalRuleMetaData.getSingleRule(SQLFederationRule.class).getOptimizerContext();
+        Schema sqlFederationSchema = 
optimizerContext.getPlannerContext(databaseName).getValidators().get(schemaName).getCatalogReader().getRootSchema().plus().getSubSchema(schemaName);
+        registerTableScanExecutor(sqlFederationSchema, prepareEngine, 
callback, federationContext, optimizerContext);
         Map<String, Object> params = 
createParameters(federationContext.getQueryContext().getParameters());
-        resultSet = execute((SelectStatementContext) sqlStatementContext, 
schema, sqlFederationSchema, params);
+        resultSet = execute((SelectStatementContext) sqlStatementContext, 
schema, sqlFederationSchema, params, optimizerContext);
         return resultSet;
     }
     
@@ -134,26 +124,28 @@ public final class SQLFederationExecutor implements 
AutoCloseable {
         return result;
     }
     
-    private AbstractSchema createSQLFederationSchema(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
final DatabaseType protocolType,
-                                                     final 
ShardingSphereSchema schema,
-                                                     final 
JDBCExecutorCallback<? extends ExecuteResult> callback, final 
SQLFederationExecutorContext federationContext) {
+    private void registerTableScanExecutor(final Schema sqlFederationSchema, 
final DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
+                                           final JDBCExecutorCallback<? 
extends ExecuteResult> callback, final SQLFederationExecutorContext 
federationContext,
+                                           final OptimizerContext 
optimizerContext) {
         TableScanExecutorContext executorContext = new 
TableScanExecutorContext(databaseName, schemaName, props, federationContext);
         TableScanExecutor executor = new 
TranslatableTableScanExecutor(prepareEngine, jdbcExecutor, callback, 
optimizerContext, globalRuleMetaData, executorContext, data);
-        return new SQLFederationSchema(schemaName, schema, protocolType, 
JAVA_TYPE_FACTORY, executor);
+        for (String each : 
federationContext.getQueryContext().getSqlStatementContext().getTablesContext().getTableNames())
 {
+            Table table = sqlFederationSchema.getTable(each);
+            if (table instanceof SQLFederationTable) {
+                ((SQLFederationTable) table).setExecutor(executor);
+            }
+        }
     }
     
     @SuppressWarnings("unchecked")
-    private ResultSet execute(final SelectStatementContext 
selectStatementContext, final ShardingSphereSchema schema, final AbstractSchema 
sqlFederationSchema, final Map<String, Object> params) {
-        OptimizerParserContext parserContext = 
optimizerContext.getParserContext(databaseName);
-        CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(parserContext.getDialectProps());
-        CalciteCatalogReader catalogReader = 
SQLFederationPlannerUtils.createCatalogReader(schemaName, sqlFederationSchema, 
JAVA_TYPE_FACTORY, connectionConfig);
-        SqlValidator validator = 
SQLFederationPlannerUtils.createSqlValidator(catalogReader, JAVA_TYPE_FACTORY, 
parserContext.getDatabaseType(), connectionConfig);
-        SqlToRelConverter converter = 
SQLFederationPlannerUtils.createSqlToRelConverter(catalogReader, validator,
-                
SQLFederationPlannerUtils.createRelOptCluster(JAVA_TYPE_FACTORY), 
optimizerContext.getSqlParserRule(), parserContext.getDatabaseType(), true);
-        RelOptPlanner hepPlanner = 
optimizerContext.getPlannerContext(databaseName).getHepPlanner();
-        SQLFederationExecutionPlan executionPlan = new 
SQLFederationCompiler(converter, 
hepPlanner).compile(selectStatementContext.getSqlStatement());
+    private ResultSet execute(final SelectStatementContext 
selectStatementContext, final ShardingSphereSchema schema, final Schema 
sqlFederationSchema, final Map<String, Object> params,
+                              final OptimizerContext optimizerContext) {
+        OptimizerPlannerContext plannerContext = 
optimizerContext.getPlannerContext(databaseName);
+        SqlValidator sqlValidator = 
plannerContext.getValidators().get(schemaName);
+        SqlToRelConverter sqlToRelConverter = 
plannerContext.getConverters().get(schemaName);
+        SQLFederationExecutionPlan executionPlan = new 
SQLFederationCompiler(sqlToRelConverter, 
plannerContext.getHepPlanner()).compile(selectStatementContext.getSqlStatement());
         Bindable<Object> executablePlan = 
EnumerableInterpretable.toBindable(Collections.emptyMap(), null, 
(EnumerableRel) executionPlan.getPhysicalPlan(), EnumerableRel.Prefer.ARRAY);
-        Enumerator<Object> enumerator = executablePlan.bind(new 
SQLFederationDataContext(validator, converter, params)).enumerator();
+        Enumerator<Object> enumerator = executablePlan.bind(new 
SQLFederationDataContext(sqlValidator, sqlToRelConverter, params)).enumerator();
         return new SQLFederationResultSet(enumerator, schema, 
sqlFederationSchema, selectStatementContext, 
executionPlan.getResultColumnType());
     }
     
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
index 6819b54c0a2..8866a2d1354 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
@@ -318,7 +318,7 @@ public final class TranslatableTableScanExecutor implements 
TableScanExecutor {
         CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(optimizerContext.getParserContext(databaseName).getDialectProps());
         ShardingSphereDatabase database = 
executorContext.getFederationContext().getMetaData().getDatabase(databaseName);
         CalciteCatalogReader catalogReader = 
SQLFederationPlannerUtils.createCatalogReader(schemaName,
-                new SQLFederationSchema(schemaName, 
database.getSchema(schemaName), database.getProtocolType(), JAVA_TYPE_FACTORY, 
null), JAVA_TYPE_FACTORY, connectionConfig);
+                new SQLFederationSchema(schemaName, 
database.getSchema(schemaName), database.getProtocolType(), JAVA_TYPE_FACTORY), 
JAVA_TYPE_FACTORY, connectionConfig);
         RelOptCluster relOptCluster = 
RelOptCluster.create(SQLFederationPlannerUtils.createVolcanoPlanner(), new 
RexBuilder(JAVA_TYPE_FACTORY));
         RelBuilder builder = 
RelFactories.LOGICAL_BUILDER.create(relOptCluster, 
catalogReader).scan(table.getName());
         if (null != scanContext.getFilterValues()) {
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSet.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSet.java
index 4c4b1f30b72..bd2e8e495bd 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSet.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSet.java
@@ -19,7 +19,7 @@ package 
org.apache.shardingsphere.sqlfederation.executor.resultset;
 
 import org.apache.calcite.linq4j.Enumerator;
 import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.schema.impl.AbstractSchema;
+import org.apache.calcite.schema.Schema;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.AggregationDistinctProjection;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
@@ -78,13 +78,13 @@ public final class SQLFederationResultSet extends 
AbstractUnsupportedOperationRe
     
     private boolean closed;
     
-    public SQLFederationResultSet(final Enumerator<Object> enumerator, final 
ShardingSphereSchema schema, final AbstractSchema filterableSchema,
+    public SQLFederationResultSet(final Enumerator<Object> enumerator, final 
ShardingSphereSchema schema, final Schema sqlFederationSchema,
                                   final SelectStatementContext 
selectStatementContext, final RelDataType resultColumnType) {
         this.enumerator = enumerator;
         columnLabelAndIndexes = new 
HashMap<>(selectStatementContext.getProjectionsContext().getExpandProjections().size(),
 1F);
         Map<Integer, String> indexAndColumnLabels = new 
HashMap<>(selectStatementContext.getProjectionsContext().getExpandProjections().size(),
 1F);
         handleColumnLabelAndIndex(columnLabelAndIndexes, indexAndColumnLabels, 
selectStatementContext);
-        resultSetMetaData = new SQLFederationResultSetMetaData(schema, 
filterableSchema, selectStatementContext, resultColumnType, 
indexAndColumnLabels);
+        resultSetMetaData = new SQLFederationResultSetMetaData(schema, 
sqlFederationSchema, selectStatementContext, resultColumnType, 
indexAndColumnLabels);
     }
     
     private void handleColumnLabelAndIndex(final Map<String, Integer> 
columnLabelAndIndexes, final Map<Integer, String> indexAndColumnLabels, final 
SelectStatementContext selectStatementContext) {
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSetMetaData.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSetMetaData.java
index ed982ab352b..1c608694b8b 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSetMetaData.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/resultset/SQLFederationResultSetMetaData.java
@@ -20,8 +20,8 @@ package 
org.apache.shardingsphere.sqlfederation.executor.resultset;
 import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.schema.Schema;
 import org.apache.calcite.schema.Table;
-import org.apache.calcite.schema.impl.AbstractSchema;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.Projection;
 import 
org.apache.shardingsphere.infra.binder.segment.select.projection.impl.ColumnProjection;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
@@ -40,7 +40,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     private final ShardingSphereSchema schema;
     
-    private final AbstractSchema filterableSchema;
+    private final Schema sqlFederationSchema;
     
     private final RelDataTypeFactory relDataTypeFactory;
     
@@ -50,10 +50,10 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     private final Map<Integer, String> indexAndColumnLabels;
     
-    public SQLFederationResultSetMetaData(final ShardingSphereSchema schema, 
final AbstractSchema filterableSchema,
+    public SQLFederationResultSetMetaData(final ShardingSphereSchema schema, 
final Schema sqlFederationSchema,
                                           final SelectStatementContext 
selectStatementContext, final RelDataType resultColumnType, final Map<Integer, 
String> indexAndColumnLabels) {
         this.schema = schema;
-        this.filterableSchema = filterableSchema;
+        this.sqlFederationSchema = sqlFederationSchema;
         this.relDataTypeFactory = new JavaTypeFactoryImpl();
         this.selectStatementContext = selectStatementContext;
         this.resultColumnType = resultColumnType;
@@ -87,7 +87,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     @Override
     public int isNullable(final int column) {
-        Optional<Table> table = findTableName(column).flatMap(optional -> 
Optional.ofNullable(filterableSchema.getTable(optional)));
+        Optional<Table> table = findTableName(column).flatMap(optional -> 
Optional.ofNullable(sqlFederationSchema.getTable(optional)));
         return !table.isPresent() || 
table.get().getRowType(relDataTypeFactory).isNullable() ? 
ResultSetMetaData.columnNullable : ResultSetMetaData.columnNoNulls;
     }
     
@@ -98,7 +98,7 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     @Override
     public int getColumnDisplaySize(final int column) {
-        return findTableName(column).flatMap(optional -> 
Optional.ofNullable(filterableSchema.getTable(optional))).map(optional -> 
optional.getRowType(relDataTypeFactory).getPrecision()).orElse(0);
+        return findTableName(column).flatMap(optional -> 
Optional.ofNullable(sqlFederationSchema.getTable(optional))).map(optional -> 
optional.getRowType(relDataTypeFactory).getPrecision()).orElse(0);
     }
     
     @Override
@@ -122,13 +122,13 @@ public final class SQLFederationResultSetMetaData extends 
WrapperAdapter impleme
     
     @Override
     public int getPrecision(final int column) {
-        Optional<Table> table = findTableName(column).flatMap(optional -> 
Optional.ofNullable(filterableSchema.getTable(optional)));
+        Optional<Table> table = findTableName(column).flatMap(optional -> 
Optional.ofNullable(sqlFederationSchema.getTable(optional)));
         return !table.isPresent() || RelDataType.PRECISION_NOT_SPECIFIED == 
table.get().getRowType(relDataTypeFactory).getPrecision() ? 0 : 
table.get().getRowType(relDataTypeFactory).getPrecision();
     }
     
     @Override
     public int getScale(final int column) {
-        Optional<Table> table = findTableName(column).flatMap(optional -> 
Optional.ofNullable(filterableSchema.getTable(optional)));
+        Optional<Table> table = findTableName(column).flatMap(optional -> 
Optional.ofNullable(sqlFederationSchema.getTable(optional)));
         return !table.isPresent() || RelDataType.SCALE_NOT_SPECIFIED == 
table.get().getRowType(relDataTypeFactory).getScale() ? 0 : 
table.get().getRowType(relDataTypeFactory).getScale();
     }
     
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/SQLFederationCompiler.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/SQLFederationCompiler.java
index b87599cdc36..9dcffdab4e1 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/SQLFederationCompiler.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/SQLFederationCompiler.java
@@ -21,6 +21,8 @@ import lombok.RequiredArgsConstructor;
 import org.apache.calcite.adapter.enumerable.EnumerableConvention;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.metadata.JaninoRelMetadataProvider;
+import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql2rel.SqlToRelConverter;
@@ -46,6 +48,7 @@ public final class SQLFederationCompiler {
      * @return sql federation execution plan
      */
     public SQLFederationExecutionPlan compile(final SQLStatement sqlStatement) 
{
+        
RelMetadataQuery.THREAD_PROVIDERS.set(JaninoRelMetadataProvider.DEFAULT);
         SqlNode sqlNode = SQLNodeConverterEngine.convert(sqlStatement);
         RelNode logicPlan = converter.convertQuery(sqlNode, true, true).rel;
         RelDataType resultColumnType = 
Objects.requireNonNull(converter.validator).getValidatedNodeType(sqlNode);
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
index 20e97c2571c..91d8f66ab28 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextFactory.java
@@ -19,13 +19,15 @@ package 
org.apache.shardingsphere.sqlfederation.optimizer.context;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
+import org.apache.shardingsphere.parser.rule.builder.SQLParserRuleBuilder;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContext;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContextFactory;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContext;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContextFactory;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
 
 import java.util.Map;
 
@@ -39,13 +41,13 @@ public final class OptimizerContextFactory {
      * Create optimize context.
      *
      * @param databases databases
-     * @param globalRuleMetaData global rule meta data
+     * @param props props
      * @return created optimizer context
      */
-    public static OptimizerContext create(final Map<String, 
ShardingSphereDatabase> databases, final ShardingSphereRuleMetaData 
globalRuleMetaData) {
+    public static OptimizerContext create(final Map<String, 
ShardingSphereDatabase> databases, final ConfigurationProperties props) {
         Map<String, OptimizerParserContext> parserContexts = 
OptimizerParserContextFactory.create(databases);
-        Map<String, OptimizerPlannerContext> plannerContexts = 
OptimizerPlannerContextFactory.create(databases);
-        SQLParserRule sqlParserRule = 
globalRuleMetaData.getSingleRule(SQLParserRule.class);
+        SQLParserRule sqlParserRule = new SQLParserRuleBuilder().build(new 
DefaultSQLParserRuleConfigurationBuilder().build(), databases, props);
+        Map<String, OptimizerPlannerContext> plannerContexts = 
OptimizerPlannerContextFactory.create(databases, parserContexts, sqlParserRule);
         return new OptimizerContext(sqlParserRule, parserContexts, 
plannerContexts);
     }
 }
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContext.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContext.java
index c2c002dd559..fe202360926 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContext.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContext.java
@@ -20,6 +20,10 @@ package 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.calcite.plan.RelOptPlanner;
+import org.apache.calcite.sql.validate.SqlValidator;
+import org.apache.calcite.sql2rel.SqlToRelConverter;
+
+import java.util.Map;
 
 /**
  * Optimize planner context.
@@ -29,4 +33,8 @@ import org.apache.calcite.plan.RelOptPlanner;
 public final class OptimizerPlannerContext {
     
     private final RelOptPlanner hepPlanner;
+    
+    private final Map<String, SqlValidator> validators;
+    
+    private final Map<String, SqlToRelConverter> converters;
 }
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContextFactory.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContextFactory.java
index fbbbf856303..c0ef10eff2a 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContextFactory.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/planner/OptimizerPlannerContextFactory.java
@@ -19,9 +19,22 @@ package 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.calcite.adapter.java.JavaTypeFactory;
+import org.apache.calcite.config.CalciteConnectionConfig;
+import org.apache.calcite.config.CalciteConnectionConfigImpl;
+import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
+import org.apache.calcite.prepare.CalciteCatalogReader;
+import org.apache.calcite.schema.Schema;
+import org.apache.calcite.sql.validate.SqlValidator;
+import org.apache.calcite.sql2rel.SqlToRelConverter;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContext;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.schema.SQLFederationSchema;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.planner.util.SQLFederationPlannerUtils;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -32,17 +45,46 @@ import java.util.concurrent.ConcurrentHashMap;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class OptimizerPlannerContextFactory {
     
+    private static final JavaTypeFactory DEFAULT_DATA_TYPE_FACTORY = new 
JavaTypeFactoryImpl();
+    
     /**
      * Create optimizer planner context map.
      *
      * @param databases databases
+     * @param parserContexts parser contexts
+     * @param sqlParserRule sql parser rule
      * @return created optimizer planner context map
      */
-    public static Map<String, OptimizerPlannerContext> create(final 
Map<String, ShardingSphereDatabase> databases) {
+    public static Map<String, OptimizerPlannerContext> create(final 
Map<String, ShardingSphereDatabase> databases, final Map<String, 
OptimizerParserContext> parserContexts,
+                                                              final 
SQLParserRule sqlParserRule) {
         Map<String, OptimizerPlannerContext> result = new 
ConcurrentHashMap<>(databases.size(), 1F);
         for (Entry<String, ShardingSphereDatabase> entry : 
databases.entrySet()) {
-            result.put(entry.getKey(), new 
OptimizerPlannerContext(SQLFederationPlannerUtils.createHepPlanner()));
+            result.put(entry.getKey(), create(entry.getValue(), 
parserContexts.get(entry.getKey()), sqlParserRule));
         }
         return result;
     }
+    
+    /**
+     * Create optimizer planner context.
+     *
+     * @param database database
+     * @param parserContext parser context
+     * @param sqlParserRule sql parser rule
+     * @return created optimizer planner context
+     */
+    public static OptimizerPlannerContext create(final ShardingSphereDatabase 
database, final OptimizerParserContext parserContext, final SQLParserRule 
sqlParserRule) {
+        Map<String, SqlValidator> validators = new LinkedHashMap<>();
+        Map<String, SqlToRelConverter> converters = new LinkedHashMap<>();
+        for (Entry<String, ShardingSphereSchema> entry : 
database.getSchemas().entrySet()) {
+            CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(parserContext.getDialectProps());
+            Schema sqlFederationSchema = new 
SQLFederationSchema(entry.getKey(), entry.getValue(), 
database.getProtocolType(), DEFAULT_DATA_TYPE_FACTORY);
+            CalciteCatalogReader catalogReader = 
SQLFederationPlannerUtils.createCatalogReader(entry.getKey(), 
sqlFederationSchema, DEFAULT_DATA_TYPE_FACTORY, connectionConfig);
+            SqlValidator validator = 
SQLFederationPlannerUtils.createSqlValidator(catalogReader, 
DEFAULT_DATA_TYPE_FACTORY, parserContext.getDatabaseType(), connectionConfig);
+            SqlToRelConverter converter = 
SQLFederationPlannerUtils.createSqlToRelConverter(catalogReader, validator, 
SQLFederationPlannerUtils.createRelOptCluster(DEFAULT_DATA_TYPE_FACTORY),
+                    sqlParserRule, parserContext.getDatabaseType(), true);
+            validators.put(entry.getKey(), validator);
+            converters.put(entry.getKey(), converter);
+        }
+        return new 
OptimizerPlannerContext(SQLFederationPlannerUtils.createHepPlanner(), 
validators, converters);
+    }
 }
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationDatabase.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationDatabase.java
index 73edcdee37d..bf1209eed25 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationDatabase.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationDatabase.java
@@ -47,7 +47,7 @@ public final class SQLFederationDatabase extends 
AbstractSchema {
     private Map<String, Schema> createSubSchemaMap(final 
ShardingSphereDatabase database, final DatabaseType protocolType, final 
TableScanExecutor executor) {
         Map<String, Schema> result = new 
LinkedHashMap<>(database.getSchemas().size(), 1F);
         for (Entry<String, ShardingSphereSchema> entry : 
database.getSchemas().entrySet()) {
-            result.put(entry.getKey(), new SQLFederationSchema(entry.getKey(), 
entry.getValue(), protocolType, null, executor));
+            result.put(entry.getKey(), new SQLFederationSchema(entry.getKey(), 
entry.getValue(), protocolType, null));
         }
         return result;
     }
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationSchema.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationSchema.java
index 2a32bde5ebd..22d6dc2339d 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationSchema.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationSchema.java
@@ -28,9 +28,8 @@ import 
org.apache.shardingsphere.infra.database.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.statistic.SQLFederationStatistic;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.util.SQLFederationDataTypeUtils;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.statistic.SQLFederationStatistic;
 
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -46,19 +45,19 @@ public final class SQLFederationSchema extends 
AbstractSchema {
     
     private final Map<String, Table> tableMap;
     
-    public SQLFederationSchema(final String schemaName, final 
ShardingSphereSchema schema, final DatabaseType protocolType, final 
JavaTypeFactory javaTypeFactory, final TableScanExecutor executor) {
+    public SQLFederationSchema(final String schemaName, final 
ShardingSphereSchema schema, final DatabaseType protocolType, final 
JavaTypeFactory javaTypeFactory) {
         name = schemaName;
-        tableMap = createTableMap(schema, protocolType, javaTypeFactory, 
executor);
+        tableMap = createTableMap(schema, protocolType, javaTypeFactory);
     }
     
-    private Map<String, Table> createTableMap(final ShardingSphereSchema 
schema, final DatabaseType protocolType, final JavaTypeFactory javaTypeFactory, 
final TableScanExecutor executor) {
+    private Map<String, Table> createTableMap(final ShardingSphereSchema 
schema, final DatabaseType protocolType, final JavaTypeFactory javaTypeFactory) 
{
         Map<String, Table> result = new 
LinkedHashMap<>(schema.getTables().size(), 1F);
         for (ShardingSphereTable each : schema.getTables().values()) {
             if (schema.containsView(each.getName())) {
                 result.put(each.getName(), getViewTable(schema, each, 
protocolType, javaTypeFactory));
             } else {
                 // TODO implement table statistic logic after using custom 
operators
-                result.put(each.getName(), new SQLFederationTable(each, 
executor, new SQLFederationStatistic(), protocolType));
+                result.put(each.getName(), new SQLFederationTable(each, new 
SQLFederationStatistic(), protocolType));
             }
         }
         return result;
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationTable.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationTable.java
index a74d9b8b862..77e794ddec4 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationTable.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/metadata/schema/SQLFederationTable.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.sqlfederation.optimizer.metadata.schema;
 
 import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import org.apache.calcite.DataContext;
 import org.apache.calcite.linq4j.Enumerable;
 import org.apache.calcite.linq4j.QueryProvider;
@@ -39,8 +40,8 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import 
org.apache.shardingsphere.infra.util.exception.external.sql.type.generic.UnsupportedSQLOperationException;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TableScanExecutor;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.executor.TranslatableScanNodeExecutorContext;
-import 
org.apache.shardingsphere.sqlfederation.optimizer.operator.physical.EnumerablePushDownTableScan;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.metadata.util.SQLFederationDataTypeUtils;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.operator.physical.EnumerablePushDownTableScan;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.statistic.SQLFederationStatistic;
 
 import java.lang.reflect.Type;
@@ -53,12 +54,13 @@ public final class SQLFederationTable extends AbstractTable 
implements Queryable
     
     private final ShardingSphereTable table;
     
-    private final TableScanExecutor executor;
-    
     private final SQLFederationStatistic statistic;
     
     private final DatabaseType protocolType;
     
+    @Setter
+    private TableScanExecutor executor;
+    
     /**
      * Execute filter and project when query the federation translatable table.
      *
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
index f8e32c7a6fc..9af676fce63 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/SQLFederationRule.java
@@ -18,12 +18,15 @@
 package org.apache.shardingsphere.sqlfederation.rule;
 
 import lombok.Getter;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import org.apache.shardingsphere.infra.metadata.data.ShardingSphereData;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.rule.identifier.scope.GlobalRule;
 import 
org.apache.shardingsphere.sqlfederation.api.config.SQLFederationRuleConfiguration;
 import org.apache.shardingsphere.sqlfederation.executor.SQLFederationExecutor;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContext;
+import 
org.apache.shardingsphere.sqlfederation.optimizer.context.OptimizerContextFactory;
+
+import java.util.Map;
 
 /**
  * SQL federation rule.
@@ -35,23 +38,12 @@ public final class SQLFederationRule implements GlobalRule {
     
     private final SQLFederationExecutor sqlFederationExecutor;
     
-    public SQLFederationRule(final SQLFederationRuleConfiguration ruleConfig) {
+    private final OptimizerContext optimizerContext;
+    
+    public SQLFederationRule(final SQLFederationRuleConfiguration ruleConfig, 
final Map<String, ShardingSphereDatabase> databases, final 
ConfigurationProperties props) {
         configuration = ruleConfig;
         sqlFederationExecutor = new SQLFederationExecutor();
-    }
-    
-    /**
-     * Init SQL federation executor.
-     *
-     * @param databaseName database name
-     * @param schemaName schema name
-     * @param metaData ShardingSphere meta data
-     * @param shardingSphereData ShardingSphere data
-     * @param jdbcExecutor jdbc executor
-     */
-    public void init(final String databaseName, final String schemaName, final 
ShardingSphereMetaData metaData, final ShardingSphereData shardingSphereData,
-                     final JDBCExecutor jdbcExecutor) {
-        sqlFederationExecutor.init(databaseName, schemaName, metaData, 
shardingSphereData, jdbcExecutor);
+        optimizerContext = OptimizerContextFactory.create(databases, props);
     }
     
     @Override
diff --git 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
index 0b956b365c1..20b64d99ee9 100644
--- 
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
+++ 
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/rule/builder/SQLFederationRuleBuilder.java
@@ -34,7 +34,7 @@ public final class SQLFederationRuleBuilder implements 
GlobalRuleBuilder<SQLFede
     
     @Override
     public GlobalRule build(final SQLFederationRuleConfiguration ruleConfig, 
final Map<String, ShardingSphereDatabase> databases, final 
ConfigurationProperties props) {
-        return new SQLFederationRule(ruleConfig);
+        return new SQLFederationRule(ruleConfig, databases, props);
     }
     
     @Override
diff --git 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/decider/engine/SQLFederationDecideEngineTest.java
 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/decider/engine/SQLFederationDecideEngineTest.java
index 567637583af..e19c4c31037 100644
--- 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/decider/engine/SQLFederationDecideEngineTest.java
+++ 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/decider/engine/SQLFederationDecideEngineTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.sqlfederation.decider.engine;
 
 import 
org.apache.shardingsphere.infra.binder.statement.CommonSQLStatementContext;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
@@ -59,7 +60,8 @@ class SQLFederationDecideEngineTest {
     
     @Test
     void assertDecideWhenNotConfigSqlFederationEnabled() {
-        Collection<ShardingSphereRule> rules = Collections.singletonList(new 
SQLFederationRule(new SQLFederationRuleConfiguration(false, 
mock(CacheOption.class))));
+        Collection<ShardingSphereRule> rules =
+                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
         SQLFederationDecideEngine engine = new 
SQLFederationDecideEngine(rules);
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), 
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new 
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
@@ -69,7 +71,8 @@ class SQLFederationDecideEngineTest {
     
     @Test
     void assertDecideWhenExecuteNotSelectStatement() {
-        Collection<ShardingSphereRule> rules = Collections.singletonList(new 
SQLFederationRule(new SQLFederationRuleConfiguration(true, 
mock(CacheOption.class))));
+        Collection<ShardingSphereRule> rules =
+                Collections.singletonList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
         SQLFederationDecideEngine engine = new 
SQLFederationDecideEngine(rules);
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), 
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new 
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
@@ -79,7 +82,9 @@ class SQLFederationDecideEngineTest {
     
     @Test
     void assertDecideWhenConfigSingleMatchedRule() {
-        Collection<ShardingSphereRule> rules = Arrays.asList(new 
SQLFederationRule(new SQLFederationRuleConfiguration(true, 
mock(CacheOption.class))), new SQLFederationDeciderRuleMatchFixture());
+        Collection<ShardingSphereRule> rules =
+                Arrays.asList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)),
+                        new SQLFederationDeciderRuleMatchFixture());
         SQLFederationDecideEngine engine = new 
SQLFederationDecideEngine(rules);
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), 
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new 
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
@@ -89,7 +94,9 @@ class SQLFederationDecideEngineTest {
     
     @Test
     void assertDecideWhenConfigSingleNotMatchedRule() {
-        Collection<ShardingSphereRule> rules = Arrays.asList(new 
SQLFederationRule(new SQLFederationRuleConfiguration(true, 
mock(CacheOption.class))), new SQLFederationDeciderRuleNotMatchFixture());
+        Collection<ShardingSphereRule> rules =
+                Arrays.asList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)),
+                        new SQLFederationDeciderRuleNotMatchFixture());
         SQLFederationDecideEngine engine = new 
SQLFederationDecideEngine(rules);
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), 
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new 
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
@@ -99,8 +106,10 @@ class SQLFederationDecideEngineTest {
     
     @Test
     void assertDecideWhenConfigMultiRule() {
-        Collection<ShardingSphereRule> rules = Arrays.asList(new 
SQLFederationRule(new SQLFederationRuleConfiguration(true, 
mock(CacheOption.class))), new SQLFederationDeciderRuleNotMatchFixture(),
-                new SQLFederationDeciderRuleMatchFixture());
+        Collection<ShardingSphereRule> rules =
+                Arrays.asList(new SQLFederationRule(new 
SQLFederationRuleConfiguration(true, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)),
+                        new SQLFederationDeciderRuleNotMatchFixture(),
+                        new SQLFederationDeciderRuleMatchFixture());
         SQLFederationDecideEngine engine = new 
SQLFederationDecideEngine(rules);
         ShardingSphereDatabase database = new 
ShardingSphereDatabase(DefaultDatabase.LOGIC_NAME,
                 mock(DatabaseType.class), 
mock(ShardingSphereResourceMetaData.class, RETURNS_DEEP_STUBS), new 
ShardingSphereRuleMetaData(rules), Collections.emptyMap());
diff --git 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
index 2392231339a..b29690898c4 100644
--- 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
+++ 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
@@ -17,12 +17,10 @@
 
 package org.apache.shardingsphere.sqlfederation.optimizer.context;
 
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.DefaultDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
-import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContext;
 import 
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContext;
 import org.junit.jupiter.api.Test;
@@ -39,19 +37,19 @@ class OptimizerContextTest {
     
     @Test
     void assertGetSqlParserRule() {
-        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), createShardingSphereRuleMetaData());
+        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), mock(ConfigurationProperties.class));
         assertThat(actual.getSqlParserRule(), instanceOf(SQLParserRule.class));
     }
     
     @Test
     void assertGetParserContext() {
-        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), createShardingSphereRuleMetaData());
+        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), mock(ConfigurationProperties.class));
         
assertThat(actual.getParserContext(DefaultDatabase.LOGIC_NAME.toLowerCase()), 
instanceOf(OptimizerParserContext.class));
     }
     
     @Test
     void assertGetPlannerContext() {
-        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), createShardingSphereRuleMetaData());
+        OptimizerContext actual = 
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
 createShardingSphereDatabase()), mock(ConfigurationProperties.class));
         
assertThat(actual.getPlannerContext(DefaultDatabase.LOGIC_NAME.toLowerCase()), 
instanceOf(OptimizerPlannerContext.class));
     }
     
@@ -60,9 +58,4 @@ class OptimizerContextTest {
         when(result.getProtocolType().getType()).thenReturn("MySQL");
         return result;
     }
-    
-    private ShardingSphereRuleMetaData createShardingSphereRuleMetaData() {
-        CacheOption cacheOption = new CacheOption(10, 1000);
-        return new ShardingSphereRuleMetaData(Collections.singleton(new 
SQLParserRule(new SQLParserRuleConfiguration(true, cacheOption, cacheOption))));
-    }
 }
diff --git 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/it/SQLFederationCompilerIT.java
 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/it/SQLFederationCompilerIT.java
index 574c2471c71..8a093a45918 100644
--- 
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/it/SQLFederationCompilerIT.java
+++ 
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/it/SQLFederationCompilerIT.java
@@ -236,7 +236,7 @@ class SQLFederationCompilerIT {
         CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(new Properties());
         RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
         DatabaseType databaseType = DatabaseTypeEngine.getDatabaseType("H2");
-        SQLFederationSchema sqlFederationSchema = new 
SQLFederationSchema(SCHEMA_NAME, schema, databaseType, new 
JavaTypeFactoryImpl(), null);
+        SQLFederationSchema sqlFederationSchema = new 
SQLFederationSchema(SCHEMA_NAME, schema, databaseType, new 
JavaTypeFactoryImpl());
         CalciteCatalogReader catalogReader = 
SQLFederationPlannerUtils.createCatalogReader(SCHEMA_NAME, sqlFederationSchema, 
relDataTypeFactory, connectionConfig);
         SqlValidator validator = 
SQLFederationPlannerUtils.createSqlValidator(catalogReader, relDataTypeFactory, 
databaseType, connectionConfig);
         RelOptCluster cluster = 
RelOptCluster.create(SQLFederationPlannerUtils.createVolcanoPlanner(), new 
RexBuilder(relDataTypeFactory));
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 aaa7eca0479..3fcaeb143b2 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
@@ -254,7 +254,7 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
         String schemaName = 
queryContext.getSqlStatementContext().getTablesContext().getSchemaName().orElseGet(()
 -> DatabaseTypeEngine.getDefaultSchemaName(databaseType, databaseName));
         SQLFederationRule sqlFederationRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLFederationRule.class);
         federationExecutor = sqlFederationRule.getSqlFederationExecutor();
-        sqlFederationRule.init(databaseName, schemaName, 
metaDataContexts.getMetaData(), metaDataContexts.getShardingSphereData(),
+        federationExecutor.init(databaseName, schemaName, 
metaDataContexts.getMetaData(), metaDataContexts.getShardingSphereData(),
                 new 
JDBCExecutor(BackendExecutorContext.getInstance().getExecutorEngine(), 
databaseConnectionManager.getConnectionSession().getConnectionContext()));
     }
     
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
index 1d9368270d6..0bbd2e5c036 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rul/sql/PreviewExecutor.java
@@ -140,7 +140,7 @@ public final class PreviewExecutor implements 
ConnectionSessionRequiredRULExecut
         String schemaName = 
queryContext.getSqlStatementContext().getTablesContext().getSchemaName().orElseGet(()
 -> DatabaseTypeEngine.getDefaultSchemaName(database.getProtocolType(), 
databaseName));
         SQLFederationRule sqlFederationRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLFederationRule.class);
         SQLFederationExecutor sqlFederationExecutor = 
sqlFederationRule.getSqlFederationExecutor();
-        sqlFederationRule.init(databaseName, schemaName, 
metaDataContexts.getMetaData(), metaDataContexts.getShardingSphereData(),
+        sqlFederationExecutor.init(databaseName, schemaName, 
metaDataContexts.getMetaData(), metaDataContexts.getShardingSphereData(),
                 new 
JDBCExecutor(BackendExecutorContext.getInstance().getExecutorEngine(), 
connectionSession.getConnectionContext()));
         sqlFederationExecutor.executeQuery(prepareEngine, 
createPreviewFederationCallback(database.getProtocolType(), 
database.getResourceMetaData().getStorageTypes(), sqlStatement), context);
         return context.getExecutionUnits();
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 c1c54980e93..852323994d0 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
@@ -162,7 +162,7 @@ public abstract class SQLRewriterIT {
     private Collection<ShardingSphereRule> createGlobalRules() {
         Collection<ShardingSphereRule> result = new LinkedList<>();
         result.add(new SQLTranslatorRule(new 
SQLTranslatorRuleConfiguration()));
-        result.add(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, mock(CacheOption.class))));
+        result.add(new SQLFederationRule(new 
SQLFederationRuleConfiguration(false, mock(CacheOption.class)), 
Collections.emptyMap(), mock(ConfigurationProperties.class)));
         result.add(new 
TimestampServiceRule(mock(TimestampServiceRuleConfiguration.class)));
         return result;
     }

Reply via email to