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 db5f49f744a Fix default schema naming for schema-unavailable databases
(#38843)
db5f49f744a is described below
commit db5f49f744adb408cb6d449f49aa23c211546118
Author: Haoran Meng <[email protected]>
AuthorDate: Fri Jun 12 10:11:34 2026 +0800
Fix default schema naming for schema-unavailable databases (#38843)
---
.../connector/core/type/DatabaseTypeRegistry.java | 9 +++++-
.../data/loader/type/SchemaMetaDataLoaderTest.java | 18 ++++-------
.../core/type/DatabaseTypeRegistryTest.java | 25 ++++++++-------
.../loader/FirebirdSchemaMetaDataLoaderTest.java | 2 +-
.../OracleIdentifierCaseRuleProvider.java | 8 ++++-
.../OracleIdentifierCaseRuleProviderTest.java | 8 +++++
.../infra/datanode/DataNodeTest.java | 2 +-
.../schema/builder/GenericSchemaBuilderTest.java | 37 ++++++++++++++++++++++
.../DatabaseIdentifierContextFactoryTest.java | 32 +++++++++++++++++--
.../DatabaseMetaDataPersistFacadeTest.java | 2 --
.../test/resources/cases/dml/select-function.xml | 8 ++---
.../binder/src/test/resources/cases/dml/select.xml | 8 ++---
12 files changed, 120 insertions(+), 39 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 f382fc28a66..659a795b3f8 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
@@ -19,10 +19,12 @@ package
org.apache.shardingsphere.database.connector.core.type;
import lombok.Getter;
import
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
+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.infra.spi.ShardingSphereServiceLoader;
import java.util.Collection;
+import java.util.Optional;
import java.util.stream.Collectors;
/**
@@ -57,7 +59,12 @@ public final class DatabaseTypeRegistry {
* @return default schema name
*/
public String getDefaultSchemaName(final String databaseName) {
- return
dialectDatabaseMetaData.getSchemaOption().getDefaultSchema().orElse(null ==
databaseName ? null : formatIdentifierPattern(databaseName));
+ DialectSchemaOption schemaOption =
dialectDatabaseMetaData.getSchemaOption();
+ Optional<String> defaultSchema = schemaOption.getDefaultSchema();
+ if (defaultSchema.isPresent() || null == databaseName) {
+ return defaultSchema.orElse(null);
+ }
+ return schemaOption.isSchemaAvailable() ?
formatIdentifierPattern(databaseName) : databaseName;
}
/**
diff --git
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SchemaMetaDataLoaderTest.java
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SchemaMetaDataLoaderTest.java
index 53438c89d70..edd6f49b751 100644
---
a/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SchemaMetaDataLoaderTest.java
+++
b/database/connector/core/src/test/java/org/apache/shardingsphere/database/connector/core/metadata/data/loader/type/SchemaMetaDataLoaderTest.java
@@ -18,7 +18,6 @@
package
org.apache.shardingsphere.database.connector.core.metadata.data.loader.type;
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.metadata.database.system.DialectSystemDatabase;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
@@ -44,7 +43,6 @@ import java.util.Optional;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
@@ -67,15 +65,14 @@ class SchemaMetaDataLoaderTest {
void assertLoadSchemaTableNamesWithoutDefaultSchema() throws SQLException {
DialectSchemaOption schemaOption = mock(DialectSchemaOption.class);
when(schemaOption.getDefaultSchema()).thenReturn(Optional.empty());
- when(schemaOption.getSchema(any())).thenReturn("public");
DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(schemaOption);
-
when(dialectDatabaseMetaData.getIdentifierPatternType()).thenReturn(IdentifierPatternType.KEEP_ORIGIN);
try (MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader =
mockStatic(DatabaseTypedSPILoader.class)) {
databaseTypedSPILoader.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
try (MockedStatic<TypedSPILoader> typedSPILoader =
mockStatic(TypedSPILoader.class)) {
typedSPILoader.when(() ->
TypedSPILoader.getService(DialectDatabaseMetaData.class,
null)).thenReturn(dialectDatabaseMetaData);
Connection connection =
dataSourceWithoutDefaultSchema.getConnection();
+ when(schemaOption.getSchema(connection)).thenReturn("public");
when(connection.getCatalog()).thenReturn("catalog");
ResultSet tableResultSet = mock(ResultSet.class);
when(tableResultSet.next()).thenReturn(true, true, true, true,
true, false);
@@ -90,18 +87,17 @@ class SchemaMetaDataLoaderTest {
}
@Test
- void
assertLoadSchemaTableNamesNormalizesDatabaseNameWithoutDefaultSchema() throws
SQLException {
+ void assertLoadSchemaTableNamesKeepsDatabaseNameWithoutDefaultSchema()
throws SQLException {
DialectSchemaOption schemaOption = mock(DialectSchemaOption.class);
when(schemaOption.getDefaultSchema()).thenReturn(Optional.empty());
- when(schemaOption.getSchema(any())).thenReturn("public");
DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(schemaOption);
-
when(dialectDatabaseMetaData.getIdentifierPatternType()).thenReturn(IdentifierPatternType.UPPER_CASE);
try (MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader =
mockStatic(DatabaseTypedSPILoader.class)) {
databaseTypedSPILoader.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
try (MockedStatic<TypedSPILoader> typedSPILoader =
mockStatic(TypedSPILoader.class)) {
typedSPILoader.when(() ->
TypedSPILoader.getService(DialectDatabaseMetaData.class,
null)).thenReturn(dialectDatabaseMetaData);
Connection connection =
dataSourceWithoutDefaultSchema.getConnection();
+ when(schemaOption.getSchema(connection)).thenReturn("public");
when(connection.getCatalog()).thenReturn("catalog");
ResultSet tableResultSet = mock(ResultSet.class);
when(tableResultSet.next()).thenReturn(true, false);
@@ -109,7 +105,7 @@ class SchemaMetaDataLoaderTest {
when(connection.getMetaData().getTables("catalog", "public",
null, TABLE_TYPES)).thenReturn(tableResultSet);
Map<String, Collection<String>> actual = new
SchemaMetaDataLoader(databaseType)
.loadSchemaTableNames("logic_db",
dataSourceWithoutDefaultSchema, Collections.emptySet(), Collections.emptySet());
- Map<String, Collection<String>> expected =
Collections.singletonMap("LOGIC_DB", new
LinkedHashSet<>(Collections.singleton("tbl")));
+ Map<String, Collection<String>> expected =
Collections.singletonMap("logic_db", new
LinkedHashSet<>(Collections.singleton("tbl")));
assertThat(actual, is(expected));
}
}
@@ -119,15 +115,14 @@ class SchemaMetaDataLoaderTest {
void assertLoadSchemaTableNamesWithIncludedTables() throws SQLException {
DialectSchemaOption schemaOption = mock(DialectSchemaOption.class);
when(schemaOption.getDefaultSchema()).thenReturn(Optional.empty());
- when(schemaOption.getSchema(any())).thenReturn("public");
DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(schemaOption);
-
when(dialectDatabaseMetaData.getIdentifierPatternType()).thenReturn(IdentifierPatternType.KEEP_ORIGIN);
try (MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader =
mockStatic(DatabaseTypedSPILoader.class)) {
databaseTypedSPILoader.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
try (MockedStatic<TypedSPILoader> typedSPILoader =
mockStatic(TypedSPILoader.class)) {
typedSPILoader.when(() ->
TypedSPILoader.getService(DialectDatabaseMetaData.class,
null)).thenReturn(dialectDatabaseMetaData);
Connection connection =
dataSourceWithoutDefaultSchema.getConnection();
+ when(schemaOption.getSchema(connection)).thenReturn("public");
when(connection.getCatalog()).thenReturn("catalog");
ResultSet tableResultSet = mock(ResultSet.class);
when(tableResultSet.next()).thenReturn(true, true, false);
@@ -145,15 +140,14 @@ class SchemaMetaDataLoaderTest {
void assertLoadSchemaTableNamesWithWildcardIncludedTables() throws
SQLException {
DialectSchemaOption schemaOption = mock(DialectSchemaOption.class);
when(schemaOption.getDefaultSchema()).thenReturn(Optional.empty());
- when(schemaOption.getSchema(any())).thenReturn("public");
DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class);
when(dialectDatabaseMetaData.getSchemaOption()).thenReturn(schemaOption);
-
when(dialectDatabaseMetaData.getIdentifierPatternType()).thenReturn(IdentifierPatternType.KEEP_ORIGIN);
try (MockedStatic<DatabaseTypedSPILoader> databaseTypedSPILoader =
mockStatic(DatabaseTypedSPILoader.class)) {
databaseTypedSPILoader.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
try (MockedStatic<TypedSPILoader> typedSPILoader =
mockStatic(TypedSPILoader.class)) {
typedSPILoader.when(() ->
TypedSPILoader.getService(DialectDatabaseMetaData.class,
null)).thenReturn(dialectDatabaseMetaData);
Connection connection =
dataSourceWithoutDefaultSchema.getConnection();
+ when(schemaOption.getSchema(connection)).thenReturn("public");
when(connection.getCatalog()).thenReturn("catalog");
ResultSet tableResultSet = mock(ResultSet.class);
when(tableResultSet.next()).thenReturn(true, true, false);
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 6f05d1d4a4f..42c4809bfe4 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
@@ -60,16 +60,16 @@ class DatabaseTypeRegistryTest {
@ParameterizedTest(name = "{0}")
@MethodSource("getDefaultSchemaNameWithIdentifierPatternArguments")
- void assertGetDefaultSchemaNameWithIdentifierPattern(final String name,
final IdentifierPatternType identifierPatternType,
+ void assertGetDefaultSchemaNameWithIdentifierPattern(final String name,
final IdentifierPatternType identifierPatternType, final boolean
schemaAvailable,
final String
databaseName, final String expectedSchemaName) throws
ReflectiveOperationException {
- DatabaseTypeRegistry databaseTypeRegistry =
createDatabaseTypeRegistry(identifierPatternType, null);
+ DatabaseTypeRegistry databaseTypeRegistry =
createDatabaseTypeRegistry(identifierPatternType, schemaAvailable, 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 {
- DatabaseTypeRegistry databaseTypeRegistry =
createDatabaseTypeRegistry(identifierPatternType, null);
+ DatabaseTypeRegistry databaseTypeRegistry =
createDatabaseTypeRegistry(identifierPatternType, false, null);
assertThat(databaseTypeRegistry.formatIdentifierPattern("Foo"),
is(expectedIdentifierPattern));
}
@@ -82,10 +82,12 @@ class DatabaseTypeRegistryTest {
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));
+ Arguments.of("schema available upper case identifier pattern
formats default schema", IdentifierPatternType.UPPER_CASE, true, "foo_db",
"FOO_DB"),
+ Arguments.of("schema available lower case identifier pattern
formats default schema", IdentifierPatternType.LOWER_CASE, true, "FOO_DB",
"foo_db"),
+ Arguments.of("schema available keep origin identifier pattern
keeps default schema", IdentifierPatternType.KEEP_ORIGIN, true, "Foo_Db",
"Foo_Db"),
+ Arguments.of("schema unavailable upper case identifier pattern
keeps database name", IdentifierPatternType.UPPER_CASE, false, "logical_db",
"logical_db"),
+ Arguments.of("schema unavailable keep origin identifier
pattern keeps database name", IdentifierPatternType.KEEP_ORIGIN, false,
"Logical_DB", "Logical_DB"),
+ Arguments.of("null database name keeps null default schema",
IdentifierPatternType.UPPER_CASE, false, null, null));
}
private static Stream<Arguments> formatIdentifierPatternArguments() {
@@ -95,10 +97,11 @@ class DatabaseTypeRegistryTest {
Arguments.of("identifier pattern keep origin",
IdentifierPatternType.KEEP_ORIGIN, "Foo"));
}
- private DatabaseTypeRegistry createDatabaseTypeRegistry(final
IdentifierPatternType identifierPatternType, final String defaultSchema) throws
ReflectiveOperationException {
+ private DatabaseTypeRegistry createDatabaseTypeRegistry(final
IdentifierPatternType identifierPatternType, final boolean schemaAvailable,
+ final String
defaultSchema) throws ReflectiveOperationException {
DatabaseTypeRegistry result = new
DatabaseTypeRegistry(trunkDatabaseType);
Plugins.getMemberAccessor().set(DatabaseTypeRegistry.class.getDeclaredField("dialectDatabaseMetaData"),
- result, new
FixtureDialectDatabaseMetaData(identifierPatternType, defaultSchema));
+ result, new
FixtureDialectDatabaseMetaData(identifierPatternType, schemaAvailable,
defaultSchema));
return result;
}
@@ -108,9 +111,9 @@ class DatabaseTypeRegistryTest {
private final DefaultSchemaOption schemaOption;
- private FixtureDialectDatabaseMetaData(final IdentifierPatternType
identifierPatternType, final String defaultSchema) {
+ private FixtureDialectDatabaseMetaData(final IdentifierPatternType
identifierPatternType, final boolean schemaAvailable, final String
defaultSchema) {
this.identifierPatternType = identifierPatternType;
- schemaOption = new DefaultSchemaOption(false, defaultSchema);
+ schemaOption = new DefaultSchemaOption(schemaAvailable,
defaultSchema);
}
@Override
diff --git
a/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/data/loader/FirebirdSchemaMetaDataLoaderTest.java
b/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/data/loader/FirebirdSchemaMetaDataLoaderTest.java
index 312a439bcc9..c1fcc193d92 100644
---
a/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/data/loader/FirebirdSchemaMetaDataLoaderTest.java
+++
b/database/connector/dialect/firebird/src/test/java/org/apache/shardingsphere/database/connector/firebird/metadata/data/loader/FirebirdSchemaMetaDataLoaderTest.java
@@ -80,7 +80,7 @@ class FirebirdSchemaMetaDataLoaderTest {
@Test
void assertLoadSchemaTableNames() throws SQLException {
- Map<String, Collection<String>> schemaTableNames =
Collections.singletonMap("FOO_DB", new
CaseInsensitiveSet<>(Arrays.asList("tbl", "partitioned_tbl")));
+ Map<String, Collection<String>> schemaTableNames =
Collections.singletonMap("foo_db", new
CaseInsensitiveSet<>(Arrays.asList("tbl", "partitioned_tbl")));
assertThat(new
SchemaMetaDataLoader(databaseType).loadSchemaTableNames("foo_db", dataSource,
Collections.emptySet(), Collections.emptySet()), is(schemaTableNames));
}
diff --git
a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProvider.java
b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProvider.java
index bd463ba6ce4..c9eca93aec0 100644
---
a/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProvider.java
+++
b/database/connector/dialect/oracle/src/main/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProvider.java
@@ -17,11 +17,15 @@
package
org.apache.shardingsphere.database.connector.oracle.metadata.identifier;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRule;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleProvider;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleProviderContext;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleSet;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCaseRuleSets;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
+import java.util.EnumMap;
+import java.util.Map;
import java.util.Objects;
import java.util.Optional;
@@ -33,7 +37,9 @@ public final class OracleIdentifierCaseRuleProvider
implements IdentifierCaseRul
@Override
public Optional<IdentifierCaseRuleSet> provide(final
IdentifierCaseRuleProviderContext context) {
Objects.requireNonNull(context, "context cannot be null.");
- return Optional.of(IdentifierCaseRuleSets.newUpperCaseRuleSet());
+ Map<IdentifierScope, IdentifierCaseRule> scopedRules = new
EnumMap<>(IdentifierScope.class);
+ scopedRules.put(IdentifierScope.SCHEMA,
IdentifierCaseRuleSets.newInsensitiveRuleSet().getRule(IdentifierScope.SCHEMA));
+ return Optional.of(new
IdentifierCaseRuleSet(IdentifierCaseRuleSets.newUpperCaseRuleSet().getRule(IdentifierScope.TABLE),
scopedRules));
}
@Override
diff --git
a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProviderTest.java
b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProviderTest.java
index 578f9a42849..de2c490bbed 100644
---
a/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProviderTest.java
+++
b/database/connector/dialect/oracle/src/test/java/org/apache/shardingsphere/database/connector/oracle/metadata/identifier/OracleIdentifierCaseRuleProviderTest.java
@@ -53,4 +53,12 @@ class OracleIdentifierCaseRuleProviderTest {
assertTrue(actual.matches("FOO", "foo", QuoteCharacter.NONE));
assertFalse(actual.matches("Foo", "foo", QuoteCharacter.NONE));
}
+
+ @Test
+ void assertProvideSchemaRule() {
+ IdentifierCaseRule actual = provider.provide(new
IdentifierCaseRuleProviderContext(databaseType,
null)).orElseThrow(AssertionError::new).getRule(IdentifierScope.SCHEMA);
+ assertThat(actual.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
+ assertTrue(actual.matches("foo_schema", "FOO_SCHEMA",
QuoteCharacter.NONE));
+ assertTrue(actual.matches("FOO_SCHEMA", "foo_schema",
QuoteCharacter.NONE));
+ }
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/datanode/DataNodeTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/datanode/DataNodeTest.java
index 3881f38e7a0..0b418816dc8 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/datanode/DataNodeTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/datanode/DataNodeTest.java
@@ -151,7 +151,7 @@ class DataNodeTest {
Arguments.of("mysql_without_schema_support", "test_db",
MYSQL_DATABASE_TYPE, "ds.tbl", "ds", "test_db", "tbl"),
Arguments.of("mysql_three_segments_kept_as_table_suffix",
"test_db", MYSQL_DATABASE_TYPE, "ds.schema.tbl", "ds", "test_db", "schema.tbl"),
Arguments.of("postgresql_preserves_table_case", "test_db",
POSTGRESQL_DATABASE_TYPE, "ds.schema.TABLE", "ds", "schema", "TABLE"),
- Arguments.of("oracle_normalizes_database_schema", "logic_db",
ORACLE_DATABASE_TYPE, "ds.tbl", "ds", "LOGIC_DB", "tbl"));
+ Arguments.of("oracle_keeps_database_schema", "logic_db",
ORACLE_DATABASE_TYPE, "ds.tbl", "ds", "logic_db", "tbl"));
}
private static Stream<Arguments> formatArguments() {
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 6da1075f3ef..89e89d4bb31 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
@@ -22,6 +22,7 @@ import
org.apache.shardingsphere.database.connector.core.metadata.data.model.Sch
import
org.apache.shardingsphere.database.connector.core.metadata.data.model.TableMetaData;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
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.identifier.DatabaseIdentifierContextFactory;
@@ -142,6 +143,42 @@ class GenericSchemaBuilderTest {
assertThat(actualSchema.getName(), is("foo_schema"));
}
+ @Test
+ void assertBuildWithMySQLProtocolAndOracleStorage() throws SQLException {
+ DatabaseType protocolType =
TypedSPILoader.getService(DatabaseType.class, "MySQL");
+ DatabaseType storageType =
TypedSPILoader.getService(DatabaseType.class, "Oracle");
+ GenericSchemaBuilderMaterial newMaterial = createMaterial(storageType,
protocolType);
+
when(MetaDataLoader.load(any())).thenReturn(createOracleSchemaMetaDataMap());
+ Map<String, ShardingSphereSchema> actual =
GenericSchemaBuilder.build(Collections.singleton("t_log"), protocolType,
newMaterial);
+ ShardingSphereSchema actualSchema = actual.get("logical_db");
+ assertThat(actualSchema.getName(), is("logical_db"));
+ assertThat(actualSchema.getAllTables().iterator().next().getName(),
is("T_LOG"));
+ }
+
+ @Test
+ void assertBuildWithOracleProtocolAndOracleStorage() throws SQLException {
+ DatabaseType protocolType =
TypedSPILoader.getService(DatabaseType.class, "Oracle");
+ GenericSchemaBuilderMaterial newMaterial =
createMaterial(protocolType, protocolType);
+
when(MetaDataLoader.load(any())).thenReturn(createOracleSchemaMetaDataMap());
+ Map<String, ShardingSphereSchema> actual =
GenericSchemaBuilder.build(Collections.singleton("t_log"), protocolType,
newMaterial);
+ ShardingSphereSchema actualSchema = actual.get("logical_db");
+ assertThat(actualSchema.getName(), is("logical_db"));
+ assertThat(actualSchema.getAllTables().iterator().next().getName(),
is("T_LOG"));
+ }
+
+ private GenericSchemaBuilderMaterial createMaterial(final DatabaseType
storageType, final DatabaseType protocolType) {
+ StorageUnit storageUnit = mock(StorageUnit.class);
+ when(storageUnit.getStorageType()).thenReturn(storageType);
+ Map<String, StorageUnit> storageUnits =
Collections.singletonMap("ds_0", storageUnit);
+ return new GenericSchemaBuilderMaterial(storageUnits,
Collections.emptyList(), new ConfigurationProperties(new Properties()),
"logical_db",
+ DatabaseIdentifierContextFactory.create(protocolType, new
ResourceMetaData(Collections.emptyMap(), storageUnits), new
ConfigurationProperties(new Properties())));
+ }
+
+ private Map<String, SchemaMetaData> createOracleSchemaMetaDataMap() {
+ return Collections.singletonMap("logical_db", new
SchemaMetaData("logical_db",
+ Collections.singleton(new TableMetaData("T_LOG",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList()))));
+ }
+
private Map<String, SchemaMetaData> createSchemaMetaDataMap(final
Collection<String> tableNames, final GenericSchemaBuilderMaterial material) {
if (!tableNames.isEmpty() && (tableNames.contains("foo_tbl") ||
tableNames.contains("bar_tbl"))) {
Collection<TableMetaData> tableMetaDataList = tableNames.stream()
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
index 9213c33e98e..2f04c21f842 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactoryTest.java
@@ -171,6 +171,22 @@ class DatabaseIdentifierContextFactoryTest {
assertTrue(actualTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
}
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("createWithOracleUnavailableSchemaLookupArguments")
+ void assertCreateFindsOracleUnavailableSchemaInsensitive(final String
name, final IdentifierValue lookupIdentifier) {
+ DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(ORACLE_DATABASE_TYPE,
ORACLE_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
+ IdentifierIndex<String> schemaIndex = createIdentifierIndex(actual,
IdentifierScope.SCHEMA, "logical_db");
+ assertThat(schemaIndex.find(lookupIdentifier),
is(Optional.of("logical_db")));
+ }
+
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("createWithOracleTableLookupArguments")
+ void assertCreateFindsOracleTableUpperCase(final String name, final
IdentifierValue lookupIdentifier) {
+ DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(ORACLE_DATABASE_TYPE,
ORACLE_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
+ IdentifierIndex<String> tableIndex = createIdentifierIndex(actual,
IdentifierScope.TABLE, "T_LOG");
+ assertThat(tableIndex.find(lookupIdentifier),
is(Optional.of("T_LOG")));
+ }
+
@Test
void
assertRefreshUsesProtocolRuleForLogicalTableAndEnablesHeterogeneousLookup() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
@@ -442,10 +458,22 @@ class DatabaseIdentifierContextFactoryTest {
createNormalizedLookupArguments("mysql schema",
MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_schema", "`"),
createInsensitiveQuotedExactLookupArguments("postgresql
schema", POSTGRESQL_DATABASE_TYPE, POSTGRESQL_RESOURCE_META_DATA, "foo_schema",
"\""),
createInsensitiveQuotedExactLookupArguments("openGauss
schema", OPEN_GAUSS_DATABASE_TYPE, OPEN_GAUSS_RESOURCE_META_DATA, "foo_schema",
"\""),
- createUpperCaseLookupArguments("oracle schema",
ORACLE_DATABASE_TYPE, ORACLE_RESOURCE_META_DATA, "foo_schema", "\""))
+ createInsensitiveQuotedExactLookupArguments("oracle schema",
ORACLE_DATABASE_TYPE, ORACLE_RESOURCE_META_DATA, "foo_schema", "\""))
.flatMap(each -> each);
}
+ private static Stream<Arguments>
createWithOracleUnavailableSchemaLookupArguments() {
+ return Stream.of(
+ Arguments.of("oracle schema finds lower logical database", new
IdentifierValue("logical_db")),
+ Arguments.of("oracle schema finds upper logical database", new
IdentifierValue("LOGICAL_DB")));
+ }
+
+ private static Stream<Arguments> createWithOracleTableLookupArguments() {
+ return Stream.of(
+ Arguments.of("oracle table finds lower lookup", new
IdentifierValue("t_log")),
+ Arguments.of("oracle table finds upper lookup", new
IdentifierValue("T_LOG")));
+ }
+
private static Stream<Arguments>
createWithSupportedDatabaseTableLookupArguments() {
return Stream.of(
createNormalizedLookupArguments("mysql table
lower_case_table_names=1", MYSQL_DATABASE_TYPE,
MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_tbl", "`"),
@@ -499,7 +527,7 @@ class DatabaseIdentifierContextFactoryTest {
createNormalizedMixedLookupArguments("mysql schema",
MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_schema", "`"),
createInsensitiveQuotedExactMixedLookupArguments("postgresql
schema", POSTGRESQL_DATABASE_TYPE, POSTGRESQL_RESOURCE_META_DATA, "foo_schema",
"\""),
createInsensitiveQuotedExactMixedLookupArguments("openGauss
schema", OPEN_GAUSS_DATABASE_TYPE, OPEN_GAUSS_RESOURCE_META_DATA, "foo_schema",
"\""),
- createUpperCaseMixedLookupArguments("oracle schema",
ORACLE_DATABASE_TYPE, ORACLE_RESOURCE_META_DATA, "foo_schema", "\""))
+ createInsensitiveQuotedExactMixedLookupArguments("oracle
schema", ORACLE_DATABASE_TYPE, ORACLE_RESOURCE_META_DATA, "foo_schema", "\""))
.flatMap(each -> each);
}
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 cc01b82d503..47fab24defa 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,7 +18,6 @@
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;
@@ -231,7 +230,6 @@ class DatabaseMetaDataPersistFacadeTest {
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;
}
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 4a698f763f2..74612793fd1 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 99d21a4d5ff..5f1ff604439 100644
--- a/test/it/binder/src/test/resources/cases/dml/select.xml
+++ b/test/it/binder/src/test/resources/cases/dml/select.xml
@@ -1558,7 +1558,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>
@@ -1566,7 +1566,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>
@@ -1585,7 +1585,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"/>
@@ -1599,7 +1599,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"/>