This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch 5.3.2-release
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/5.3.2-release by this push:
new aa697cca053 Cherry-pick c6dd048 and 1025a5e (#24817)
aa697cca053 is described below
commit aa697cca053c78fec829f1ec5f3bfbcb45c58e5f
Author: zhaojinchao <[email protected]>
AuthorDate: Fri Mar 24 22:57:42 2023 +0800
Cherry-pick c6dd048 and 1025a5e (#24817)
* Avoid repeat call findRules method (#24797)
* Avoid repeat call findRules method
* Fix chekystyle
* Avoid repeat call findRules method
* Adjust single table to isTransparentStatement
* Change method name
* Refactor DatabaseConnector avoid repeat call findRules method (#24816)
* Refactor DatabaseConnector avoid repeat call findRules method
* Update
* Fix index
---
.../rule/identifier/type/ColumnContainedRule.java | 1 +
.../jdbc/adapter/AbstractResultSetAdapter.java | 7 +++-
.../core/resultset/ShardingSphereResultSet.java | 11 +++---
.../resultset/ShardingSphereResultSetMetaData.java | 24 +++--------
.../statement/ShardingSpherePreparedStatement.java | 35 +++++++++++++++-
.../core/statement/ShardingSphereStatement.java | 33 +++++++++++++++-
.../driver/jdbc/adapter/ResultSetAdapterTest.java | 15 +------
.../jdbc/adapter/ResultSetGetterAdapterTest.java | 2 +-
.../resultset/ShardingSphereResultSetTest.java | 2 +-
.../UnsupportedOperationResultSetTest.java | 2 +-
.../UnsupportedUpdateOperationResultSetTest.java | 2 +-
.../proxy/backend/connector/DatabaseConnector.java | 46 ++++++++++++++--------
12 files changed, 117 insertions(+), 63 deletions(-)
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/ColumnContainedRule.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/ColumnContainedRule.java
index cd15c9f768b..b327f8d23c6 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/ColumnContainedRule.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/ColumnContainedRule.java
@@ -21,6 +21,7 @@ import
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import java.util.Collection;
+//TODO Consider introducing transparent table and enhance table.
/**
* ShardingSphere rule which contains column.
*/
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
index e4002e8363b..324fa22daad 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/adapter/AbstractResultSetAdapter.java
@@ -46,6 +46,8 @@ public abstract class AbstractResultSetAdapter extends
AbstractUnsupportedOperat
@Getter
private final Statement statement;
+ private final boolean transparentStatement;
+
private boolean closed;
private final ForceExecuteTemplate<ResultSet> forceExecuteTemplate = new
ForceExecuteTemplate<>();
@@ -53,16 +55,17 @@ public abstract class AbstractResultSetAdapter extends
AbstractUnsupportedOperat
@Getter
private final ExecutionContext executionContext;
- protected AbstractResultSetAdapter(final List<ResultSet> resultSets, final
Statement statement, final ExecutionContext executionContext) {
+ protected AbstractResultSetAdapter(final List<ResultSet> resultSets, final
Statement statement, final boolean transparentStatement, final ExecutionContext
executionContext) {
Preconditions.checkArgument(!resultSets.isEmpty());
this.resultSets = resultSets;
this.statement = statement;
+ this.transparentStatement = transparentStatement;
this.executionContext = executionContext;
}
@Override
public final ResultSetMetaData getMetaData() throws SQLException {
- return new
ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getDatabase(),
executionContext.getSqlStatementContext());
+ return new
ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getDatabase(),
transparentStatement, executionContext.getSqlStatementContext());
}
private ShardingSphereDatabase getDatabase() {
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java
index 3e6149a3d54..67f8dedf346 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSet.java
@@ -62,15 +62,16 @@ public final class ShardingSphereResultSet extends
AbstractResultSetAdapter {
private final Map<String, Integer> columnLabelAndIndexMap;
- public ShardingSphereResultSet(final List<ResultSet> resultSets, final
MergedResult mergeResultSet, final Statement statement, final ExecutionContext
executionContext) throws SQLException {
- super(resultSets, statement, executionContext);
+ public ShardingSphereResultSet(final List<ResultSet> resultSets, final
MergedResult mergeResultSet, final Statement statement, final boolean
transparentStatement,
+ final ExecutionContext executionContext)
throws SQLException {
+ super(resultSets, statement, transparentStatement, executionContext);
this.mergeResultSet = mergeResultSet;
columnLabelAndIndexMap =
ShardingSphereResultSetUtil.createColumnLabelAndIndexMap(executionContext.getSqlStatementContext(),
resultSets.get(0).getMetaData());
}
- public ShardingSphereResultSet(final List<ResultSet> resultSets, final
MergedResult mergeResultSet, final Statement statement, final ExecutionContext
executionContext,
- final Map<String, Integer>
columnLabelAndIndexMap) {
- super(resultSets, statement, executionContext);
+ public ShardingSphereResultSet(final List<ResultSet> resultSets, final
MergedResult mergeResultSet, final Statement statement, final boolean
transparentStatement,
+ final ExecutionContext executionContext,
final Map<String, Integer> columnLabelAndIndexMap) {
+ super(resultSets, statement, transparentStatement, executionContext);
this.mergeResultSet = mergeResultSet;
this.columnLabelAndIndexMap = columnLabelAndIndexMap;
}
diff --git
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
index 87b8f90dadc..cc0bef694c7 100644
---
a/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
+++
b/jdbc/core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetMetaData.java
@@ -28,9 +28,7 @@ import
org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
-import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
@@ -47,12 +45,14 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
private final ShardingSphereDatabase database;
+ private final boolean transparentStatement;
+
private final SQLStatementContext<?> sqlStatementContext;
@Override
public int getColumnCount() throws SQLException {
if (sqlStatementContext instanceof SelectStatementContext) {
- if (isAllSingleTable()) {
+ if (transparentStatement) {
return resultSetMetaData.getColumnCount();
}
if (hasSelectExpandProjections()) {
@@ -100,7 +100,7 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
@Override
public String getColumnLabel(final int column) throws SQLException {
- if (isAllSingleTable()) {
+ if (transparentStatement) {
return resultSetMetaData.getColumnLabel(column);
}
if (hasSelectExpandProjections()) {
@@ -115,7 +115,7 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
@Override
public String getColumnName(final int column) throws SQLException {
- if (isAllSingleTable()) {
+ if (transparentStatement) {
return resultSetMetaData.getColumnName(column);
}
if (hasSelectExpandProjections()) {
@@ -135,20 +135,6 @@ public final class ShardingSphereResultSetMetaData extends
WrapperAdapter implem
return sqlStatementContext instanceof SelectStatementContext &&
!((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections().isEmpty();
}
- private boolean isAllSingleTable() {
- return
sqlStatementContext.getTablesContext().getTableNames().stream().allMatch(each
-> !containsInImmutableDataNodeContainedRule(each)
- && !containsInColumnContainedRule(each));
- }
-
- private boolean containsInImmutableDataNodeContainedRule(final String
tableName) {
- return
database.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
- .filter(each -> !(each instanceof
MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
- }
-
- private boolean containsInColumnContainedRule(final String tableName) {
- return
database.getRuleMetaData().findRules(ColumnContainedRule.class).stream().anyMatch(each
-> each.getTables().contains(tableName));
- }
-
private void checkColumnIndex(final int column) throws SQLException {
List<Projection> actualProjections = ((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections();
if (column > actualProjections.size()) {
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 1219ac4313a..e013cdba599 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
@@ -81,6 +81,8 @@ import
org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.StorageConnectorReusableRule;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -152,6 +154,9 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
@Getter(AccessLevel.PROTECTED)
private final StatementManager statementManager;
+ @Getter
+ private final boolean transparentStatement;
+
private ExecutionContext executionContext;
private Map<String, Integer> columnLabelAndIndexMap;
@@ -207,6 +212,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
kernelProcessor = new KernelProcessor();
statementsCacheable =
isStatementsCacheable(metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData());
trafficRule =
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(TrafficRule.class);
+ transparentStatement =
isTransparentStatement(metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData());
statementManager = new StatementManager();
}
@@ -214,6 +220,31 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
return
databaseRuleMetaData.findRules(StorageConnectorReusableRule.class).size() ==
databaseRuleMetaData.getRules().size() && !HintManager.isInstantiated();
}
+ private boolean isTransparentStatement(final ShardingSphereRuleMetaData
ruleMetaData) {
+ Optional<DataNodeContainedRule> dataNodeContainedRule =
getDataNodeContainedRuleForShardingRule(ruleMetaData.findRules(DataNodeContainedRule.class));
+ Collection<ColumnContainedRule> columnContainedRules =
ruleMetaData.findRules(ColumnContainedRule.class);
+ for (String each :
sqlStatementContext.getTablesContext().getTableNames()) {
+ return (!dataNodeContainedRule.isPresent() ||
!dataNodeContainedRule.get().getAllTables().contains(each)) &&
!containsInColumnContainedRule(each, columnContainedRules);
+ }
+ return true;
+ }
+
+ private Optional<DataNodeContainedRule>
getDataNodeContainedRuleForShardingRule(final Collection<DataNodeContainedRule>
dataNodeContainedRules) {
+ for (DataNodeContainedRule each : dataNodeContainedRules) {
+ if (!(each instanceof MutableDataNodeRule)) {
+ return Optional.of(each);
+ }
+ }
+ return Optional.empty();
+ }
+
+ private boolean containsInColumnContainedRule(final String tableName,
final Collection<ColumnContainedRule> columnContainedRules) {
+ for (ColumnContainedRule each : columnContainedRules) {
+ return each.getTables().contains(tableName);
+ }
+ return false;
+ }
+
@Override
public ResultSet executeQuery() throws SQLException {
ResultSet result;
@@ -240,7 +271,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
List<ResultSet> resultSets = getResultSets();
Map<String, Integer> columnLabelAndIndexMap = null !=
this.columnLabelAndIndexMap ? this.columnLabelAndIndexMap
: (this.columnLabelAndIndexMap =
ShardingSphereResultSetUtil.createColumnLabelAndIndexMap(sqlStatementContext,
resultSets.get(0).getMetaData()));
- result = new ShardingSphereResultSet(resultSets, mergedResult,
this, executionContext, columnLabelAndIndexMap);
+ result = new ShardingSphereResultSet(resultSets, mergedResult,
this, transparentStatement, executionContext, columnLabelAndIndexMap);
// CHECKSTYLE:OFF
} catch (final Exception ex) {
// CHECKSTYLE:ON
@@ -521,7 +552,7 @@ public final class ShardingSpherePreparedStatement extends
AbstractPreparedState
MergedResult mergedResult =
mergeQuery(getQueryResults(resultSets));
Map<String, Integer> columnLabelAndIndexMap = null !=
this.columnLabelAndIndexMap ? this.columnLabelAndIndexMap
: (this.columnLabelAndIndexMap =
ShardingSphereResultSetUtil.createColumnLabelAndIndexMap(sqlStatementContext,
resultSets.get(0).getMetaData()));
- currentResultSet = new ShardingSphereResultSet(resultSets,
mergedResult, this, executionContext, columnLabelAndIndexMap);
+ currentResultSet = new ShardingSphereResultSet(resultSets,
mergedResult, this, transparentStatement, executionContext,
columnLabelAndIndexMap);
}
return currentResultSet;
}
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 67a1e8a26d6..281a61960e2 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
@@ -75,7 +75,9 @@ import
org.apache.shardingsphere.infra.merge.result.MergedResult;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.infra.route.context.RouteContext;
+import
org.apache.shardingsphere.infra.rule.identifier.type.ColumnContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.MutableDataNodeRule;
import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -177,7 +179,8 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
executionContext = createExecutionContext(queryContext);
List<QueryResult> queryResults = executeQuery0();
MergedResult mergedResult = mergeQuery(queryResults);
- result = new ShardingSphereResultSet(getResultSets(),
mergedResult, this, executionContext);
+ result = new ShardingSphereResultSet(getResultSets(),
mergedResult, this,
isTransparentStatement(queryContext.getSqlStatementContext(),
+
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData()),
executionContext);
// CHECKSTYLE:OFF
} catch (final Exception ex) {
// CHECKSTYLE:ON
@@ -242,6 +245,31 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getResourceMetaData().getStorageTypes());
}
+ private boolean isTransparentStatement(final SQLStatementContext<?>
sqlStatementContext, final ShardingSphereRuleMetaData ruleMetaData) {
+ Optional<DataNodeContainedRule> dataNodeContainedRule =
getDataNodeContainedRuleForShardingRule(ruleMetaData.findRules(DataNodeContainedRule.class));
+ Collection<ColumnContainedRule> columnContainedRules =
ruleMetaData.findRules(ColumnContainedRule.class);
+ for (String each :
sqlStatementContext.getTablesContext().getTableNames()) {
+ return (!dataNodeContainedRule.isPresent() ||
!dataNodeContainedRule.get().getAllTables().contains(each)) &&
!containsInColumnContainedRule(each, columnContainedRules);
+ }
+ return true;
+ }
+
+ private Optional<DataNodeContainedRule>
getDataNodeContainedRuleForShardingRule(final Collection<DataNodeContainedRule>
dataNodeContainedRules) {
+ for (DataNodeContainedRule each : dataNodeContainedRules) {
+ if (!(each instanceof MutableDataNodeRule)) {
+ return Optional.of(each);
+ }
+ }
+ return Optional.empty();
+ }
+
+ private boolean containsInColumnContainedRule(final String tableName,
final Collection<ColumnContainedRule> columnContainedRules) {
+ for (ColumnContainedRule each : columnContainedRules) {
+ return each.getTables().contains(tableName);
+ }
+ return false;
+ }
+
@Override
public int executeUpdate(final String sql) throws SQLException {
try {
@@ -615,7 +643,8 @@ public final class ShardingSphereStatement extends
AbstractStatementAdapter {
return currentResultSet;
}
MergedResult mergedResult =
mergeQuery(getQueryResults(resultSets));
- currentResultSet = new ShardingSphereResultSet(resultSets,
mergedResult, this, executionContext);
+ currentResultSet = new ShardingSphereResultSet(resultSets,
mergedResult, this,
isTransparentStatement(executionContext.getSqlStatementContext(),
+
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData()),
executionContext);
}
return currentResultSet;
}
diff --git
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetAdapterTest.java
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetAdapterTest.java
index d131f855397..b60fb76cde0 100644
---
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetAdapterTest.java
+++
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetAdapterTest.java
@@ -19,8 +19,6 @@ package org.apache.shardingsphere.driver.jdbc.adapter;
import
org.apache.shardingsphere.driver.jdbc.core.resultset.ShardingSphereResultSet;
import
org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement;
-import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionContext;
import org.apache.shardingsphere.infra.merge.result.MergedResult;
import org.junit.jupiter.api.Test;
@@ -113,16 +111,7 @@ public final class ResultSetAdapterTest {
when(resultSetMetaData.getColumnLabel(1)).thenReturn("col");
when(resultSetMetaData.getColumnCount()).thenReturn(1);
when(resultSet.getMetaData()).thenReturn(resultSetMetaData);
- return new
ShardingSphereResultSet(Collections.singletonList(resultSet),
mock(MergedResult.class), mock(ShardingSphereStatement.class,
RETURNS_DEEP_STUBS), createExecutionContext());
- }
-
- private ExecutionContext createExecutionContext() {
- ExecutionContext result = mock(ExecutionContext.class);
- SQLStatementContext sqlStatementContext =
mock(SQLStatementContext.class);
- TablesContext tablesContext = mock(TablesContext.class);
-
when(tablesContext.getTableNames()).thenReturn(Collections.emptyList());
- when(sqlStatementContext.getTablesContext()).thenReturn(tablesContext);
- when(result.getSqlStatementContext()).thenReturn(sqlStatementContext);
- return result;
+ return new
ShardingSphereResultSet(Collections.singletonList(resultSet),
mock(MergedResult.class), mock(ShardingSphereStatement.class,
RETURNS_DEEP_STUBS),
+ true, mock(ExecutionContext.class));
}
}
diff --git
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java
index cfc5ce7221f..36281fd6a55 100644
---
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java
+++
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/adapter/ResultSetGetterAdapterTest.java
@@ -439,6 +439,6 @@ public final class ResultSetGetterAdapterTest {
ResultSet resultSet = mock(ResultSet.class);
when(resultSetMetaData.getColumnCount()).thenReturn(1);
when(resultSet.getMetaData()).thenReturn(resultSetMetaData);
- return new
ShardingSphereResultSet(Collections.singletonList(resultSet), mergedResult,
mock(Statement.class), mock(ExecutionContext.class));
+ return new
ShardingSphereResultSet(Collections.singletonList(resultSet), mergedResult,
mock(Statement.class), true, mock(ExecutionContext.class));
}
}
diff --git
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java
index 99f61be4814..c3b715011cd 100644
---
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java
+++
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetTest.java
@@ -70,7 +70,7 @@ public final class ShardingSphereResultSetTest {
@BeforeEach
public void setUp() throws SQLException {
mergeResultSet = mock(MergedResult.class);
- shardingSphereResultSet = new ShardingSphereResultSet(getResultSets(),
mergeResultSet, getShardingSphereStatement(), createExecutionContext());
+ shardingSphereResultSet = new ShardingSphereResultSet(getResultSets(),
mergeResultSet, getShardingSphereStatement(), true, createExecutionContext());
}
private ExecutionContext createExecutionContext() {
diff --git
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationResultSetTest.java
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationResultSetTest.java
index 44ba8965171..bbc82b8da84 100644
---
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationResultSetTest.java
+++
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedOperationResultSetTest.java
@@ -40,7 +40,7 @@ public final class UnsupportedOperationResultSetTest {
@BeforeEach
public void init() throws SQLException {
shardingSphereResultSet = new ShardingSphereResultSet(
- Collections.singletonList(mock(ResultSet.class,
RETURNS_DEEP_STUBS)), mock(MergedResult.class), mock(Statement.class),
mock(ExecutionContext.class));
+ Collections.singletonList(mock(ResultSet.class,
RETURNS_DEEP_STUBS)), mock(MergedResult.class), mock(Statement.class), true,
mock(ExecutionContext.class));
}
@Test
diff --git
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedUpdateOperationResultSetTest.java
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedUpdateOperationResultSetTest.java
index b9269a7b4d3..0c94850251b 100644
---
a/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedUpdateOperationResultSetTest.java
+++
b/jdbc/core/src/test/java/org/apache/shardingsphere/driver/jdbc/unsupported/UnsupportedUpdateOperationResultSetTest.java
@@ -48,7 +48,7 @@ public final class UnsupportedUpdateOperationResultSetTest {
@BeforeEach
public void init() throws SQLException {
shardingSphereResultSet = new ShardingSphereResultSet(
- Collections.singletonList(mock(ResultSet.class,
RETURNS_DEEP_STUBS)), mock(MergedResult.class), mock(Statement.class),
mock(ExecutionContext.class));
+ Collections.singletonList(mock(ResultSet.class,
RETURNS_DEEP_STUBS)), mock(MergedResult.class), mock(Statement.class), true,
mock(ExecutionContext.class));
}
@Test
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 a261fac31aa..f74dcb4ec20 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
@@ -111,6 +111,8 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
private final ShardingSphereDatabase database;
+ private final boolean transparentStatement;
+
private final QueryContext queryContext;
private final BackendConnection backendConnection;
@@ -126,6 +128,7 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
failedIfBackendNotReady(backendConnection.getConnectionSession(),
sqlStatementContext);
this.driverType = driverType;
this.database = database;
+ this.transparentStatement =
isTransparentStatement(sqlStatementContext);
this.queryContext = queryContext;
this.backendConnection = backendConnection;
if (sqlStatementContext instanceof CursorAvailable) {
@@ -143,6 +146,31 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
}
}
+ private boolean isTransparentStatement(final SQLStatementContext<?>
sqlStatementContext) {
+ Optional<DataNodeContainedRule> dataNodeContainedRule =
getDataNodeContainedRuleForShardingRule(database.getRuleMetaData().findRules(DataNodeContainedRule.class));
+ Collection<ColumnContainedRule> columnContainedRules =
database.getRuleMetaData().findRules(ColumnContainedRule.class);
+ for (String each :
sqlStatementContext.getTablesContext().getTableNames()) {
+ return (!dataNodeContainedRule.isPresent() ||
!dataNodeContainedRule.get().getAllTables().contains(each)) &&
!containsInColumnContainedRule(each, columnContainedRules);
+ }
+ return true;
+ }
+
+ private Optional<DataNodeContainedRule>
getDataNodeContainedRuleForShardingRule(final Collection<DataNodeContainedRule>
dataNodeContainedRules) {
+ for (DataNodeContainedRule each : dataNodeContainedRules) {
+ if (!(each instanceof MutableDataNodeRule)) {
+ return Optional.of(each);
+ }
+ }
+ return Optional.empty();
+ }
+
+ private boolean containsInColumnContainedRule(final String tableName,
final Collection<ColumnContainedRule> columnContainedRules) {
+ for (ColumnContainedRule each : columnContainedRules) {
+ return each.getTables().contains(tableName);
+ }
+ return false;
+ }
+
/**
* Add statement.
*
@@ -327,7 +355,7 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
}
private int getColumnCount(final ExecutionContext executionContext, final
QueryResult queryResultSample) throws SQLException {
- if (isAllSingleTable(executionContext.getSqlStatementContext())) {
+ if (transparentStatement) {
return queryResultSample.getMetaData().getColumnCount();
}
return
hasSelectExpandProjections(executionContext.getSqlStatementContext())
@@ -335,27 +363,13 @@ public final class DatabaseConnector implements
DatabaseBackendHandler {
: queryResultSample.getMetaData().getColumnCount();
}
- private boolean isAllSingleTable(final SQLStatementContext<?>
sqlStatementContext) {
- return
sqlStatementContext.getTablesContext().getTableNames().stream().allMatch(each
-> !containsInImmutableDataNodeContainedRule(each)
- && !containsInColumnContainedRule(each));
- }
-
- private boolean containsInImmutableDataNodeContainedRule(final String
tableName) {
- return
database.getRuleMetaData().findRules(DataNodeContainedRule.class).stream()
- .filter(each -> !(each instanceof
MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName));
- }
-
- private boolean containsInColumnContainedRule(final String tableName) {
- return
database.getRuleMetaData().findRules(ColumnContainedRule.class).stream().anyMatch(each
-> each.getTables().contains(tableName));
- }
-
private boolean hasSelectExpandProjections(final SQLStatementContext<?>
sqlStatementContext) {
return sqlStatementContext instanceof SelectStatementContext &&
!((SelectStatementContext)
sqlStatementContext).getProjectionsContext().getExpandProjections().isEmpty();
}
private QueryHeader createQueryHeader(final QueryHeaderBuilderEngine
queryHeaderBuilderEngine, final ExecutionContext executionContext,
final QueryResult queryResultSample,
final ShardingSphereDatabase database, final int columnIndex) throws
SQLException {
- if (isAllSingleTable(executionContext.getSqlStatementContext())) {
+ if (transparentStatement) {
return
queryHeaderBuilderEngine.build(queryResultSample.getMetaData(), database,
columnIndex);
}
return
hasSelectExpandProjections(executionContext.getSqlStatementContext())