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 <[email protected]>
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);
     }

Reply via email to