You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by me...@apache.org on 2026/03/25 01:21:57 UTC

(shardingsphere) branch master updated: Use dialect identifier pattern to format default schema name (#38551)

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

menghaoran 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 cf9c7e06eb4 Use dialect identifier pattern to format default schema name (#38551)
cf9c7e06eb4 is described below

commit cf9c7e06eb428af609b4987364ad8974bb860e4c
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Wed Mar 25 09:21:50 2026 +0800

    Use dialect identifier pattern to format default schema name (#38551)
---
 .../connector/core/type/DatabaseTypeRegistry.java  |  2 +-
 .../core/type/DatabaseTypeRegistryTest.java        | 70 ++++++++++++++++++++--
 .../ShardingSphereDatabaseFactoryTest.java         |  3 +-
 .../DatabaseMetaDataPersistFacadeTest.java         | 20 ++++---
 .../refresh/RefreshTableMetaDataExecutorTest.java  |  2 +
 .../test/resources/cases/dml/select-function.xml   |  8 +--
 .../binder/src/test/resources/cases/dml/select.xml |  8 +--
 7 files changed, 89 insertions(+), 24 deletions(-)

diff --git a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistry.java b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistry.java
index 45b2ef2e58d..f382fc28a66 100644
--- a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistry.java
+++ b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistry.java
@@ -57,7 +57,7 @@ public final class DatabaseTypeRegistry {
      * @return default schema name
      */
     public String getDefaultSchemaName(final String databaseName) {
-        return dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().orElse(databaseName);
+        return dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().orElse(null == databaseName ? null : formatIdentifierPattern(databaseName));
     }
     
     /**
diff --git a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistryTest.java b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistryTest.java
index ae6b3e122e9..6f05d1d4a4f 100644
--- a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistryTest.java
+++ b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/type/DatabaseTypeRegistryTest.java
@@ -18,7 +18,10 @@
 package org.apache.shardingsphere.database.connector.core.type;
 
 import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
+import org.apache.shardingsphere.database.connector.core.metadata.database.enums.NullsOrderType;
+import org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
 import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
+import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -32,8 +35,6 @@ import java.util.stream.Stream;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 class DatabaseTypeRegistryTest {
     
@@ -57,13 +58,18 @@ class DatabaseTypeRegistryTest {
         assertThat(new DatabaseTypeRegistry(TypedSPILoader.getService(DatabaseType.class, databaseType)).getDefaultSchemaName(databaseName), is(expectedSchemaName));
     }
     
+    @ParameterizedTest(name = "{0}")
+    @MethodSource("getDefaultSchemaNameWithIdentifierPatternArguments")
+    void assertGetDefaultSchemaNameWithIdentifierPattern(final String name, final IdentifierPatternType identifierPatternType,
+                                                         final String databaseName, final String expectedSchemaName) throws ReflectiveOperationException {
+        DatabaseTypeRegistry databaseTypeRegistry = createDatabaseTypeRegistry(identifierPatternType, null);
+        assertThat(databaseTypeRegistry.getDefaultSchemaName(databaseName), is(expectedSchemaName));
+    }
+    
     @ParameterizedTest(name = "{0}")
     @MethodSource("formatIdentifierPatternArguments")
     void assertFormatIdentifierPattern(final String name, final IdentifierPatternType identifierPatternType, final String expectedIdentifierPattern) throws ReflectiveOperationException {
-        DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
-        when(dialectDatabaseMetaData.getIdentifierPatternType()).thenReturn(identifierPatternType);
-        DatabaseTypeRegistry databaseTypeRegistry = new DatabaseTypeRegistry(trunkDatabaseType);
-        Plugins.getMemberAccessor().set(DatabaseTypeRegistry.class.getDeclaredField("dialectDatabaseMetaData"), databaseTypeRegistry, dialectDatabaseMetaData);
+        DatabaseTypeRegistry databaseTypeRegistry = createDatabaseTypeRegistry(identifierPatternType, null);
         assertThat(databaseTypeRegistry.formatIdentifierPattern("Foo"), is(expectedIdentifierPattern));
     }
     
@@ -74,10 +80,62 @@ class DatabaseTypeRegistryTest {
                 Arguments.of("database name is null", "BRANCH", null, null));
     }
     
+    private static Stream<Arguments> getDefaultSchemaNameWithIdentifierPatternArguments() {
+        return Stream.of(
+                Arguments.of("upper case identifier pattern formats default schema", IdentifierPatternType.UPPER_CASE, "foo_db", "FOO_DB"),
+                Arguments.of("lower case identifier pattern formats default schema", IdentifierPatternType.LOWER_CASE, "FOO_DB", "foo_db"),
+                Arguments.of("keep origin identifier pattern keeps default schema", IdentifierPatternType.KEEP_ORIGIN, "Foo_Db", "Foo_Db"),
+                Arguments.of("null database name keeps null default schema", IdentifierPatternType.UPPER_CASE, null, null));
+    }
+    
     private static Stream<Arguments> formatIdentifierPatternArguments() {
         return Stream.of(
                 Arguments.of("identifier pattern upper case", IdentifierPatternType.UPPER_CASE, "FOO"),
                 Arguments.of("identifier pattern lower case", IdentifierPatternType.LOWER_CASE, "foo"),
                 Arguments.of("identifier pattern keep origin", IdentifierPatternType.KEEP_ORIGIN, "Foo"));
     }
+    
+    private DatabaseTypeRegistry createDatabaseTypeRegistry(final IdentifierPatternType identifierPatternType, final String defaultSchema) throws ReflectiveOperationException {
+        DatabaseTypeRegistry result = new DatabaseTypeRegistry(trunkDatabaseType);
+        Plugins.getMemberAccessor().set(DatabaseTypeRegistry.class.getDeclaredField("dialectDatabaseMetaData"),
+                result, new FixtureDialectDatabaseMetaData(identifierPatternType, defaultSchema));
+        return result;
+    }
+    
+    private static final class FixtureDialectDatabaseMetaData implements DialectDatabaseMetaData {
+        
+        private final IdentifierPatternType identifierPatternType;
+        
+        private final DefaultSchemaOption schemaOption;
+        
+        private FixtureDialectDatabaseMetaData(final IdentifierPatternType identifierPatternType, final String defaultSchema) {
+            this.identifierPatternType = identifierPatternType;
+            schemaOption = new DefaultSchemaOption(false, defaultSchema);
+        }
+        
+        @Override
+        public QuoteCharacter getQuoteCharacter() {
+            return QuoteCharacter.NONE;
+        }
+        
+        @Override
+        public IdentifierPatternType getIdentifierPatternType() {
+            return identifierPatternType;
+        }
+        
+        @Override
+        public NullsOrderType getDefaultNullsOrderType() {
+            return NullsOrderType.LOW;
+        }
+        
+        @Override
+        public DefaultSchemaOption getSchemaOption() {
+            return schemaOption;
+        }
+        
+        @Override
+        public String getDatabaseType() {
+            return "FIXTURE";
+        }
+    }
 }
diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseFactoryTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseFactoryTest.java
index 3058d39532c..5b2128a6bd4 100644
--- a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseFactoryTest.java
+++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseFactoryTest.java
@@ -118,6 +118,7 @@ class ShardingSphereDatabaseFactoryTest {
         return Stream.of(
                 Arguments.of("fixture database adds default schema", TypedSPILoader.getService(DatabaseType.class, "FIXTURE"), "system_db", "system_db", 1),
                 Arguments.of("mysql system database keeps existing default schema", TypedSPILoader.getService(DatabaseType.class, "MySQL"), "mysql", "mysql", 1),
-                Arguments.of("mysql database adds default schema", TypedSPILoader.getService(DatabaseType.class, "MySQL"), "foo_db", "foo_db", 1));
+                Arguments.of("mysql database adds default schema", TypedSPILoader.getService(DatabaseType.class, "MySQL"), "foo_db", "foo_db", 1),
+                Arguments.of("oracle database formats default schema to upper case", TypedSPILoader.getService(DatabaseType.class, "Oracle"), "foo_db", "FOO_DB", 1));
     }
 }
diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java
index d1d1af541e8..579e53a00b8 100644
--- a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java
+++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/metadata/DatabaseMetaDataPersistFacadeTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.mode.metadata.persist.metadata;
 
 import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
+import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
 import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DefaultSchemaOption;
 import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
@@ -148,8 +149,7 @@ class DatabaseMetaDataPersistFacadeTest {
     
     @Test
     void assertUnregisterStorageUnitsDropsTables() throws SQLException {
-        DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
-        when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new DefaultSchemaOption(false, null));
+        DialectDatabaseMetaData dialectDatabaseMetaData = createDialectDatabaseMetaData();
         try (MockedStatic<DatabaseTypedSPILoader> mocked = mockStatic(DatabaseTypedSPILoader.class)) {
             mocked.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(dialectDatabaseMetaData);
             ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema", mock(DatabaseType.class));
@@ -164,8 +164,7 @@ class DatabaseMetaDataPersistFacadeTest {
     
     @Test
     void assertUnregisterStorageUnitsWhenLoadFailed() throws SQLException {
-        DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
-        when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new DefaultSchemaOption(false, null));
+        DialectDatabaseMetaData dialectDatabaseMetaData = createDialectDatabaseMetaData();
         try (MockedStatic<DatabaseTypedSPILoader> mocked = mockStatic(DatabaseTypedSPILoader.class)) {
             mocked.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(dialectDatabaseMetaData);
             ShardingSphereDatabase database = createDatabase("foo_db", Collections.singleton(new ShardingSphereSchema("foo_schema", mock(DatabaseType.class))));
@@ -177,8 +176,7 @@ class DatabaseMetaDataPersistFacadeTest {
     
     @Test
     void assertPersistAlteredTables() throws SQLException {
-        DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
-        when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new DefaultSchemaOption(false, null));
+        DialectDatabaseMetaData dialectDatabaseMetaData = createDialectDatabaseMetaData();
         try (MockedStatic<DatabaseTypedSPILoader> mocked = mockStatic(DatabaseTypedSPILoader.class)) {
             mocked.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(dialectDatabaseMetaData);
             ShardingSphereSchema existedSchema = new ShardingSphereSchema("foo_schema", mock(DatabaseType.class));
@@ -199,8 +197,7 @@ class DatabaseMetaDataPersistFacadeTest {
     
     @Test
     void assertPersistAlteredTablesWhenLoadFailed() throws SQLException {
-        DialectDatabaseMetaData dialectDatabaseMetaData = mock(DialectDatabaseMetaData.class);
-        when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(new DefaultSchemaOption(false, null));
+        DialectDatabaseMetaData dialectDatabaseMetaData = createDialectDatabaseMetaData();
         try (MockedStatic<DatabaseTypedSPILoader> mocked = mockStatic(DatabaseTypedSPILoader.class)) {
             mocked.when(() -> DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class, databaseType)).thenReturn(dialectDatabaseMetaData);
             ShardingSphereDatabase database = createDatabase("foo_db", Collections.singleton(new ShardingSphereSchema("foo_schema", mock(DatabaseType.class))));
@@ -226,6 +223,13 @@ class DatabaseMetaDataPersistFacadeTest {
                 new ResourceMetaData(Collections.emptyMap(), Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), schemas);
     }
     
+    private DialectDatabaseMetaData createDialectDatabaseMetaData() {
+        DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
+        when(result.getSchemaOption()).thenReturn(new DefaultSchemaOption(false, null));
+        when(result.getIdentifierPatternType()).thenReturn(IdentifierPatternType.KEEP_ORIGIN);
+        return result;
+    }
+    
     private ShardingSphereMetaData createMetaData(final ShardingSphereDatabase database) {
         return new ShardingSphereMetaData(Collections.singleton(database),
                 new ResourceMetaData(Collections.emptyMap(), Collections.emptyMap()), new RuleMetaData(Collections.emptyList()), new ConfigurationProperties(new Properties()));
diff --git a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java
index 2362374e25c..c7ee3889802 100644
--- a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java
+++ b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/refresh/RefreshTableMetaDataExecutorTest.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable.refresh;
 
 import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
+import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
 import org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.schema.DialectSchemaOption;
 import org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
@@ -168,6 +169,7 @@ class RefreshTableMetaDataExecutorTest {
         DialectSchemaOption schemaOption = mock(DialectSchemaOption.class);
         when(schemaOption.getDefaultSchema()).thenReturn(Optional.of("public"));
         when(result.getSchemaOption()).thenReturn(schemaOption);
+        when(result.getIdentifierPatternType()).thenReturn(IdentifierPatternType.KEEP_ORIGIN);
         return result;
     }
 }
diff --git a/test/it/binder/src/test/resources/cases/dml/select-function.xml b/test/it/binder/src/test/resources/cases/dml/select-function.xml
index 8babdf6959d..4a698f763f2 100644
--- a/test/it/binder/src/test/resources/cases/dml/select-function.xml
+++ b/test/it/binder/src/test/resources/cases/dml/select-function.xml
@@ -43,7 +43,7 @@
                                                                                     <owner name="i" start-index="46" stop-index="46" />
                                                                                     <column-bound>
                                                                                         <original-database name="foo_db_1" />
-                                                                                        <original-schema name="foo_db_1" />
+                                                                                        <original-schema name="FOO_DB_1" />
                                                                                         <original-table name="t_order_item" />
                                                                                         <original-column name="item_id" start-delimiter="&quot;" end-delimiter="&quot;" />
                                                                                         <table-source-type name="PHYSICAL_TABLE"/>
@@ -54,7 +54,7 @@
                                                                                 <simple-table name="t_order_item" alias="i" start-index="61" stop-index="74">
                                                                                     <table-bound>
                                                                                         <original-database name="foo_db_1" />
-                                                                                        <original-schema name="foo_db_1" />
+                                                                                        <original-schema name="FOO_DB_1" />
                                                                                     </table-bound>
                                                                                 </simple-table>
                                                                             </from>
@@ -66,7 +66,7 @@
                                                                                                 <owner name="i" start-index="82" stop-index="82" />
                                                                                                 <column-bound>
                                                                                                     <original-database name="foo_db_1" />
-                                                                                                    <original-schema name="foo_db_1" />
+                                                                                                    <original-schema name="FOO_DB_1" />
                                                                                                     <original-table name="t_order_item" />
                                                                                                     <original-column name="item_id" start-delimiter="&quot;" end-delimiter="&quot;" />
                                                                                                     <table-source-type name="PHYSICAL_TABLE"/>
@@ -117,7 +117,7 @@
             <simple-table name="DUAL" start-index="151" stop-index="154">
                 <table-bound>
                     <original-database name="foo_db_1" />
-                    <original-schema name="foo_db_1" />
+                    <original-schema name="FOO_DB_1" />
                 </table-bound>
             </simple-table>
         </from>
diff --git a/test/it/binder/src/test/resources/cases/dml/select.xml b/test/it/binder/src/test/resources/cases/dml/select.xml
index ee00ebdbc9f..6a89fda5c56 100644
--- a/test/it/binder/src/test/resources/cases/dml/select.xml
+++ b/test/it/binder/src/test/resources/cases/dml/select.xml
@@ -1548,7 +1548,7 @@
                     <simple-table alias="o" name="t_order" start-index="23" stop-index="31">
                         <table-bound start-index="0" stop-index="0">
                             <original-database name="foo_db_1" start-index="0" stop-index="0"/>
-                            <original-schema name="foo_db_1" start-index="0" stop-index="0"/>
+                            <original-schema name="FOO_DB_1" start-index="0" stop-index="0"/>
                         </table-bound>
                     </simple-table>
                 </left>
@@ -1556,7 +1556,7 @@
                     <simple-table alias="i" name="t_order_item" start-index="34" stop-index="47">
                         <table-bound start-index="0" stop-index="0">
                             <original-database name="foo_db_1" start-index="0" stop-index="0"/>
-                            <original-schema name="foo_db_1" start-index="0" stop-index="0"/>
+                            <original-schema name="FOO_DB_1" start-index="0" stop-index="0"/>
                         </table-bound>
                     </simple-table>
                 </right>
@@ -1575,7 +1575,7 @@
                             <owner name="o" start-index="55" stop-index="55"/>
                             <column-bound start-index="0" stop-index="0">
                                 <original-database name="foo_db_1" start-index="0" stop-index="0"/>
-                                <original-schema name="foo_db_1" start-index="0" stop-index="0"/>
+                                <original-schema name="FOO_DB_1" start-index="0" stop-index="0"/>
                                 <original-table name="t_order" start-index="0" stop-index="0"/>
                                 <original-column name="order_id" start-delimiter="&quot;" end-delimiter="&quot;" start-index="0" stop-index="0"/>
                                 <table-source-type name="PHYSICAL_TABLE" start-index="0" stop-index="0"/>
@@ -1589,7 +1589,7 @@
                                 <owner name="i" start-index="68" stop-index="68"/>
                                 <column-bound start-index="0" stop-index="0">
                                     <original-database name="foo_db_1" start-index="0" stop-index="0"/>
-                                    <original-schema name="foo_db_1" start-index="0" stop-index="0"/>
+                                    <original-schema name="FOO_DB_1" start-index="0" stop-index="0"/>
                                     <original-table name="t_order_item" start-index="0" stop-index="0"/>
                                     <original-column name="order_id" start-delimiter="&quot;" end-delimiter="&quot;" start-index="0" stop-index="0"/>
                                     <table-source-type name="PHYSICAL_TABLE" start-index="0" stop-index="0"/>