You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2023/06/11 05:10:27 UTC
[shardingsphere] branch master updated: Add containsEnhancedTable in SelectStatementContext init logic to improve performance (#26231)
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 50cb4316f99 Add containsEnhancedTable in SelectStatementContext init logic to improve performance (#26231)
50cb4316f99 is described below
commit 50cb4316f99706a7d870d6b75f5360c055b569df
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Sun Jun 11 13:10:18 2023 +0800
Add containsEnhancedTable in SelectStatementContext init logic to improve performance (#26231)
---
.../common/IteratorStreamMergedResultTest.java | 9 ++++-
.../dql/orderby/OrderByStreamMergedResultTest.java | 11 +++++-
.../merge/dql/orderby/OrderByValueTest.java | 16 ++++++--
.../dml/ShardingInsertStatementValidatorTest.java | 5 ++-
.../statement/dml/SelectStatementContext.java | 25 ++++++++++++
.../select/pagination/PaginationContextTest.java | 13 ++++++-
.../engine/ProjectionsContextEngineTest.java | 10 ++++-
.../statement/dml/SelectStatementContextTest.java | 45 ++++++++++++++++------
.../jdbc/adapter/AbstractResultSetAdapter.java | 8 ++--
.../core/resultset/ShardingSphereResultSet.java | 8 ++--
.../resultset/ShardingSphereResultSetMetaData.java | 17 ++------
.../statement/ShardingSpherePreparedStatement.java | 21 ++--------
.../core/statement/ShardingSphereStatement.java | 23 +++--------
.../traffic/rule/TrafficRuleTest.java | 13 +++++--
...NewYamlTransactionRuleConfigurationSwapper.java | 2 +-
.../proxy/backend/connector/DatabaseConnector.java | 27 ++-----------
16 files changed, 149 insertions(+), 104 deletions(-)
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/common/IteratorStreamMergedResultTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/common/IteratorStreamMergedResultTest.java
index 7c9862ce331..3f99605cbb5 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/common/IteratorStreamMergedResultTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/common/IteratorStreamMergedResultTest.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.sharding.merge.common;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
@@ -58,11 +59,17 @@ class IteratorStreamMergedResultTest {
@BeforeEach
void setUp() {
MySQLSelectStatement selectStatement = new MySQLSelectStatement();
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setProjections(new ProjectionsSegment(0, 0));
selectStatementContext = new SelectStatementContext(createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
}
+ private ShardingSphereDatabase mockDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(result.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.emptyList());
+ return result;
+ }
+
private ShardingSphereMetaData createShardingSphereMetaData(final ShardingSphereDatabase database) {
return new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database), mock(ShardingSphereRuleMetaData.class), mock(ConfigurationProperties.class));
}
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByStreamMergedResultTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByStreamMergedResultTest.java
index 81e92fb703a..1f18e84fafa 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByStreamMergedResultTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByStreamMergedResultTest.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.sharding.merge.dql.orderby;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
@@ -32,6 +31,8 @@ import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
+import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sharding.merge.dql.ShardingDQLResultMerger;
import org.apache.shardingsphere.sql.parser.sql.common.enums.NullsOrderType;
@@ -74,11 +75,17 @@ class OrderByStreamMergedResultTest {
new IndexOrderByItemSegment(0, 0, 1, OrderDirection.ASC, NullsOrderType.FIRST),
new IndexOrderByItemSegment(0, 0, 2, OrderDirection.ASC, NullsOrderType.FIRST))));
selectStatement.setProjections(new ProjectionsSegment(0, 0));
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatementContext = new SelectStatementContext(
createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
}
+ private ShardingSphereDatabase mockDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(result.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.emptyList());
+ return result;
+ }
+
private ShardingSphereMetaData createShardingSphereMetaData(final ShardingSphereDatabase database) {
return new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database), mock(ShardingSphereRuleMetaData.class), mock(ConfigurationProperties.class));
}
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValueTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValueTest.java
index 35dc622987f..9ad79bac0bf 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValueTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/merge/dql/orderby/OrderByValueTest.java
@@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.sql.parser.sql.common.enums.NullsOrderType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
@@ -51,9 +52,10 @@ import java.util.Arrays;
import java.util.Collections;
import static org.hamcrest.CoreMatchers.is;
-import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -87,7 +89,7 @@ class OrderByValueTest {
private void assertCompareToForAsc(final SelectStatement selectStatement) throws SQLException, NoSuchFieldException, IllegalAccessException {
ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
selectStatement.setProjections(projectionsSegment);
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setOrderBy(createOrderBySegment());
SelectStatementContext selectStatementContext = new SelectStatementContext(
createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
@@ -112,6 +114,12 @@ class OrderByValueTest {
assertFalse(orderByValue2.getQueryResult().next());
}
+ private ShardingSphereDatabase mockDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(result.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.emptyList());
+ return result;
+ }
+
private static ShardingSphereMetaData createShardingSphereMetaData(final ShardingSphereDatabase database) {
return new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database), mock(ShardingSphereRuleMetaData.class), mock(ConfigurationProperties.class));
}
@@ -144,7 +152,7 @@ class OrderByValueTest {
private void assertCompareToForDesc(final SelectStatement selectStatement) throws SQLException, NoSuchFieldException, IllegalAccessException {
ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
selectStatement.setProjections(projectionsSegment);
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setOrderBy(createOrderBySegment());
SelectStatementContext selectStatementContext = new SelectStatementContext(createShardingSphereMetaData(database),
Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
@@ -198,7 +206,7 @@ class OrderByValueTest {
private void assertCompareToWhenEqual(final SelectStatement selectStatement) throws SQLException, NoSuchFieldException, IllegalAccessException {
ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
selectStatement.setProjections(projectionsSegment);
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setOrderBy(createOrderBySegment());
SelectStatementContext selectStatementContext = new SelectStatementContext(createShardingSphereMetaData(database),
Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java
index a3fd8ff825f..c2b906d39f5 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/validator/dml/ShardingInsertStatementValidatorTest.java
@@ -32,6 +32,7 @@ import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.sharding.exception.algorithm.sharding.DuplicateInsertDataRecordException;
@@ -63,6 +64,7 @@ import org.apache.shardingsphere.test.util.PropertiesBuilder;
import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
@@ -91,7 +93,7 @@ class ShardingInsertStatementValidatorTest {
@Mock
private ShardingConditions shardingConditions;
- @Mock
+ @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ShardingSphereDatabase database;
@Mock
@@ -106,6 +108,7 @@ class ShardingInsertStatementValidatorTest {
when(schema.containsTable("user")).thenReturn(true);
when(database.getSchema(any())).thenReturn(schema);
when(database.getName()).thenReturn("sharding_db");
+ when(database.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.emptyList());
assertThrows(DMLWithMultipleShardingTablesException.class, () -> new ShardingInsertStatementValidator(shardingConditions).preValidate(shardingRule,
sqlStatementContext, Collections.emptyList(), database, mock(ConfigurationProperties.class)));
}
diff --git a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
index be4783d1525..e585d77c79e 100644
--- a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
+++ b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContext.java
@@ -44,6 +44,7 @@ import org.apache.shardingsphere.infra.binder.type.WhereAvailable;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.sql.parser.sql.common.enums.ParameterMarkerType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.SubqueryType;
@@ -99,6 +100,8 @@ public final class SelectStatementContext extends CommonSQLStatementContext impl
private final Collection<ColumnSegment> columnSegments = new LinkedList<>();
+ private final boolean containsEnhancedTable;
+
private SubqueryType subqueryType;
private boolean needAggregateRewrite;
@@ -117,6 +120,28 @@ public final class SelectStatementContext extends CommonSQLStatementContext impl
projectionsContext = new ProjectionsContextEngine(databaseName, getSchemas(metaData, databaseName), getDatabaseType())
.createProjectionsContext(getSqlStatement().getFrom(), getSqlStatement().getProjections(), groupByContext, orderByContext);
paginationContext = new PaginationContextEngine().createPaginationContext(sqlStatement, projectionsContext, params, whereSegments);
+ containsEnhancedTable = isContainsEnhancedTable(metaData, databaseName, getTablesContext().getTableNames());
+ }
+
+ private boolean isContainsEnhancedTable(final ShardingSphereMetaData metaData, final String databaseName, final Collection<String> tableNames) {
+ for (TableContainedRule each : getTableContainedRules(metaData, databaseName)) {
+ for (String tableName : tableNames) {
+ if (each.getEnhancedTableMapper().contains(tableName)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private Collection<TableContainedRule> getTableContainedRules(final ShardingSphereMetaData metaData, final String databaseName) {
+ if (null == databaseName) {
+ ShardingSpherePreconditions.checkState(tablesContext.getSimpleTableSegments().isEmpty(), NoDatabaseSelectedException::new);
+ return Collections.emptyList();
+ }
+ ShardingSphereDatabase database = metaData.getDatabase(databaseName);
+ ShardingSpherePreconditions.checkNotNull(database, () -> new UnknownDatabaseException(databaseName));
+ return database.getRuleMetaData().findRules(TableContainedRule.class);
}
private Map<Integer, SelectStatementContext> createSubqueryContexts(final ShardingSphereMetaData metaData, final List<Object> params, final String defaultDatabaseName) {
diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/PaginationContextTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/PaginationContextTest.java
index 389f4bb2d1d..234086f86b9 100644
--- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/PaginationContextTest.java
+++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/pagination/PaginationContextTest.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.sql.parser.sql.common.enums.NullsOrderType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
@@ -49,7 +50,9 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
class PaginationContextTest {
@@ -165,12 +168,18 @@ class PaginationContextTest {
private void getRevisedRowCount(final SelectStatement selectStatement) {
selectStatement.setProjections(new ProjectionsSegment(0, 0));
- Map<String, ShardingSphereDatabase> databases = Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class));
+ Map<String, ShardingSphereDatabase> databases = Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mockDatabase());
ShardingSphereMetaData metaData = new ShardingSphereMetaData(databases, mock(ShardingSphereRuleMetaData.class), mock(ConfigurationProperties.class));
SelectStatementContext selectStatementContext = new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
assertThat(new PaginationContext(getOffsetSegment(), getRowCountSegment(), getParameters()).getRevisedRowCount(selectStatementContext), is(50L));
}
+ private ShardingSphereDatabase mockDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(result.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.emptyList());
+ return result;
+ }
+
@Test
void assertGetRevisedRowCountWithMaxForMySQL() {
getRevisedRowCountWithMax(new MySQLSelectStatement());
@@ -200,7 +209,7 @@ class PaginationContextTest {
selectStatement.setProjections(new ProjectionsSegment(0, 0));
selectStatement.setGroupBy(new GroupBySegment(0, 0, Collections.singletonList(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.ASC, NullsOrderType.LAST))));
selectStatement.setOrderBy(new OrderBySegment(0, 0, Collections.singletonList(new IndexOrderByItemSegment(0, 0, 1, OrderDirection.DESC, NullsOrderType.LAST))));
- Map<String, ShardingSphereDatabase> databases = Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class));
+ Map<String, ShardingSphereDatabase> databases = Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mockDatabase());
ShardingSphereMetaData metaData = new ShardingSphereMetaData(databases, mock(ShardingSphereRuleMetaData.class), mock(ConfigurationProperties.class));
SelectStatementContext selectStatementContext = new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
assertThat(new PaginationContext(getOffsetSegment(), getRowCountSegment(), getParameters()).getRevisedRowCount(selectStatementContext), is((long) Integer.MAX_VALUE));
diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
index 08a29903faa..3337b15e0f3 100644
--- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
+++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/segment/select/projection/engine/ProjectionsContextEngineTest.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.sql.parser.sql.common.enums.NullsOrderType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
@@ -63,6 +64,7 @@ import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -227,13 +229,19 @@ class ProjectionsContextEngineTest {
}
private SelectStatementContext createSelectStatementContext(final SelectStatement selectStatement) {
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
when(database.getSchemas()).thenReturn(mockSchemas());
Map<String, ShardingSphereDatabase> databases = Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database);
ShardingSphereMetaData metaData = new ShardingSphereMetaData(databases, mock(ShardingSphereRuleMetaData.class), mock(ConfigurationProperties.class));
return new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
}
+ private ShardingSphereDatabase mockDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(result.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.emptyList());
+ return result;
+ }
+
private Map<String, ShardingSphereSchema> mockSchemas() {
Map<String, ShardingSphereSchema> result = new LinkedHashMap<>(2, 1F);
result.put(DefaultDatabase.LOGIC_NAME, schema);
diff --git a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContextTest.java b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContextTest.java
index 03473aecbdd..52f6a2b3752 100644
--- a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContextTest.java
+++ b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/dml/SelectStatementContextTest.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.sql.parser.sql.common.enums.AggregationType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.NullsOrderType;
import org.apache.shardingsphere.sql.parser.sql.common.enums.OrderDirection;
@@ -65,6 +66,7 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -104,7 +106,7 @@ class SelectStatementContextTest {
}
private void assertSetIndexForItemsByIndexOrderBy(final SelectStatement selectStatement) {
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setOrderBy(new OrderBySegment(0, 0, Collections.singletonList(createOrderByItemSegment(INDEX_ORDER_BY))));
selectStatement.setProjections(createProjectionsSegment());
selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("table"))));
@@ -113,6 +115,14 @@ class SelectStatementContextTest {
assertThat(selectStatementContext.getOrderByContext().getItems().iterator().next().getIndex(), is(4));
}
+ private ShardingSphereDatabase mockDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ TableContainedRule tableContainedRule = mock(TableContainedRule.class, RETURNS_DEEP_STUBS);
+ when(tableContainedRule.getEnhancedTableMapper().contains("t_order")).thenReturn(true);
+ when(result.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.singletonList(tableContainedRule));
+ return result;
+ }
+
@Test
void assertSetIndexForItemsByColumnOrderByWithOwnerForMySQL() {
assertSetIndexForItemsByColumnOrderByWithOwner(new MySQLSelectStatement());
@@ -144,7 +154,7 @@ class SelectStatementContextTest {
SimpleTableSegment tableSegment = new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("table")));
tableSegment.setOwner(new OwnerSegment(0, 0, new IdentifierValue(DefaultDatabase.LOGIC_NAME.toUpperCase())));
selectStatement.setFrom(tableSegment);
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
SelectStatementContext selectStatementContext = new SelectStatementContext(createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
selectStatementContext.setIndexes(Collections.emptyMap());
assertThat(selectStatementContext.getOrderByContext().getItems().iterator().next().getIndex(), is(1));
@@ -176,7 +186,7 @@ class SelectStatementContextTest {
}
private void assertSetIndexForItemsByColumnOrderByWithAlias(final SelectStatement selectStatement) {
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setOrderBy(new OrderBySegment(0, 0, Collections.singletonList(createOrderByItemSegment(COLUMN_ORDER_BY_WITH_ALIAS))));
selectStatement.setProjections(createProjectionsSegment());
SelectStatementContext selectStatementContext = new SelectStatementContext(createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
@@ -210,7 +220,7 @@ class SelectStatementContextTest {
}
private void assertSetIndexForItemsByColumnOrderByWithoutAlias(final SelectStatement selectStatement) {
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setOrderBy(new OrderBySegment(0, 0, Collections.singletonList(createOrderByItemSegment(COLUMN_ORDER_BY_WITHOUT_OWNER_ALIAS))));
selectStatement.setProjections(createProjectionsSegment());
SelectStatementContext selectStatementContext = new SelectStatementContext(createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
@@ -252,7 +262,7 @@ class SelectStatementContextTest {
}
private SelectStatementContext createSelectStatementContext(final SelectStatement selectStatement) {
- ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), mock(ShardingSphereRuleMetaData.class),
+ ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mockDatabase()), mock(ShardingSphereRuleMetaData.class),
mock(ConfigurationProperties.class));
return new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
}
@@ -347,7 +357,7 @@ class SelectStatementContextTest {
}
private void assertSetIndexWhenAggregationProjectionsPresent(final SelectStatement selectStatement) {
- final ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ final ShardingSphereDatabase database = mockDatabase();
selectStatement.setOrderBy(new OrderBySegment(0, 0, Collections.singletonList(createOrderByItemSegment(COLUMN_ORDER_BY_WITHOUT_OWNER_ALIAS))));
ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
AggregationProjectionSegment aggregationProjectionSegment = new AggregationProjectionSegment(0, 0, AggregationType.MAX, "");
@@ -387,7 +397,7 @@ class SelectStatementContextTest {
private void assertSetWhere(final SelectStatement selectStatement) {
WhereSegment whereSegment = mock(WhereSegment.class);
selectStatement.setWhere(whereSegment);
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
selectStatement.setProjections(new ProjectionsSegment(0, 0));
SelectStatementContext actual = new SelectStatementContext(createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
assertThat(actual.getTablesContext().getTableNames(), is(Collections.emptySet()));
@@ -432,7 +442,7 @@ class SelectStatementContextTest {
SubqueryProjectionSegment subqueryProjectionSegment = new SubqueryProjectionSegment(subquerySegment, "");
projectionsSegment.getProjections().add(subqueryProjectionSegment);
selectStatement.setProjections(projectionsSegment);
- ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ ShardingSphereDatabase database = mockDatabase();
assertTrue(new SelectStatementContext(createShardingSphereMetaData(database), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME).isContainsSubquery());
}
@@ -479,7 +489,7 @@ class SelectStatementContextTest {
ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
projectionsSegment.getProjections().add(projectionSegment);
selectStatement.setProjections(projectionsSegment);
- ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), mock(ShardingSphereRuleMetaData.class),
+ ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mockDatabase()), mock(ShardingSphereRuleMetaData.class),
mock(ConfigurationProperties.class));
assertTrue(new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME).isContainsSubquery());
}
@@ -513,7 +523,7 @@ class SelectStatementContextTest {
ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
projectionsSegment.getProjections().add(new ParameterMarkerExpressionSegment(0, 0, 0, ParameterMarkerType.DOLLAR));
selectStatement.setProjections(projectionsSegment);
- ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), mock(ShardingSphereRuleMetaData.class),
+ ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mockDatabase()), mock(ShardingSphereRuleMetaData.class),
mock(ConfigurationProperties.class));
SelectStatementContext selectStatementContext = new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
assertTrue(selectStatementContext.isContainsDollarParameterMarker());
@@ -555,7 +565,7 @@ class SelectStatementContextTest {
projectionsSegment.getProjections().add(new AggregationProjectionSegment(0, 0, AggregationType.COUNT, "(*)"));
projectionsSegment.getProjections().add(new AggregationDistinctProjectionSegment(0, 10, AggregationType.COUNT, "(1)", "distinctExpression"));
selectStatement.setProjections(projectionsSegment);
- ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), mock(ShardingSphereRuleMetaData.class),
+ ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mockDatabase()), mock(ShardingSphereRuleMetaData.class),
mock(ConfigurationProperties.class));
SelectStatementContext selectStatementContext = new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
assertTrue(selectStatementContext.isContainsPartialDistinctAggregation());
@@ -600,4 +610,17 @@ class SelectStatementContextTest {
columnProjectionSegment.setAlias(new AliasSegment(0, 0, new IdentifierValue(hasAlias ? "n" : null)));
return columnProjectionSegment;
}
+
+ @Test
+ void assertIsContainsEnhancedTable() {
+ ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
+ projectionsSegment.getProjections().add(new ColumnProjectionSegment(new ColumnSegment(0, 0, new IdentifierValue("order_id"))));
+ SelectStatement selectStatement = new MySQLSelectStatement();
+ selectStatement.setProjections(projectionsSegment);
+ selectStatement.setFrom(new SimpleTableSegment(new TableNameSegment(0, 0, new IdentifierValue("t_order"))));
+ ShardingSphereMetaData metaData = new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mockDatabase()), mock(ShardingSphereRuleMetaData.class),
+ mock(ConfigurationProperties.class));
+ SelectStatementContext actual = new SelectStatementContext(metaData, Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
+ assertTrue(actual.isContainsEnhancedTable());
+ }
}
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 324fa22daad..8ba9d70a08d 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,7 +46,7 @@ public abstract class AbstractResultSetAdapter extends AbstractUnsupportedOperat
@Getter
private final Statement statement;
- private final boolean transparentStatement;
+ private final boolean selectContainsEnhancedTable;
private boolean closed;
@@ -55,17 +55,17 @@ public abstract class AbstractResultSetAdapter extends AbstractUnsupportedOperat
@Getter
private final ExecutionContext executionContext;
- protected AbstractResultSetAdapter(final List<ResultSet> resultSets, final Statement statement, final boolean transparentStatement, final ExecutionContext executionContext) {
+ protected AbstractResultSetAdapter(final List<ResultSet> resultSets, final Statement statement, final boolean selectContainsEnhancedTable, final ExecutionContext executionContext) {
Preconditions.checkArgument(!resultSets.isEmpty());
this.resultSets = resultSets;
this.statement = statement;
- this.transparentStatement = transparentStatement;
+ this.selectContainsEnhancedTable = selectContainsEnhancedTable;
this.executionContext = executionContext;
}
@Override
public final ResultSetMetaData getMetaData() throws SQLException {
- return new ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getDatabase(), transparentStatement, executionContext.getSqlStatementContext());
+ return new ShardingSphereResultSetMetaData(resultSets.get(0).getMetaData(), getDatabase(), selectContainsEnhancedTable, 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 9d6ec2c9146..c840181de7f 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,16 +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 boolean transparentStatement,
+ public ShardingSphereResultSet(final List<ResultSet> resultSets, final MergedResult mergeResultSet, final Statement statement, final boolean selectContainsEnhancedTable,
final ExecutionContext executionContext) throws SQLException {
- super(resultSets, statement, transparentStatement, executionContext);
+ super(resultSets, statement, selectContainsEnhancedTable, executionContext);
this.mergeResultSet = mergeResultSet;
columnLabelAndIndexMap = ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(executionContext.getSqlStatementContext(), resultSets.get(0).getMetaData());
}
- public ShardingSphereResultSet(final List<ResultSet> resultSets, final MergedResult mergeResultSet, final Statement statement, final boolean transparentStatement,
+ public ShardingSphereResultSet(final List<ResultSet> resultSets, final MergedResult mergeResultSet, final Statement statement, final boolean selectContainsEnhancedTable,
final ExecutionContext executionContext, final Map<String, Integer> columnLabelAndIndexMap) {
- super(resultSets, statement, transparentStatement, executionContext);
+ super(resultSets, statement, selectContainsEnhancedTable, 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 55d46d5a52d..346e72b4aff 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
@@ -45,17 +45,14 @@ public final class ShardingSphereResultSetMetaData extends WrapperAdapter implem
private final ShardingSphereDatabase database;
- private final boolean transparentStatement;
+ private final boolean selectContainsEnhancedTable;
private final SQLStatementContext sqlStatementContext;
@Override
public int getColumnCount() throws SQLException {
if (sqlStatementContext instanceof SelectStatementContext) {
- if (transparentStatement) {
- return resultSetMetaData.getColumnCount();
- }
- if (hasSelectExpandProjections()) {
+ if (selectContainsEnhancedTable && hasSelectExpandProjections()) {
return ((SelectStatementContext) sqlStatementContext).getProjectionsContext().getExpandProjections().size();
}
return resultSetMetaData.getColumnCount();
@@ -100,10 +97,7 @@ public final class ShardingSphereResultSetMetaData extends WrapperAdapter implem
@Override
public String getColumnLabel(final int column) throws SQLException {
- if (transparentStatement) {
- return resultSetMetaData.getColumnLabel(column);
- }
- if (hasSelectExpandProjections()) {
+ if (selectContainsEnhancedTable && hasSelectExpandProjections()) {
checkColumnIndex(column);
Projection projection = ((SelectStatementContext) sqlStatementContext).getProjectionsContext().getExpandProjections().get(column - 1);
if (projection instanceof AggregationDistinctProjection) {
@@ -115,10 +109,7 @@ public final class ShardingSphereResultSetMetaData extends WrapperAdapter implem
@Override
public String getColumnName(final int column) throws SQLException {
- if (transparentStatement) {
- return resultSetMetaData.getColumnName(column);
- }
- if (hasSelectExpandProjections()) {
+ if (selectContainsEnhancedTable && hasSelectExpandProjections()) {
checkColumnIndex(column);
Projection projection = ((SelectStatementContext) sqlStatementContext).getProjectionsContext().getExpandProjections().get(column - 1);
if (projection instanceof ColumnProjection) {
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 9cd4e09446d..88500906920 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
@@ -79,7 +79,6 @@ import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
import org.apache.shardingsphere.infra.rule.identifier.type.StorageConnectorReusableRule;
-import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -148,7 +147,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
private final StatementManager statementManager;
@Getter
- private final boolean transparentStatement;
+ private final boolean selectContainsEnhancedTable;
private ExecutionContext executionContext;
@@ -205,7 +204,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());
+ selectContainsEnhancedTable = sqlStatementContext instanceof SelectStatementContext && ((SelectStatementContext) sqlStatementContext).isContainsEnhancedTable();
statementManager = new StatementManager();
}
@@ -213,18 +212,6 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
return databaseRuleMetaData.findRules(StorageConnectorReusableRule.class).size() == databaseRuleMetaData.getRules().size() && !HintManager.isInstantiated();
}
- private boolean isTransparentStatement(final ShardingSphereRuleMetaData ruleMetaData) {
- Collection<TableContainedRule> tableContainedRules = ruleMetaData.findRules(TableContainedRule.class);
- for (String each : sqlStatementContext.getTablesContext().getTableNames()) {
- for (TableContainedRule tableContainedRule : tableContainedRules) {
- if (tableContainedRule.getEnhancedTableMapper().contains(each.toLowerCase())) {
- return false;
- }
- }
- }
- return true;
- }
-
@Override
public ResultSet executeQuery() throws SQLException {
ResultSet result;
@@ -252,7 +239,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
if (null == columnLabelAndIndexMap) {
columnLabelAndIndexMap = ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(sqlStatementContext, resultSets.get(0).getMetaData());
}
- result = new ShardingSphereResultSet(resultSets, mergedResult, this, transparentStatement, executionContext, columnLabelAndIndexMap);
+ result = new ShardingSphereResultSet(resultSets, mergedResult, this, selectContainsEnhancedTable, executionContext, columnLabelAndIndexMap);
// CHECKSTYLE:OFF
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
@@ -524,7 +511,7 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
if (null == columnLabelAndIndexMap) {
columnLabelAndIndexMap = ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(sqlStatementContext, resultSets.get(0).getMetaData());
}
- currentResultSet = new ShardingSphereResultSet(resultSets, mergedResult, this, transparentStatement, executionContext, columnLabelAndIndexMap);
+ currentResultSet = new ShardingSphereResultSet(resultSets, mergedResult, this, selectContainsEnhancedTable, 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 0e891fcfde2..e9d60495e86 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
@@ -74,7 +74,6 @@ import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
-import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -177,8 +176,9 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
executionContext = createExecutionContext(queryContext);
List<QueryResult> queryResults = executeQuery0();
MergedResult mergedResult = mergeQuery(queryResults);
- result = new ShardingSphereResultSet(getResultSets(), mergedResult, this, isTransparentStatement(queryContext.getSqlStatementContext(),
- metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData()), executionContext);
+ boolean selectContainsEnhancedTable =
+ executionContext.getSqlStatementContext() instanceof SelectStatementContext && ((SelectStatementContext) executionContext.getSqlStatementContext()).isContainsEnhancedTable();
+ result = new ShardingSphereResultSet(getResultSets(), mergedResult, this, selectContainsEnhancedTable, executionContext);
// CHECKSTYLE:OFF
} catch (final RuntimeException ex) {
// CHECKSTYLE:ON
@@ -241,18 +241,6 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getResourceMetaData().getStorageTypes());
}
- private boolean isTransparentStatement(final SQLStatementContext sqlStatementContext, final ShardingSphereRuleMetaData ruleMetaData) {
- Collection<TableContainedRule> tableContainedRules = ruleMetaData.findRules(TableContainedRule.class);
- for (String each : sqlStatementContext.getTablesContext().getTableNames()) {
- for (TableContainedRule tableContainedRule : tableContainedRules) {
- if (tableContainedRule.getEnhancedTableMapper().contains(each.toLowerCase())) {
- return false;
- }
- }
- }
- return true;
- }
-
@Override
public int executeUpdate(final String sql) throws SQLException {
try {
@@ -605,8 +593,9 @@ public final class ShardingSphereStatement extends AbstractStatementAdapter {
return currentResultSet;
}
MergedResult mergedResult = mergeQuery(getQueryResults(resultSets));
- currentResultSet = new ShardingSphereResultSet(resultSets, mergedResult, this, isTransparentStatement(executionContext.getSqlStatementContext(),
- metaDataContexts.getMetaData().getDatabase(connection.getDatabaseName()).getRuleMetaData()), executionContext);
+ boolean selectContainsEnhancedTable =
+ executionContext.getSqlStatementContext() instanceof SelectStatementContext && ((SelectStatementContext) executionContext.getSqlStatementContext()).isContainsEnhancedTable();
+ currentResultSet = new ShardingSphereResultSet(resultSets, mergedResult, this, selectContainsEnhancedTable, executionContext);
}
return currentResultSet;
}
diff --git a/kernel/traffic/core/src/test/java/org/apache/shardingsphere/traffic/rule/TrafficRuleTest.java b/kernel/traffic/core/src/test/java/org/apache/shardingsphere/traffic/rule/TrafficRuleTest.java
index 4ec8d357719..66e2a2c4218 100644
--- a/kernel/traffic/core/src/test/java/org/apache/shardingsphere/traffic/rule/TrafficRuleTest.java
+++ b/kernel/traffic/core/src/test/java/org/apache/shardingsphere/traffic/rule/TrafficRuleTest.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.traffic.rule;
-import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
import org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
@@ -26,6 +25,8 @@ import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
+import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item.ProjectionsSegment;
import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.CommentSegment;
import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dml.MySQLSelectStatement;
@@ -48,6 +49,7 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -85,18 +87,23 @@ class TrafficRuleTest {
assertThat(new TrafficRule(createTrafficRuleConfig()).getLabels(), is(new HashSet<>(Arrays.asList("OLAP", "OLTP"))));
}
- @SuppressWarnings({"rawtypes", "unchecked"})
private QueryContext createQueryContext(final boolean includeComments) {
QueryContext result = mock(QueryContext.class);
MySQLSelectStatement sqlStatement = mock(MySQLSelectStatement.class);
when(sqlStatement.getCommentSegments()).thenReturn(includeComments ? Collections.singleton(new CommentSegment("/* SHARDINGSPHERE_HINT: USE_TRAFFIC=true */", 0, 0)) : Collections.emptyList());
when(sqlStatement.getProjections()).thenReturn(new ProjectionsSegment(0, 0));
SQLStatementContext statementContext =
- new SelectStatementContext(createShardingSphereMetaData(mock(ShardingSphereDatabase.class)), Collections.emptyList(), sqlStatement, DefaultDatabase.LOGIC_NAME);
+ new SelectStatementContext(createShardingSphereMetaData(mockDatabase()), Collections.emptyList(), sqlStatement, DefaultDatabase.LOGIC_NAME);
when(result.getSqlStatementContext()).thenReturn(statementContext);
return result;
}
+ private ShardingSphereDatabase mockDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
+ when(result.getRuleMetaData().findRules(TableContainedRule.class)).thenReturn(Collections.emptyList());
+ return result;
+ }
+
private ShardingSphereMetaData createShardingSphereMetaData(final ShardingSphereDatabase database) {
return new ShardingSphereMetaData(Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database), mock(ShardingSphereRuleMetaData.class), mock(ConfigurationProperties.class));
}
diff --git a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/yaml/swapper/NewYamlTransactionRuleConfigurationSwapper.java b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/yaml/swapper/NewYamlTransactionRuleConfigurationSwapper.java
index a80e5d63472..69bb043f965 100644
--- a/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/yaml/swapper/NewYamlTransactionRuleConfigurationSwapper.java
+++ b/kernel/transaction/core/src/main/java/org/apache/shardingsphere/transaction/yaml/swapper/NewYamlTransactionRuleConfigurationSwapper.java
@@ -35,7 +35,7 @@ import java.util.Properties;
* New YAML Transaction rule configuration swapper.
*/
public final class NewYamlTransactionRuleConfigurationSwapper implements NewYamlRuleConfigurationSwapper<TransactionRuleConfiguration> {
-
+
@Override
public Collection<YamlDataNode> swapToDataNodes(final TransactionRuleConfiguration data) {
return Collections.singletonList(new YamlDataNode(GlobalRuleNodeConverter.getRootNode(getRuleTagName().toLowerCase()), YamlEngine.marshal(swapToYamlConfiguration(data))));
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 05b8c1ff6c6..afd9eaf4338 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
@@ -47,7 +47,6 @@ import org.apache.shardingsphere.infra.merge.result.MergedResult;
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;
-import org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
import org.apache.shardingsphere.infra.session.query.QueryContext;
import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -109,7 +108,7 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
private final ShardingSphereDatabase database;
- private final boolean transparentStatement;
+ private final boolean selectContainsEnhancedTable;
private final QueryContext queryContext;
@@ -126,8 +125,8 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
failedIfBackendNotReady(databaseConnectionManager.getConnectionSession(), sqlStatementContext);
this.driverType = driverType;
this.database = database;
- this.transparentStatement = isTransparentStatement(sqlStatementContext);
this.queryContext = queryContext;
+ this.selectContainsEnhancedTable = sqlStatementContext instanceof SelectStatementContext && ((SelectStatementContext) sqlStatementContext).isContainsEnhancedTable();
this.databaseConnectionManager = databaseConnectionManager;
if (sqlStatementContext instanceof CursorAvailable) {
prepareCursorStatementContext((CursorAvailable) sqlStatementContext, databaseConnectionManager.getConnectionSession());
@@ -144,18 +143,6 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
}
}
- private boolean isTransparentStatement(final SQLStatementContext sqlStatementContext) {
- Collection<TableContainedRule> tableContainedRules = database.getRuleMetaData().findRules(TableContainedRule.class);
- for (String each : sqlStatementContext.getTablesContext().getTableNames()) {
- for (TableContainedRule tableContainedRule : tableContainedRules) {
- if (tableContainedRule.getEnhancedTableMapper().contains(each.toLowerCase())) {
- return false;
- }
- }
- }
- return true;
- }
-
/**
* Add statement.
*
@@ -349,10 +336,7 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
}
private int getColumnCount(final ExecutionContext executionContext, final QueryResult queryResultSample) throws SQLException {
- if (transparentStatement) {
- return queryResultSample.getMetaData().getColumnCount();
- }
- return hasSelectExpandProjections(executionContext.getSqlStatementContext())
+ return selectContainsEnhancedTable && hasSelectExpandProjections(executionContext.getSqlStatementContext())
? ((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext().getExpandProjections().size()
: queryResultSample.getMetaData().getColumnCount();
}
@@ -363,10 +347,7 @@ public final class DatabaseConnector implements DatabaseBackendHandler {
private QueryHeader createQueryHeader(final QueryHeaderBuilderEngine queryHeaderBuilderEngine, final ExecutionContext executionContext,
final QueryResult queryResultSample, final ShardingSphereDatabase database, final int columnIndex) throws SQLException {
- if (transparentStatement) {
- return queryHeaderBuilderEngine.build(queryResultSample.getMetaData(), database, columnIndex);
- }
- return hasSelectExpandProjections(executionContext.getSqlStatementContext())
+ return selectContainsEnhancedTable && hasSelectExpandProjections(executionContext.getSqlStatementContext())
? queryHeaderBuilderEngine.build(((SelectStatementContext) executionContext.getSqlStatementContext()).getProjectionsContext(), queryResultSample.getMetaData(), database, columnIndex)
: queryHeaderBuilderEngine.build(queryResultSample.getMetaData(), database, columnIndex);
}