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

chengzhang 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 05d9b258a6b Minor refactor for encrypt merge decorate logic (#33479)
05d9b258a6b is described below

commit 05d9b258a6baf96b8ec24f9963f923ba9b84c9d1
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Thu Oct 31 15:51:24 2024 +0800

    Minor refactor for encrypt merge decorate logic (#33479)
---
 .../encrypt/merge/EncryptResultDecoratorEngine.java      |  8 ++++----
 .../encrypt/merge/dql/EncryptDQLResultDecorator.java     |  7 ++++---
 .../encrypt/merge/dql/EncryptMergedResult.java           |  7 ++++++-
 .../projection/EncryptProjectionTokenGenerator.java      |  3 +--
 .../EncryptSelectProjectionSupportedCheckerTest.java     | 13 +++++--------
 .../encrypt/merge/EncryptResultDecoratorEngineTest.java  |  8 ++++----
 .../encrypt/merge/dql/EncryptDQLResultDecoratorTest.java |  5 +++--
 .../encrypt/merge/dql/EncryptMergedResultTest.java       | 14 +++++++-------
 .../mask/merge/MaskResultDecoratorEngine.java            |  4 ++--
 .../mask/merge/MaskResultDecoratorEngineTest.java        |  6 +++---
 .../select/projection/engine/ProjectionEngine.java       |  3 +--
 .../segment/select/projection/impl/ColumnProjection.java | 14 +++++++-------
 .../select/projection/impl/ColumnProjectionTest.java     |  9 +++++----
 .../apache/shardingsphere/infra/merge/MergeEngine.java   | 10 +++++-----
 .../merge/engine/decorator/ResultDecoratorEngine.java    |  6 +++---
 .../shardingsphere/infra/merge/MergeEngineTest.java      | 16 ++++++++++------
 .../fixture/decorator/ResultDecoratorEngineFixture.java  |  4 ++--
 .../pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java |  2 +-
 .../jdbc/DriverJDBCPushDownExecuteQueryExecutor.java     |  9 ++++-----
 .../raw/DriverRawPushDownExecuteQueryExecutor.java       |  9 ++++-----
 .../core/resultset/ShardingSphereResultSetFactory.java   |  6 +++---
 .../executor/enumerable/EnumerableScanExecutor.java      |  2 +-
 .../proxy/backend/connector/DatabaseConnector.java       |  2 +-
 23 files changed, 86 insertions(+), 81 deletions(-)

diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java
index dd36e718dc1..9dd12b54067 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngine.java
@@ -26,8 +26,8 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 import 
org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecoratorEngine;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.dal.DALStatement;
 
 import java.util.Optional;
@@ -38,13 +38,13 @@ import java.util.Optional;
 public final class EncryptResultDecoratorEngine implements 
ResultDecoratorEngine<EncryptRule> {
     
     @Override
-    public Optional<ResultDecorator<EncryptRule>> newInstance(final 
RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database,
+    public Optional<ResultDecorator<EncryptRule>> newInstance(final 
ShardingSphereMetaData metaData, final ShardingSphereDatabase database,
                                                               final 
EncryptRule encryptRule, final ConfigurationProperties props, final 
SQLStatementContext sqlStatementContext) {
         if (sqlStatementContext instanceof SelectStatementContext) {
-            return Optional.of(new EncryptDQLResultDecorator(database, 
encryptRule, (SelectStatementContext) sqlStatementContext));
+            return Optional.of(new EncryptDQLResultDecorator(database, 
metaData, (SelectStatementContext) sqlStatementContext));
         }
         if (sqlStatementContext.getSqlStatement() instanceof DALStatement) {
-            return Optional.of(new 
EncryptDALResultDecorator(globalRuleMetaData));
+            return Optional.of(new 
EncryptDALResultDecorator(metaData.getGlobalRuleMetaData()));
         }
         return Optional.empty();
     }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java
index 07b4535d18c..679e46bf8ce 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecorator.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryRe
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 
 /**
@@ -35,17 +36,17 @@ public final class EncryptDQLResultDecorator implements 
ResultDecorator<EncryptR
     
     private final ShardingSphereDatabase database;
     
-    private final EncryptRule encryptRule;
+    private final ShardingSphereMetaData metaData;
     
     private final SelectStatementContext selectStatementContext;
     
     @Override
     public MergedResult decorate(final QueryResult queryResult, final 
SQLStatementContext sqlStatementContext, final EncryptRule rule) {
-        return new EncryptMergedResult(database, encryptRule, 
selectStatementContext, new TransparentMergedResult(queryResult));
+        return new EncryptMergedResult(database, metaData, 
selectStatementContext, new TransparentMergedResult(queryResult));
     }
     
     @Override
     public MergedResult decorate(final MergedResult mergedResult, final 
SQLStatementContext sqlStatementContext, final EncryptRule rule) {
-        return new EncryptMergedResult(database, encryptRule, 
selectStatementContext, mergedResult);
+        return new EncryptMergedResult(database, metaData, 
selectStatementContext, mergedResult);
     }
 }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
index a7b7141385e..4eafb680c7a 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResult.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.identifier.SQLExceptionIdentifier;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 
 import java.io.InputStream;
@@ -42,7 +43,7 @@ public final class EncryptMergedResult implements 
MergedResult {
     
     private final ShardingSphereDatabase database;
     
-    private final EncryptRule encryptRule;
+    private final ShardingSphereMetaData metaData;
     
     private final SelectStatementContext selectStatementContext;
     
@@ -61,6 +62,10 @@ public final class EncryptMergedResult implements 
MergedResult {
         }
         String originalTableName = 
columnProjection.get().getOriginalTable().getValue();
         String originalColumnName = 
columnProjection.get().getOriginalColumn().getValue();
+        ShardingSphereDatabase database = 
metaData.containsDatabase(columnProjection.get().getColumnBoundInfo().getOriginalDatabase().getValue())
+                ? 
metaData.getDatabase(columnProjection.get().getColumnBoundInfo().getOriginalDatabase().getValue())
+                : this.database;
+        EncryptRule encryptRule = 
database.getRuleMetaData().getSingleRule(EncryptRule.class);
         if (!encryptRule.findEncryptTable(originalTableName).map(optional -> 
optional.isEncryptColumn(originalColumnName)).orElse(false)) {
             return mergedResult.getValue(columnIndex, type);
         }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
index 2949565bcaf..bb001274e5e 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/rewrite/token/generator/projection/EncryptProjectionTokenGenerator.java
@@ -144,8 +144,7 @@ public final class EncryptProjectionTokenGenerator {
         IdentifierValue owner = 
segment.getColumn().getOwner().map(OwnerSegment::getIdentifier).orElse(null);
         ColumnProjection result = new ColumnProjection(owner, 
segment.getColumn().getIdentifier(), segment.getAliasName().isPresent() ? 
segment.getAlias().orElse(null) : null, databaseType,
                 segment.getColumn().getLeftParentheses().orElse(null), 
segment.getColumn().getRightParentheses().orElse(null));
-        
result.setOriginalColumn(segment.getColumn().getColumnBoundInfo().getOriginalColumn());
-        
result.setOriginalTable(segment.getColumn().getColumnBoundInfo().getOriginalTable());
+        result.setColumnBoundInfo(segment.getColumn().getColumnBoundInfo());
         return result;
     }
     
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
index 96b52ee0bb1..af8131f0eb8 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/checker/sql/projection/EncryptSelectProjectionSupportedCheckerTest.java
@@ -26,6 +26,7 @@ import 
org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import 
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperationException;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.combine.CombineSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ShorthandProjectionSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
@@ -58,19 +59,15 @@ class EncryptSelectProjectionSupportedCheckerTest {
         CombineSegment combineSegment = mock(CombineSegment.class, 
RETURNS_DEEP_STUBS);
         
when(sqlStatementContext.getSqlStatement().getCombine().get()).thenReturn(combineSegment);
         ColumnProjection orderIdColumn = new ColumnProjection("o", "order_id", 
null, new MySQLDatabaseType());
-        orderIdColumn.setOriginalTable(new IdentifierValue("t_order"));
-        orderIdColumn.setOriginalColumn(new IdentifierValue("order_id"));
+        orderIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("t_order"), 
new IdentifierValue("order_id")));
         ColumnProjection userIdColumn = new ColumnProjection("o", "user_id", 
null, new MySQLDatabaseType());
-        userIdColumn.setOriginalTable(new IdentifierValue("t_order"));
-        userIdColumn.setOriginalColumn(new IdentifierValue("user_id"));
+        userIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("t_order"), 
new IdentifierValue("user_id")));
         SelectStatementContext leftSelectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(leftSelectStatementContext.getProjectionsContext().getExpandProjections()).thenReturn(Arrays.asList(orderIdColumn,
 userIdColumn));
         ColumnProjection merchantIdColumn = new ColumnProjection("m", 
"merchant_id", null, new MySQLDatabaseType());
-        merchantIdColumn.setOriginalTable(new IdentifierValue("t_merchant"));
-        merchantIdColumn.setOriginalColumn(new IdentifierValue("merchant_id"));
+        merchantIdColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new 
IdentifierValue("t_merchant"), new IdentifierValue("merchant_id")));
         ColumnProjection merchantNameColumn = new ColumnProjection("m", 
"merchant_name", null, new MySQLDatabaseType());
-        merchantNameColumn.setOriginalTable(new IdentifierValue("t_merchant"));
-        merchantNameColumn.setOriginalColumn(new 
IdentifierValue("merchant_name"));
+        merchantNameColumn.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new 
IdentifierValue("t_merchant"), new IdentifierValue("merchant_name")));
         SelectStatementContext rightSelectStatementContext = 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS);
         
when(rightSelectStatementContext.getProjectionsContext().getExpandProjections()).thenReturn(Arrays.asList(merchantIdColumn,
 merchantNameColumn));
         Map<Integer, SelectStatementContext> subqueryContexts = new 
LinkedHashMap<>(2, 1F);
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java
index ac3cf265b97..9254e1dd623 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/EncryptResultDecoratorEngineTest.java
@@ -27,8 +27,8 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.merge.engine.ResultProcessEngine;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.MySQLExplainStatement;
 import org.junit.jupiter.api.Test;
@@ -60,7 +60,7 @@ class EncryptResultDecoratorEngineTest {
     void assertNewInstanceWithSelectStatement() {
         EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
         Optional<ResultDecorator<EncryptRule>> actual =
-                engine.newInstance(mock(RuleMetaData.class), database, rule, 
mock(ConfigurationProperties.class), mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS));
+                engine.newInstance(mock(ShardingSphereMetaData.class), 
database, rule, mock(ConfigurationProperties.class), 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS));
         assertTrue(actual.isPresent());
         assertThat(actual.get(), instanceOf(EncryptDQLResultDecorator.class));
     }
@@ -70,7 +70,7 @@ class EncryptResultDecoratorEngineTest {
         SQLStatementContext sqlStatementContext = 
mock(ExplainStatementContext.class);
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(MySQLExplainStatement.class));
         EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
-        Optional<ResultDecorator<EncryptRule>> actual = 
engine.newInstance(mock(RuleMetaData.class), database, rule, 
mock(ConfigurationProperties.class), sqlStatementContext);
+        Optional<ResultDecorator<EncryptRule>> actual = 
engine.newInstance(mock(ShardingSphereMetaData.class), database, rule, 
mock(ConfigurationProperties.class), sqlStatementContext);
         assertTrue(actual.isPresent());
         assertThat(actual.get(), instanceOf(EncryptDALResultDecorator.class));
     }
@@ -78,6 +78,6 @@ class EncryptResultDecoratorEngineTest {
     @Test
     void assertNewInstanceWithOtherStatement() {
         EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
-        assertFalse(engine.newInstance(mock(RuleMetaData.class), database, 
rule, mock(ConfigurationProperties.class), 
mock(InsertStatementContext.class)).isPresent());
+        assertFalse(engine.newInstance(mock(ShardingSphereMetaData.class), 
database, rule, mock(ConfigurationProperties.class), 
mock(InsertStatementContext.class)).isPresent());
     }
 }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java
index f9c1709a055..0b73a14bd52 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptDQLResultDecoratorTest.java
@@ -22,6 +22,7 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementCont
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.junit.jupiter.api.Test;
 
@@ -37,7 +38,7 @@ class EncryptDQLResultDecoratorTest {
     void assertDecorateQueryResult() throws SQLException {
         QueryResult queryResult = mock(QueryResult.class);
         when(queryResult.next()).thenReturn(true);
-        EncryptDQLResultDecorator decorator = new 
EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), 
mock(EncryptRule.class), mock(SelectStatementContext.class));
+        EncryptDQLResultDecorator decorator = new 
EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), 
mock(ShardingSphereMetaData.class), mock(SelectStatementContext.class));
         MergedResult actual = decorator.decorate(queryResult, 
mock(SQLStatementContext.class), mock(EncryptRule.class));
         assertTrue(actual.next());
     }
@@ -46,7 +47,7 @@ class EncryptDQLResultDecoratorTest {
     void assertDecorateMergedResult() throws SQLException {
         MergedResult mergedResult = mock(MergedResult.class);
         when(mergedResult.next()).thenReturn(true);
-        EncryptDQLResultDecorator decorator = new 
EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), 
mock(EncryptRule.class), mock(SelectStatementContext.class));
+        EncryptDQLResultDecorator decorator = new 
EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), 
mock(ShardingSphereMetaData.class), mock(SelectStatementContext.class));
         MergedResult actual = decorator.decorate(mergedResult, 
mock(SQLStatementContext.class), mock(EncryptRule.class));
         assertTrue(actual.next());
     }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
index 76e9ae65702..13f0082f2df 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/EncryptMergedResultTest.java
@@ -17,9 +17,9 @@
 
 package org.apache.shardingsphere.encrypt.merge.dql;
 
-import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -45,7 +45,7 @@ class EncryptMergedResultTest {
     private ShardingSphereDatabase database;
     
     @Mock
-    private EncryptRule encryptRule;
+    private ShardingSphereMetaData metaData;
     
     @Mock
     private SelectStatementContext selectStatementContext;
@@ -55,32 +55,32 @@ class EncryptMergedResultTest {
     
     @Test
     void assertNext() throws SQLException {
-        assertFalse(new EncryptMergedResult(database, encryptRule, 
selectStatementContext, mergedResult).next());
+        assertFalse(new EncryptMergedResult(database, metaData, 
selectStatementContext, mergedResult).next());
     }
     
     @Test
     void assertGetCalendarValue() throws SQLException {
         Calendar calendar = Calendar.getInstance();
         when(mergedResult.getCalendarValue(1, Date.class, 
calendar)).thenReturn(new Date(0L));
-        assertThat(new EncryptMergedResult(database, encryptRule, 
selectStatementContext, mergedResult).getCalendarValue(1, Date.class, 
calendar), is(new Date(0L)));
+        assertThat(new EncryptMergedResult(database, metaData, 
selectStatementContext, mergedResult).getCalendarValue(1, Date.class, 
calendar), is(new Date(0L)));
     }
     
     @Test
     void assertGetInputStream() throws SQLException {
         InputStream inputStream = mock(InputStream.class);
         when(mergedResult.getInputStream(1, "asc")).thenReturn(inputStream);
-        assertThat(new EncryptMergedResult(database, encryptRule, 
selectStatementContext, mergedResult).getInputStream(1, "asc"), 
is(inputStream));
+        assertThat(new EncryptMergedResult(database, metaData, 
selectStatementContext, mergedResult).getInputStream(1, "asc"), 
is(inputStream));
     }
     
     @Test
     void assertGetCharacterStream() throws SQLException {
         Reader reader = mock(Reader.class);
         when(mergedResult.getCharacterStream(1)).thenReturn(reader);
-        assertThat(new EncryptMergedResult(database, encryptRule, 
selectStatementContext, mergedResult).getCharacterStream(1), is(reader));
+        assertThat(new EncryptMergedResult(database, metaData, 
selectStatementContext, mergedResult).getCharacterStream(1), is(reader));
     }
     
     @Test
     void assertWasNull() throws SQLException {
-        assertFalse(new EncryptMergedResult(database, encryptRule, 
selectStatementContext, mergedResult).wasNull());
+        assertFalse(new EncryptMergedResult(database, metaData, 
selectStatementContext, mergedResult).wasNull());
     }
 }
diff --git 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java
 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java
index 01d8e896e20..12f2dadbde7 100644
--- 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java
+++ 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngine.java
@@ -22,8 +22,8 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 import 
org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecoratorEngine;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.mask.constant.MaskOrder;
 import org.apache.shardingsphere.mask.merge.dql.MaskDQLResultDecorator;
 import org.apache.shardingsphere.mask.rule.MaskRule;
@@ -36,7 +36,7 @@ import java.util.Optional;
 public final class MaskResultDecoratorEngine implements 
ResultDecoratorEngine<MaskRule> {
     
     @Override
-    public Optional<ResultDecorator<MaskRule>> newInstance(final RuleMetaData 
globalRuleMetaData, final ShardingSphereDatabase database,
+    public Optional<ResultDecorator<MaskRule>> newInstance(final 
ShardingSphereMetaData metaData, final ShardingSphereDatabase database,
                                                            final MaskRule 
maskRule, final ConfigurationProperties props, final SQLStatementContext 
sqlStatementContext) {
         return sqlStatementContext instanceof SelectStatementContext ? 
Optional.of(new MaskDQLResultDecorator(maskRule, (SelectStatementContext) 
sqlStatementContext)) : Optional.empty();
     }
diff --git 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java
 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java
index c7db8e81096..cac3b85b121 100644
--- 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java
+++ 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/MaskResultDecoratorEngineTest.java
@@ -22,8 +22,8 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.dml.SelectStatem
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.merge.engine.ResultProcessEngine;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import org.apache.shardingsphere.mask.merge.dql.MaskDQLResultDecorator;
 import org.apache.shardingsphere.mask.rule.MaskRule;
@@ -55,7 +55,7 @@ class MaskResultDecoratorEngineTest {
     void assertNewInstanceWithSelectStatement() {
         MaskResultDecoratorEngine engine = (MaskResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
         Optional<ResultDecorator<MaskRule>> actual =
-                engine.newInstance(mock(RuleMetaData.class), database, rule, 
mock(ConfigurationProperties.class), mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS));
+                engine.newInstance(mock(ShardingSphereMetaData.class), 
database, rule, mock(ConfigurationProperties.class), 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS));
         assertTrue(actual.isPresent());
         assertThat(actual.get(), instanceOf(MaskDQLResultDecorator.class));
     }
@@ -63,6 +63,6 @@ class MaskResultDecoratorEngineTest {
     @Test
     void assertNewInstanceWithOtherStatement() {
         MaskResultDecoratorEngine engine = (MaskResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
-        assertFalse(engine.newInstance(mock(RuleMetaData.class), database, 
rule, mock(ConfigurationProperties.class), 
mock(InsertStatementContext.class)).isPresent());
+        assertFalse(engine.newInstance(mock(ShardingSphereMetaData.class), 
database, rule, mock(ConfigurationProperties.class), 
mock(InsertStatementContext.class)).isPresent());
     }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
index f6b86183941..46a24422a41 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/engine/ProjectionEngine.java
@@ -110,8 +110,7 @@ public final class ProjectionEngine {
         IdentifierValue alias = projectionSegment.getAliasName().isPresent() ? 
projectionSegment.getAlias().orElse(null) : null;
         ColumnProjection result = new ColumnProjection(owner, 
projectionSegment.getColumn().getIdentifier(), alias, databaseType, 
projectionSegment.getColumn().getLeftParentheses().orElse(null),
                 
projectionSegment.getColumn().getRightParentheses().orElse(null));
-        
result.setOriginalColumn(projectionSegment.getColumn().getColumnBoundInfo().getOriginalColumn());
-        
result.setOriginalTable(projectionSegment.getColumn().getColumnBoundInfo().getOriginalTable());
+        
result.setColumnBoundInfo(projectionSegment.getColumn().getColumnBoundInfo());
         return result;
     }
     
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java
index 039d6f8be08..dc53d030945 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjection.java
@@ -29,6 +29,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.Quo
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.mysql.type.MySQLDatabaseType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.ParenthesesSegment;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 import java.util.Optional;
@@ -39,7 +40,7 @@ import java.util.Optional;
 @RequiredArgsConstructor
 @Getter
 @Setter
-@EqualsAndHashCode(exclude = {"originalTable", "originalColumn"})
+@EqualsAndHashCode(exclude = "columnBoundInfo")
 @ToString
 public final class ColumnProjection implements Projection {
     
@@ -55,9 +56,7 @@ public final class ColumnProjection implements Projection {
     
     private final ParenthesesSegment rightParentheses;
     
-    private IdentifierValue originalTable;
-    
-    private IdentifierValue originalColumn;
+    private ColumnSegmentBoundInfo columnBoundInfo;
     
     public ColumnProjection(final String owner, final String name, final 
String alias, final DatabaseType databaseType) {
         this(null == owner ? null : new IdentifierValue(owner, 
QuoteCharacter.NONE), new IdentifierValue(name, QuoteCharacter.NONE),
@@ -83,10 +82,10 @@ public final class ColumnProjection implements Projection {
      * @return original table
      */
     public IdentifierValue getOriginalTable() {
-        if (null == originalTable || 
Strings.isNullOrEmpty(originalTable.getValue())) {
+        if (null == columnBoundInfo || null == 
columnBoundInfo.getOriginalTable() || 
Strings.isNullOrEmpty(columnBoundInfo.getOriginalTable().getValue())) {
             return null == owner ? new IdentifierValue("") : owner;
         }
-        return originalTable;
+        return columnBoundInfo.getOriginalTable();
     }
     
     /**
@@ -95,7 +94,8 @@ public final class ColumnProjection implements Projection {
      * @return original column
      */
     public IdentifierValue getOriginalColumn() {
-        return null == originalColumn || 
Strings.isNullOrEmpty(originalColumn.getValue()) ? name : originalColumn;
+        return null == columnBoundInfo || null == 
columnBoundInfo.getOriginalColumn() || 
Strings.isNullOrEmpty(columnBoundInfo.getOriginalColumn().getValue()) ? name
+                : columnBoundInfo.getOriginalColumn();
     }
     
     /**
diff --git 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java
 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java
index 5f7ed51cc9e..6e5193671b3 100644
--- 
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java
+++ 
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ColumnProjectionTest.java
@@ -19,6 +19,7 @@ package 
org.apache.shardingsphere.infra.binder.context.segment.select.projection
 
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.ColumnSegmentBoundInfo;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
@@ -45,14 +46,14 @@ class ColumnProjectionTest {
     @Test
     void assertGetOriginalTableWithEmptyOriginalTableAndWithOwner() {
         ColumnProjection projection = new ColumnProjection("owner", "name", 
"alias", databaseType);
-        projection.setOriginalTable(new IdentifierValue(""));
+        projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("")));
         assertThat(projection.getOriginalTable(), is(new 
IdentifierValue("owner")));
     }
     
     @Test
     void assertGetOriginalTable() {
         ColumnProjection projection = new ColumnProjection("owner", "name", 
"alias", databaseType);
-        projection.setOriginalTable(new IdentifierValue("tbl"));
+        projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue(""), new IdentifierValue(""), new IdentifierValue("tbl"), new 
IdentifierValue("")));
         assertThat(projection.getOriginalTable(), is(new 
IdentifierValue("tbl")));
     }
     
@@ -64,14 +65,14 @@ class ColumnProjectionTest {
     @Test
     void assertGetOriginalColumnWithEmptyOriginalColumn() {
         ColumnProjection projection = new ColumnProjection(null, "name", 
"alias", databaseType);
-        projection.setOriginalColumn(new IdentifierValue(""));
+        projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("")));
         assertThat(projection.getOriginalColumn(), is(new 
IdentifierValue("name")));
     }
     
     @Test
     void assertGetOriginalColumn() {
         ColumnProjection projection = new ColumnProjection(null, "name", 
"alias", databaseType);
-        projection.setOriginalColumn(new IdentifierValue("col"));
+        projection.setColumnBoundInfo(new ColumnSegmentBoundInfo(new 
IdentifierValue("col")));
         assertThat(projection.getOriginalColumn(), is(new 
IdentifierValue("col")));
     }
     
diff --git 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java
 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java
index cd931787c1d..f410b4240c9 100644
--- 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java
+++ 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/MergeEngine.java
@@ -29,8 +29,8 @@ import 
org.apache.shardingsphere.infra.merge.engine.merger.ResultMerger;
 import org.apache.shardingsphere.infra.merge.engine.merger.ResultMergerEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
@@ -47,7 +47,7 @@ import java.util.Optional;
 @HighFrequencyInvocation
 public final class MergeEngine {
     
-    private final RuleMetaData globalRuleMetaData;
+    private final ShardingSphereMetaData metaData;
     
     private final ShardingSphereDatabase database;
     
@@ -58,8 +58,8 @@ public final class MergeEngine {
     
     private final ConnectionContext connectionContext;
     
-    public MergeEngine(final RuleMetaData globalRuleMetaData, final 
ShardingSphereDatabase database, final ConfigurationProperties props, final 
ConnectionContext connectionContext) {
-        this.globalRuleMetaData = globalRuleMetaData;
+    public MergeEngine(final ShardingSphereMetaData metaData, final 
ShardingSphereDatabase database, final ConfigurationProperties props, final 
ConnectionContext connectionContext) {
+        this.metaData = metaData;
         this.database = database;
         this.props = props;
         engines = OrderedSPILoader.getServices(ResultProcessEngine.class, 
database.getRuleMetaData().getRules());
@@ -117,7 +117,7 @@ public final class MergeEngine {
     
     @SuppressWarnings({"unchecked", "rawtypes"})
     private ResultDecorator getResultDecorator(final SQLStatementContext 
sqlStatementContext, final Entry<ShardingSphereRule, ResultProcessEngine> 
entry) {
-        return (ResultDecorator) ((ResultDecoratorEngine) 
entry.getValue()).newInstance(globalRuleMetaData, database, entry.getKey(), 
props, sqlStatementContext)
+        return (ResultDecorator) ((ResultDecoratorEngine) 
entry.getValue()).newInstance(metaData, database, entry.getKey(), props, 
sqlStatementContext)
                 .orElseGet(TransparentResultDecorator::new);
     }
 }
diff --git 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java
 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java
index 83baab91121..b2a1d282eb6 100644
--- 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java
+++ 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecoratorEngine.java
@@ -20,8 +20,8 @@ package 
org.apache.shardingsphere.infra.merge.engine.decorator;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.merge.engine.ResultProcessEngine;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
 import java.util.Optional;
@@ -36,12 +36,12 @@ public interface ResultDecoratorEngine<T extends 
ShardingSphereRule> extends Res
     /**
      * Create new instance of result decorator.
      *
-     * @param globalRuleMetaData global rule meta data
+     * @param metaData meta data
      * @param database database
      * @param rule rule
      * @param props configuration properties
      * @param sqlStatementContext SQL statement context
      * @return created instance
      */
-    Optional<ResultDecorator<T>> newInstance(RuleMetaData globalRuleMetaData, 
ShardingSphereDatabase database, T rule, ConfigurationProperties props, 
SQLStatementContext sqlStatementContext);
+    Optional<ResultDecorator<T>> newInstance(ShardingSphereMetaData metaData, 
ShardingSphereDatabase database, T rule, ConfigurationProperties props, 
SQLStatementContext sqlStatementContext);
 }
diff --git 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java
 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java
index e22aed41204..ee2810b5bea 100644
--- 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java
+++ 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/MergeEngineTest.java
@@ -19,13 +19,13 @@ package org.apache.shardingsphere.infra.merge;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
-import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.merge.fixture.rule.DecoratorRuleFixture;
 import org.apache.shardingsphere.infra.merge.fixture.rule.MergerRuleFixture;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.test.fixture.infra.rule.MockedRule;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -60,7 +60,8 @@ class MergeEngineTest {
         
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(new
 MockedRule()));
         when(queryResult.getValue(1, String.class)).thenReturn("test");
         MergedResult actual =
-                new MergeEngine(mock(RuleMetaData.class), database, new 
ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult),
+                new MergeEngine(mock(ShardingSphereMetaData.class), database, 
new ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(
+                        Collections.singletonList(queryResult),
                         mock(SQLStatementContext.class));
         assertThat(actual.getValue(1, String.class), is("test"));
     }
@@ -69,7 +70,8 @@ class MergeEngineTest {
     void assertMergeWithMergerRuleOnly() throws SQLException {
         
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(new
 MergerRuleFixture()));
         MergedResult actual =
-                new MergeEngine(mock(RuleMetaData.class), database, new 
ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult),
+                new MergeEngine(mock(ShardingSphereMetaData.class), database, 
new ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(
+                        Collections.singletonList(queryResult),
                         mock(SQLStatementContext.class));
         assertThat(actual.getValue(1, String.class), is("merged_value"));
     }
@@ -78,7 +80,8 @@ class MergeEngineTest {
     void assertMergeWithDecoratorRuleOnly() throws SQLException {
         
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(new
 DecoratorRuleFixture()));
         MergedResult actual =
-                new MergeEngine(mock(RuleMetaData.class), database, new 
ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult),
+                new MergeEngine(mock(ShardingSphereMetaData.class), database, 
new ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(
+                        Collections.singletonList(queryResult),
                         mock(SQLStatementContext.class));
         assertThat(actual.getValue(1, String.class), is("decorated_value"));
     }
@@ -87,7 +90,8 @@ class MergeEngineTest {
     void assertMergeWithMergerRuleAndDecoratorRuleTogether() throws 
SQLException {
         
when(database.getRuleMetaData().getRules()).thenReturn(Arrays.asList(new 
MergerRuleFixture(), new DecoratorRuleFixture()));
         MergedResult actual =
-                new MergeEngine(mock(RuleMetaData.class), database, new 
ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(Collections.singletonList(queryResult),
+                new MergeEngine(mock(ShardingSphereMetaData.class), database, 
new ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(
+                        Collections.singletonList(queryResult),
                         mock(SQLStatementContext.class));
         assertThat(actual.getValue(1, String.class), 
is("decorated_merged_value"));
     }
diff --git 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java
 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java
index fe559ebbae9..7c0296f9cc1 100644
--- 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java
+++ 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorEngineFixture.java
@@ -22,15 +22,15 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 import 
org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecoratorEngine;
 import org.apache.shardingsphere.infra.merge.fixture.rule.DecoratorRuleFixture;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 
 import java.util.Optional;
 
 public final class ResultDecoratorEngineFixture implements 
ResultDecoratorEngine<DecoratorRuleFixture> {
     
     @Override
-    public Optional<ResultDecorator<DecoratorRuleFixture>> newInstance(final 
RuleMetaData globalRuleMetaData, final ShardingSphereDatabase database,
+    public Optional<ResultDecorator<DecoratorRuleFixture>> newInstance(final 
ShardingSphereMetaData metaData, final ShardingSphereDatabase database,
                                                                        final 
DecoratorRuleFixture rule, final ConfigurationProperties props, final 
SQLStatementContext sqlStatementContext) {
         return Optional.of(new ResultDecoratorFixture());
     }
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java
index 19fc46a5ea1..b385d5d2ab9 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteExecutor.java
@@ -145,7 +145,7 @@ public final class DriverJDBCPushDownExecuteExecutor {
                 return Optional.empty();
             }
             List<QueryResult> queryResults = getQueryResults(resultSets);
-            MergedResult mergedResult = new 
MergeEngine(metaData.getGlobalRuleMetaData(), database, metaData.getProps(), 
connection.getDatabaseConnectionManager().getConnectionContext())
+            MergedResult mergedResult = new MergeEngine(metaData, database, 
metaData.getProps(), 
connection.getDatabaseConnectionManager().getConnectionContext())
                     .merge(queryResults, sqlStatementContext);
             return Optional.of(new ShardingSphereResultSet(resultSets, 
mergedResult, statement, sqlStatementContext));
         }
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java
index 35b8a7cb171..ed64ea06e64 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/jdbc/DriverJDBCPushDownExecuteQueryExecutor.java
@@ -36,7 +36,6 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.JDBCDriv
 import org.apache.shardingsphere.infra.executor.sql.process.ProcessEngine;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 
@@ -59,7 +58,7 @@ public final class DriverJDBCPushDownExecuteQueryExecutor {
     
     private final String processId;
     
-    private final RuleMetaData globalRuleMetaData;
+    private final ShardingSphereMetaData metaData;
     
     private final ConfigurationProperties props;
     
@@ -70,7 +69,7 @@ public final class DriverJDBCPushDownExecuteQueryExecutor {
     public DriverJDBCPushDownExecuteQueryExecutor(final 
ShardingSphereConnection connection, final ShardingSphereMetaData metaData, 
final JDBCExecutor jdbcExecutor) {
         connectionContext = 
connection.getDatabaseConnectionManager().getConnectionContext();
         processId = connection.getProcessId();
-        globalRuleMetaData = metaData.getGlobalRuleMetaData();
+        this.metaData = metaData;
         props = metaData.getProps();
         this.jdbcExecutor = jdbcExecutor;
         statements = new LinkedList<>();
@@ -95,14 +94,14 @@ public final class DriverJDBCPushDownExecuteQueryExecutor {
                                   final Map<String, Integer> 
columnLabelAndIndexMap,
                                   final StatementAddCallback addCallback, 
final StatementReplayCallback replayCallback) throws SQLException {
         List<QueryResult> queryResults = getQueryResults(database, 
queryContext, prepareEngine, addCallback, replayCallback);
-        return new ShardingSphereResultSetFactory(connectionContext, 
globalRuleMetaData, props, statements).newInstance(database, queryContext, 
queryResults, statement, columnLabelAndIndexMap);
+        return new ShardingSphereResultSetFactory(connectionContext, metaData, 
props, statements).newInstance(database, queryContext, queryResults, statement, 
columnLabelAndIndexMap);
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
     private List<QueryResult> getQueryResults(final ShardingSphereDatabase 
database, final QueryContext queryContext, final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
                                               final StatementAddCallback 
addCallback, final StatementReplayCallback replayCallback) throws SQLException {
         statements.clear();
-        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(queryContext, globalRuleMetaData, 
props);
+        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(queryContext, 
metaData.getGlobalRuleMetaData(), props);
         ExecutionGroupContext<JDBCExecutionUnit> executionGroupContext = 
prepareEngine.prepare(database.getName(), executionContext.getRouteContext(), 
executionContext.getExecutionUnits(),
                 new ExecutionGroupReportContext(processId, database.getName(), 
connectionContext.getGrantee()));
         for (ExecutionGroup<JDBCExecutionUnit> each : 
executionGroupContext.getInputGroups()) {
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java
index 2fd83d4c978..a115f340f22 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/executor/engine/pushdown/raw/DriverRawPushDownExecuteQueryExecutor.java
@@ -32,7 +32,6 @@ import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryRe
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.raw.RawExecutionPrepareEngine;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 
@@ -53,7 +52,7 @@ public final class DriverRawPushDownExecuteQueryExecutor {
     
     private final String processId;
     
-    private final RuleMetaData globalRuleMetaData;
+    private final ShardingSphereMetaData metaData;
     
     private final ConfigurationProperties props;
     
@@ -62,7 +61,7 @@ public final class DriverRawPushDownExecuteQueryExecutor {
     public DriverRawPushDownExecuteQueryExecutor(final 
ShardingSphereConnection connection, final ShardingSphereMetaData metaData, 
final RawExecutor rawExecutor) {
         connectionContext = 
connection.getDatabaseConnectionManager().getConnectionContext();
         processId = connection.getProcessId();
-        globalRuleMetaData = metaData.getGlobalRuleMetaData();
+        this.metaData = metaData;
         props = metaData.getProps();
         this.rawExecutor = rawExecutor;
     }
@@ -80,12 +79,12 @@ public final class DriverRawPushDownExecuteQueryExecutor {
     public ResultSet executeQuery(final ShardingSphereDatabase database, final 
QueryContext queryContext, final Statement statement,
                                   final Map<String, Integer> 
columnLabelAndIndexMap) throws SQLException {
         List<QueryResult> queryResults = getQueryResults(database, 
queryContext);
-        return new ShardingSphereResultSetFactory(connectionContext, 
globalRuleMetaData, props, Collections.emptyList())
+        return new ShardingSphereResultSetFactory(connectionContext, metaData, 
props, Collections.emptyList())
                 .newInstance(database, queryContext, queryResults, statement, 
columnLabelAndIndexMap);
     }
     
     private List<QueryResult> getQueryResults(final ShardingSphereDatabase 
database, final QueryContext queryContext) throws SQLException {
-        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(queryContext, globalRuleMetaData, 
props);
+        ExecutionContext executionContext = new 
KernelProcessor().generateExecutionContext(queryContext, 
metaData.getGlobalRuleMetaData(), props);
         return rawExecutor.execute(
                 createRawExecutionGroupContext(database, executionContext), 
queryContext, new 
RawSQLExecutorCallback()).stream().map(QueryResult.class::cast).collect(Collectors.toList());
     }
diff --git 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java
 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java
index 4d9f8ade6e3..fe5de62de54 100644
--- 
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java
+++ 
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/resultset/ShardingSphereResultSetFactory.java
@@ -23,8 +23,8 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.QueryResult;
 import org.apache.shardingsphere.infra.merge.MergeEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.session.connection.ConnectionContext;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 
@@ -45,7 +45,7 @@ public final class ShardingSphereResultSetFactory {
     
     private final ConnectionContext connectionContext;
     
-    private final RuleMetaData globalRuleMetaData;
+    private final ShardingSphereMetaData metaData;
     
     private final ConfigurationProperties props;
     
@@ -65,7 +65,7 @@ public final class ShardingSphereResultSetFactory {
     public ResultSet newInstance(final ShardingSphereDatabase database, final 
QueryContext queryContext, final List<QueryResult> queryResults,
                                  final Statement statement, final Map<String, 
Integer> columnLabelAndIndexMap) throws SQLException {
         List<ResultSet> resultSets = getResultSets();
-        MergedResult mergedResult = new MergeEngine(globalRuleMetaData, 
database, props, connectionContext).merge(queryResults, 
queryContext.getSqlStatementContext());
+        MergedResult mergedResult = new MergeEngine(metaData, database, props, 
connectionContext).merge(queryResults, queryContext.getSqlStatementContext());
         return new ShardingSphereResultSet(resultSets, mergedResult, 
statement, queryContext.getSqlStatementContext(),
                 null == columnLabelAndIndexMap
                         ? 
ShardingSphereResultSetUtils.createColumnLabelAndIndexMap(queryContext.getSqlStatementContext(),
 resultSets.get(0).getMetaData())
diff --git 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
index 6242a06c745..3be60e46f33 100644
--- 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
+++ 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java
@@ -135,7 +135,7 @@ public final class EnumerableScanExecutor implements 
ScanExecutor {
                 
ShardingSpherePreconditions.checkState(!ProcessRegistry.getInstance().get(federationContext.getProcessId()).isInterrupted(),
 SQLExecutionInterruptedException::new);
                 processEngine.executeSQL(executionGroupContext, 
federationContext.getQueryContext());
                 List<QueryResult> queryResults = 
jdbcExecutor.execute(executionGroupContext, 
callback).stream().map(QueryResult.class::cast).collect(Collectors.toList());
-                MergeEngine mergeEngine = new 
MergeEngine(federationContext.getMetaData().getGlobalRuleMetaData(), database, 
executorContext.getProps(), new ConnectionContext(Collections::emptySet));
+                MergeEngine mergeEngine = new 
MergeEngine(federationContext.getMetaData(), database, 
executorContext.getProps(), new ConnectionContext(Collections::emptySet));
                 MergedResult mergedResult = mergeEngine.merge(queryResults, 
queryContext.getSqlStatementContext());
                 Collection<Statement> statements = 
getStatements(executionGroupContext.getInputGroups());
                 return new JDBCRowEnumerator(mergedResult, 
queryResults.get(0).getMetaData(), statements);
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 42bec4c3bc0..46cd93db397 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
@@ -314,7 +314,7 @@ public final class DatabaseConnector implements 
DatabaseBackendHandler {
     }
     
     private MergedResult mergeQuery(final SQLStatementContext 
sqlStatementContext, final List<QueryResult> queryResults) throws SQLException {
-        MergeEngine mergeEngine = new 
MergeEngine(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData(),
+        MergeEngine mergeEngine = new 
MergeEngine(contextManager.getMetaDataContexts().getMetaData(),
                 database, 
contextManager.getMetaDataContexts().getMetaData().getProps(), 
databaseConnectionManager.getConnectionSession().getConnectionContext());
         return mergeEngine.merge(queryResults, sqlStatementContext);
     }

Reply via email to