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 1890079  Use sane SQL if connection cannot connect in proxy (#9217)
1890079 is described below

commit 18900793d82aea4715ce629dd98892445b75e7ad
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Jan 29 16:12:35 2021 +0800

    Use sane SQL if connection cannot connect in proxy (#9217)
    
    * Simplify ConnectionAdapterTest
    
    * Use sane SQL if connection cannot connect in proxy
---
 .../backend/communication/ProxySQLExecutor.java    | 28 +++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
index 5f84f48..1e53dcf 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/communication/ProxySQLExecutor.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.proxy.backend.communication;
 
 import 
org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
 import org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroup;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
@@ -26,6 +27,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.context.SQLUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.SQLExecutorExceptionHandler;
 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.sane.JDBCSaneQueryResultEngineFactory;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.raw.RawExecutor;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.raw.RawSQLExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.raw.callback.RawSQLExecutorCallback;
@@ -34,8 +36,8 @@ 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.executor.sql.prepare.raw.RawExecutionPrepareEngine;
 import org.apache.shardingsphere.infra.optimize.execute.CalciteExecutor;
-import org.apache.shardingsphere.infra.optimize.schema.row.CalciteRowExecutor;
 import org.apache.shardingsphere.infra.optimize.execute.CalciteJDBCExecutor;
+import org.apache.shardingsphere.infra.optimize.schema.row.CalciteRowExecutor;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.type.RawExecutionRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
@@ -55,6 +57,7 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -122,7 +125,12 @@ public final class ProxySQLExecutor {
     
     private Collection<ExecuteResult> rawExecute(final ExecutionContext 
executionContext, final Collection<ShardingSphereRule> rules, final int 
maxConnectionsSizePerQuery) throws SQLException {
         RawExecutionPrepareEngine prepareEngine = new 
RawExecutionPrepareEngine(maxConnectionsSizePerQuery, rules);
-        Collection<ExecutionGroup<RawSQLExecutionUnit>> executionGroups = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits());
+        Collection<ExecutionGroup<RawSQLExecutionUnit>> executionGroups;
+        try {
+            executionGroups = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits());
+        } catch (final SQLException ex) {
+            return getSaneExecuteResults(executionContext, ex);
+        }
         // TODO handle query header
         return rawExecutor.execute(executionGroups, new 
RawSQLExecutorCallback());
     }
@@ -146,7 +154,21 @@ public final class ProxySQLExecutor {
                                                          final int 
maxConnectionsSizePerQuery, final boolean isReturnGeneratedKeys, final boolean 
isExceptionThrown) throws SQLException {
         DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> 
prepareEngine = new DriverExecutionPrepareEngine<>(
                 type, maxConnectionsSizePerQuery, backendConnection, new 
StatementOption(isReturnGeneratedKeys), rules);
-        Collection<ExecutionGroup<JDBCExecutionUnit>> executionGroups = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits());
+        Collection<ExecutionGroup<JDBCExecutionUnit>> executionGroups;
+        try {
+            executionGroups = 
prepareEngine.prepare(executionContext.getRouteContext(), 
executionContext.getExecutionUnits());
+        } catch (final SQLException ex) {
+            return getSaneExecuteResults(executionContext, ex);
+        }
         return 
jdbcExecutor.execute(executionContext.getSqlStatementContext().getSqlStatement(),
 executionGroups, isReturnGeneratedKeys, isExceptionThrown);
     }
+    
+    private Collection<ExecuteResult> getSaneExecuteResults(final 
ExecutionContext executionContext, final SQLException originalException) throws 
SQLException {
+        DatabaseType databaseType = 
ProxyContext.getInstance().getMetaData(backendConnection.getSchemaName()).getResource().getDatabaseType();
+        Optional<ExecuteResult> executeResult = 
JDBCSaneQueryResultEngineFactory.newInstance(databaseType).getSaneQueryResult(executionContext.getSqlStatementContext().getSqlStatement());
+        if (executeResult.isPresent()) {
+            return Collections.singleton(executeResult.get());
+        }
+        throw originalException;
+    }
 }

Reply via email to