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

zhaojinchao 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 1d7d0d0b2a9 Fix load single table with specific schema, and make show 
single/logical tables support schema (#37535)
1d7d0d0b2a9 is described below

commit 1d7d0d0b2a998cba587095ea3f7f590c5c7f9fc3
Author: Raigor <[email protected]>
AuthorDate: Sat Dec 27 23:19:29 2025 +0800

    Fix load single table with specific schema, and make show single/logical 
tables support schema (#37535)
    
    * Fix load single table with specific schema, and make show single/logical 
tables support schema
    
    * Update RELEASE-NOTES.md
    
    * Fix DistSQL E2E
---
 RELEASE-NOTES.md                                   |  1 +
 .../rql/resource/ShowLogicalTablesExecutor.java    | 14 ++--
 .../single/datanode/SingleTableDataNodeLoader.java | 21 ++---
 .../SingleRuleConfigurationDecorator.java          | 97 +++++++++++++++-------
 .../shardingsphere/single/rule/SingleRule.java     |  1 +
 .../SingleRuleConfigurationDecoratorTest.java      |  3 +-
 .../handler/query/ShowSingleTablesExecutor.java    | 32 +++++--
 .../query/ShowUnloadedSingleTablesExecutor.java    | 20 ++++-
 .../handler/update/LoadSingleTableExecutor.java    |  7 +-
 .../single/distsql/segment/SingleTableSegment.java | 10 ++-
 .../distsql/segment/SingleTableSegmentTest.java    |  4 +-
 .../{ => mysql}/alter_single_table_rules.xml       |  0
 .../{ => mysql}/create_single_table_rules.xml      |  0
 .../{ => mysql}/drop_single_table_rules.xml        |  0
 .../{ => postgresql}/alter_single_table_rules.xml  |  9 +-
 .../{ => postgresql}/create_single_table_rules.xml |  9 +-
 .../{ => postgresql}/drop_single_table_rules.xml   |  7 +-
 .../{ => mysql}/show_single_table.xml              |  0
 .../{ => mysql}/show_single_tables.xml             |  0
 .../{ => opengauss}/show_single_table.xml          |  3 +-
 .../{ => opengauss}/show_single_tables.xml         |  7 +-
 .../{ => postgresql}/show_single_table.xml         |  3 +-
 .../{ => postgresql}/show_single_tables.xml        |  7 +-
 .../DistSQLDatabaseRuleQueryExecutorAssert.java    |  3 +
 24 files changed, 173 insertions(+), 85 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index ae51ea0bc79..97afee67392 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -119,6 +119,7 @@
 1. Pipeline: Fix migration might skip some records on big table after job 
restarting - [#36878](https://github.com/apache/shardingsphere/pull/36878)
 1. Pipeline: Fix unsigned number column value type inconsistent in inventory 
and incremental - [#37280](https://github.com/apache/shardingsphere/pull/37280)
 1. Pipeline: Fix PostgreSQL migration create table SQL generation failure 
caused by locale-formatted sequence values - 
[#28360](https://github.com/apache/shardingsphere/issues/28360)
+1. DistSQL: Fix load single table with specific schema - 
[#37535](https://github.com/apache/shardingsphere/pull/37535)
 
 ### Change Logs
 
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowLogicalTablesExecutor.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowLogicalTablesExecutor.java
index ca1a5ae170f..62e24ae4205 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowLogicalTablesExecutor.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/executor/rql/resource/ShowLogicalTablesExecutor.java
@@ -47,9 +47,10 @@ public final class ShowLogicalTablesExecutor implements 
DistSQLQueryExecutor<Sho
     
     @Override
     public Collection<String> getColumnNames(final ShowLogicalTablesStatement 
sqlStatement) {
-        return sqlStatement.isContainsFull()
-                ? Arrays.asList(String.format("Tables_in_%s", 
database.getName()), "Table_type")
-                : Collections.singleton(String.format("Tables_in_%s", 
database.getName()));
+        if (new 
DatabaseTypeRegistry(database.getProtocolType()).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable())
 {
+            return sqlStatement.isContainsFull() ? Arrays.asList("table_name", 
"table_type", "schema_name") : Arrays.asList("table_name", "schema_name");
+        }
+        return sqlStatement.isContainsFull() ? Arrays.asList("table_name", 
"table_type") : Collections.singleton("table_name");
     }
     
     @Override
@@ -59,10 +60,13 @@ public final class ShowLogicalTablesExecutor implements 
DistSQLQueryExecutor<Sho
         if (null == database.getSchema(schemaName)) {
             return Collections.emptyList();
         }
-        return getTables(schemaName, sqlStatement).stream().map(each -> 
getRow(each, sqlStatement)).collect(Collectors.toList());
+        return getTables(schemaName, sqlStatement).stream().map(each -> 
getRow(schemaName, each, sqlStatement)).collect(Collectors.toList());
     }
     
-    private LocalDataQueryResultRow getRow(final ShardingSphereTable table, 
final ShowLogicalTablesStatement sqlStatement) {
+    private LocalDataQueryResultRow getRow(final String schemaName, final 
ShardingSphereTable table, final ShowLogicalTablesStatement sqlStatement) {
+        if (new 
DatabaseTypeRegistry(database.getProtocolType()).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable())
 {
+            return sqlStatement.isContainsFull() ? new 
LocalDataQueryResultRow(table.getName(), table.getType(), schemaName) : new 
LocalDataQueryResultRow(table.getName(), schemaName);
+        }
         return sqlStatement.isContainsFull() ? new 
LocalDataQueryResultRow(table.getName(), table.getType()) : new 
LocalDataQueryResultRow(table.getName());
     }
     
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java
index 92d550c163a..912f0a7b1d0 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/datanode/SingleTableDataNodeLoader.java
@@ -116,9 +116,9 @@ public final class SingleTableDataNodeLoader {
                                                                             
final Map<String, Map<String, Collection<String>>> configuredTableMap) {
         Map<String, Collection<DataNode>> result = new 
ConcurrentHashMap<>(actualDataNodes.size(), 1F);
         for (Entry<String, Collection<DataNode>> entry : 
actualDataNodes.entrySet()) {
-            Collection<DataNode> singleNode = 
loadSpecifiedDataNode(entry.getValue(), featureRequiredSingleTables, 
configuredTableMap);
-            if (!singleNode.isEmpty()) {
-                result.put(entry.getKey(), singleNode);
+            Collection<DataNode> singleNodes = 
loadSpecifiedDataNode(entry.getValue(), featureRequiredSingleTables, 
configuredTableMap);
+            if (!singleNodes.isEmpty()) {
+                result.put(entry.getKey(), singleNodes);
             }
         }
         return result;
@@ -126,31 +126,28 @@ public final class SingleTableDataNodeLoader {
     
     private static Collection<DataNode> loadSpecifiedDataNode(final 
Collection<DataNode> dataNodes, final Collection<String> 
featureRequiredSingleTables,
                                                               final 
Map<String, Map<String, Collection<String>>> configuredTableMap) {
+        Collection<DataNode> result = new LinkedList<>();
         for (DataNode each : dataNodes) {
             if (featureRequiredSingleTables.contains(each.getTableName())) {
-                return getSingleDataNodes(each);
+                result.add(each);
+                continue;
             }
             Map<String, Collection<String>> configuredTablesForDataSource = 
configuredTableMap.get(each.getDataSourceName());
             if (null == configuredTablesForDataSource || 
configuredTablesForDataSource.isEmpty()) {
                 continue;
             }
             if 
(configuredTablesForDataSource.containsKey(SingleTableConstants.ASTERISK)) {
-                return getSingleDataNodes(each);
+                result.add(each);
+                continue;
             }
             Collection<String> configuredTablesForSchema = 
configuredTablesForDataSource.get(each.getSchemaName());
             if (null == configuredTablesForSchema || 
configuredTablesForSchema.isEmpty()) {
                 continue;
             }
             if 
(configuredTablesForSchema.contains(SingleTableConstants.ASTERISK) || 
configuredTablesForSchema.contains(each.getTableName().toLowerCase())) {
-                return getSingleDataNodes(each);
+                result.add(each);
             }
         }
-        return Collections.emptyList();
-    }
-    
-    private static Collection<DataNode> getSingleDataNodes(final DataNode 
dataNode) {
-        Collection<DataNode> result = new LinkedList<>();
-        result.add(dataNode);
         return result;
     }
     
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecorator.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecorator.java
index 1726088f8ef..7e9023d75d2 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecorator.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecorator.java
@@ -17,6 +17,8 @@
 
 package org.apache.shardingsphere.single.decorator;
 
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.config.rule.decorator.RuleConfigurationDecorator;
@@ -41,6 +43,7 @@ import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -67,24 +70,28 @@ public final class SingleRuleConfigurationDecorator 
implements RuleConfiguration
         DatabaseType databaseType = dataSources.isEmpty() ? 
DatabaseTypeEngine.getDefaultStorageType() : 
DatabaseTypeEngine.getStorageType(dataSources.values().iterator().next());
         Collection<String> excludedTables = 
SingleTableLoadUtils.getExcludedTables(builtRules);
         Map<String, Collection<DataNode>> actualDataNodes = 
SingleTableDataNodeLoader.load(databaseName, aggregatedDataSources, 
excludedTables);
-        boolean isSchemaSupportedDatabaseType = new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSchemaOption().getDefaultSchema().isPresent();
+        boolean isSchemaAvailable = new 
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable();
         if (splitTables.contains(SingleTableConstants.ALL_TABLES) || 
splitTables.contains(SingleTableConstants.ALL_SCHEMA_TABLES)) {
-            return loadAllTables(isSchemaSupportedDatabaseType, 
actualDataNodes);
+            return loadAllTables(isSchemaAvailable, actualDataNodes);
         }
         Collection<DataNode> configuredDataNodes = 
SingleTableLoadUtils.convertToDataNodes(databaseName, databaseType, 
splitTables);
-        return loadSpecifiedTables(isSchemaSupportedDatabaseType, 
actualDataNodes, builtRules, configuredDataNodes);
+        return loadSpecifiedTables(isSchemaAvailable, actualDataNodes, 
builtRules, configuredDataNodes);
     }
     
     private boolean isExpandRequired(final Collection<String> splitTables) {
         return splitTables.stream().anyMatch(each -> 
each.contains(SingleTableConstants.ASTERISK));
     }
     
-    private Collection<String> loadAllTables(final boolean 
isSchemaSupportedDatabaseType, final Map<String, Collection<DataNode>> 
actualDataNodes) {
-        return actualDataNodes.values().stream().map(each -> 
getTableNodeString(isSchemaSupportedDatabaseType, 
each.iterator().next())).collect(Collectors.toList());
+    private Collection<String> loadAllTables(final boolean isSchemaAvailable, 
final Map<String, Collection<DataNode>> actualDataNodes) {
+        Collection<String> result = new LinkedList<>();
+        for (Entry<String, Collection<DataNode>> entry : 
actualDataNodes.entrySet()) {
+            result.addAll(entry.getValue().stream().map(each -> 
getTableNodeString(isSchemaAvailable, each)).collect(Collectors.toList()));
+        }
+        return result;
     }
     
-    private String getTableNodeString(final boolean 
isSchemaSupportedDatabaseType, final DataNode dataNode) {
-        return isSchemaSupportedDatabaseType
+    private String getTableNodeString(final boolean isSchemaAvailable, final 
DataNode dataNode) {
+        return isSchemaAvailable
                 ? formatTableName(dataNode.getDataSourceName(), 
dataNode.getSchemaName(), dataNode.getTableName())
                 : formatTableName(dataNode.getDataSourceName(), 
dataNode.getTableName());
     }
@@ -97,57 +104,78 @@ public final class SingleRuleConfigurationDecorator 
implements RuleConfiguration
         return String.format("%s.%s", dataSourceName, tableName);
     }
     
-    private Collection<String> loadSpecifiedTables(final boolean 
isSchemaSupportedDatabaseType, final Map<String, Collection<DataNode>> 
actualDataNodes,
+    private Collection<String> loadSpecifiedTables(final boolean 
isSchemaAvailable, final Map<String, Collection<DataNode>> actualDataNodes,
                                                    final 
Collection<ShardingSphereRule> builtRules, final Collection<DataNode> 
configuredDataNodes) {
-        Collection<String> expandRequiredDataSources = new 
LinkedHashSet<>(configuredDataNodes.size(), 1F);
-        Map<String, DataNode> expectedDataNodes = new 
LinkedHashMap<>(configuredDataNodes.size(), 1F);
+        DataNodeClassification dataNodeClassification = 
classifyDataNodes(configuredDataNodes);
+        if (dataNodeClassification.expandDataSources.isEmpty() && 
dataNodeClassification.expandDataSourceSchemas.isEmpty()) {
+            return loadSpecifiedTablesWithoutExpand(isSchemaAvailable, 
actualDataNodes, configuredDataNodes);
+        }
+        return loadSpecifiedTablesWithExpand(isSchemaAvailable, 
actualDataNodes, 
SingleTableLoadUtils.getFeatureRequiredSingleTables(builtRules),
+                dataNodeClassification.getExpandDataSources(), 
dataNodeClassification.getExpandDataSourceSchemas(), 
dataNodeClassification.getExpectedDataNodes());
+    }
+    
+    private DataNodeClassification classifyDataNodes(final 
Collection<DataNode> configuredDataNodes) {
+        Collection<String> expandDataSources = new LinkedHashSet<>();
+        Map<String, Set<String>> expandDataSourceSchemas = new 
LinkedHashMap<>();
+        Map<String, DataNode> expectedDataNodes = new LinkedHashMap<>();
         for (DataNode each : configuredDataNodes) {
-            if (SingleTableConstants.ASTERISK.equals(each.getTableName())) {
-                expandRequiredDataSources.add(each.getDataSourceName());
+            categorizeDataNode(each, expandDataSources, 
expandDataSourceSchemas, expectedDataNodes);
+        }
+        return new DataNodeClassification(expandDataSources, 
expandDataSourceSchemas, expectedDataNodes);
+    }
+    
+    private void categorizeDataNode(final DataNode dataNode, final 
Collection<String> expandDataSources,
+                                    final Map<String, Set<String>> 
expandDataSourceSchemas, final Map<String, DataNode> expectedDataNodes) {
+        if (SingleTableConstants.ASTERISK.equals(dataNode.getTableName())) {
+            if 
(SingleTableConstants.ASTERISK.equals(dataNode.getSchemaName())) {
+                expandDataSources.add(dataNode.getDataSourceName());
             } else {
-                expectedDataNodes.put(each.getTableName(), each);
+                
expandDataSourceSchemas.computeIfAbsent(dataNode.getDataSourceName(), key -> 
new LinkedHashSet<>()).add(dataNode.getSchemaName());
             }
+        } else {
+            expectedDataNodes.put(dataNode.getTableName(), dataNode);
         }
-        return expandRequiredDataSources.isEmpty()
-                ? 
loadSpecifiedTablesWithoutExpand(isSchemaSupportedDatabaseType, 
actualDataNodes, configuredDataNodes)
-                : loadSpecifiedTablesWithExpand(
-                        isSchemaSupportedDatabaseType, actualDataNodes, 
SingleTableLoadUtils.getFeatureRequiredSingleTables(builtRules), 
expandRequiredDataSources, expectedDataNodes);
     }
     
-    private Collection<String> loadSpecifiedTablesWithExpand(final boolean 
isSchemaSupportedDatabaseType, final Map<String, Collection<DataNode>> 
actualDataNodes,
-                                                             final 
Collection<String> featureRequiredSingleTables, final Collection<String> 
expandRequiredDataSources,
-                                                             final Map<String, 
DataNode> expectedDataNodes) {
+    private Collection<String> loadSpecifiedTablesWithExpand(final boolean 
isSchemaAvailable, final Map<String, Collection<DataNode>> actualDataNodes,
+                                                             final 
Collection<String> featureRequiredSingleTables, final Collection<String> 
expandDataSources,
+                                                             final Map<String, 
Set<String>> expandDataSourceSchemas, final Map<String, DataNode> 
expectedDataNodes) {
         Collection<String> result = new 
LinkedHashSet<>(actualDataNodes.size(), 1F);
         for (Entry<String, Collection<DataNode>> entry : 
actualDataNodes.entrySet()) {
             if (featureRequiredSingleTables.contains(entry.getKey())) {
                 continue;
             }
             DataNode physicalDataNode = entry.getValue().iterator().next();
-            if 
(expandRequiredDataSources.contains(physicalDataNode.getDataSourceName())) {
-                result.add(getTableNodeString(isSchemaSupportedDatabaseType, 
physicalDataNode));
+            if 
(expandDataSources.contains(physicalDataNode.getDataSourceName())) {
+                result.add(getTableNodeString(isSchemaAvailable, 
physicalDataNode));
+                continue;
+            }
+            Set<String> requiredSchemas = 
expandDataSourceSchemas.get(physicalDataNode.getDataSourceName());
+            if (null != requiredSchemas && 
requiredSchemas.contains(physicalDataNode.getSchemaName())) {
+                result.add(getTableNodeString(isSchemaAvailable, 
physicalDataNode));
                 continue;
             }
             if (expectedDataNodes.containsKey(entry.getKey())) {
                 DataNode dataNode = expectedDataNodes.get(entry.getKey());
-                String tableNodeStr = 
getTableNodeString(isSchemaSupportedDatabaseType, physicalDataNode);
+                String tableNodeStr = getTableNodeString(isSchemaAvailable, 
physicalDataNode);
                 
ShardingSpherePreconditions.checkState(physicalDataNode.equals(dataNode),
                         () -> new 
InvalidSingleRuleConfigurationException(String.format("Single table `%s` is 
found that does not match %s", tableNodeStr,
-                                
getTableNodeString(isSchemaSupportedDatabaseType, dataNode))));
+                                getTableNodeString(isSchemaAvailable, 
dataNode))));
                 result.add(tableNodeStr);
             }
         }
         return result;
     }
     
-    private Collection<String> loadSpecifiedTablesWithoutExpand(final boolean 
isSchemaSupportedDatabaseType,
-                                                                final 
Map<String, Collection<DataNode>> actualDataNodes, final Collection<DataNode> 
configuredDataNodes) {
+    private Collection<String> loadSpecifiedTablesWithoutExpand(final boolean 
isSchemaAvailable, final Map<String, Collection<DataNode>> actualDataNodes,
+                                                                final 
Collection<DataNode> configuredDataNodes) {
         Collection<String> result = new 
LinkedHashSet<>(configuredDataNodes.size(), 1F);
         for (DataNode each : configuredDataNodes) {
-            ShardingSpherePreconditions.checkContainsKey(actualDataNodes, 
each.getTableName(), () -> new 
SingleTableNotFoundException(getTableNodeString(isSchemaSupportedDatabaseType, 
each)));
+            ShardingSpherePreconditions.checkContainsKey(actualDataNodes, 
each.getTableName(), () -> new 
SingleTableNotFoundException(getTableNodeString(isSchemaAvailable, each)));
             DataNode actualDataNode = 
actualDataNodes.get(each.getTableName()).iterator().next();
-            String tableNodeStr = 
getTableNodeString(isSchemaSupportedDatabaseType, actualDataNode);
+            String tableNodeStr = getTableNodeString(isSchemaAvailable, 
actualDataNode);
             
ShardingSpherePreconditions.checkState(actualDataNode.equals(each), () -> new 
InvalidSingleRuleConfigurationException(
-                    String.format("Single table '%s' is found that does not 
match %s", tableNodeStr, getTableNodeString(isSchemaSupportedDatabaseType, 
each))));
+                    String.format("Single table '%s' is found that does not 
match %s", tableNodeStr, getTableNodeString(isSchemaAvailable, each))));
             result.add(tableNodeStr);
         }
         return result;
@@ -157,4 +185,15 @@ public final class SingleRuleConfigurationDecorator 
implements RuleConfiguration
     public Class<SingleRuleConfiguration> getType() {
         return SingleRuleConfiguration.class;
     }
+    
+    @Getter
+    @RequiredArgsConstructor
+    private static class DataNodeClassification {
+        
+        private final Collection<String> expandDataSources;
+        
+        private final Map<String, Set<String>> expandDataSourceSchemas;
+        
+        private final Map<String, DataNode> expectedDataNodes;
+    }
 }
diff --git 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
index 8009c556d3b..c3fbcfefa71 100644
--- 
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
+++ 
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
@@ -64,6 +64,7 @@ public final class SingleRule implements DatabaseRule {
     @Getter
     private final Collection<String> dataSourceNames;
     
+    @Getter
     private final Map<String, Collection<DataNode>> singleTableDataNodes;
     
     private final DatabaseType protocolType;
diff --git 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecoratorTest.java
 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecoratorTest.java
index 6c4e6d17d26..c5eb29ea64a 100644
--- 
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecoratorTest.java
+++ 
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/decorator/SingleRuleConfigurationDecoratorTest.java
@@ -43,7 +43,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Optional;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
@@ -189,7 +188,7 @@ class SingleRuleConfigurationDecoratorTest {
     
     private MockedConstruction<DatabaseTypeRegistry> mockSchemaAwareRegistry() 
{
         DialectDatabaseMetaData dialectDatabaseMetaData = 
mock(DialectDatabaseMetaData.class, RETURNS_DEEP_STUBS);
-        
when(dialectDatabaseMetaData.getSchemaOption().getDefaultSchema()).thenReturn(Optional.of("public"));
+        
when(dialectDatabaseMetaData.getSchemaOption().isSchemaAvailable()).thenReturn(true);
         return mockConstruction(DatabaseTypeRegistry.class, (mock, context) -> 
when(mock.getDialectDatabaseMetaData()).thenReturn(dialectDatabaseMetaData));
     }
     
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTablesExecutor.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTablesExecutor.java
index ffe287dcd7d..8b724c764e0 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTablesExecutor.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowSingleTablesExecutor.java
@@ -18,10 +18,13 @@
 package org.apache.shardingsphere.single.distsql.handler.query;
 
 import lombok.Setter;
+import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
+import 
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorDatabaseAware;
 import 
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorRuleAware;
 import 
org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor;
 import org.apache.shardingsphere.infra.datanode.DataNode;
 import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryResultRow;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
 import org.apache.shardingsphere.infra.util.regex.RegexUtils;
 import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -31,7 +34,9 @@ import org.apache.shardingsphere.single.rule.SingleRule;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.LinkedList;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -40,13 +45,17 @@ import java.util.stream.Collectors;
  * Show single tables executor.
  */
 @Setter
-public final class ShowSingleTablesExecutor implements 
DistSQLQueryExecutor<ShowSingleTablesStatement>, 
DistSQLExecutorRuleAware<SingleRule> {
+public final class ShowSingleTablesExecutor implements 
DistSQLQueryExecutor<ShowSingleTablesStatement>, 
DistSQLExecutorRuleAware<SingleRule>, DistSQLExecutorDatabaseAware {
+    
+    private ShardingSphereDatabase database;
     
     private SingleRule rule;
     
     @Override
     public Collection<String> getColumnNames(final ShowSingleTablesStatement 
sqlStatement) {
-        return Arrays.asList("table_name", "storage_unit_name");
+        return new 
DatabaseTypeRegistry(database.getProtocolType()).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable()
+                ? Arrays.asList("table_name", "storage_unit_name", 
"schema_name")
+                : Arrays.asList("table_name", "storage_unit_name");
     }
     
     @Override
@@ -55,7 +64,10 @@ public final class ShowSingleTablesExecutor implements 
DistSQLQueryExecutor<Show
                 .map(optional -> 
getDataNodesWithLikePattern(rule.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes(),
 optional))
                 .orElseGet(() -> 
getDataNodes(rule.getAttributes().getAttribute(DataNodeRuleAttribute.class).getAllDataNodes()));
         Collection<DataNode> sortedDataNodes = 
resultDataNodes.stream().sorted(Comparator.comparing(DataNode::getTableName)).collect(Collectors.toList());
-        return sortedDataNodes.stream().map(each -> new 
LocalDataQueryResultRow(each.getTableName(), 
each.getDataSourceName())).collect(Collectors.toList());
+        boolean isSchemaAvailable = new 
DatabaseTypeRegistry(database.getProtocolType()).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable();
+        return sortedDataNodes.stream().map(each -> isSchemaAvailable
+                ? new LocalDataQueryResultRow(each.getTableName(), 
each.getDataSourceName(), each.getSchemaName())
+                : new LocalDataQueryResultRow(each.getTableName(), 
each.getDataSourceName())).collect(Collectors.toList());
     }
     
     private Optional<Pattern> getPattern(final ShowSingleTablesStatement 
sqlStatement) {
@@ -65,11 +77,21 @@ public final class ShowSingleTablesExecutor implements 
DistSQLQueryExecutor<Show
     }
     
     private Collection<DataNode> getDataNodesWithLikePattern(final Map<String, 
Collection<DataNode>> singleTableNodes, final Pattern pattern) {
-        return singleTableNodes.entrySet().stream().filter(entry -> 
pattern.matcher(entry.getKey()).matches()).map(entry -> 
entry.getValue().iterator().next()).collect(Collectors.toList());
+        Collection<DataNode> result = new LinkedList<>();
+        for (Entry<String, Collection<DataNode>> entry : 
singleTableNodes.entrySet()) {
+            if (pattern.matcher(entry.getKey()).matches()) {
+                result.addAll(entry.getValue());
+            }
+        }
+        return result;
     }
     
     private Collection<DataNode> getDataNodes(final Map<String, 
Collection<DataNode>> singleTableNodes) {
-        return singleTableNodes.values().stream().map(each -> 
each.iterator().next()).collect(Collectors.toList());
+        Collection<DataNode> result = new LinkedList<>();
+        for (Collection<DataNode> each : singleTableNodes.values()) {
+            result.addAll(each);
+        }
+        return result;
     }
     
     @Override
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTablesExecutor.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTablesExecutor.java
index 9081e0d40d5..e97fc58de5e 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTablesExecutor.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/query/ShowUnloadedSingleTablesExecutor.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.single.distsql.handler.query;
 
 import lombok.Setter;
+import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorDatabaseAware;
 import 
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorRuleAware;
 import 
org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecutor;
@@ -26,7 +27,6 @@ import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryRes
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.PhysicalDataSourceAggregator;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
-import 
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.single.datanode.SingleTableDataNodeLoader;
 import 
org.apache.shardingsphere.single.distsql.statement.rql.ShowUnloadedSingleTablesStatement;
@@ -54,14 +54,23 @@ public final class ShowUnloadedSingleTablesExecutor 
implements DistSQLQueryExecu
     
     @Override
     public Collection<String> getColumnNames(final 
ShowUnloadedSingleTablesStatement sqlStatement) {
-        return Arrays.asList("table_name", "storage_unit_name");
+        return new 
DatabaseTypeRegistry(database.getProtocolType()).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable()
+                ? Arrays.asList("table_name", "storage_unit_name", 
"schema_name")
+                : Arrays.asList("table_name", "storage_unit_name");
     }
     
     @Override
     public Collection<LocalDataQueryResultRow> getRows(final 
ShowUnloadedSingleTablesStatement sqlStatement, final ContextManager 
contextManager) {
         Map<String, Collection<DataNode>> actualDataNodes = 
getActualDataNodes(database);
-        for (String each : 
rule.getAttributes().getAttribute(TableMapperRuleAttribute.class).getLogicTableNames())
 {
-            actualDataNodes.remove(each.toLowerCase());
+        for (Entry<String, Collection<DataNode>> entry : 
rule.getSingleTableDataNodes().entrySet()) {
+            if (actualDataNodes.containsKey(entry.getKey())) {
+                if 
(entry.getValue().containsAll(actualDataNodes.get(entry.getKey()))) {
+                    actualDataNodes.remove(entry.getKey().toLowerCase());
+                    continue;
+                }
+                Collection<DataNode> tableNodes = 
actualDataNodes.get(entry.getKey());
+                tableNodes.removeIf(each -> entry.getValue().contains(each));
+            }
         }
         Collection<LocalDataQueryResultRow> result = new LinkedList<>();
         
actualDataNodes.values().stream().map(this::getRows).forEach(result::addAll);
@@ -69,6 +78,9 @@ public final class ShowUnloadedSingleTablesExecutor 
implements DistSQLQueryExecu
     }
     
     private Collection<LocalDataQueryResultRow> getRows(final 
Collection<DataNode> dataNodes) {
+        if (new 
DatabaseTypeRegistry(database.getProtocolType()).getDialectDatabaseMetaData().getSchemaOption().isSchemaAvailable())
 {
+            return dataNodes.stream().map(each -> new 
LocalDataQueryResultRow(each.getTableName(), each.getDataSourceName(), 
each.getSchemaName())).collect(Collectors.toList());
+        }
         return dataNodes.stream().map(each -> new 
LocalDataQueryResultRow(each.getTableName(), 
each.getDataSourceName())).collect(Collectors.toList());
     }
     
diff --git 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutor.java
 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutor.java
index c4f4bf4c069..c3b4a049a6a 100644
--- 
a/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutor.java
+++ 
b/kernel/single/distsql/handler/src/main/java/org/apache/shardingsphere/single/distsql/handler/update/LoadSingleTableExecutor.java
@@ -92,10 +92,10 @@ public final class LoadSingleTableExecutor implements 
DatabaseRuleCreateExecutor
             return;
         }
         if (isSchemaSupportedDatabaseType) {
-            
ShardingSpherePreconditions.checkState(singleTableSegment.containsSchema(),
+            
ShardingSpherePreconditions.checkState(singleTableSegment.getSchemaName().isPresent(),
                     () -> new 
InvalidDataNodeFormatException(singleTableSegment.toString(), "Current database 
is schema required, please use format `db.schema.table`"));
         } else {
-            
ShardingSpherePreconditions.checkState(!singleTableSegment.containsSchema(),
+            
ShardingSpherePreconditions.checkState(!singleTableSegment.getSchemaName().isPresent(),
                     () -> new 
InvalidDataNodeFormatException(singleTableSegment.toString(), "Current database 
does not support schema, please use format `db.table`"));
         }
     }
@@ -112,7 +112,8 @@ public final class LoadSingleTableExecutor implements 
DatabaseRuleCreateExecutor
             String tableName = each.getTableName();
             if (!SingleTableConstants.ASTERISK.equals(tableName)) {
                 String storageUnitName = each.getStorageUnitName();
-                
ShardingSpherePreconditions.checkState(actualTableNodes.containsKey(storageUnitName)
 && 
actualTableNodes.get(storageUnitName).get(defaultSchemaName).contains(tableName),
+                String schemaName = each.getSchemaName().isPresent() ? 
each.getSchemaName().get() : defaultSchemaName;
+                
ShardingSpherePreconditions.checkState(actualTableNodes.containsKey(storageUnitName)
 && actualTableNodes.get(storageUnitName).get(schemaName).contains(tableName),
                         () -> new TableNotFoundException(tableName, 
storageUnitName));
             }
         }
diff --git 
a/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegment.java
 
b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegment.java
index 012177d5274..678337ba3f7 100644
--- 
a/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegment.java
+++ 
b/kernel/single/distsql/statement/src/main/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegment.java
@@ -22,6 +22,8 @@ import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.shardingsphere.distsql.segment.DistSQLSegment;
 
+import java.util.Optional;
+
 /**
  * Single table segment.
  */
@@ -41,12 +43,12 @@ public final class SingleTableSegment implements 
DistSQLSegment {
     }
     
     /**
-     * Whether to contain schema.
+     * Get schema name.
      *
-     * @return contains schema or not
+     * @return schema name
      */
-    public boolean containsSchema() {
-        return null != schemaName;
+    public Optional<String> getSchemaName() {
+        return Optional.ofNullable(schemaName);
     }
     
     @Override
diff --git 
a/kernel/single/distsql/statement/src/test/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegmentTest.java
 
b/kernel/single/distsql/statement/src/test/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegmentTest.java
index b4f0ee44f69..f06449fc8e1 100644
--- 
a/kernel/single/distsql/statement/src/test/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegmentTest.java
+++ 
b/kernel/single/distsql/statement/src/test/java/org/apache/shardingsphere/single/distsql/segment/SingleTableSegmentTest.java
@@ -29,12 +29,12 @@ class SingleTableSegmentTest {
     
     @Test
     void assertContainsSchema() {
-        assertTrue(new SingleTableSegment("foo_ds", "foo_schema", 
"foo_tbl").containsSchema());
+        assertTrue(new SingleTableSegment("foo_ds", "foo_schema", 
"foo_tbl").getSchemaName().isPresent());
     }
     
     @Test
     void assertDoesNotContainSchema() {
-        assertFalse(new SingleTableSegment("foo_ds", 
"foo_tbl").containsSchema());
+        assertFalse(new SingleTableSegment("foo_ds", 
"foo_tbl").getSchemaName().isPresent());
     }
     
     @Test
diff --git 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/alter_single_table_rules.xml
 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/mysql/alter_single_table_rules.xml
similarity index 100%
copy from 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/alter_single_table_rules.xml
copy to 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/mysql/alter_single_table_rules.xml
diff --git 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/create_single_table_rules.xml
 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/mysql/create_single_table_rules.xml
similarity index 100%
copy from 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/create_single_table_rules.xml
copy to 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/mysql/create_single_table_rules.xml
diff --git 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/drop_single_table_rules.xml
 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/mysql/drop_single_table_rules.xml
similarity index 100%
copy from 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/drop_single_table_rules.xml
copy to 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/mysql/drop_single_table_rules.xml
diff --git 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/alter_single_table_rules.xml
 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/alter_single_table_rules.xml
similarity index 80%
rename from 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/alter_single_table_rules.xml
rename to 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/alter_single_table_rules.xml
index b19b759d402..2813eb80fd4 100644
--- 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/alter_single_table_rules.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/alter_single_table_rules.xml
@@ -19,10 +19,11 @@
     <metadata>
         <column name="table_name" />
         <column name="storage_unit_name" />
+        <column name="schema_name" />
     </metadata>
-    <row values="t_country| ds_2" />
-    <row values="t_product_category| ds_2" />
-    <row values="t_user| ds_0" />
-    <row values="temp_alter| ds_0" />
+    <row values="t_country| ds_2| public" />
+    <row values="t_product_category| ds_2| public" />
+    <row values="t_user| ds_0| public" />
+    <row values="temp_alter| ds_0| public" />
 </dataset>
 
diff --git 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/create_single_table_rules.xml
 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/create_single_table_rules.xml
similarity index 81%
rename from 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/create_single_table_rules.xml
rename to 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/create_single_table_rules.xml
index bb0705ad713..6e329e38e70 100644
--- 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/create_single_table_rules.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/create_single_table_rules.xml
@@ -19,10 +19,11 @@
     <metadata>
         <column name="table_name" />
         <column name="storage_unit_name" />
+        <column name="schema_name" />
     </metadata>
-    <row values="t_country| ds_2" />
-    <row values="t_product_category| ds_2" />
-    <row values="t_user| ds_0" />
-    <row values="temp| ds_1" />
+    <row values="t_country| ds_2| public" />
+    <row values="t_product_category| ds_2| public" />
+    <row values="t_user| ds_0| public" />
+    <row values="temp| ds_1| public" />
 </dataset>
 
diff --git 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/drop_single_table_rules.xml
 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/drop_single_table_rules.xml
similarity index 84%
rename from 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/drop_single_table_rules.xml
rename to 
test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/drop_single_table_rules.xml
index 9ed72429c45..20483b73841 100644
--- 
a/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/drop_single_table_rules.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/rdl/dataset/distsql_rdl/postgresql/drop_single_table_rules.xml
@@ -19,9 +19,10 @@
     <metadata>
         <column name="table_name" />
         <column name="storage_unit_name" />
+        <column name="schema_name" />
     </metadata>
-    <row values="t_country| ds_2" />
-    <row values="t_product_category| ds_2" />
-    <row values="t_user| ds_0" />
+    <row values="t_country| ds_2| public" />
+    <row values="t_product_category| ds_2| public" />
+    <row values="t_user| ds_0| public" />
 </dataset>
 
diff --git 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/mysql/show_single_table.xml
similarity index 100%
copy from 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
copy to 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/mysql/show_single_table.xml
diff --git 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/mysql/show_single_tables.xml
similarity index 100%
copy from 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
copy to 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/mysql/show_single_tables.xml
diff --git 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/opengauss/show_single_table.xml
similarity index 91%
copy from 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
copy to 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/opengauss/show_single_table.xml
index dd276712622..3ba02af0dc4 100644
--- 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/opengauss/show_single_table.xml
@@ -19,6 +19,7 @@
     <metadata>
         <column name="table_name" />
         <column name="storage_unit_name" />
+        <column name="schema_name" />
     </metadata>
-    <row values="t_product| encrypt_ds_0" />
+    <row values="t_product| encrypt_ds_0| public" />
 </dataset>
diff --git 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/opengauss/show_single_tables.xml
similarity index 82%
copy from 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
copy to 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/opengauss/show_single_tables.xml
index 3ce2712d5a5..3686ba1eee3 100644
--- 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/opengauss/show_single_tables.xml
@@ -19,8 +19,9 @@
     <metadata>
         <column name="table_name" />
         <column name="storage_unit_name" />
+        <column name="schema_name" />
     </metadata>
-    <row values="t_merchant| encrypt_ds_0" />
-    <row values="t_product| encrypt_ds_0" />
-    <row values="t_product_detail| encrypt_ds_0" />
+    <row values="t_merchant| encrypt_ds_0| public" />
+    <row values="t_product| encrypt_ds_0| public" />
+    <row values="t_product_detail| encrypt_ds_0| public" />
 </dataset>
diff --git 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/postgresql/show_single_table.xml
similarity index 91%
rename from 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
rename to 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/postgresql/show_single_table.xml
index dd276712622..3ba02af0dc4 100644
--- 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_table.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/postgresql/show_single_table.xml
@@ -19,6 +19,7 @@
     <metadata>
         <column name="table_name" />
         <column name="storage_unit_name" />
+        <column name="schema_name" />
     </metadata>
-    <row values="t_product| encrypt_ds_0" />
+    <row values="t_product| encrypt_ds_0| public" />
 </dataset>
diff --git 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/postgresql/show_single_tables.xml
similarity index 82%
rename from 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
rename to 
test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/postgresql/show_single_tables.xml
index 3ce2712d5a5..3686ba1eee3 100644
--- 
a/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/show_single_tables.xml
+++ 
b/test/e2e/sql/src/test/resources/cases/rql/dataset/sharding_and_encrypt/postgresql/show_single_tables.xml
@@ -19,8 +19,9 @@
     <metadata>
         <column name="table_name" />
         <column name="storage_unit_name" />
+        <column name="schema_name" />
     </metadata>
-    <row values="t_merchant| encrypt_ds_0" />
-    <row values="t_product| encrypt_ds_0" />
-    <row values="t_product_detail| encrypt_ds_0" />
+    <row values="t_merchant| encrypt_ds_0| public" />
+    <row values="t_product| encrypt_ds_0| public" />
+    <row values="t_product_detail| encrypt_ds_0| public" />
 </dataset>
diff --git 
a/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/query/DistSQLDatabaseRuleQueryExecutorAssert.java
 
b/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/query/DistSQLDatabaseRuleQueryExecutorAssert.java
index 053b390c01b..dc74b5a0eb1 100644
--- 
a/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/query/DistSQLDatabaseRuleQueryExecutorAssert.java
+++ 
b/test/it/distsql/src/main/java/org/apache/shardingsphere/test/it/distsql/handler/engine/query/DistSQLDatabaseRuleQueryExecutorAssert.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.test.it.distsql.handler.engine.query;
 
 import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.distsql.handler.engine.DistSQLConnectionContext;
 import 
org.apache.shardingsphere.distsql.handler.engine.query.DistSQLQueryExecuteEngine;
 import org.apache.shardingsphere.distsql.statement.DistSQLStatement;
@@ -26,6 +27,7 @@ import 
org.apache.shardingsphere.infra.merge.result.impl.local.LocalDataQueryRes
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import org.apache.shardingsphere.infra.rule.scope.DatabaseRule;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 
 import java.sql.SQLException;
@@ -67,6 +69,7 @@ public final class DistSQLDatabaseRuleQueryExecutorAssert {
         when(mockedRule.getConfiguration()).thenReturn(ruleConfig);
         ShardingSphereDatabase database = mock(ShardingSphereDatabase.class, 
RETURNS_DEEP_STUBS);
         when(database.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.singleton(mockedRule)));
+        
when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "MockedDatabaseType"));
         when(result.getDatabase("foo_db")).thenReturn(database);
         return result;
     }

Reply via email to