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

tuichenchuxin 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 3da2f14c062 Refactor proxy and jdbc adapter and add 
ImplicitTransactionCallback (#29748)
3da2f14c062 is described below

commit 3da2f14c062089da44462ce4c2a122b35dcd3009
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Wed Jan 17 15:15:13 2024 +0800

    Refactor proxy and jdbc adapter and add ImplicitTransactionCallback (#29748)
---
 .../jdbc/adapter/AbstractStatementAdapter.java     |  14 +--
 .../statement/ShardingSpherePreparedStatement.java | 120 +++++++++------------
 .../core/statement/ShardingSphereStatement.java    | 112 ++++++++-----------
 .../driver/jdbc/adapter/StatementAdapterTest.java  |   2 +-
 .../implicit/ImplicitTransactionCallback.java      |  36 +++++++
 .../proxy/backend/connector/DatabaseConnector.java |  78 ++++++--------
 6 files changed, 162 insertions(+), 200 deletions(-)

diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
index 3ccbc6d1404..b86728c578c 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractStatementAdapter.java
@@ -57,7 +57,7 @@ public abstract class AbstractStatementAdapter extends 
AbstractUnsupportedOperat
     
     private boolean closed;
     
-    protected final boolean isNeedImplicitCommitTransaction(final 
ShardingSphereConnection connection, final Collection<ExecutionContext> 
executionContexts) {
+    protected final boolean isNeedImplicitCommitTransaction(final 
ShardingSphereConnection connection, final ExecutionContext executionContext) {
         if (connection.getAutoCommit()) {
             return false;
         }
@@ -66,16 +66,8 @@ public abstract class AbstractStatementAdapter extends 
AbstractUnsupportedOperat
         if 
(!TransactionType.isDistributedTransaction(connectionTransaction.getTransactionType())
 || isInTransaction) {
             return false;
         }
-        if (1 == executionContexts.size()) {
-            SQLStatement sqlStatement = 
executionContexts.iterator().next().getSqlStatementContext().getSqlStatement();
-            return isWriteDMLStatement(sqlStatement) && 
executionContexts.iterator().next().getExecutionUnits().size() > 1;
-        }
-        for (ExecutionContext each : executionContexts) {
-            if 
(isWriteDMLStatement(each.getSqlStatementContext().getSqlStatement())) {
-                return true;
-            }
-        }
-        return false;
+        SQLStatement sqlStatement = 
executionContext.getSqlStatementContext().getSqlStatement();
+        return isWriteDMLStatement(sqlStatement) && 
executionContext.getExecutionUnits().size() > 1;
     }
     
     private boolean isWriteDMLStatement(final SQLStatement sqlStatement) {
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 220ceea2956..0d64b5af9c4 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.driver.jdbc.core.statement;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -88,6 +87,7 @@ import 
org.apache.shardingsphere.sqlfederation.executor.SQLFederationExecutorCon
 import org.apache.shardingsphere.traffic.engine.TrafficEngine;
 import 
org.apache.shardingsphere.traffic.exception.metadata.EmptyTrafficExecutionUnitException;
 import org.apache.shardingsphere.traffic.rule.TrafficRule;
+import 
org.apache.shardingsphere.transaction.implicit.ImplicitTransactionCallback;
 import org.apache.shardingsphere.transaction.util.AutoCommitUtils;
 
 import java.sql.Connection;
@@ -151,7 +151,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     @Getter
     private final boolean selectContainsEnhancedTable;
     
-    private Collection<ExecutionContext> executionContexts;
+    private ExecutionContext executionContext;
     
     private Map<String, Integer> columnLabelAndIndexMap;
     
@@ -240,8 +240,8 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
             if (useFederation) {
                 return executeFederationQuery(queryContext);
             }
-            executionContexts = createExecutionContext(queryContext);
-            result = doExecuteQuery(executionContexts);
+            executionContext = createExecutionContext(queryContext);
+            result = doExecuteQuery(executionContext);
             // CHECKSTYLE:OFF
         } catch (final RuntimeException ex) {
             // CHECKSTYLE:ON
@@ -254,19 +254,14 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
         return result;
     }
     
-    private ShardingSphereResultSet doExecuteQuery(final 
Collection<ExecutionContext> executionContexts) throws SQLException {
-        ShardingSphereResultSet result = null;
-        // TODO support multi execution context, currently 
executionContexts.size() always equals 1
-        for (ExecutionContext each : executionContexts) {
-            List<QueryResult> queryResults = executeQuery0(each);
-            MergedResult mergedResult = mergeQuery(queryResults, 
each.getSqlStatementContext());
-            List<ResultSet> resultSets = getResultSets();
-            if (null == columnLabelAndIndexMap) {
-                columnLabelAndIndexMap = 
ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(sqlStatementContext, 
selectContainsEnhancedTable, resultSets.get(0).getMetaData());
-            }
-            result = new ShardingSphereResultSet(resultSets, mergedResult, 
this, selectContainsEnhancedTable, each, columnLabelAndIndexMap);
+    private ShardingSphereResultSet doExecuteQuery(final ExecutionContext 
executionContext) throws SQLException {
+        List<QueryResult> queryResults = executeQuery0(executionContext);
+        MergedResult mergedResult = mergeQuery(queryResults, 
executionContext.getSqlStatementContext());
+        List<ResultSet> resultSets = getResultSets();
+        if (null == columnLabelAndIndexMap) {
+            columnLabelAndIndexMap = 
ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(sqlStatementContext, 
selectContainsEnhancedTable, resultSets.get(0).getMetaData());
         }
-        return result;
+        return new ShardingSphereResultSet(resultSets, mergedResult, this, 
selectContainsEnhancedTable, executionContext, columnLabelAndIndexMap);
     }
     
     private boolean decide(final QueryContext queryContext, final 
ShardingSphereDatabase database, final RuleMetaData globalRuleMetaData) {
@@ -356,15 +351,13 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
                 JDBCExecutionUnit executionUnit = 
createTrafficExecutionUnit(trafficInstanceId, queryContext);
                 return executor.getTrafficExecutor().execute(executionUnit, 
(statement, sql) -> ((PreparedStatement) statement).executeUpdate());
             }
-            executionContexts = createExecutionContext(queryContext);
+            executionContext = createExecutionContext(queryContext);
             if (hasRawExecutionRule()) {
-                Collection<ExecuteResult> results = new LinkedList<>();
-                for (ExecutionContext each : executionContexts) {
-                    
results.addAll(executor.getRawExecutor().execute(createRawExecutionGroupContext(each),
 each.getQueryContext(), new RawSQLExecutorCallback()));
-                }
+                Collection<ExecuteResult> results =
+                        
executor.getRawExecutor().execute(createRawExecutionGroupContext(executionContext),
 executionContext.getQueryContext(), new RawSQLExecutorCallback());
                 return accumulate(results);
             }
-            return executeUpdateWithExecutionContexts(executionContexts);
+            return executeUpdateWithExecutionContext(executionContext);
             // CHECKSTYLE:OFF
         } catch (final RuntimeException ex) {
             // CHECKSTYLE:ON
@@ -375,17 +368,11 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
         }
     }
     
-    private int useDriverToExecuteUpdate(final Collection<ExecutionContext> 
executionContexts) throws SQLException {
-        Integer result = null;
-        Preconditions.checkArgument(!executionContexts.isEmpty());
-        // TODO support multi execution context, currently 
executionContexts.size() always equals 1
-        for (ExecutionContext each : executionContexts) {
-            ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(each);
-            cacheStatements(executionGroupContext.getInputGroups());
-            result = 
executor.getRegularExecutor().executeUpdate(executionGroupContext,
-                    each.getQueryContext(), 
each.getRouteContext().getRouteUnits(), createExecuteUpdateCallback());
-        }
-        return result;
+    private int useDriverToExecuteUpdate(final ExecutionContext 
executionContext) throws SQLException {
+        ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(executionContext);
+        cacheStatements(executionGroupContext.getInputGroups());
+        return 
executor.getRegularExecutor().executeUpdate(executionGroupContext,
+                executionContext.getQueryContext(), 
executionContext.getRouteContext().getRouteUnits(), 
createExecuteUpdateCallback());
     }
     
     private int accumulate(final Collection<ExecuteResult> results) {
@@ -434,16 +421,13 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
                 ResultSet resultSet = executeFederationQuery(queryContext);
                 return null != resultSet;
             }
-            executionContexts = createExecutionContext(queryContext);
+            executionContext = createExecutionContext(queryContext);
             if (hasRawExecutionRule()) {
-                Collection<ExecuteResult> results = new LinkedList<>();
-                for (ExecutionContext each : executionContexts) {
-                    // TODO process getStatement
-                    
results.addAll(executor.getRawExecutor().execute(createRawExecutionGroupContext(each),
 each.getQueryContext(), new RawSQLExecutorCallback()));
-                }
+                Collection<ExecuteResult> results =
+                        
executor.getRawExecutor().execute(createRawExecutionGroupContext(executionContext),
 executionContext.getQueryContext(), new RawSQLExecutorCallback());
                 return results.iterator().next() instanceof QueryResult;
             }
-            return executeWithExecutionContexts(executionContexts);
+            return executeWithExecutionContext(executionContext);
             // CHECKSTYLE:OFF
         } catch (final RuntimeException ex) {
             // CHECKSTYLE:ON
@@ -469,15 +453,15 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
                 .prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits(), new 
ExecutionGroupReportContext(databaseName));
     }
     
-    private boolean executeWithExecutionContexts(final 
Collection<ExecutionContext> executionContexts) throws SQLException {
-        return isNeedImplicitCommitTransaction(connection, executionContexts) 
? executeWithImplicitCommitTransaction(executionContexts) : 
useDriverToExecute(executionContexts);
+    private boolean executeWithExecutionContext(final ExecutionContext 
executionContext) throws SQLException {
+        return isNeedImplicitCommitTransaction(connection, executionContext) ? 
executeWithImplicitCommitTransaction(() -> 
useDriverToExecute(executionContext)) : useDriverToExecute(executionContext);
     }
     
-    private boolean executeWithImplicitCommitTransaction(final 
Collection<ExecutionContext> executionContexts) throws SQLException {
+    private boolean executeWithImplicitCommitTransaction(final 
ImplicitTransactionCallback<Boolean> callback) throws SQLException {
         boolean result;
         try {
             connection.setAutoCommit(false);
-            result = useDriverToExecute(executionContexts);
+            result = callback.execute();
             connection.commit();
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
@@ -490,15 +474,16 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
         return result;
     }
     
-    private int executeUpdateWithExecutionContexts(final 
Collection<ExecutionContext> executionContexts) throws SQLException {
-        return isNeedImplicitCommitTransaction(connection, executionContexts) 
? executeUpdateWithImplicitCommitTransaction(executionContexts) : 
useDriverToExecuteUpdate(executionContexts);
+    private int executeUpdateWithExecutionContext(final ExecutionContext 
executionContext) throws SQLException {
+        return isNeedImplicitCommitTransaction(connection, executionContext) ? 
executeUpdateWithImplicitCommitTransaction(() -> 
useDriverToExecuteUpdate(executionContext))
+                : useDriverToExecuteUpdate(executionContext);
     }
     
-    private int executeUpdateWithImplicitCommitTransaction(final 
Collection<ExecutionContext> executionContexts) throws SQLException {
+    private int executeUpdateWithImplicitCommitTransaction(final 
ImplicitTransactionCallback<Integer> callback) throws SQLException {
         int result;
         try {
             connection.setAutoCommit(false);
-            result = useDriverToExecuteUpdate(executionContexts);
+            result = callback.execute();
             connection.commit();
             // CHECKSTYLE:OFF
         } catch (final RuntimeException ex) {
@@ -511,17 +496,11 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
         return result;
     }
     
-    private boolean useDriverToExecute(final Collection<ExecutionContext> 
executionContexts) throws SQLException {
-        Boolean result = null;
-        Preconditions.checkArgument(!executionContexts.isEmpty());
-        // TODO support multi execution context, currently 
executionContexts.size() always equals 1
-        for (ExecutionContext each : executionContexts) {
-            ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(each);
-            cacheStatements(executionGroupContext.getInputGroups());
-            result = 
executor.getRegularExecutor().execute(executionGroupContext,
-                    each.getQueryContext(), 
each.getRouteContext().getRouteUnits(), createExecuteCallback());
-        }
-        return result;
+    private boolean useDriverToExecute(final ExecutionContext 
executionContext) throws SQLException {
+        ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(executionContext);
+        cacheStatements(executionGroupContext.getInputGroups());
+        return executor.getRegularExecutor().execute(executionGroupContext,
+                executionContext.getQueryContext(), 
executionContext.getRouteContext().getRouteUnits(), createExecuteCallback());
     }
     
     private JDBCExecutorCallback<Boolean> createExecuteCallback() {
@@ -557,7 +536,6 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         if (useFederation) {
             return executor.getSqlFederationEngine().getResultSet();
         }
-        ExecutionContext executionContext = 
executionContexts.iterator().next();
         if (executionContext.getSqlStatementContext() instanceof 
SelectStatementContext
                 || executionContext.getSqlStatementContext().getSqlStatement() 
instanceof DALStatement) {
             List<ResultSet> resultSets = getResultSets();
@@ -594,19 +572,19 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
         return result;
     }
     
-    private Collection<ExecutionContext> createExecutionContext(final 
QueryContext queryContext) {
+    private ExecutionContext createExecutionContext(final QueryContext 
queryContext) {
         RuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
         ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(databaseName);
         SQLAuditEngine.audit(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null, 
queryContext.getHintValueContext());
         ExecutionContext result = kernelProcessor.generateExecutionContext(
                 queryContext, currentDatabase, globalRuleMetaData, 
metaDataContexts.getMetaData().getProps(), 
connection.getDatabaseConnectionManager().getConnectionContext());
         findGeneratedKey(result).ifPresent(optional -> 
generatedValues.addAll(optional.getGeneratedValues()));
-        return Collections.singleton(result);
+        return result;
     }
     
-    private Collection<ExecutionContext> createExecutionContext(final 
QueryContext queryContext, final String trafficInstanceId) {
+    private ExecutionContext createExecutionContext(final QueryContext 
queryContext, final String trafficInstanceId) {
         ExecutionUnit executionUnit = new ExecutionUnit(trafficInstanceId, new 
SQLUnit(queryContext.getSql(), queryContext.getParameters()));
-        return Collections.singleton(new ExecutionContext(queryContext, 
Collections.singletonList(executionUnit), new RouteContext()));
+        return new ExecutionContext(queryContext, 
Collections.singletonList(executionUnit), new RouteContext());
     }
     
     private QueryContext createQueryContext() {
@@ -663,7 +641,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         if (null != currentBatchGeneratedKeysResultSet) {
             return currentBatchGeneratedKeysResultSet;
         }
-        Optional<GeneratedKeyContext> generatedKey = 
findGeneratedKey(executionContexts.iterator().next());
+        Optional<GeneratedKeyContext> generatedKey = 
findGeneratedKey(executionContext);
         if (generatedKey.isPresent() && 
statementOption.isReturnGeneratedKeys() && !generatedValues.isEmpty()) {
             return new 
GeneratedKeysResultSet(getGeneratedKeysColumnName(generatedKey.get().getColumnName()),
 generatedValues.iterator(), this);
         }
@@ -686,8 +664,8 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         try {
             QueryContext queryContext = createQueryContext();
             trafficInstanceId = getInstanceIdAndSet(queryContext).orElse(null);
-            executionContexts = null == trafficInstanceId ? 
createExecutionContext(queryContext) : createExecutionContext(queryContext, 
trafficInstanceId);
-            
batchPreparedStatementExecutor.addBatchForExecutionUnits(executionContexts.iterator().next().getExecutionUnits());
+            executionContext = null == trafficInstanceId ? 
createExecutionContext(queryContext) : createExecutionContext(queryContext, 
trafficInstanceId);
+            
batchPreparedStatementExecutor.addBatchForExecutionUnits(executionContext.getExecutionUnits());
         } finally {
             currentResultSet = null;
             clearParameters();
@@ -696,13 +674,13 @@ public final class ShardingSpherePreparedStatement 
extends AbstractPreparedState
     
     @Override
     public int[] executeBatch() throws SQLException {
-        if (null == executionContexts || executionContexts.isEmpty()) {
+        if (null == executionContext) {
             return new int[0];
         }
         try {
             // TODO add raw SQL executor
             initBatchPreparedStatementExecutor();
-            int[] results = 
batchPreparedStatementExecutor.executeBatch(executionContexts.iterator().next().getSqlStatementContext());
+            int[] results = 
batchPreparedStatementExecutor.executeBatch(executionContext.getSqlStatementContext());
             if (statementOption.isReturnGeneratedKeys() && 
generatedValues.isEmpty()) {
                 List<Statement> batchPreparedStatementExecutorStatements = 
batchPreparedStatementExecutor.getStatements();
                 for (Statement statement : 
batchPreparedStatementExecutorStatements) {
@@ -732,7 +710,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
             ExecutionUnit executionUnit = each.getExecutionUnit();
             executionUnits.add(executionUnit);
         }
-        
batchPreparedStatementExecutor.init(prepareEngine.prepare(executionContexts.iterator().next().getRouteContext(),
 executionUnits, new ExecutionGroupReportContext(databaseName)));
+        
batchPreparedStatementExecutor.init(prepareEngine.prepare(executionContext.getRouteContext(),
 executionUnits, new ExecutionGroupReportContext(databaseName)));
         setBatchParametersForStatements();
     }
     
@@ -773,7 +751,7 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
     @Override
     public boolean isAccumulate() {
         return 
metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
-                .anyMatch(each -> 
each.isNeedAccumulate(executionContexts.iterator().next().getSqlStatementContext().getTablesContext().getTableNames()));
+                .anyMatch(each -> 
each.isNeedAccumulate(executionContext.getSqlStatementContext().getTablesContext().getTableNames()));
     }
     
     @Override
diff --git 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 61a3a48996a..5cacd97385c 100644
--- 
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.driver.jdbc.core.statement;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -82,6 +81,7 @@ import org.apache.shardingsphere.traffic.engine.TrafficEngine;
 import 
org.apache.shardingsphere.traffic.exception.metadata.EmptyTrafficExecutionUnitException;
 import org.apache.shardingsphere.traffic.executor.TrafficExecutorCallback;
 import org.apache.shardingsphere.traffic.rule.TrafficRule;
+import 
org.apache.shardingsphere.transaction.implicit.ImplicitTransactionCallback;
 import org.apache.shardingsphere.transaction.util.AutoCommitUtils;
 
 import java.sql.Connection;
@@ -124,7 +124,7 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     
     private boolean returnGeneratedKeys;
     
-    private Collection<ExecutionContext> executionContexts;
+    private ExecutionContext executionContext;
     
     private ResultSet currentResultSet;
     
@@ -175,8 +175,8 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
             if (useFederation) {
                 return executeFederationQuery(queryContext);
             }
-            executionContexts = createExecutionContext(queryContext);
-            result = doExecuteQuery(executionContexts);
+            executionContext = createExecutionContext(queryContext);
+            result = doExecuteQuery(executionContext);
             // CHECKSTYLE:OFF
         } catch (final RuntimeException ex) {
             // CHECKSTYLE:ON
@@ -189,18 +189,12 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         return result;
     }
     
-    private ShardingSphereResultSet doExecuteQuery(final 
Collection<ExecutionContext> executionContexts) throws SQLException {
-        ShardingSphereResultSet result = null;
-        // TODO support multi execution context, currently 
executionContexts.size() always equals 1
-        for (ExecutionContext each : executionContexts) {
-            List<QueryResult> queryResults = executeQuery0(each);
-            MergedResult mergedResult = mergeQuery(queryResults, 
each.getSqlStatementContext());
-            boolean selectContainsEnhancedTable =
-                    each.getSqlStatementContext() instanceof 
SelectStatementContext && ((SelectStatementContext) 
each.getSqlStatementContext()).isContainsEnhancedTable();
-            result = new ShardingSphereResultSet(getResultSets(), 
mergedResult, this, selectContainsEnhancedTable, each);
-            
-        }
-        return result;
+    private ShardingSphereResultSet doExecuteQuery(final ExecutionContext 
executionContext) throws SQLException {
+        List<QueryResult> queryResults = executeQuery0(executionContext);
+        MergedResult mergedResult = mergeQuery(queryResults, 
executionContext.getSqlStatementContext());
+        boolean selectContainsEnhancedTable =
+                executionContext.getSqlStatementContext() instanceof 
SelectStatementContext && ((SelectStatementContext) 
executionContext.getSqlStatementContext()).isContainsEnhancedTable();
+        return new ShardingSphereResultSet(getResultSets(), mergedResult, 
this, selectContainsEnhancedTable, executionContext);
     }
     
     private boolean decide(final QueryContext queryContext, final 
ShardingSphereDatabase database, final RuleMetaData globalRuleMetaData) {
@@ -315,9 +309,10 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         }
     }
     
-    private int executeUpdate(final ExecuteUpdateCallback updateCallback, 
final SQLStatementContext sqlStatementContext, final 
Collection<ExecutionContext> executionContexts) throws SQLException {
-        return isNeedImplicitCommitTransaction(connection, executionContexts) 
? executeUpdateWithImplicitCommitTransaction(updateCallback, 
sqlStatementContext, executionContexts)
-                : useDriverToExecuteUpdate(updateCallback, 
sqlStatementContext, executionContexts);
+    private int executeUpdate(final ExecuteUpdateCallback updateCallback, 
final SQLStatementContext sqlStatementContext, final ExecutionContext 
executionContext) throws SQLException {
+        return isNeedImplicitCommitTransaction(connection, executionContext)
+                ? executeUpdateWithImplicitCommitTransaction(() -> 
useDriverToExecuteUpdate(updateCallback, sqlStatementContext, executionContext))
+                : useDriverToExecuteUpdate(updateCallback, 
sqlStatementContext, executionContext);
     }
     
     private int executeUpdate0(final String sql, final ExecuteUpdateCallback 
updateCallback, final TrafficExecutorCallback<Integer> trafficCallback) throws 
SQLException {
@@ -330,23 +325,19 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
             JDBCExecutionUnit executionUnit = 
createTrafficExecutionUnit(trafficInstanceId, queryContext);
             return executor.getTrafficExecutor().execute(executionUnit, 
trafficCallback);
         }
-        executionContexts = createExecutionContext(queryContext);
+        executionContext = createExecutionContext(queryContext);
         if 
(metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules().stream().anyMatch(RawExecutionRule.class::isInstance))
 {
-            Collection<ExecuteResult> results = new LinkedList<>();
-            for (ExecutionContext each : executionContexts) {
-                
results.addAll(executor.getRawExecutor().execute(createRawExecutionContext(each),
 each.getQueryContext(), new RawSQLExecutorCallback()));
-            }
+            Collection<ExecuteResult> results = 
executor.getRawExecutor().execute(createRawExecutionContext(executionContext), 
executionContext.getQueryContext(), new RawSQLExecutorCallback());
             return accumulate(results);
         }
-        return executeUpdate(updateCallback, 
queryContext.getSqlStatementContext(), executionContexts);
+        return executeUpdate(updateCallback, 
queryContext.getSqlStatementContext(), executionContext);
     }
     
-    private int executeUpdateWithImplicitCommitTransaction(final 
ExecuteUpdateCallback updateCallback, final SQLStatementContext 
sqlStatementContext,
-                                                           final 
Collection<ExecutionContext> executionContexts) throws SQLException {
+    private int executeUpdateWithImplicitCommitTransaction(final 
ImplicitTransactionCallback<Integer> callback) throws SQLException {
         int result;
         try {
             connection.setAutoCommit(false);
-            result = useDriverToExecuteUpdate(updateCallback, 
sqlStatementContext, executionContexts);
+            result = callback.execute();
             connection.commit();
             // CHECKSTYLE:OFF
         } catch (final RuntimeException ex) {
@@ -360,18 +351,12 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     }
     
     private int useDriverToExecuteUpdate(final ExecuteUpdateCallback 
updateCallback, final SQLStatementContext sqlStatementContext,
-                                         final Collection<ExecutionContext> 
executionContexts) throws SQLException {
-        Integer result = null;
-        Preconditions.checkArgument(!executionContexts.isEmpty());
-        // TODO support multi execution context, currently 
executionContexts.size() always equals 1
-        for (ExecutionContext each : executionContexts) {
-            ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(each);
-            cacheStatements(executionGroupContext.getInputGroups());
-            JDBCExecutorCallback<Integer> callback = 
createExecuteUpdateCallback(updateCallback, sqlStatementContext);
-            result = 
executor.getRegularExecutor().executeUpdate(executionGroupContext,
-                    each.getQueryContext(), 
each.getRouteContext().getRouteUnits(), callback);
-        }
-        return result;
+                                         final ExecutionContext 
executionContext) throws SQLException {
+        ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(executionContext);
+        cacheStatements(executionGroupContext.getInputGroups());
+        JDBCExecutorCallback<Integer> callback = 
createExecuteUpdateCallback(updateCallback, sqlStatementContext);
+        return 
executor.getRegularExecutor().executeUpdate(executionGroupContext,
+                executionContext.getQueryContext(), 
executionContext.getRouteContext().getRouteUnits(), callback);
     }
     
     private JDBCExecutorCallback<Integer> createExecuteUpdateCallback(final 
ExecuteUpdateCallback updateCallback, final SQLStatementContext 
sqlStatementContext) {
@@ -469,15 +454,12 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
                 ResultSet resultSet = executeFederationQuery(queryContext);
                 return null != resultSet;
             }
-            executionContexts = createExecutionContext(queryContext);
+            executionContext = createExecutionContext(queryContext);
             if 
(metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules().stream().anyMatch(RawExecutionRule.class::isInstance))
 {
-                Collection<ExecuteResult> results = new LinkedList<>();
-                for (ExecutionContext each : executionContexts) {
-                    
results.addAll(executor.getRawExecutor().execute(createRawExecutionContext(each),
 each.getQueryContext(), new RawSQLExecutorCallback()));
-                }
+                Collection<ExecuteResult> results = 
executor.getRawExecutor().execute(createRawExecutionContext(executionContext), 
executionContext.getQueryContext(), new RawSQLExecutorCallback());
                 return results.iterator().next() instanceof QueryResult;
             }
-            return executeWithExecutionContexts(executeCallback, 
executionContexts);
+            return executeWithExecutionContext(executeCallback, 
executionContext);
         } finally {
             currentResultSet = null;
         }
@@ -528,13 +510,13 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         return new QueryContext(sqlStatementContext, sql, 
Collections.emptyList(), hintValueContext);
     }
     
-    private Collection<ExecutionContext> createExecutionContext(final 
QueryContext queryContext) throws SQLException {
+    private ExecutionContext createExecutionContext(final QueryContext 
queryContext) throws SQLException {
         clearStatements();
         RuleMetaData globalRuleMetaData = 
metaDataContexts.getMetaData().getGlobalRuleMetaData();
         ShardingSphereDatabase currentDatabase = 
metaDataContexts.getMetaData().getDatabase(databaseName);
         SQLAuditEngine.audit(queryContext.getSqlStatementContext(), 
queryContext.getParameters(), globalRuleMetaData, currentDatabase, null, 
queryContext.getHintValueContext());
-        return 
Collections.singleton(kernelProcessor.generateExecutionContext(queryContext, 
currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(),
-                
connection.getDatabaseConnectionManager().getConnectionContext()));
+        return kernelProcessor.generateExecutionContext(queryContext, 
currentDatabase, globalRuleMetaData, metaDataContexts.getMetaData().getProps(),
+                
connection.getDatabaseConnectionManager().getConnectionContext());
     }
     
     private ExecutionGroupContext<JDBCExecutionUnit> 
createExecutionGroupContext(final ExecutionContext executionContext) throws 
SQLException {
@@ -548,16 +530,16 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
                 .prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits(), new 
ExecutionGroupReportContext(databaseName));
     }
     
-    private boolean executeWithExecutionContexts(final ExecuteCallback 
executeCallback, final Collection<ExecutionContext> executionContexts) throws 
SQLException {
-        return isNeedImplicitCommitTransaction(connection, executionContexts) 
? executeWithImplicitCommitTransaction(executeCallback, executionContexts)
-                : useDriverToExecute(executeCallback, executionContexts);
+    private boolean executeWithExecutionContext(final ExecuteCallback 
executeCallback, final ExecutionContext executionContext) throws SQLException {
+        return isNeedImplicitCommitTransaction(connection, executionContext) ? 
executeWithImplicitCommitTransaction(() -> useDriverToExecute(executeCallback, 
executionContext))
+                : useDriverToExecute(executeCallback, executionContext);
     }
     
-    private boolean executeWithImplicitCommitTransaction(final ExecuteCallback 
callback, final Collection<ExecutionContext> executionContexts) throws 
SQLException {
+    private boolean executeWithImplicitCommitTransaction(final 
ImplicitTransactionCallback<Boolean> callback) throws SQLException {
         boolean result;
         try {
             connection.setAutoCommit(false);
-            result = useDriverToExecute(callback, executionContexts);
+            result = callback.execute();
             connection.commit();
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
@@ -570,18 +552,12 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         return result;
     }
     
-    private boolean useDriverToExecute(final ExecuteCallback callback, final 
Collection<ExecutionContext> executionContexts) throws SQLException {
-        Boolean result = null;
-        Preconditions.checkArgument(!executionContexts.isEmpty());
-        // TODO support multi execution context, currently 
executionContexts.size() always equals 1
-        for (ExecutionContext each : executionContexts) {
-            ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(each);
-            cacheStatements(executionGroupContext.getInputGroups());
-            JDBCExecutorCallback<Boolean> jdbcExecutorCallback = 
createExecuteCallback(callback, 
each.getSqlStatementContext().getSqlStatement());
-            result = 
executor.getRegularExecutor().execute(executionGroupContext,
-                    each.getQueryContext(), 
each.getRouteContext().getRouteUnits(), jdbcExecutorCallback);
-        }
-        return result;
+    private boolean useDriverToExecute(final ExecuteCallback callback, final 
ExecutionContext executionContext) throws SQLException {
+        ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
createExecutionGroupContext(executionContext);
+        cacheStatements(executionGroupContext.getInputGroups());
+        JDBCExecutorCallback<Boolean> jdbcExecutorCallback = 
createExecuteCallback(callback, 
executionContext.getSqlStatementContext().getSqlStatement());
+        return executor.getRegularExecutor().execute(executionGroupContext,
+                executionContext.getQueryContext(), 
executionContext.getRouteContext().getRouteUnits(), jdbcExecutorCallback);
     }
     
     private void cacheStatements(final 
Collection<ExecutionGroup<JDBCExecutionUnit>> executionGroups) throws 
SQLException {
@@ -625,7 +601,6 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
         if (useFederation) {
             return executor.getSqlFederationEngine().getResultSet();
         }
-        ExecutionContext executionContext = 
executionContexts.iterator().next();
         if (executionContext.getSqlStatementContext() instanceof 
SelectStatementContext
                 || executionContext.getSqlStatementContext().getSqlStatement() 
instanceof DALStatement) {
             List<ResultSet> resultSets = getResultSets();
@@ -686,7 +661,7 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     @Override
     public boolean isAccumulate() {
         return 
metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
-                .anyMatch(each -> 
each.isNeedAccumulate(executionContexts.iterator().next().getSqlStatementContext().getTablesContext().getTableNames()));
+                .anyMatch(each -> 
each.isNeedAccumulate(executionContext.getSqlStatementContext().getTablesContext().getTableNames()));
     }
     
     @Override
@@ -712,7 +687,6 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     }
     
     private Optional<GeneratedKeyContext> findGeneratedKey() {
-        ExecutionContext executionContext = 
executionContexts.iterator().next();
         return executionContext.getSqlStatementContext() instanceof 
InsertStatementContext
                 ? ((InsertStatementContext) 
executionContext.getSqlStatementContext()).getGeneratedKeyContext()
                 : Optional.empty();
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 816625d8614..e907a752eac 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
@@ -272,6 +272,6 @@ class StatementAdapterTest {
     
     @SneakyThrows(ReflectiveOperationException.class)
     private void setExecutionContext(final ShardingSphereStatement statement, 
final ExecutionContext executionContext) {
-        
Plugins.getMemberAccessor().set(statement.getClass().getDeclaredField("executionContexts"),
 statement, Collections.singleton(executionContext));
+        
Plugins.getMemberAccessor().set(statement.getClass().getDeclaredField("executionContext"),
 statement, executionContext);
     }
 }
diff --git 
a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/implicit/ImplicitTransactionCallback.java
 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/implicit/ImplicitTransactionCallback.java
new file mode 100644
index 00000000000..e9616dd8057
--- /dev/null
+++ 
b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/implicit/ImplicitTransactionCallback.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.transaction.implicit;
+
+import java.sql.SQLException;
+
+/**
+ * Implicit transaction callback.
+ *
+ * @param <T> type of return value
+ */
+public interface ImplicitTransactionCallback<T> {
+    
+    /**
+     * Execute.
+     *
+     * @return return value
+     * @throws SQLException SQL exception
+     */
+    T execute() throws SQLException;
+}
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 ee51ee8e6dc..b073eaa2c61 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
@@ -43,6 +43,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecuti
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
 import org.apache.shardingsphere.infra.merge.MergeEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.util.SystemSchemaUtils;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
@@ -69,10 +70,11 @@ import 
org.apache.shardingsphere.proxy.backend.session.transaction.TransactionSt
 import 
org.apache.shardingsphere.sharding.merge.common.IteratorStreamMergedResult;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DMLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLInsertStatement;
 import 
org.apache.shardingsphere.sqlfederation.executor.SQLFederationExecutorContext;
 import org.apache.shardingsphere.transaction.api.TransactionType;
+import 
org.apache.shardingsphere.transaction.implicit.ImplicitTransactionCallback;
 
 import java.sql.Connection;
 import java.sql.ResultSet;
@@ -165,21 +167,17 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
             ResultSet resultSet = doExecuteFederation(queryContext, 
metaDataContexts);
             return processExecuteFederation(resultSet, metaDataContexts);
         }
-        Collection<ExecutionContext> executionContexts = 
generateExecutionContexts();
-        return isNeedImplicitCommitTransaction(executionContexts) ? 
doExecuteWithImplicitCommitTransaction(executionContexts) : 
doExecute(executionContexts);
+        ExecutionContext executionContext = generateExecutionContext();
+        return isNeedImplicitCommitTransaction(executionContext) ? 
doExecuteWithImplicitCommitTransaction(() -> doExecute(executionContext)) : 
doExecute(executionContext);
     }
     
-    private Collection<ExecutionContext> generateExecutionContexts() {
-        Collection<ExecutionContext> result = new LinkedList<>();
-        MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(queryContext, database, 
metaDataContexts.getMetaData().getGlobalRuleMetaData(),
-                metaDataContexts.getMetaData().getProps(), 
databaseConnectionManager.getConnectionSession().getConnectionContext());
-        result.add(executionContext);
-        // TODO support logical SQL optimize to generate multiple logical SQL
-        return result;
+    private ExecutionContext generateExecutionContext() {
+        ShardingSphereMetaData metaData = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData();
+        return new KernelProcessor().generateExecutionContext(queryContext, 
database, metaData.getGlobalRuleMetaData(), metaData.getProps(),
+                
databaseConnectionManager.getConnectionSession().getConnectionContext());
     }
     
-    private boolean isNeedImplicitCommitTransaction(final 
Collection<ExecutionContext> executionContexts) {
+    private boolean isNeedImplicitCommitTransaction(final ExecutionContext 
executionContext) {
         if (!databaseConnectionManager.getConnectionSession().isAutoCommit()) {
             return false;
         }
@@ -187,28 +185,20 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
         if 
(!TransactionType.isDistributedTransaction(transactionStatus.getTransactionType())
 || transactionStatus.isInTransaction()) {
             return false;
         }
-        if (1 == executionContexts.size()) {
-            SQLStatement sqlStatement = 
executionContexts.iterator().next().getSqlStatementContext().getSqlStatement();
-            return isWriteDMLStatement(sqlStatement) && 
executionContexts.iterator().next().getExecutionUnits().size() > 1;
-        }
-        for (ExecutionContext each : executionContexts) {
-            if 
(isWriteDMLStatement(each.getSqlStatementContext().getSqlStatement())) {
-                return true;
-            }
-        }
-        return false;
+        SQLStatement sqlStatement = 
executionContext.getSqlStatementContext().getSqlStatement();
+        return isWriteDMLStatement(sqlStatement) && 
executionContext.getExecutionUnits().size() > 1;
     }
     
     private boolean isWriteDMLStatement(final SQLStatement sqlStatement) {
         return sqlStatement instanceof DMLStatement && !(sqlStatement 
instanceof SelectStatement);
     }
     
-    private ResponseHeader doExecuteWithImplicitCommitTransaction(final 
Collection<ExecutionContext> executionContexts) throws SQLException {
-        ResponseHeader result;
+    private <T> T doExecuteWithImplicitCommitTransaction(final 
ImplicitTransactionCallback<T> callback) throws SQLException {
+        T result;
         BackendTransactionManager transactionManager = new 
BackendTransactionManager(databaseConnectionManager);
         try {
             transactionManager.begin();
-            result = doExecute(executionContexts);
+            result = callback.execute();
             transactionManager.commit();
             // CHECKSTYLE:OFF
         } catch (final Exception ex) {
@@ -220,15 +210,6 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
         return result;
     }
     
-    private ResponseHeader doExecute(final Collection<ExecutionContext> 
executionContexts) throws SQLException {
-        ResponseHeader result = null;
-        // TODO support multi execution context, currently 
executionContexts.size() always equals 1
-        for (ExecutionContext each : executionContexts) {
-            result = doExecute(each);
-        }
-        return result;
-    }
-    
     @SuppressWarnings({"unchecked", "rawtypes"})
     private ResponseHeader doExecute(final ExecutionContext executionContext) 
throws SQLException {
         if (executionContext.getExecutionUnits().isEmpty()) {
@@ -238,11 +219,12 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
         List result = proxySQLExecutor.execute(executionContext);
         refreshMetaData(executionContext);
         Object executeResultSample = result.iterator().next();
-        return executeResultSample instanceof QueryResult ? 
processExecuteQuery(executionContext, result, (QueryResult) 
executeResultSample) : processExecuteUpdate(executionContext, result);
+        return executeResultSample instanceof QueryResult ? 
processExecuteQuery(queryContext.getSqlStatementContext(), result, 
(QueryResult) executeResultSample)
+                : processExecuteUpdate(executionContext, result);
     }
     
     private ResultSet doExecuteFederation(final QueryContext queryContext, 
final MetaDataContexts metaDataContexts) {
-        boolean isReturnGeneratedKeys = 
queryContext.getSqlStatementContext().getSqlStatement() instanceof 
MySQLInsertStatement;
+        boolean isReturnGeneratedKeys = 
queryContext.getSqlStatementContext().getSqlStatement() instanceof 
InsertStatement;
         ShardingSphereDatabase database = 
metaDataContexts.getMetaData().getDatabase(databaseConnectionManager.getConnectionSession().getDatabaseName());
         DatabaseType protocolType = database.getProtocolType();
         ProxyJDBCExecutorCallback callback = 
ProxyJDBCExecutorCallbackFactory.newInstance(driverType, protocolType, 
database.getResourceMetaData(),
@@ -302,25 +284,25 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
                 
contextManager.getMetaDataContexts().getMetaData().getProps()).refresh(executionContext.getSqlStatementContext(),
 executionContext.getRouteContext().getRouteUnits());
     }
     
-    private QueryResponseHeader processExecuteQuery(final ExecutionContext 
executionContext, final List<QueryResult> queryResults, final QueryResult 
queryResultSample) throws SQLException {
-        queryHeaders = createQueryHeaders(executionContext, queryResultSample);
-        mergedResult = mergeQuery(executionContext.getSqlStatementContext(), 
queryResults);
+    private QueryResponseHeader processExecuteQuery(final SQLStatementContext 
sqlStatementContext, final List<QueryResult> queryResults, final QueryResult 
queryResultSample) throws SQLException {
+        queryHeaders = createQueryHeaders(sqlStatementContext, 
queryResultSample);
+        mergedResult = mergeQuery(sqlStatementContext, queryResults);
         return new QueryResponseHeader(queryHeaders);
     }
     
-    private List<QueryHeader> createQueryHeaders(final ExecutionContext 
executionContext, final QueryResult queryResultSample) throws SQLException {
-        int columnCount = getColumnCount(executionContext, queryResultSample);
+    private List<QueryHeader> createQueryHeaders(final SQLStatementContext 
sqlStatementContext, final QueryResult queryResultSample) throws SQLException {
+        int columnCount = getColumnCount(sqlStatementContext, 
queryResultSample);
         List<QueryHeader> result = new ArrayList<>(columnCount);
         QueryHeaderBuilderEngine queryHeaderBuilderEngine = new 
QueryHeaderBuilderEngine(database.getProtocolType());
         for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) {
-            result.add(createQueryHeader(queryHeaderBuilderEngine, 
executionContext, queryResultSample, database, columnIndex));
+            result.add(createQueryHeader(queryHeaderBuilderEngine, 
sqlStatementContext, queryResultSample, database, columnIndex));
         }
         return result;
     }
     
-    private int getColumnCount(final ExecutionContext executionContext, final 
QueryResult queryResultSample) throws SQLException {
-        return selectContainsEnhancedTable && 
hasSelectExpandProjections(executionContext.getSqlStatementContext())
-                ? ((SelectStatementContext) 
executionContext.getSqlStatementContext()).getProjectionsContext().getExpandProjections().size()
+    private int getColumnCount(final SQLStatementContext sqlStatementContext, 
final QueryResult queryResultSample) throws SQLException {
+        return selectContainsEnhancedTable && 
hasSelectExpandProjections(sqlStatementContext)
+                ? ((SelectStatementContext) 
sqlStatementContext).getProjectionsContext().getExpandProjections().size()
                 : queryResultSample.getMetaData().getColumnCount();
     }
     
@@ -328,10 +310,10 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
         return sqlStatementContext instanceof SelectStatementContext && 
!((SelectStatementContext) 
sqlStatementContext).getProjectionsContext().getExpandProjections().isEmpty();
     }
     
-    private QueryHeader createQueryHeader(final QueryHeaderBuilderEngine 
queryHeaderBuilderEngine, final ExecutionContext executionContext,
+    private QueryHeader createQueryHeader(final QueryHeaderBuilderEngine 
queryHeaderBuilderEngine, final SQLStatementContext sqlStatementContext,
                                           final QueryResult queryResultSample, 
final ShardingSphereDatabase database, final int columnIndex) throws 
SQLException {
-        return selectContainsEnhancedTable && 
hasSelectExpandProjections(executionContext.getSqlStatementContext())
-                ? queryHeaderBuilderEngine.build(((SelectStatementContext) 
executionContext.getSqlStatementContext()).getProjectionsContext(), 
queryResultSample.getMetaData(), database, columnIndex)
+        return selectContainsEnhancedTable && 
hasSelectExpandProjections(sqlStatementContext)
+                ? queryHeaderBuilderEngine.build(((SelectStatementContext) 
sqlStatementContext).getProjectionsContext(), queryResultSample.getMetaData(), 
database, columnIndex)
                 : 
queryHeaderBuilderEngine.build(queryResultSample.getMetaData(), database, 
columnIndex);
     }
     

Reply via email to