This is an automated email from the ASF dual-hosted git repository.
menghaoranss 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 cd7164fb2ea Use protocol schema resolver for frontend schema
translation (#39700)
cd7164fb2ea is described below
commit cd7164fb2eada46ca00995818fe142d9062c651b
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Sep 3 13:44:50 2026 +0800
Use protocol schema resolver for frontend schema translation (#39700)
* Use protocol schema resolver for frontend schema translation
* Preserve canonical schema names during translation
---
.../schema/builder/GenericSchemaBuilder.java | 3 +-
.../schema/builder/GenericSchemaBuilderTest.java | 8 ++---
.../mode/manager/ContextManagerTest.java | 42 ++++++++++++++++++++++
3 files changed, 47 insertions(+), 6 deletions(-)
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
index 92d66c78dca..31a1541a0a5 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilder.java
@@ -26,7 +26,6 @@ import
org.apache.shardingsphere.database.connector.core.metadata.data.model.Tab
import
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.reviser.MetaDataReviseEngine;
@@ -111,7 +110,7 @@ public final class GenericSchemaBuilder {
for (String each :
loaderMaterials.stream().map(MetaDataLoaderMaterial::getDefaultSchemaName).distinct().collect(Collectors.toList()))
{
tableMetaDataList.addAll(Optional.ofNullable(schemaMetaDataMap.get(each)).map(SchemaMetaData::getTables).orElseGet(Collections::emptyList));
}
- String frontendSchemaName = new
DatabaseTypeRegistry(protocolType).getDefaultSchemaName(material.getDefaultSchemaName());
+ String frontendSchemaName = material.getDefaultSchemaName();
return Collections.singletonMap(frontendSchemaName, new
SchemaMetaData(frontendSchemaName, tableMetaDataList));
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java
index e8c29f7eeae..b931745a7a3 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/builder/GenericSchemaBuilderTest.java
@@ -152,9 +152,9 @@ class GenericSchemaBuilderTest {
void assertBuildTranslatesSchemaWhenProtocolSchemaUnavailable() throws
SQLException {
when(MetaDataLoader.load(any())).thenReturn(Collections.singletonMap("public",
createSchemaMetaData("public", "foo_tbl")));
Map<String, ShardingSphereSchema> actual =
- GenericSchemaBuilder.build(Collections.singleton("foo_tbl"),
MYSQL_DATABASE_TYPE, createMaterial(POSTGRESQL_DATABASE_TYPE, "foo_db"));
+ GenericSchemaBuilder.build(Collections.singleton("foo_tbl"),
MYSQL_DATABASE_TYPE, createMaterial(POSTGRESQL_DATABASE_TYPE, "FOO_DB"));
assertThat(actual.size(), is(1));
- assertSchemaTable(actual, "foo_db", "foo_tbl");
+ assertSchemaTable(actual, "FOO_DB", "foo_tbl");
}
@Test
@@ -170,7 +170,7 @@ class GenericSchemaBuilderTest {
void assertBuildTranslatesSchemaWithStorageDataSourcePolicy() throws
SQLException {
mockLoadedSchemaWithMaterialDefault("foo_tbl");
Map<String, ShardingSphereSchema> actual =
GenericSchemaBuilder.build(Collections.singleton("foo_tbl"),
POSTGRESQL_DATABASE_TYPE,
- createMaterial(MYSQL_DATABASE_TYPE, "Foo_DB",
mockMySQLDataSource(1)));
+ createMaterial(MYSQL_DATABASE_TYPE, "public",
mockMySQLDataSource(1)));
assertThat(actual.size(), is(1));
assertSchemaTable(actual, "public", "foo_tbl");
}
@@ -179,7 +179,7 @@ class GenericSchemaBuilderTest {
void assertBuildTranslatesSchemaWithHiddenStorageSchema() throws
SQLException {
mockLoadedSchemaWithMaterialDefault("foo_tbl");
Map<String, ShardingSphereSchema> actual = GenericSchemaBuilder.build(
- Collections.singleton("foo_tbl"), POSTGRESQL_DATABASE_TYPE,
createMaterial(H2_DATABASE_TYPE, "Foo_DB"));
+ Collections.singleton("foo_tbl"), POSTGRESQL_DATABASE_TYPE,
createMaterial(H2_DATABASE_TYPE, "public"));
assertThat(actual.size(), is(1));
assertSchemaTable(actual, "public", "foo_tbl");
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 3cff2f6b4b2..9ba56ead9ee 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -18,6 +18,10 @@
package org.apache.shardingsphere.mode.manager;
import lombok.SneakyThrows;
+import
org.apache.shardingsphere.database.connector.core.metadata.data.loader.MetaDataLoader;
+import
org.apache.shardingsphere.database.connector.core.metadata.data.loader.MetaDataLoaderMaterial;
+import
org.apache.shardingsphere.database.connector.core.metadata.data.model.SchemaMetaData;
+import
org.apache.shardingsphere.database.connector.core.metadata.data.model.TableMetaData;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.exception.core.exception.syntax.database.NoDatabaseSelectedException;
import
org.apache.shardingsphere.database.exception.core.exception.syntax.database.UnknownDatabaseException;
@@ -39,11 +43,13 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericS
import
org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContextFactory;
import
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
import
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
+import
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
@@ -69,6 +75,7 @@ import org.mockito.quality.Strictness;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collection;
import java.util.Collections;
import java.util.Optional;
import java.util.Properties;
@@ -84,6 +91,7 @@ import static org.mockito.ArgumentMatchers.anyCollection;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.anySet;
import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
@@ -311,6 +319,40 @@ class ContextManagerTest {
verify(persistServiceFacade.getModeFacade().getMetaDataManagerService()).dropTables(database,
"foo_schema", Collections.singleton("foo_tbl"));
}
+ @Test
+ void assertReloadSchemaWithCanonicalSchemaName() throws SQLException {
+ DatabaseType protocolType =
TypedSPILoader.getService(DatabaseType.class, "MySQL");
+ DatabaseType storageType =
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL");
+ StorageUnit storageUnit = mock(StorageUnit.class);
+ when(storageUnit.getStorageType()).thenReturn(storageType);
+ when(storageUnit.getDataSource()).thenReturn(new MockedDataSource());
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
+ when(database.getName()).thenReturn("foo_db");
+ when(database.getProtocolType()).thenReturn(protocolType);
+
when(database.getResourceMetaData().getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
storageUnit));
+ TableMapperRuleAttribute tableMapperRuleAttribute =
mock(TableMapperRuleAttribute.class);
+
when(tableMapperRuleAttribute.getLogicTableNames()).thenReturn(Collections.singleton("foo_tbl"));
+ ShardingSphereRule rule = mock(ShardingSphereRule.class);
+ when(rule.getAttributes()).thenReturn(new
RuleAttributes(tableMapperRuleAttribute));
+ when(database.getRuleMetaData()).thenReturn(new
RuleMetaData(Collections.singleton(rule)));
+
when(database.getIdentifierContext()).thenReturn(DatabaseIdentifierContextFactory.createDefault());
+ when(database.getAllSchemas()).thenReturn(Collections.singleton(new
ShardingSphereSchema("FOO_DB", protocolType)));
+ PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();
+ setPersistServiceFacade(persistServiceFacade);
+ TableMetaData tableMetaData = new TableMetaData("foo_tbl",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
+ try (MockedStatic<MetaDataLoader> metaDataLoader =
mockStatic(MetaDataLoader.class)) {
+ metaDataLoader.when(() ->
MetaDataLoader.load(any())).thenAnswer(invocation -> {
+ Collection<MetaDataLoaderMaterial> loaderMaterials =
invocation.getArgument(0);
+ String storageSchemaName =
loaderMaterials.iterator().next().getDefaultSchemaName();
+ return Collections.singletonMap(storageSchemaName, new
SchemaMetaData(storageSchemaName, Collections.singleton(tableMetaData)));
+ });
+ contextManager.reloadSchema(database, "FOO_DB", "foo_ds");
+ }
+ verify(database).addSchema(argThat(schema ->
"FOO_DB".equals(schema.getName()) && 1 == schema.getAllTables().size()));
+
verify(persistServiceFacade.getMetaDataFacade().getDatabaseMetaDataFacade().getSchema()).alterByRefresh(eq("foo_db"),
+ argThat(schema -> "FOO_DB".equals(schema.getName()) && 1 ==
schema.getAllTables().size()));
+ }
+
@Test
void assertReloadTableWithSQLException() {
PersistServiceFacade persistServiceFacade = mockPersistServiceFacade();