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 579de83cf84 Make unquoted schema lookup case-insensitive for
PostgresSQL (#38696)
579de83cf84 is described below
commit 579de83cf84b1c3523380b845781a45a0f54c13a
Author: Haoran Meng <[email protected]>
AuthorDate: Fri May 15 19:07:34 2026 +0800
Make unquoted schema lookup case-insensitive for PostgresSQL (#38696)
---
.../identifier/OpenGaussIdentifierCaseRuleProvider.java | 9 ++++++++-
.../identifier/OpenGaussIdentifierCaseRuleProviderTest.java | 13 +++++++++----
.../identifier/PostgreSQLIdentifierCaseRuleProvider.java | 9 ++++++++-
.../PostgreSQLIdentifierCaseRuleProviderTest.java | 13 +++++++++----
.../identifier/DatabaseIdentifierContextFactoryTest.java | 8 ++++----
5 files changed, 38 insertions(+), 14 deletions(-)
diff --git
a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProvider.java
b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProvider.java
index f638598fe44..da274ab5be3 100644
---
a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProvider.java
+++
b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProvider.java
@@ -19,9 +19,13 @@ package
org.apache.shardingsphere.database.connector.opengauss.metadata.identifi
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.IdentifierCaseRule;
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,10 @@ public final class OpenGaussIdentifierCaseRuleProvider
implements IdentifierCase
@Override
public Optional<IdentifierCaseRuleSet> provide(final
IdentifierCaseRuleProviderContext context) {
Objects.requireNonNull(context, "context cannot be null.");
- return Optional.of(IdentifierCaseRuleSets.newLowerCaseRuleSet());
+ IdentifierCaseRuleSet lowerCaseRuleSet =
IdentifierCaseRuleSets.newLowerCaseRuleSet();
+ Map<IdentifierScope, IdentifierCaseRule> scopedRules = new
EnumMap<>(IdentifierScope.class);
+ scopedRules.put(IdentifierScope.SCHEMA,
IdentifierCaseRuleSets.newInsensitiveRuleSet().getRule(IdentifierScope.SCHEMA));
+ return Optional.of(new
IdentifierCaseRuleSet(lowerCaseRuleSet.getRule(IdentifierScope.TABLE),
scopedRules));
}
@Override
diff --git
a/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProviderTest.java
b/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProviderTest.java
index 9035e474e3a..b3ea2f2fb78 100644
---
a/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProviderTest.java
+++
b/database/connector/dialect/opengauss/src/test/java/org/apache/shardingsphere/database/connector/opengauss/metadata/identifier/OpenGaussIdentifierCaseRuleProviderTest.java
@@ -48,9 +48,14 @@ class OpenGaussIdentifierCaseRuleProviderTest {
@Test
void assertProvide() {
- IdentifierCaseRule actual = provider.provide(new
IdentifierCaseRuleProviderContext(databaseType,
null)).orElseThrow(AssertionError::new).getRule(IdentifierScope.TABLE);
- assertThat(actual.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
- assertTrue(actual.matches("foo", "FOO", QuoteCharacter.NONE));
- assertFalse(actual.matches("Foo", "foo", QuoteCharacter.NONE));
+ IdentifierCaseRuleProviderContext context = new
IdentifierCaseRuleProviderContext(databaseType, null);
+ IdentifierCaseRule tableRule =
provider.provide(context).orElseThrow(AssertionError::new).getRule(IdentifierScope.TABLE);
+ assertThat(tableRule.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
+ assertTrue(tableRule.matches("foo", "FOO", QuoteCharacter.NONE));
+ assertFalse(tableRule.matches("Foo", "foo", QuoteCharacter.NONE));
+ IdentifierCaseRule schemaRule =
provider.provide(context).orElseThrow(AssertionError::new).getRule(IdentifierScope.SCHEMA);
+ assertThat(schemaRule.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
+ assertTrue(schemaRule.matches("UPPER_SCHEMA", "upper_schema",
QuoteCharacter.NONE));
+ assertFalse(schemaRule.matches("UPPER_SCHEMA", "upper_schema",
QuoteCharacter.QUOTE));
}
}
diff --git
a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProvider.java
b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProvider.java
index 9a22e86431f..d07f4879a9f 100644
---
a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProvider.java
+++
b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProvider.java
@@ -20,8 +20,12 @@ package
org.apache.shardingsphere.database.connector.postgresql.metadata.identif
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.IdentifierCaseRule;
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,10 @@ public final class PostgreSQLIdentifierCaseRuleProvider
implements IdentifierCas
@Override
public Optional<IdentifierCaseRuleSet> provide(final
IdentifierCaseRuleProviderContext context) {
Objects.requireNonNull(context, "context cannot be null.");
- return Optional.of(IdentifierCaseRuleSets.newLowerCaseRuleSet());
+ IdentifierCaseRuleSet lowerCaseRuleSet =
IdentifierCaseRuleSets.newLowerCaseRuleSet();
+ Map<IdentifierScope, IdentifierCaseRule> scopedRules = new
EnumMap<>(IdentifierScope.class);
+ scopedRules.put(IdentifierScope.SCHEMA,
IdentifierCaseRuleSets.newInsensitiveRuleSet().getRule(IdentifierScope.SCHEMA));
+ return Optional.of(new
IdentifierCaseRuleSet(lowerCaseRuleSet.getRule(IdentifierScope.TABLE),
scopedRules));
}
@Override
diff --git
a/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProviderTest.java
b/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProviderTest.java
index 29b76995208..b12d1788eb7 100644
---
a/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProviderTest.java
+++
b/database/connector/dialect/postgresql/src/test/java/org/apache/shardingsphere/database/connector/postgresql/metadata/identifier/PostgreSQLIdentifierCaseRuleProviderTest.java
@@ -48,9 +48,14 @@ class PostgreSQLIdentifierCaseRuleProviderTest {
@Test
void assertProvide() {
- IdentifierCaseRule actual = provider.provide(new
IdentifierCaseRuleProviderContext(databaseType,
null)).orElseThrow(AssertionError::new).getRule(IdentifierScope.TABLE);
- assertThat(actual.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
- assertTrue(actual.matches("foo", "FOO", QuoteCharacter.NONE));
- assertFalse(actual.matches("Foo", "foo", QuoteCharacter.NONE));
+ IdentifierCaseRuleProviderContext context = new
IdentifierCaseRuleProviderContext(databaseType, null);
+ IdentifierCaseRule tableRule =
provider.provide(context).orElseThrow(AssertionError::new).getRule(IdentifierScope.TABLE);
+ assertThat(tableRule.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
+ assertTrue(tableRule.matches("foo", "FOO", QuoteCharacter.NONE));
+ assertFalse(tableRule.matches("Foo", "foo", QuoteCharacter.NONE));
+ IdentifierCaseRule schemaRule =
provider.provide(context).orElseThrow(AssertionError::new).getRule(IdentifierScope.SCHEMA);
+ assertThat(schemaRule.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
+ assertTrue(schemaRule.matches("UPPER_SCHEMA", "upper_schema",
QuoteCharacter.NONE));
+ assertFalse(schemaRule.matches("UPPER_SCHEMA", "upper_schema",
QuoteCharacter.QUOTE));
}
}
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 124a13aa87d..5bb59d8eeba 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
@@ -417,8 +417,8 @@ class DatabaseIdentifierContextFactoryTest {
private static Stream<Arguments>
createWithSupportedDatabaseSchemaLookupArguments() {
return Stream.of(
createNormalizedLookupArguments("mysql schema",
MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_schema", "`"),
- createLowerCaseLookupArguments("postgresql schema",
POSTGRESQL_DATABASE_TYPE, POSTGRESQL_RESOURCE_META_DATA, "foo_schema", "\""),
- createLowerCaseLookupArguments("openGauss schema",
OPEN_GAUSS_DATABASE_TYPE, OPEN_GAUSS_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", "\""))
.flatMap(each -> each);
}
@@ -474,8 +474,8 @@ class DatabaseIdentifierContextFactoryTest {
private static Stream<Arguments>
createWithMixedStoredCaseSchemaLookupArguments() {
return Stream.of(
createNormalizedMixedLookupArguments("mysql schema",
MYSQL_DATABASE_TYPE, MYSQL_INSENSITIVE_RESOURCE_META_DATA, "foo_schema", "`"),
- createLowerCaseMixedLookupArguments("postgresql schema",
POSTGRESQL_DATABASE_TYPE, POSTGRESQL_RESOURCE_META_DATA, "foo_schema", "\""),
- createLowerCaseMixedLookupArguments("openGauss schema",
OPEN_GAUSS_DATABASE_TYPE, OPEN_GAUSS_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", "\""))
.flatMap(each -> each);
}