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;
}