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=""" end-delimiter=""" />
<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=""" end-delimiter=""" />
<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=""" end-delimiter=""" 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=""" end-delimiter=""" start-index="0" stop-index="0"/>
<table-source-type name="PHYSICAL_TABLE" start-index="0" stop-index="0"/>