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

duanzhengqiang 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 8a61c0607b0 Refactor MergeEngine (#37712)
8a61c0607b0 is described below

commit 8a61c0607b0cbc4e8f1204f8c56e655966a530a9
Author: Cong Hu <[email protected]>
AuthorDate: Mon Jan 12 16:43:32 2026 +0800

    Refactor MergeEngine (#37712)
---
 .../merge/EncryptResultDecoratorEngine.java        |  6 ++--
 .../merge/dal/EncryptDALResultDecorator.java       | 27 ++++++++++++++----
 .../merge/dql/EncryptDQLResultDecorator.java       |  5 ++--
 .../merge/EncryptResultDecoratorEngineTest.java    |  4 +--
 .../merge/dal/EncryptDALResultDecoratorTest.java   | 27 ++++++++++++------
 .../merge/dql/EncryptDQLResultDecoratorTest.java   | 13 +++++++--
 .../mask/merge/MaskResultDecoratorEngine.java      |  4 +--
 .../mask/merge/dql/MaskDQLResultDecorator.java     |  5 ++--
 .../mask/merge/MaskResultDecoratorEngineTest.java  |  2 +-
 .../mask/merge/dql/MaskDQLResultDecoratorTest.java |  3 +-
 .../shardingsphere/infra/merge/MergeEngine.java    | 33 +++++++++++++---------
 .../merge/engine/decorator/ResultDecorator.java    |  8 ++----
 .../engine/decorator/ResultDecoratorEngine.java    |  2 +-
 .../decorator/impl/TransparentResultDecorator.java |  5 ++--
 .../infra/merge/MergeEngineTest.java               |  3 ++
 .../impl/TransparentResultDecoratorTest.java       |  3 +-
 .../decorator/ResultDecoratorEngineFixture.java    |  4 +--
 .../fixture/decorator/ResultDecoratorFixture.java  |  5 ++--
 .../infra/session/query/QueryContext.java          | 20 +++++++++++++
 .../implementor/EnumerableScanImplementor.java     |  3 +-
 .../implementor/EnumerableScanImplementorTest.java |  1 +
 .../statement/type/MySQLDALStatementVisitor.java   |  2 +-
 .../show/view/MySQLShowCreateViewStatement.java    |  7 +++--
 23 files changed, 124 insertions(+), 68 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 5c4c11dff6c..c7e37ad96b7 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
@@ -38,13 +38,13 @@ import java.util.Optional;
 public final class EncryptResultDecoratorEngine implements 
ResultDecoratorEngine<EncryptRule> {
     
     @Override
-    public Optional<ResultDecorator<EncryptRule>> newInstance(final 
ShardingSphereMetaData metaData,
-                                                              final 
ShardingSphereDatabase database, final ConfigurationProperties props, final 
SQLStatementContext sqlStatementContext) {
+    public Optional<ResultDecorator> newInstance(final ShardingSphereMetaData 
metaData,
+                                                 final ShardingSphereDatabase 
database, final ConfigurationProperties props, final SQLStatementContext 
sqlStatementContext) {
         if (sqlStatementContext instanceof SelectStatementContext) {
             return Optional.of(new EncryptDQLResultDecorator(database, 
metaData, (SelectStatementContext) sqlStatementContext));
         }
         if (sqlStatementContext.getSqlStatement() instanceof DALStatement) {
-            return Optional.of(new EncryptDALResultDecorator(metaData));
+            return Optional.of(new EncryptDALResultDecorator(database, 
metaData));
         }
         return Optional.empty();
     }
diff --git 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
index 910e127fb76..632ea0f4441 100644
--- 
a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
+++ 
b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecorator.java
@@ -26,34 +26,51 @@ import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 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.query.QueryContext;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.ColumnInResultSetSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableInResultSetSQLStatementAttribute;
+import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
+import java.util.Collection;
 import java.util.Optional;
 
 /**
  * DAL result decorator for encrypt.
  */
 @RequiredArgsConstructor
-public final class EncryptDALResultDecorator implements 
ResultDecorator<EncryptRule> {
+public final class EncryptDALResultDecorator implements ResultDecorator {
+    
+    private final ShardingSphereDatabase database;
     
     private final ShardingSphereMetaData metaData;
     
     @Override
-    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext, final EncryptRule rule) {
+    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext) {
+        Collection<SimpleTableSegment> simpleTables = 
queryContext.getSqlStatementContext().getTablesContext().getSimpleTables();
+        if (1 != simpleTables.size()) {
+            return mergedResult;
+        }
+        ShardingSphereDatabase shardingSphereDatabase = 
simpleTables.iterator().next().getTableName().getTableBoundInfo().map(TableSegmentBoundInfo::getOriginalDatabase)
+                
.map(IdentifierValue::getValue).map(metaData::getDatabase).orElse(database);
+        Optional<EncryptRule> encryptRule = 
shardingSphereDatabase.getRuleMetaData().findSingleRule(EncryptRule.class);
+        if (!encryptRule.isPresent()) {
+            return mergedResult;
+        }
         SQLStatement sqlStatement = 
queryContext.getSqlStatementContext().getSqlStatement();
         if 
(sqlStatement.getAttributes().findAttribute(ColumnInResultSetSQLStatementAttribute.class).isPresent())
 {
-            return new EncryptShowColumnsMergedResult(mergedResult, 
queryContext.getSqlStatementContext(), rule);
+            return new EncryptShowColumnsMergedResult(mergedResult, 
queryContext.getSqlStatementContext(), encryptRule.get());
         }
         if 
(sqlStatement.getAttributes().findAttribute(TableInResultSetSQLStatementAttribute.class).isPresent())
 {
-            return new 
EncryptShowCreateTableMergedResult(metaData.getGlobalRuleMetaData(), 
mergedResult, queryContext.getSqlStatementContext(), rule);
+            return new 
EncryptShowCreateTableMergedResult(metaData.getGlobalRuleMetaData(), 
mergedResult, queryContext.getSqlStatementContext(), encryptRule.get());
         }
         Optional<ViewInResultSetSQLStatementAttribute> 
viewInResultSetSQLStatementAttribute = 
sqlStatement.getAttributes().findAttribute(ViewInResultSetSQLStatementAttribute.class);
         if (viewInResultSetSQLStatementAttribute.isPresent()) {
             String currentDatabaseName = 
queryContext.getConnectionContext().getCurrentDatabaseName().orElse(null);
-            return new EncryptShowCreateViewMergedResult(metaData, 
mergedResult, viewInResultSetSQLStatementAttribute.get().getViewName(), rule, 
currentDatabaseName);
+            return new EncryptShowCreateViewMergedResult(metaData, 
mergedResult, viewInResultSetSQLStatementAttribute.get().getViewName(), 
encryptRule.get(), currentDatabaseName);
         }
         return mergedResult;
     }
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 8ce4f35203b..f1afaa7d45e 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
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.encrypt.merge.dql;
 
 import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
@@ -30,7 +29,7 @@ import 
org.apache.shardingsphere.infra.session.query.QueryContext;
  * DQL result decorator for encrypt.
  */
 @RequiredArgsConstructor
-public final class EncryptDQLResultDecorator implements 
ResultDecorator<EncryptRule> {
+public final class EncryptDQLResultDecorator implements ResultDecorator {
     
     private final ShardingSphereDatabase database;
     
@@ -39,7 +38,7 @@ public final class EncryptDQLResultDecorator implements 
ResultDecorator<EncryptR
     private final SelectStatementContext selectStatementContext;
     
     @Override
-    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext, final EncryptRule rule) {
+    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext) {
         return new EncryptMergedResult(database, metaData, 
selectStatementContext, mergedResult);
     }
 }
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 85603feff8c..97ed8be5256 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
@@ -59,7 +59,7 @@ class EncryptResultDecoratorEngineTest {
     @Test
     void assertNewInstanceWithSelectStatement() {
         EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
-        Optional<ResultDecorator<EncryptRule>> actual =
+        Optional<ResultDecorator> actual =
                 engine.newInstance(mock(ShardingSphereMetaData.class), 
database, mock(ConfigurationProperties.class), 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS));
         assertTrue(actual.isPresent());
         assertThat(actual.get(), isA(EncryptDQLResultDecorator.class));
@@ -70,7 +70,7 @@ class EncryptResultDecoratorEngineTest {
         SQLStatementContext sqlStatementContext = 
mock(ExplainStatementContext.class);
         
when(sqlStatementContext.getSqlStatement()).thenReturn(mock(ExplainStatement.class));
         EncryptResultDecoratorEngine engine = (EncryptResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
-        Optional<ResultDecorator<EncryptRule>> actual = 
engine.newInstance(mock(ShardingSphereMetaData.class), database, 
mock(ConfigurationProperties.class), sqlStatementContext);
+        Optional<ResultDecorator> actual = 
engine.newInstance(mock(ShardingSphereMetaData.class), database, 
mock(ConfigurationProperties.class), sqlStatementContext);
         assertTrue(actual.isPresent());
         assertThat(actual.get(), isA(EncryptDALResultDecorator.class));
     }
diff --git 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
index d141aff2557..7f6fdbcb99d 100644
--- 
a/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
+++ 
b/features/encrypt/core/src/test/java/org/apache/shardingsphere/encrypt/merge/dal/EncryptDALResultDecoratorTest.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.encrypt.rule.EncryptRule;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
 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.query.QueryContext;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -35,12 +36,15 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.S
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.ColumnInResultSetSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.TableInResultSetSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
+import org.junit.jupiter.api.BeforeEach;
 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;
 
 import java.util.Collections;
+import java.util.Optional;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.isA;
@@ -53,19 +57,24 @@ class EncryptDALResultDecoratorTest {
     
     private final DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
     
-    @Mock
-    private EncryptRule rule;
-    
     @Mock
     private SQLStatementContext sqlStatementContext;
     
+    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
+    private ShardingSphereDatabase database;
+    
+    @BeforeEach
+    public void setup() {
+        
when(database.getRuleMetaData().findSingleRule(EncryptRule.class)).thenReturn(Optional.ofNullable(mock(EncryptRule.class)));
+    }
+    
     @Test
     void assertMergedResultWithShowColumnsStatement() {
         sqlStatementContext = 
mockColumnInResultSetSQLStatementAttributeContext();
         QueryContext queryContext = mock(QueryContext.class);
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(mock(ShardingSphereMetaData.class));
-        assertThat(decorator.decorate(mock(MergedResult.class), queryContext, 
rule), isA(EncryptShowColumnsMergedResult.class));
+        EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(database, mock(ShardingSphereMetaData.class));
+        assertThat(decorator.decorate(mock(MergedResult.class), queryContext), 
isA(EncryptShowColumnsMergedResult.class));
     }
     
     @Test
@@ -77,8 +86,8 @@ class EncryptDALResultDecoratorTest {
         RuleMetaData ruleMetaData = mock(RuleMetaData.class);
         
when(ruleMetaData.getSingleRule(SQLParserRule.class)).thenReturn(mock(SQLParserRule.class));
         when(metaData.getGlobalRuleMetaData()).thenReturn(ruleMetaData);
-        EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(metaData);
-        assertThat(decorator.decorate(mock(MergedResult.class), queryContext, 
rule), isA(EncryptShowCreateTableMergedResult.class));
+        EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(database, metaData);
+        assertThat(decorator.decorate(mock(MergedResult.class), queryContext), 
isA(EncryptShowCreateTableMergedResult.class));
     }
     
     @Test
@@ -86,8 +95,8 @@ class EncryptDALResultDecoratorTest {
         sqlStatementContext = mock(SQLStatementContext.class, 
RETURNS_DEEP_STUBS);
         QueryContext queryContext = mock(QueryContext.class);
         
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
-        EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(mock(ShardingSphereMetaData.class));
-        assertThat(decorator.decorate(mock(MergedResult.class), queryContext, 
rule), isA(MergedResult.class));
+        EncryptDALResultDecorator decorator = new 
EncryptDALResultDecorator(database, mock(ShardingSphereMetaData.class));
+        assertThat(decorator.decorate(mock(MergedResult.class), queryContext), 
isA(MergedResult.class));
     }
     
     private SQLStatementContext 
mockColumnInResultSetSQLStatementAttributeContext() {
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 030c3deaaad..bfd42472bbb 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,9 +22,12 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectS
 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.resource.ResourceMetaData;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.junit.jupiter.api.Test;
 
 import java.sql.SQLException;
+import java.util.Collections;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -37,9 +40,15 @@ class EncryptDQLResultDecoratorTest {
     void assertDecorate() throws SQLException {
         MergedResult mergedResult = mock(MergedResult.class);
         when(mergedResult.next()).thenReturn(true);
+        EncryptRule rule = mock(EncryptRule.class);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+        when(database.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.singleton(rule)));
+        ResourceMetaData resourceMetaData = mock(ResourceMetaData.class);
+        
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.emptyMap());
+        when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         EncryptDQLResultDecorator decorator =
-                new 
EncryptDQLResultDecorator(mock(ShardingSphereDatabase.class), 
mock(ShardingSphereMetaData.class), mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS));
-        MergedResult actual = decorator.decorate(mergedResult, mock(), 
mock(EncryptRule.class));
+                new EncryptDQLResultDecorator(database, 
mock(ShardingSphereMetaData.class), mock(SelectStatementContext.class, 
RETURNS_DEEP_STUBS));
+        MergedResult actual = decorator.decorate(mergedResult, mock());
         assertTrue(actual.next());
     }
 }
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 60692b2b8dc..6e321f6258d 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
@@ -36,8 +36,8 @@ import java.util.Optional;
 public final class MaskResultDecoratorEngine implements 
ResultDecoratorEngine<MaskRule> {
     
     @Override
-    public Optional<ResultDecorator<MaskRule>> newInstance(final 
ShardingSphereMetaData metaData, final ShardingSphereDatabase database, final 
ConfigurationProperties props,
-                                                           final 
SQLStatementContext sqlStatementContext) {
+    public Optional<ResultDecorator> newInstance(final ShardingSphereMetaData 
metaData, final ShardingSphereDatabase database, final ConfigurationProperties 
props,
+                                                 final SQLStatementContext 
sqlStatementContext) {
         return sqlStatementContext instanceof SelectStatementContext
                 ? Optional.of(new MaskDQLResultDecorator(database, metaData, 
(SelectStatementContext) sqlStatementContext))
                 : Optional.empty();
diff --git 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java
 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java
index 24c6a7b8c74..232537e41b4 100644
--- 
a/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java
+++ 
b/features/mask/core/src/main/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecorator.java
@@ -24,13 +24,12 @@ 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.query.QueryContext;
-import org.apache.shardingsphere.mask.rule.MaskRule;
 
 /**
  * DQL result decorator for mask.
  */
 @RequiredArgsConstructor
-public final class MaskDQLResultDecorator implements ResultDecorator<MaskRule> 
{
+public final class MaskDQLResultDecorator implements ResultDecorator {
     
     private final ShardingSphereDatabase database;
     
@@ -39,7 +38,7 @@ public final class MaskDQLResultDecorator implements 
ResultDecorator<MaskRule> {
     private final SelectStatementContext selectStatementContext;
     
     @Override
-    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext, final MaskRule rule) {
+    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext) {
         return new MaskMergedResult(database, metaData, 
selectStatementContext, mergedResult);
     }
 }
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 9526156b250..e991c0f064e 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
@@ -54,7 +54,7 @@ class MaskResultDecoratorEngineTest {
     @Test
     void assertNewInstanceWithSelectStatement() {
         MaskResultDecoratorEngine engine = (MaskResultDecoratorEngine) 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
Collections.singleton(rule)).get(rule);
-        Optional<ResultDecorator<MaskRule>> actual =
+        Optional<ResultDecorator> actual =
                 engine.newInstance(mock(ShardingSphereMetaData.class), 
database, mock(ConfigurationProperties.class), 
mock(SelectStatementContext.class, RETURNS_DEEP_STUBS));
         assertTrue(actual.isPresent());
         assertThat(actual.get(), isA(MaskDQLResultDecorator.class));
diff --git 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java
 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java
index 82f8f04814f..0a1bebd939c 100644
--- 
a/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java
+++ 
b/features/mask/core/src/test/java/org/apache/shardingsphere/mask/merge/dql/MaskDQLResultDecoratorTest.java
@@ -21,7 +21,6 @@ import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectS
 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.mask.rule.MaskRule;
 import org.junit.jupiter.api.Test;
 
 import java.sql.SQLException;
@@ -37,7 +36,7 @@ class MaskDQLResultDecoratorTest {
         MergedResult mergedResult = mock(MergedResult.class);
         when(mergedResult.next()).thenReturn(true);
         MaskDQLResultDecorator decorator = new 
MaskDQLResultDecorator(mock(ShardingSphereDatabase.class), 
mock(ShardingSphereMetaData.class), mock(SelectStatementContext.class));
-        MergedResult actual = decorator.decorate(mergedResult, mock(), 
mock(MaskRule.class));
+        MergedResult actual = decorator.decorate(mergedResult, mock());
         assertTrue(actual.next());
     }
 }
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 3063946ff12..edac7553680 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
@@ -37,9 +37,10 @@ import 
org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 
 import java.sql.SQLException;
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
 
 /**
@@ -55,15 +56,17 @@ public final class MergeEngine {
     private final ConfigurationProperties props;
     
     @SuppressWarnings("rawtypes")
-    private final Map<ShardingSphereRule, ResultProcessEngine> engines;
+    private final Collection<ResultProcessEngine> engines;
     
     private final ConnectionContext connectionContext;
     
-    public MergeEngine(final ShardingSphereMetaData metaData, final 
ShardingSphereDatabase database, final ConfigurationProperties props, final 
ConnectionContext connectionContext) {
+    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());
+        Map<ShardingSphereRule, ResultProcessEngine> ruleEngines = 
OrderedSPILoader.getServices(ResultProcessEngine.class, 
database.getRuleMetaData().getRules());
+        engines = new LinkedList<>(ruleEngines.values());
         this.connectionContext = connectionContext;
     }
     
@@ -82,11 +85,14 @@ public final class MergeEngine {
     
     @SuppressWarnings({"unchecked", "rawtypes"})
     private Optional<MergedResult> executeMerge(final List<QueryResult> 
queryResults, final QueryContext queryContext) throws SQLException {
-        for (Entry<ShardingSphereRule, ResultProcessEngine> entry : 
engines.entrySet()) {
-            if (entry.getValue() instanceof ResultMergerEngine) {
-                ResultMerger resultMerger =
-                        ((ResultMergerEngine) 
entry.getValue()).newInstance(database.getName(), database.getProtocolType(), 
entry.getKey(), props, queryContext.getSqlStatementContext());
-                return Optional.of(resultMerger.merge(queryResults, 
queryContext.getSqlStatementContext(), database, connectionContext));
+        for (ResultProcessEngine each : engines) {
+            if (each instanceof ResultMergerEngine) {
+                Optional<ShardingSphereRule> rule = 
database.getRuleMetaData().findSingleRule(each.getTypeClass());
+                if (rule.isPresent()) {
+                    ResultMerger resultMerger =
+                            ((ResultMergerEngine) 
each).newInstance(database.getName(), database.getProtocolType(), rule.get(), 
props, queryContext.getSqlStatementContext());
+                    return Optional.of(resultMerger.merge(queryResults, 
queryContext.getSqlStatementContext(), database, connectionContext));
+                }
             }
         }
         return Optional.empty();
@@ -95,11 +101,10 @@ public final class MergeEngine {
     @SuppressWarnings({"unchecked", "rawtypes"})
     private MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext) throws SQLException {
         MergedResult result = null;
-        for (Entry<ShardingSphereRule, ResultProcessEngine> entry : 
engines.entrySet()) {
-            if (entry.getValue() instanceof ResultDecoratorEngine) {
-                ResultDecorator resultDecorator = 
getResultDecorator(queryContext.getSqlStatementContext(), entry.getValue());
-                result = null == result ? 
resultDecorator.decorate(mergedResult, queryContext, entry.getKey())
-                        : resultDecorator.decorate(result, queryContext, 
entry.getKey());
+        for (ResultProcessEngine each : engines) {
+            if (each instanceof ResultDecoratorEngine) {
+                ResultDecorator resultDecorator = 
getResultDecorator(queryContext.getSqlStatementContext(), each);
+                result = null == result ? 
resultDecorator.decorate(mergedResult, queryContext) : 
resultDecorator.decorate(result, queryContext);
             }
         }
         return null == result ? mergedResult : result;
diff --git 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java
 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java
index d2d923a9922..749e247838c 100644
--- 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java
+++ 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/ResultDecorator.java
@@ -18,26 +18,22 @@
 package org.apache.shardingsphere.infra.merge.engine.decorator;
 
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 
 import java.sql.SQLException;
 
 /**
  * Result decorator.
- *
- * @param <T> type of ShardingSphere rule
  */
-public interface ResultDecorator<T extends ShardingSphereRule> {
+public interface ResultDecorator {
     
     /**
      * Decorate merged result.
      *
      * @param mergedResult merged result
      * @param queryContext query context
-     * @param rule ShardingSphere rule
      * @return merged result
      * @throws SQLException SQL exception
      */
-    MergedResult decorate(MergedResult mergedResult, QueryContext 
queryContext, T rule) throws SQLException;
+    MergedResult decorate(MergedResult mergedResult, QueryContext 
queryContext) throws SQLException;
 }
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 71c17538d77..a511c4fb5a7 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
@@ -42,5 +42,5 @@ public interface ResultDecoratorEngine<T extends 
ShardingSphereRule> extends Res
      * @param sqlStatementContext SQL statement context
      * @return created instance
      */
-    Optional<ResultDecorator<T>> newInstance(ShardingSphereMetaData metaData, 
ShardingSphereDatabase database, ConfigurationProperties props, 
SQLStatementContext sqlStatementContext);
+    Optional<ResultDecorator> newInstance(ShardingSphereMetaData metaData, 
ShardingSphereDatabase database, ConfigurationProperties props, 
SQLStatementContext sqlStatementContext);
 }
diff --git 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java
 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java
index a27a6f0299e..52c750f3b16 100644
--- 
a/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java
+++ 
b/infra/merge/src/main/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecorator.java
@@ -19,16 +19,15 @@ package 
org.apache.shardingsphere.infra.merge.engine.decorator.impl;
 
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
 
 /**
  * Transparent result decorator.
  */
-public final class TransparentResultDecorator implements 
ResultDecorator<ShardingSphereRule> {
+public final class TransparentResultDecorator implements ResultDecorator {
     
     @Override
-    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext, final ShardingSphereRule rule) {
+    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext) {
         return mergedResult;
     }
 }
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 428b6647fbc..5fd8272ee18 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
@@ -38,10 +38,12 @@ import org.mockito.quality.Strictness;
 import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -69,6 +71,7 @@ class MergeEngineTest {
     @Test
     void assertMergeWithMergerRuleOnly() throws SQLException {
         
when(database.getRuleMetaData().getRules()).thenReturn(Collections.singleton(new
 MergerRuleFixture()));
+        
when(database.getRuleMetaData().findSingleRule(any())).thenReturn(Optional.of(new
 MergerRuleFixture()));
         MergedResult actual =
                 new MergeEngine(mock(ShardingSphereMetaData.class), database, 
new ConfigurationProperties(new Properties()), 
mock(ConnectionContext.class)).merge(
                         Collections.singletonList(queryResult),
diff --git 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java
 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java
index 4caa1af2489..2abe21b7f33 100644
--- 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java
+++ 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/engine/decorator/impl/TransparentResultDecoratorTest.java
@@ -18,7 +18,6 @@
 package org.apache.shardingsphere.infra.merge.engine.decorator.impl;
 
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.junit.jupiter.api.Test;
 
 import java.sql.SQLException;
@@ -34,6 +33,6 @@ class TransparentResultDecoratorTest {
         MergedResult mergedResult = mock(MergedResult.class);
         when(mergedResult.next()).thenReturn(true);
         TransparentResultDecorator decorator = new 
TransparentResultDecorator();
-        assertTrue(decorator.decorate(mergedResult, mock(), 
mock(ShardingSphereRule.class)).next());
+        assertTrue(decorator.decorate(mergedResult, mock()).next());
     }
 }
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 7fe0065e3b7..0e43a21bbd2 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
@@ -30,8 +30,8 @@ import java.util.Optional;
 public final class ResultDecoratorEngineFixture implements 
ResultDecoratorEngine<DecoratorRuleFixture> {
     
     @Override
-    public Optional<ResultDecorator<DecoratorRuleFixture>> newInstance(final 
ShardingSphereMetaData metaData,
-                                                                       final 
ShardingSphereDatabase database, final ConfigurationProperties props, final 
SQLStatementContext sqlStatementContext) {
+    public Optional<ResultDecorator> newInstance(final ShardingSphereMetaData 
metaData,
+                                                 final ShardingSphereDatabase 
database, final ConfigurationProperties props, final SQLStatementContext 
sqlStatementContext) {
         return Optional.of(new ResultDecoratorFixture());
     }
     
diff --git 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java
 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java
index 69ecb4d28e6..7596ffbd447 100644
--- 
a/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java
+++ 
b/infra/merge/src/test/java/org/apache/shardingsphere/infra/merge/fixture/decorator/ResultDecoratorFixture.java
@@ -19,7 +19,6 @@ package 
org.apache.shardingsphere.infra.merge.fixture.decorator;
 
 import 
org.apache.shardingsphere.infra.executor.sql.execute.result.query.impl.driver.jdbc.type.stream.JDBCStreamQueryResult;
 import org.apache.shardingsphere.infra.merge.engine.decorator.ResultDecorator;
-import org.apache.shardingsphere.infra.merge.fixture.rule.DecoratorRuleFixture;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.merge.result.impl.transparent.TransparentMergedResult;
 import org.apache.shardingsphere.infra.session.query.QueryContext;
@@ -30,10 +29,10 @@ import java.sql.SQLException;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-public final class ResultDecoratorFixture implements 
ResultDecorator<DecoratorRuleFixture> {
+public final class ResultDecoratorFixture implements ResultDecorator {
     
     @Override
-    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext, final DecoratorRuleFixture rule) throws SQLException 
{
+    public MergedResult decorate(final MergedResult mergedResult, final 
QueryContext queryContext) throws SQLException {
         ResultSet resultSet = mock(ResultSet.class);
         when(resultSet.getString(1)).thenReturn("decorated_merged_value");
         return new TransparentMergedResult(new 
JDBCStreamQueryResult(resultSet));
diff --git 
a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
 
b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
index a6f2d1f8c4a..4067c7ffc21 100644
--- 
a/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
+++ 
b/infra/session/src/main/java/org/apache/shardingsphere/infra/session/query/QueryContext.java
@@ -34,6 +34,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.t
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Optional;
 
@@ -115,4 +116,23 @@ public final class QueryContext {
         
ShardingSpherePreconditions.checkState(metaData.containsDatabase(databaseName), 
() -> new UnknownDatabaseException(databaseName));
         return metaData.getDatabase(databaseName);
     }
+    
+    /**
+     * Get used databases.
+     *
+     * @return used databases
+     */
+    public Collection<ShardingSphereDatabase> getUsedDatabases() {
+        Collection<ShardingSphereDatabase> result = new LinkedList<>();
+        for (String each : usedDatabaseNames) {
+            result.add(getDatabase(each));
+        }
+        return result;
+    }
+    
+    private ShardingSphereDatabase getDatabase(final String databaseName) {
+        ShardingSpherePreconditions.checkNotNull(databaseName, 
NoDatabaseSelectedException::new);
+        
ShardingSpherePreconditions.checkState(metaData.containsDatabase(databaseName), 
() -> new UnknownDatabaseException(databaseName));
+        return metaData.getDatabase(databaseName);
+    }
 }
diff --git 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java
 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java
index 45d62e5b1d4..590ffd92256 100644
--- 
a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java
+++ 
b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementor.java
@@ -161,7 +161,8 @@ public final class EnumerableScanImplementor implements 
ScanImplementor {
                 processEngine.executeSQL(executionGroupContext, queryContext);
                 List<QueryResult> queryResults =
                         
executorContext.getJdbcExecutor().execute(executionGroupContext, 
executorContext.getQueryCallback()).stream().map(QueryResult.class::cast).collect(Collectors.toList());
-                MergeEngine mergeEngine = new 
MergeEngine(queryContext.getMetaData(), database, 
queryContext.getMetaData().getProps(), queryContext.getConnectionContext());
+                MergeEngine mergeEngine = new 
MergeEngine(queryContext.getMetaData(), database, 
queryContext.getMetaData().getProps(),
+                        queryContext.getConnectionContext());
                 MergedResult mergedResult = mergeEngine.merge(queryResults, 
queryContext);
                 Collection<Statement> statements = 
getStatements(executionGroupContext.getInputGroups());
                 return new JDBCDataRowEnumerator(mergedResult, 
queryResults.get(0).getMetaData(), statements);
diff --git 
a/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementorTest.java
 
b/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementorTest.java
index c51cccf8122..a1043c2d80c 100644
--- 
a/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementorTest.java
+++ 
b/kernel/sql-federation/executor/src/test/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/implementor/EnumerableScanImplementorTest.java
@@ -263,6 +263,7 @@ class EnumerableScanImplementorTest {
         ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
         when(database.getName()).thenReturn("foo_db");
+        when(metaData.containsDatabase("foo_db")).thenReturn(true);
         when(metaData.getDatabase("foo_db")).thenReturn(database);
         
when(metaData.getGlobalRuleMetaData()).thenReturn(mock(RuleMetaData.class));
         when(queryContext.getMetaData()).thenReturn(metaData);
diff --git 
a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
 
b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
index cf067c04ad3..ff8ee6e6f52 100644
--- 
a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
+++ 
b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
@@ -266,7 +266,7 @@ public final class MySQLDALStatementVisitor extends 
MySQLStatementVisitor implem
     
     @Override
     public ASTNode visitShowCreateView(final ShowCreateViewContext ctx) {
-        return new MySQLShowCreateViewStatement(getDatabaseType(), 
((SimpleTableSegment) 
visit(ctx.viewName())).getTableName().getIdentifier().getValue());
+        return new MySQLShowCreateViewStatement(getDatabaseType(), 
(SimpleTableSegment) visit(ctx.viewName()));
     }
     
     @Override
diff --git 
a/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
 
b/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
index 41970eca33d..7a86db03a50 100644
--- 
a/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
+++ 
b/parser/sql/statement/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/statement/mysql/dal/show/view/MySQLShowCreateViewStatement.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.sql.parser.statement.mysql.dal.show.view;
 import 
com.sphereex.dbplusengine.sql.parser.statement.core.statement.attribute.type.ViewInResultSetSQLStatementAttribute;
 import lombok.Getter;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.SQLStatementAttributes;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.DatabaseSelectRequiredSQLStatementAttribute;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.DALStatement;
@@ -30,15 +31,15 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.type.dal.DA
 @Getter
 public final class MySQLShowCreateViewStatement extends DALStatement {
     
-    private final String viewName;
+    private final SimpleTableSegment viewName;
     
-    public MySQLShowCreateViewStatement(final DatabaseType databaseType, final 
String viewName) {
+    public MySQLShowCreateViewStatement(final DatabaseType databaseType, final 
SimpleTableSegment viewName) {
         super(databaseType);
         this.viewName = viewName;
     }
     
     @Override
     public SQLStatementAttributes getAttributes() {
-        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute(), new 
ViewInResultSetSQLStatementAttribute(2, viewName));
+        return new SQLStatementAttributes(new 
DatabaseSelectRequiredSQLStatementAttribute(), new 
ViewInResultSetSQLStatementAttribute(2, 
getViewName().getTableName().getIdentifier().getValue()));
     }
 }


Reply via email to