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 5a0050edb4d Normalize actual table/view name with identifier in 
SchemaMetaDataUtils for different database type (#38678)
5a0050edb4d is described below

commit 5a0050edb4d3eebecd42aff7a726861c479039c0
Author: Haoran Meng <[email protected]>
AuthorDate: Sat May 9 12:02:47 2026 +0800

    Normalize actual table/view name with identifier in SchemaMetaDataUtils for 
different database type (#38678)
---
 .../schema/builder/GenericSchemaBuilder.java        | 10 ++++++----
 .../database/schema/util/SchemaMetaDataUtils.java   | 21 +++++++++++++++------
 .../schema/util/SchemaMetaDataUtilsTest.java        | 12 ++++++------
 3 files changed, 27 insertions(+), 16 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 826da5d69b2..0a723853d7d 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
@@ -69,8 +69,9 @@ public final class GenericSchemaBuilder {
      * @throws SQLException SQL exception
      */
     public static Map<String, ShardingSphereSchema> build(final 
Collection<String> tableNames, final DatabaseType protocolType, final 
GenericSchemaBuilderMaterial material) throws SQLException {
-        Map<String, SchemaMetaData> result = loadSchemas(tableNames, material);
-        if (!isSameProtocolAndStorageTypes(protocolType, 
material.getStorageUnits())) {
+        boolean isSameProtocolAndStorageTypes = 
isSameProtocolAndStorageTypes(protocolType, material.getStorageUnits());
+        Map<String, SchemaMetaData> result = loadSchemas(tableNames, material, 
isSameProtocolAndStorageTypes);
+        if (!isSameProtocolAndStorageTypes) {
             result = translate(result, protocolType, material);
         }
         return revise(result, material, protocolType);
@@ -84,8 +85,9 @@ public final class GenericSchemaBuilder {
         return result;
     }
     
-    private static Map<String, SchemaMetaData> loadSchemas(final 
Collection<String> tableNames, final GenericSchemaBuilderMaterial material) 
throws SQLException {
-        Collection<MetaDataLoaderMaterial> materials = 
SchemaMetaDataUtils.getMetaDataLoaderMaterials(tableNames, material);
+    private static Map<String, SchemaMetaData> loadSchemas(final 
Collection<String> tableNames, final GenericSchemaBuilderMaterial material,
+                                                           final boolean 
isSameProtocolAndStorageTypes) throws SQLException {
+        Collection<MetaDataLoaderMaterial> materials = 
SchemaMetaDataUtils.getMetaDataLoaderMaterials(tableNames, material, 
isSameProtocolAndStorageTypes);
         return materials.isEmpty() ? Collections.emptyMap() : 
MetaDataLoader.load(materials);
     }
     
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
index 5d67d2a8e8e..98337e0e587 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
@@ -22,7 +22,6 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import 
org.apache.shardingsphere.database.connector.core.GlobalDataSourceRegistry;
 import 
org.apache.shardingsphere.database.connector.core.metadata.data.loader.MetaDataLoaderMaterial;
-import 
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRule;
 import 
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import 
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
@@ -33,6 +32,7 @@ import 
org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.kernel.metadata.datanode.UnsupportedActualDataNodeStructureException;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
+import 
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
 
 import javax.sql.DataSource;
 import java.util.ArrayList;
@@ -56,9 +56,11 @@ public final class SchemaMetaDataUtils {
      *
      * @param tableNames table name collection
      * @param material material
+     * @param isSameProtocolAndStorageTypes whether protocol and storage types 
are the same
      * @return meta data loader materials
      */
-    public static Collection<MetaDataLoaderMaterial> 
getMetaDataLoaderMaterials(final Collection<String> tableNames, final 
GenericSchemaBuilderMaterial material) {
+    public static Collection<MetaDataLoaderMaterial> 
getMetaDataLoaderMaterials(final Collection<String> tableNames, final 
GenericSchemaBuilderMaterial material,
+                                                                               
 final boolean isSameProtocolAndStorageTypes) {
         Map<String, Collection<String>> dataSourceTableGroups = new 
LinkedHashMap<>();
         Collection<DatabaseType> 
unsupportedThreeTierStorageStructureDatabaseTypes = 
getUnsupportedThreeTierStorageStructureDatabaseTypes(material.getStorageUnits().values());
         DataNodes dataNodes = new DataNodes(material.getRules());
@@ -76,22 +78,29 @@ public final class SchemaMetaDataUtils {
         for (Entry<String, Collection<String>> entry : 
dataSourceTableGroups.entrySet()) {
             DatabaseType storageType = 
material.getStorageUnits().get(entry.getKey()).getStorageType();
             String defaultSchemaName = new 
DatabaseTypeRegistry(storageType).getDefaultSchemaName(material.getDefaultSchemaName());
-            result.addAll(buildMaterials(material, entry.getKey(), 
entry.getValue(), storageType, defaultSchemaName, loadTableMetadataBatchSize));
+            result.addAll(buildMaterials(material, entry.getKey(), 
entry.getValue(), storageType, defaultSchemaName, loadTableMetadataBatchSize, 
isSameProtocolAndStorageTypes));
         }
         return result;
     }
     
     private static Collection<MetaDataLoaderMaterial> buildMaterials(final 
GenericSchemaBuilderMaterial material, final String dataSourceName, final 
Collection<String> actualTableNames,
-                                                                     final 
DatabaseType storageType, final String defaultSchemaName, final int 
loadTableMetadataBatchSize) {
+                                                                     final 
DatabaseType storageType, final String defaultSchemaName, final int 
loadTableMetadataBatchSize,
+                                                                     final 
boolean isSameProtocolAndStorageTypes) {
         Collection<MetaDataLoaderMaterial> result = new LinkedList<>();
         DataSource dataSource = getDataSource(material, dataSourceName);
-        IdentifierCaseRule tableIdentifierRule = 
material.getIdentifierContext().getRule(IdentifierScope.TABLE);
         for (List<String> each : Lists.partition(new 
ArrayList<>(actualTableNames), loadTableMetadataBatchSize)) {
-            result.add(new 
MetaDataLoaderMaterial(each.stream().map(tableIdentifierRule::normalize).collect(Collectors.toList()),
 dataSourceName, dataSource, storageType, defaultSchemaName));
+            result.add(new MetaDataLoaderMaterial(normalize(each, 
material.getIdentifierContext(), isSameProtocolAndStorageTypes), 
dataSourceName, dataSource, storageType, defaultSchemaName));
         }
         return result;
     }
     
+    private static Collection<String> normalize(final Collection<String> 
tableNames, final DatabaseIdentifierContext identifierContext, final boolean 
isSameProtocolAndStorageTypes) {
+        if (isSameProtocolAndStorageTypes) {
+            return tableNames;
+        }
+        return tableNames.stream().map(each -> 
identifierContext.getRule(IdentifierScope.TABLE).normalize(each)).collect(Collectors.toList());
+    }
+    
     private static DataSource getDataSource(final GenericSchemaBuilderMaterial 
material, final String dataSourceName) {
         return material.getStorageUnits().get(dataSourceName.contains(".") ? 
dataSourceName.split("\\.")[0] : dataSourceName).getDataSource();
     }
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
index 54d521bb3ca..6e1c2589dac 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
@@ -82,7 +82,7 @@ class SchemaMetaDataUtilsTest {
                                           final List<List<String>> 
expectedActualTableNames, final List<String> expectedDefaultSchemaNames) {
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(storageUnits, 
Collections.singleton(mockDataNodeRule(dataNodes)), props, defaultSchemaName,
                 DatabaseIdentifierContextFactory.createDefault());
-        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material));
+        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material, true));
         assertThat(actual.size(), is(expectedStorageUnitNames.size()));
         for (int i = 0; i < actual.size(); i++) {
             assertThat(actual.get(i).getStorageUnitName(), 
is(expectedStorageUnitNames.get(i)));
@@ -100,7 +100,7 @@ class SchemaMetaDataUtilsTest {
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(storageUnits,
                 
Collections.singleton(mockDataNodeRule(Collections.singleton(new 
DataNode("ds.foo_db", "foo_db", "foo_tbl")))),
                 createProperties(Boolean.FALSE, null), "foo_db", 
DatabaseIdentifierContextFactory.createDefault());
-        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material));
+        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material, true));
         assertThat(actual.size(), is(1));
         assertThat(actual.get(0).getStorageUnitName(), is("ds.foo_db"));
         assertThat(actual.get(0).getDataSource(), is(dataSource));
@@ -118,7 +118,7 @@ class SchemaMetaDataUtilsTest {
                 
Collections.singleton(mockDataNodeRule(Collections.singleton(new 
DataNode("ds.foo_db", "foo_db", "foo_tbl")))),
                 createProperties(Boolean.FALSE, null), "foo_db", 
DatabaseIdentifierContextFactory.createDefault());
         UnsupportedActualDataNodeStructureException actual = 
assertThrows(UnsupportedActualDataNodeStructureException.class,
-                () -> 
SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material));
+                () -> 
SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material, true));
         assertThat(actual.getMessage(), is("Can not support 3-tier structure 
for actual data node 'ds.foo_db.foo_tbl' with JDBC 'jdbc:mock'."));
     }
     
@@ -129,7 +129,7 @@ class SchemaMetaDataUtilsTest {
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(storageUnits, Collections.singleton(
                 mockDataNodeRule(Arrays.asList(new DataNode("ds_0.foo_tbl_0"), 
new DataNode("ds_0.foo_tbl_1"), new DataNode("ds_0.foo_tbl_2")))),
                 createProperties(Boolean.TRUE, 2), "foo_db", 
DatabaseIdentifierContextFactory.createDefault());
-        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material));
+        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material, true));
         assertThat(actual.size(), is(2));
         assertThat(actual.get(0).getStorageUnitName(), is("ds_0"));
         assertThat(new ArrayList<>(actual.get(0).getActualTableNames()), 
is(Arrays.asList("foo_tbl_0", "foo_tbl_1")));
@@ -144,7 +144,7 @@ class SchemaMetaDataUtilsTest {
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(storageUnits,
                 
Collections.singleton(mockDataNodeRule(Collections.singleton(new 
DataNode("ds_0.t_user")))), props, "foo_db",
                 DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE, 
new ResourceMetaData(Collections.emptyMap(), storageUnits), props));
-        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material));
+        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material, false));
         assertThat(actual.size(), is(1));
         assertThat(new ArrayList<>(actual.get(0).getActualTableNames()), 
is(Collections.singletonList("T_USER")));
     }
@@ -158,7 +158,7 @@ class SchemaMetaDataUtilsTest {
         GenericSchemaBuilderMaterial material = new 
GenericSchemaBuilderMaterial(storageUnits, Collections.singleton(
                 mockDataNodeRule(Arrays.asList(new 
DataNode("ds_mysql.t_order"), new DataNode("ds_oracle.t_user")))), props, 
"foo_db",
                 DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE, 
new ResourceMetaData(Collections.emptyMap(), storageUnits), props));
-        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material));
+        List<MetaDataLoaderMaterial> actual = new 
ArrayList<>(SchemaMetaDataUtils.getMetaDataLoaderMaterials(Collections.singleton("foo_tbl"),
 material, false));
         assertThat(actual.size(), is(2));
         assertThat(actual.get(0).getStorageUnitName(), is("ds_mysql"));
         assertThat(new ArrayList<>(actual.get(0).getActualTableNames()), 
is(Collections.singletonList("t_order")));

Reply via email to