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 c9b7a8f41f3 Separate identifier case policies for protocol, storage,
and metadata (#39197)
c9b7a8f41f3 is described below
commit c9b7a8f41f379844333b9285044d71ebeb191dbe
Author: Haoran Meng <[email protected]>
AuthorDate: Tue Jul 21 12:25:49 2026 +0800
Separate identifier case policies for protocol, storage, and metadata
(#39197)
---
.../metadata/database/ShardingSphereDatabase.java | 11 ----
.../database/schema/util/SchemaMetaDataUtils.java | 3 +-
.../identifier/DatabaseIdentifierContext.java | 63 +++++++++++++++++-----
.../DatabaseIdentifierContextFactory.java | 36 ++++++++++---
.../identifier/IdentifierCasePolicyResolver.java | 21 ++------
.../infra/metadata/identifier/IdentifierIndex.java | 10 ++--
.../database/ShardingSphereDatabaseTest.java | 5 +-
.../schema/model/ShardingSphereSchemaTest.java | 27 ++++------
.../schema/util/SchemaMetaDataUtilsTest.java | 5 +-
.../DatabaseIdentifierContextFactoryTest.java | 63 ++++++++++++++--------
.../identifier/DatabaseIdentifierContextTest.java | 45 ++++++++++++----
.../IdentifierCasePolicyResolverTest.java | 28 ++--------
.../shardingsphere/single/rule/SingleRule.java | 14 +++--
.../single/route/engine/SingleRouteEngineTest.java | 5 +-
.../shardingsphere/single/rule/SingleRuleTest.java | 5 +-
.../jdbc/MCPJdbcDatabaseProfileLoader.java | 5 +-
.../jdbc/MCPJdbcDatabaseProfileLoaderTest.java | 10 ++--
.../refresher/util/SchemaRefreshUtils.java | 10 +---
.../metadata/refresher/util/TableRefreshUtils.java | 31 ++++-------
.../refresher/util/SchemaRefreshUtilsTest.java | 13 +++++
.../refresher/util/TableRefreshUtilsTest.java | 25 +++++++++
21 files changed, 254 insertions(+), 181 deletions(-)
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
index 8b46b4e4035..63bf79dfb00 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabase.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.infra.metadata.database;
import lombok.AccessLevel;
import lombok.Getter;
import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
@@ -157,16 +156,6 @@ public final class ShardingSphereDatabase {
return findSchema(schemaName).orElse(null);
}
- /**
- * Get identifier case policy by scope.
- *
- * @param identifierScope identifier scope
- * @return identifier case policy
- */
- public IdentifierCasePolicy getIdentifierCasePolicy(final IdentifierScope
identifierScope) {
- return identifierContext.getPolicy(identifierScope);
- }
-
/**
* Add schema.
*
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
index 33569ea4057..36156e41224 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtils.java
@@ -33,6 +33,7 @@ import
org.apache.shardingsphere.infra.exception.kernel.metadata.datanode.Unsupp
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import javax.sql.DataSource;
import java.util.ArrayList;
@@ -98,7 +99,7 @@ public final class SchemaMetaDataUtils {
if (isSameProtocolAndStorageTypes) {
return tableNames;
}
- return tableNames.stream().map(each ->
identifierContext.getPolicy(IdentifierScope.TABLE).normalize(each)).collect(Collectors.toList());
+ return tableNames.stream().map(each ->
identifierContext.normalizeStorage(IdentifierScope.TABLE, new
IdentifierValue(each))).collect(Collectors.toList());
}
private static DataSource getDataSource(final GenericSchemaBuilderMaterial
material, final String dataSourceName) {
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContext.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContext.java
index 01f54e3548d..9e29ed37b61 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContext.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContext.java
@@ -19,9 +19,12 @@ package org.apache.shardingsphere.infra.metadata.identifier;
import lombok.AllArgsConstructor;
import lombok.Getter;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicySet;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
/**
* Database identifier context.
@@ -29,42 +32,76 @@ import
org.apache.shardingsphere.database.connector.core.metadata.identifier.Ide
@AllArgsConstructor
public final class DatabaseIdentifierContext {
- private volatile IdentifierCasePolicySet policySet;
+ private volatile IdentifierCasePolicySet protocolPolicySet;
+
+ private volatile IdentifierCasePolicySet storagePolicySet;
+
+ private volatile IdentifierCasePolicySet metaDataPolicySet;
@Getter
private volatile boolean heterogeneousTableLookupEnabled;
public DatabaseIdentifierContext(final IdentifierCasePolicySet policySet) {
- this(policySet, false);
+ this(policySet, policySet, policySet, false);
+ }
+
+ IdentifierCasePolicy getMetaDataPolicy(final IdentifierScope
identifierScope) {
+ return metaDataPolicySet.getPolicy(identifierScope);
}
/**
- * Get identifier case policy for scope.
+ * Judge whether stored metadata identifier matches input identifier.
*
* @param identifierScope identifier scope
- * @return identifier case policy
+ * @param storedName stored metadata identifier name
+ * @param identifier input identifier
+ * @return whether matched
*/
- public IdentifierCasePolicy getPolicy(final IdentifierScope
identifierScope) {
- return policySet.getPolicy(identifierScope);
+ public boolean matchesMetaData(final IdentifierScope identifierScope,
final String storedName, final IdentifierValue identifier) {
+ return
metaDataPolicySet.getPolicy(identifierScope).matches(storedName,
identifier.getValue(), identifier.getQuoteCharacter());
}
/**
- * Refresh identifier context.
+ * Normalize protocol identifier.
+ *
+ * @param identifierScope identifier scope
+ * @param identifier identifier to be normalized
+ * @return normalized protocol identifier
+ */
+ public String normalizeProtocol(final IdentifierScope identifierScope,
final IdentifierValue identifier) {
+ return normalize(protocolPolicySet.getPolicy(identifierScope),
identifier);
+ }
+
+ /**
+ * Normalize storage identifier.
*
- * @param policySet identifier case policy set
+ * @param identifierScope identifier scope
+ * @param identifier identifier to be normalized
+ * @return normalized storage identifier
*/
- public synchronized void refresh(final IdentifierCasePolicySet policySet) {
- this.policySet = policySet;
+ public String normalizeStorage(final IdentifierScope identifierScope,
final IdentifierValue identifier) {
+ return normalize(storagePolicySet.getPolicy(identifierScope),
identifier);
+ }
+
+ private String normalize(final IdentifierCasePolicy policy, final
IdentifierValue identifier) {
+ return QuoteCharacter.NONE == identifier.getQuoteCharacter() &&
LookupMode.NORMALIZED == policy.getLookupMode(identifier.getQuoteCharacter())
+ ? policy.normalize(identifier.getValue())
+ : identifier.getValue();
}
/**
* Refresh identifier context.
*
- * @param policySet identifier case policy set
+ * @param protocolPolicySet protocol identifier case policy set
+ * @param storagePolicySet storage identifier case policy set
+ * @param metaDataPolicySet metadata identifier case policy set
* @param heterogeneousTableLookupEnabled heterogeneous table lookup
enabled or not
*/
- public synchronized void refresh(final IdentifierCasePolicySet policySet,
final boolean heterogeneousTableLookupEnabled) {
- this.policySet = policySet;
+ public synchronized void refresh(final IdentifierCasePolicySet
protocolPolicySet, final IdentifierCasePolicySet storagePolicySet,
+ final IdentifierCasePolicySet
metaDataPolicySet, final boolean heterogeneousTableLookupEnabled) {
+ this.protocolPolicySet = protocolPolicySet;
+ this.storagePolicySet = storagePolicySet;
+ this.metaDataPolicySet = metaDataPolicySet;
this.heterogeneousTableLookupEnabled = heterogeneousTableLookupEnabled;
}
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
index f5715e5aa07..ebb79be0547 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextFactory.java
@@ -26,6 +26,9 @@ import
org.apache.shardingsphere.database.connector.core.metadata.identifier.Ide
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import
org.apache.shardingsphere.infra.config.props.MetadataIdentifierCaseSensitivity;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
@@ -58,7 +61,8 @@ public final class DatabaseIdentifierContextFactory {
*/
public static DatabaseIdentifierContext create(final DatabaseType
protocolType, final ConfigurationProperties props) {
ResolvedIdentifierContext resolvedContext = resolve(protocolType,
null, props);
- return new DatabaseIdentifierContext(resolvedContext.policySet,
resolvedContext.heterogeneousTableLookupEnabled);
+ return new
DatabaseIdentifierContext(resolvedContext.protocolPolicySet,
resolvedContext.storagePolicySet,
+ resolvedContext.metaDataPolicySet,
resolvedContext.heterogeneousTableLookupEnabled);
}
/**
@@ -71,7 +75,8 @@ public final class DatabaseIdentifierContextFactory {
*/
public static DatabaseIdentifierContext create(final DatabaseType
protocolType, final ResourceMetaData resourceMetaData, final
ConfigurationProperties props) {
ResolvedIdentifierContext resolvedContext = resolve(protocolType,
resourceMetaData, props);
- return new DatabaseIdentifierContext(resolvedContext.policySet,
resolvedContext.heterogeneousTableLookupEnabled);
+ return new
DatabaseIdentifierContext(resolvedContext.protocolPolicySet,
resolvedContext.storagePolicySet,
+ resolvedContext.metaDataPolicySet,
resolvedContext.heterogeneousTableLookupEnabled);
}
/**
@@ -84,17 +89,30 @@ public final class DatabaseIdentifierContextFactory {
*/
public static void refresh(final DatabaseIdentifierContext
identifierContext, final DatabaseType protocolType, final ResourceMetaData
resourceMetaData, final ConfigurationProperties props) {
ResolvedIdentifierContext resolvedContext = resolve(protocolType,
resourceMetaData, props);
- identifierContext.refresh(resolvedContext.policySet,
resolvedContext.heterogeneousTableLookupEnabled);
+ identifierContext.refresh(resolvedContext.protocolPolicySet,
resolvedContext.storagePolicySet,
+ resolvedContext.metaDataPolicySet,
resolvedContext.heterogeneousTableLookupEnabled);
}
private static ResolvedIdentifierContext resolve(final DatabaseType
protocolType, final ResourceMetaData resourceMetaData, final
ConfigurationProperties props) {
Collection<StorageUnit> storageUnits =
getStorageUnits(resourceMetaData);
StorageUnit storageUnit =
storageUnits.stream().findFirst().orElse(null);
- IdentifierCasePolicySet protocolPolicySet =
IdentifierCasePolicyResolver.resolveProtocol(protocolType, props);
+ IdentifierCasePolicySet protocolPolicySet =
IdentifierCasePolicyResolver.resolveProtocol(protocolType);
IdentifierCasePolicySet storagePolicySet = null == storageUnit
? protocolPolicySet
- :
IdentifierCasePolicyResolver.resolveStorage(storageUnit.getStorageType(),
props, storageUnit.getDataSource());
- return new
ResolvedIdentifierContext(createScopeAwarePolicySet(protocolPolicySet,
storagePolicySet), isHeterogeneous(protocolType, storageUnits));
+ :
IdentifierCasePolicyResolver.resolveStorage(storageUnit.getStorageType(),
storageUnit.getDataSource());
+ return new ResolvedIdentifierContext(protocolPolicySet,
storagePolicySet,
+ createMetaDataPolicySet(protocolPolicySet, storagePolicySet,
props), isHeterogeneous(protocolType, storageUnits));
+ }
+
+ private static IdentifierCasePolicySet createMetaDataPolicySet(final
IdentifierCasePolicySet protocolPolicySet, final IdentifierCasePolicySet
storagePolicySet,
+ final
ConfigurationProperties props) {
+ MetadataIdentifierCaseSensitivity configuredCaseSensitivity = new
TemporaryConfigurationProperties(props.getProps())
+
.getValue(TemporaryConfigurationPropertyKey.METADATA_IDENTIFIER_CASE_SENSITIVITY);
+ if (MetadataIdentifierCaseSensitivity.INSENSITIVE !=
configuredCaseSensitivity) {
+ return createScopeAwarePolicySet(protocolPolicySet,
storagePolicySet);
+ }
+ IdentifierCasePolicySet insensitivePolicySet =
IdentifierCasePolicyFactory.newInsensitivePolicySet();
+ return createScopeAwarePolicySet(insensitivePolicySet,
insensitivePolicySet);
}
private static Collection<StorageUnit> getStorageUnits(final
ResourceMetaData resourceMetaData) {
@@ -132,7 +150,11 @@ public final class DatabaseIdentifierContextFactory {
@RequiredArgsConstructor
private static final class ResolvedIdentifierContext {
- private final IdentifierCasePolicySet policySet;
+ private final IdentifierCasePolicySet protocolPolicySet;
+
+ private final IdentifierCasePolicySet storagePolicySet;
+
+ private final IdentifierCasePolicySet metaDataPolicySet;
private final boolean heterogeneousTableLookupEnabled;
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolver.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolver.java
index 9acb706a46e..06ede9c7336 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolver.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolver.java
@@ -25,10 +25,6 @@ import
org.apache.shardingsphere.database.connector.core.metadata.identifier.Ide
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicyFactory;
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import
org.apache.shardingsphere.infra.config.props.MetadataIdentifierCaseSensitivity;
-import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
-import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import javax.sql.DataSource;
@@ -42,31 +38,24 @@ public final class IdentifierCasePolicyResolver {
* Resolve protocol identifier case policy.
*
* @param protocolType protocol type
- * @param props configuration properties
* @return identifier case policy set
*/
- public static IdentifierCasePolicySet resolveProtocol(final DatabaseType
protocolType, final ConfigurationProperties props) {
- return resolve(protocolType, props, null);
+ public static IdentifierCasePolicySet resolveProtocol(final DatabaseType
protocolType) {
+ return resolve(protocolType, null);
}
/**
* Resolve storage identifier case policy.
*
* @param storageType storage type
- * @param props configuration properties
* @param dataSource storage data source
* @return identifier case policy set
*/
- public static IdentifierCasePolicySet resolveStorage(final DatabaseType
storageType, final ConfigurationProperties props, final DataSource dataSource) {
- return resolve(storageType, props, dataSource);
+ public static IdentifierCasePolicySet resolveStorage(final DatabaseType
storageType, final DataSource dataSource) {
+ return resolve(storageType, dataSource);
}
- private static IdentifierCasePolicySet resolve(final DatabaseType
databaseType, final ConfigurationProperties props, final DataSource dataSource)
{
- MetadataIdentifierCaseSensitivity configuredCaseSensitivity = new
TemporaryConfigurationProperties(props.getProps())
-
.getValue(TemporaryConfigurationPropertyKey.METADATA_IDENTIFIER_CASE_SENSITIVITY);
- if (MetadataIdentifierCaseSensitivity.INSENSITIVE ==
configuredCaseSensitivity) {
- return IdentifierCasePolicyFactory.newInsensitivePolicySet();
- }
+ private static IdentifierCasePolicySet resolve(final DatabaseType
databaseType, final DataSource dataSource) {
IdentifierCasePolicyProviderContext context = new
IdentifierCasePolicyProviderContext(databaseType, dataSource);
return
DatabaseTypedSPILoader.findService(IdentifierCasePolicyProvider.class,
databaseType)
.map(each -> each.provide(context))
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierIndex.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierIndex.java
index 1950a2fcfd7..50450979501 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierIndex.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierIndex.java
@@ -60,7 +60,7 @@ public final class IdentifierIndex<T> {
public synchronized void rebuild(final Map<String, T> values) {
Map<String, T> newExactValues = new LinkedHashMap<>(values.size(), 1F);
Map<String, Collection<String>> newNormalizedIdentifiers = new
LinkedHashMap<>(values.size(), 1F);
- IdentifierCasePolicy policy =
databaseIdentifierContext.getPolicy(identifierScope);
+ IdentifierCasePolicy policy =
databaseIdentifierContext.getMetaDataPolicy(identifierScope);
for (Entry<String, T> entry : values.entrySet()) {
newExactValues.put(entry.getKey(), entry.getValue());
addNormalizedIdentifier(newNormalizedIdentifiers, policy,
entry.getKey());
@@ -96,7 +96,7 @@ public final class IdentifierIndex<T> {
Snapshot<T> currentSnapshot = snapshot;
Map<String, T> newExactValues = new
LinkedHashMap<>(currentSnapshot.getExactValues());
Map<String, Collection<String>> newNormalizedIdentifiers =
copyNormalizedIdentifiers(currentSnapshot.getNormalizedIdentifierNames());
- IdentifierCasePolicy policy =
databaseIdentifierContext.getPolicy(identifierScope);
+ IdentifierCasePolicy policy =
databaseIdentifierContext.getMetaDataPolicy(identifierScope);
if (newExactValues.containsKey(name)) {
removeNormalizedIdentifier(newNormalizedIdentifiers, policy, name);
}
@@ -118,7 +118,7 @@ public final class IdentifierIndex<T> {
}
Map<String, T> newExactValues = new
LinkedHashMap<>(currentSnapshot.getExactValues());
Map<String, Collection<String>> newNormalizedIdentifiers =
copyNormalizedIdentifiers(currentSnapshot.getNormalizedIdentifierNames());
- IdentifierCasePolicy policy =
databaseIdentifierContext.getPolicy(identifierScope);
+ IdentifierCasePolicy policy =
databaseIdentifierContext.getMetaDataPolicy(identifierScope);
T result = newExactValues.remove(name);
removeNormalizedIdentifier(newNormalizedIdentifiers, policy, name);
snapshot = createSnapshot(newExactValues, newNormalizedIdentifiers,
policy);
@@ -161,7 +161,7 @@ public final class IdentifierIndex<T> {
*/
public T get(final String identifier) {
Snapshot<T> currentSnapshot = snapshot;
- IdentifierCasePolicy policy =
databaseIdentifierContext.getPolicy(identifierScope);
+ IdentifierCasePolicy policy =
databaseIdentifierContext.getMetaDataPolicy(identifierScope);
if (LookupMode.EXACT == policy.getLookupMode(QuoteCharacter.NONE)) {
return currentSnapshot.getExactValues().get(identifier);
}
@@ -176,7 +176,7 @@ public final class IdentifierIndex<T> {
*/
public Optional<T> find(final IdentifierValue identifierValue) {
Snapshot<T> currentSnapshot = snapshot;
- IdentifierCasePolicy policy =
databaseIdentifierContext.getPolicy(identifierScope);
+ IdentifierCasePolicy policy =
databaseIdentifierContext.getMetaDataPolicy(identifierScope);
if (LookupMode.EXACT ==
policy.getLookupMode(identifierValue.getQuoteCharacter())) {
return
Optional.ofNullable(currentSnapshot.getExactValues().get(identifierValue.getValue()));
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
index 96331e811ab..8872e03c904 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/ShardingSphereDatabaseTest.java
@@ -18,9 +18,7 @@
package org.apache.shardingsphere.infra.metadata.database;
import lombok.SneakyThrows;
-import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
@@ -45,6 +43,7 @@ import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMappe
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.infra.util.props.PropertiesBuilder;
import org.apache.shardingsphere.infra.util.props.PropertiesBuilder.Property;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.apache.shardingsphere.test.infra.fixture.jdbc.MockedDataSource;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -231,7 +230,7 @@ class ShardingSphereDatabaseTest {
database.refreshIdentifierContext(new ConfigurationProperties(
PropertiesBuilder.build(new
Property(TemporaryConfigurationPropertyKey.METADATA_IDENTIFIER_CASE_SENSITIVITY.getKey(),
MetadataIdentifierCaseSensitivity.INSENSITIVE.name()))));
DatabaseIdentifierContext actualIdentifierContext =
getIdentifierContext(database);
-
assertThat(actualIdentifierContext.getPolicy(IdentifierScope.SCHEMA).getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
+
assertTrue(actualIdentifierContext.matchesMetaData(IdentifierScope.SCHEMA,
"foo_schema", new IdentifierValue("FOO_SCHEMA")));
assertThat(getIdentifierContext(schema), is(actualIdentifierContext));
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java
index ca9848ab465..bc6ccd2b1a8 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/model/ShardingSphereSchemaTest.java
@@ -310,10 +310,7 @@ class ShardingSphereSchemaTest {
void
assertContainsTableByLogicalTableIndexWhenHeterogeneousLookupEnabled() {
ShardingSphereTable table = new ShardingSphereTable("foo_tbl",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
postgreSQLDatabaseType, Collections.singleton(table), Collections.emptyList());
- Map<IdentifierScope, IdentifierCasePolicy> scopedRules = new
EnumMap<>(IdentifierScope.class);
- scopedRules.put(IdentifierScope.LOGICAL_TABLE,
IdentifierCasePolicyFactory.newLowerCasePolicySet().getPolicy(IdentifierScope.TABLE));
- DatabaseIdentifierContext context = new DatabaseIdentifierContext(new
IdentifierCasePolicySet(IdentifierCasePolicyFactory.newUpperCasePolicySet()
- .getPolicy(IdentifierScope.TABLE), scopedRules), true);
+ DatabaseIdentifierContext context =
createHeterogeneousIdentifierContext();
schema.refreshIdentifierContext(context);
assertTrue(schema.containsTable("FOO_TBL"));
assertThat(schema.getTable("FOO_TBL"), is(table));
@@ -324,10 +321,7 @@ class ShardingSphereSchemaTest {
ShardingSphereTable lowerCaseTable = new
ShardingSphereTable("foo_tbl", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
ShardingSphereTable upperCaseTable = new
ShardingSphereTable("FOO_TBL", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
postgreSQLDatabaseType, Arrays.asList(lowerCaseTable, upperCaseTable),
Collections.emptyList());
- Map<IdentifierScope, IdentifierCasePolicy> scopedRules = new
EnumMap<>(IdentifierScope.class);
- scopedRules.put(IdentifierScope.LOGICAL_TABLE,
IdentifierCasePolicyFactory.newLowerCasePolicySet().getPolicy(IdentifierScope.TABLE));
- DatabaseIdentifierContext context = new DatabaseIdentifierContext(new
IdentifierCasePolicySet(IdentifierCasePolicyFactory.newUpperCasePolicySet()
- .getPolicy(IdentifierScope.TABLE), scopedRules), true);
+ DatabaseIdentifierContext context =
createHeterogeneousIdentifierContext();
schema.refreshIdentifierContext(context);
assertThat(schema.getTable("FOO_TBL"), is(upperCaseTable));
}
@@ -336,10 +330,7 @@ class ShardingSphereSchemaTest {
void assertRemoveTableByLogicalTableIndexWhenHeterogeneousLookupEnabled() {
ShardingSphereTable table = new ShardingSphereTable("foo_tbl",
Collections.emptyList(), Collections.emptyList(), Collections.emptyList());
ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
postgreSQLDatabaseType, Collections.singleton(table), Collections.emptyList());
- Map<IdentifierScope, IdentifierCasePolicy> scopedRules = new
EnumMap<>(IdentifierScope.class);
- scopedRules.put(IdentifierScope.LOGICAL_TABLE,
IdentifierCasePolicyFactory.newLowerCasePolicySet().getPolicy(IdentifierScope.TABLE));
- DatabaseIdentifierContext context = new DatabaseIdentifierContext(new
IdentifierCasePolicySet(IdentifierCasePolicyFactory.newUpperCasePolicySet()
- .getPolicy(IdentifierScope.TABLE), scopedRules), true);
+ DatabaseIdentifierContext context =
createHeterogeneousIdentifierContext();
schema.refreshIdentifierContext(context);
schema.removeTable("FOO_TBL");
assertNull(schema.getTable("foo_tbl"));
@@ -359,10 +350,7 @@ class ShardingSphereSchemaTest {
ShardingSphereTable lowerCaseTable = new
ShardingSphereTable("foo_tbl", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
ShardingSphereTable upperCaseTable = new
ShardingSphereTable("FOO_TBL", Collections.emptyList(),
Collections.emptyList(), Collections.emptyList());
ShardingSphereSchema schema = new ShardingSphereSchema("foo_schema",
postgreSQLDatabaseType, Arrays.asList(lowerCaseTable, upperCaseTable),
Collections.emptyList());
- Map<IdentifierScope, IdentifierCasePolicy> scopedRules = new
EnumMap<>(IdentifierScope.class);
- scopedRules.put(IdentifierScope.LOGICAL_TABLE,
IdentifierCasePolicyFactory.newLowerCasePolicySet().getPolicy(IdentifierScope.TABLE));
- DatabaseIdentifierContext context = new DatabaseIdentifierContext(new
IdentifierCasePolicySet(IdentifierCasePolicyFactory.newUpperCasePolicySet()
- .getPolicy(IdentifierScope.TABLE), scopedRules), true);
+ DatabaseIdentifierContext context =
createHeterogeneousIdentifierContext();
schema.refreshIdentifierContext(context);
schema.removeTable("FOO_TBL");
assertThat(schema.getTable("FOO_TBL"), is(lowerCaseTable));
@@ -376,4 +364,11 @@ class ShardingSphereSchemaTest {
schema.removeView("Foo_View");
assertTrue(schema.getAllViews().isEmpty());
}
+
+ private DatabaseIdentifierContext createHeterogeneousIdentifierContext() {
+ Map<IdentifierScope, IdentifierCasePolicy> scopedRules = new
EnumMap<>(IdentifierScope.class);
+ scopedRules.put(IdentifierScope.LOGICAL_TABLE,
IdentifierCasePolicyFactory.newLowerCasePolicySet().getPolicy(IdentifierScope.TABLE));
+ IdentifierCasePolicySet policySet = new
IdentifierCasePolicySet(IdentifierCasePolicyFactory.newUpperCasePolicySet().getPolicy(IdentifierScope.TABLE),
scopedRules);
+ return new DatabaseIdentifierContext(policySet, policySet, policySet,
true);
+ }
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
index 6e1c2589dac..cd7c3b63014 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/util/SchemaMetaDataUtilsTest.java
@@ -22,6 +22,8 @@ import
org.apache.shardingsphere.database.connector.core.metadata.data.loader.Me
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import
org.apache.shardingsphere.infra.config.props.MetadataIdentifierCaseSensitivity;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.datanode.UnsupportedActualDataNodeStructureException;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
@@ -140,7 +142,8 @@ class SchemaMetaDataUtilsTest {
void
assertGetMetaDataLoaderMaterialsNormalizeActualTableNamesByTableScope() {
Map<String, StorageUnit> storageUnits = new LinkedHashMap<>(1, 1F);
storageUnits.put("ds_0", mockStorageUnit(ORACLE_DATABASE_TYPE,
mock(DataSource.class)));
- ConfigurationProperties props = new ConfigurationProperties(new
Properties());
+ ConfigurationProperties props = new
ConfigurationProperties(PropertiesBuilder.build(new Property(
+
TemporaryConfigurationPropertyKey.METADATA_IDENTIFIER_CASE_SENSITIVITY.getKey(),
MetadataIdentifierCaseSensitivity.INSENSITIVE.name())));
GenericSchemaBuilderMaterial material = new
GenericSchemaBuilderMaterial(storageUnits,
Collections.singleton(mockDataNodeRule(Collections.singleton(new
DataNode("ds_0.t_user")))), props, "foo_db",
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
new ResourceMetaData(Collections.emptyMap(), storageUnits), props));
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 65e7b1af2c2..33486a9b3a8 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
@@ -95,7 +95,7 @@ class DatabaseIdentifierContextFactoryTest {
@Test
void assertCreateDefault() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
- IdentifierCasePolicy actualRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertThat(actualRule.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
assertTrue(actualRule.matches("Foo", "foo", QuoteCharacter.NONE));
}
@@ -105,7 +105,7 @@ class DatabaseIdentifierContextFactoryTest {
void assertCreateWithProtocolTypeAndProps(final String name, final
DatabaseType protocolType, final ConfigurationProperties props, final
LookupMode expectedLookupMode,
final String actualIdentifier,
final String logicIdentifier, final boolean expectedMatched) {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(protocolType, props);
- IdentifierCasePolicy actualRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertThat(actualRule.getLookupMode(QuoteCharacter.NONE),
is(expectedLookupMode));
assertThat(actualRule.matches(actualIdentifier, logicIdentifier,
QuoteCharacter.NONE), is(expectedMatched));
}
@@ -116,11 +116,30 @@ class DatabaseIdentifierContextFactoryTest {
final
ConfigurationProperties props, final LookupMode expectedLookupMode,
final String
actualIdentifier, final String logicIdentifier, final boolean expectedMatched) {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(protocolType, resourceMetaData, props);
- IdentifierCasePolicy actualRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertThat(actualRule.getLookupMode(QuoteCharacter.NONE),
is(expectedLookupMode));
assertThat(actualRule.matches(actualIdentifier, logicIdentifier,
QuoteCharacter.NONE), is(expectedMatched));
}
+ @Test
+ void assertInsensitivePropsOnlyAffectMetaDataPolicy() {
+ DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(ORACLE_DATABASE_TYPE,
POSTGRESQL_RESOURCE_META_DATA,
+
createConfigurationProperties(MetadataIdentifierCaseSensitivity.INSENSITIVE));
+ assertThat(actual.normalizeProtocol(IdentifierScope.TABLE, new
IdentifierValue("Foo")), is("FOO"));
+ assertThat(actual.normalizeStorage(IdentifierScope.TABLE, new
IdentifierValue("Foo")), is("foo"));
+
assertThat(actual.getMetaDataPolicy(IdentifierScope.TABLE).normalize("Foo"),
is("foo"));
+ }
+
+ @Test
+ void assertRefreshWithInsensitivePropsOnlyAffectsMetaDataPolicy() {
+ DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
+ DatabaseIdentifierContextFactory.refresh(actual, ORACLE_DATABASE_TYPE,
POSTGRESQL_RESOURCE_META_DATA,
+
createConfigurationProperties(MetadataIdentifierCaseSensitivity.INSENSITIVE));
+ assertThat(actual.normalizeProtocol(IdentifierScope.TABLE, new
IdentifierValue("Foo")), is("FOO"));
+ assertThat(actual.normalizeStorage(IdentifierScope.TABLE, new
IdentifierValue("Foo")), is("foo"));
+
assertThat(actual.getMetaDataPolicy(IdentifierScope.TABLE).normalize("Foo"),
is("foo"));
+ }
+
@ParameterizedTest(name = "{0}")
@MethodSource("refreshWithResourceMetaDataAndPropsArguments")
void assertRefreshWithResourceMetaDataAndProps(final String name, final
DatabaseType protocolType, final ResourceMetaData resourceMetaData,
@@ -128,7 +147,7 @@ class DatabaseIdentifierContextFactoryTest {
final String
actualIdentifier, final String logicIdentifier, final boolean expectedMatched) {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
DatabaseIdentifierContextFactory.refresh(actual, protocolType,
resourceMetaData, props);
- IdentifierCasePolicy actualRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertThat(actualRule.getLookupMode(QuoteCharacter.NONE),
is(expectedLookupMode));
assertThat(actualRule.matches(actualIdentifier, logicIdentifier,
QuoteCharacter.NONE), is(expectedMatched));
}
@@ -136,8 +155,8 @@ class DatabaseIdentifierContextFactoryTest {
@Test
void assertCreateUsesProtocolRuleForSchemaAndStorageRuleForTable() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
ORACLE_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
- IdentifierCasePolicy actualSchemaRule =
actual.getPolicy(IdentifierScope.SCHEMA);
- IdentifierCasePolicy actualTableRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualSchemaRule =
actual.getMetaDataPolicy(IdentifierScope.SCHEMA);
+ IdentifierCasePolicy actualTableRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertTrue(actualSchemaRule.matches("test_db", "TEST_DB",
QuoteCharacter.NONE));
assertTrue(actualTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
}
@@ -146,8 +165,8 @@ class DatabaseIdentifierContextFactoryTest {
void assertRefreshUsesProtocolRuleForSchemaAndStorageRuleForTable() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
DatabaseIdentifierContextFactory.refresh(actual, MYSQL_DATABASE_TYPE,
ORACLE_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
- IdentifierCasePolicy actualSchemaRule =
actual.getPolicy(IdentifierScope.SCHEMA);
- IdentifierCasePolicy actualTableRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualSchemaRule =
actual.getMetaDataPolicy(IdentifierScope.SCHEMA);
+ IdentifierCasePolicy actualTableRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertTrue(actualSchemaRule.matches("test_db", "TEST_DB",
QuoteCharacter.NONE));
assertTrue(actualTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
}
@@ -155,8 +174,8 @@ class DatabaseIdentifierContextFactoryTest {
@Test
void
assertCreateUsesProtocolRuleForLogicalTableAndEnablesHeterogeneousLookup() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
ORACLE_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
- IdentifierCasePolicy actualLogicalTableRule =
actual.getPolicy(IdentifierScope.LOGICAL_TABLE);
- IdentifierCasePolicy actualTableRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualLogicalTableRule =
actual.getMetaDataPolicy(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCasePolicy actualTableRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertTrue(actual.isHeterogeneousTableLookupEnabled());
assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
assertTrue(actualTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
@@ -166,8 +185,8 @@ class DatabaseIdentifierContextFactoryTest {
void
assertRefreshUsesProtocolRuleForLogicalTableAndEnablesHeterogeneousLookup() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
DatabaseIdentifierContextFactory.refresh(actual, MYSQL_DATABASE_TYPE,
ORACLE_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
- IdentifierCasePolicy actualLogicalTableRule =
actual.getPolicy(IdentifierScope.LOGICAL_TABLE);
- IdentifierCasePolicy actualTableRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualLogicalTableRule =
actual.getMetaDataPolicy(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCasePolicy actualTableRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertTrue(actual.isHeterogeneousTableLookupEnabled());
assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
assertTrue(actualTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
@@ -177,7 +196,7 @@ class DatabaseIdentifierContextFactoryTest {
void assertCreateDoesNotUseStorageDataSourceForProtocolPolicy() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
createResourceMetaDataWithStorageUnit("jdbc:oracle:thin:@localhost:1521:xe",
createDataSourceFailingOnConnection()), new ConfigurationProperties(new
Properties()));
-
assertTrue(actual.getPolicy(IdentifierScope.LOGICAL_TABLE).matches("t_order",
"T_ORDER", QuoteCharacter.NONE));
+
assertTrue(actual.getMetaDataPolicy(IdentifierScope.LOGICAL_TABLE).matches("t_order",
"T_ORDER", QuoteCharacter.NONE));
}
@Test
@@ -185,14 +204,14 @@ class DatabaseIdentifierContextFactoryTest {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
DatabaseIdentifierContextFactory.refresh(actual, MYSQL_DATABASE_TYPE,
createResourceMetaDataWithStorageUnit("jdbc:oracle:thin:@localhost:1521:xe",
createDataSourceFailingOnConnection()), new ConfigurationProperties(new
Properties()));
-
assertTrue(actual.getPolicy(IdentifierScope.LOGICAL_TABLE).matches("t_order",
"T_ORDER", QuoteCharacter.NONE));
+
assertTrue(actual.getMetaDataPolicy(IdentifierScope.LOGICAL_TABLE).matches("t_order",
"T_ORDER", QuoteCharacter.NONE));
}
@Test
void
assertCreateUsesInsensitiveRuleForLogicalTableWhenMySQLLowerCaseTableNamesIsZero()
{
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
MYSQL_SENSITIVE_STORAGE_RESOURCE_META_DATA, new ConfigurationProperties(new
Properties()));
- IdentifierCasePolicy actualLogicalTableRule =
actual.getPolicy(IdentifierScope.LOGICAL_TABLE);
- IdentifierCasePolicy actualTableRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualLogicalTableRule =
actual.getMetaDataPolicy(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCasePolicy actualTableRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
assertFalse(actualTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
}
@@ -201,8 +220,8 @@ class DatabaseIdentifierContextFactoryTest {
void
assertRefreshUsesInsensitiveRuleForLogicalTableWhenMySQLLowerCaseTableNamesIsZero()
{
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
DatabaseIdentifierContextFactory.refresh(actual, MYSQL_DATABASE_TYPE,
MYSQL_SENSITIVE_STORAGE_RESOURCE_META_DATA, new ConfigurationProperties(new
Properties()));
- IdentifierCasePolicy actualLogicalTableRule =
actual.getPolicy(IdentifierScope.LOGICAL_TABLE);
- IdentifierCasePolicy actualTableRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualLogicalTableRule =
actual.getMetaDataPolicy(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCasePolicy actualTableRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
assertFalse(actualTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
}
@@ -210,8 +229,8 @@ class DatabaseIdentifierContextFactoryTest {
@Test
void assertCreateKeepsPostgreSQLLogicalTableRuleWithResourceMetadata() {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(POSTGRESQL_DATABASE_TYPE,
POSTGRESQL_RESOURCE_META_DATA, new ConfigurationProperties(new Properties()));
- IdentifierCasePolicy actualLogicalTableRule =
actual.getPolicy(IdentifierScope.LOGICAL_TABLE);
- IdentifierCasePolicy actualTableRule =
actual.getPolicy(IdentifierScope.TABLE);
+ IdentifierCasePolicy actualLogicalTableRule =
actual.getMetaDataPolicy(IdentifierScope.LOGICAL_TABLE);
+ IdentifierCasePolicy actualTableRule =
actual.getMetaDataPolicy(IdentifierScope.TABLE);
assertTrue(actualLogicalTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
assertTrue(actualTableRule.matches("t_order", "T_ORDER",
QuoteCharacter.NONE));
assertFalse(actualLogicalTableRule.matches("T_ORDER", "t_order",
QuoteCharacter.NONE));
@@ -258,7 +277,7 @@ class DatabaseIdentifierContextFactoryTest {
@MethodSource("storageObjectScopes")
void assertCreateUsesInsensitiveRuleForStorageObjectScope(final String
name, final IdentifierScope identifierScope) {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.create(MYSQL_DATABASE_TYPE,
MYSQL_SENSITIVE_STORAGE_RESOURCE_META_DATA, new ConfigurationProperties(new
Properties()));
- IdentifierCasePolicy actualRule = actual.getPolicy(identifierScope);
+ IdentifierCasePolicy actualRule =
actual.getMetaDataPolicy(identifierScope);
assertThat(actualRule.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
assertThat(actualRule.getLookupMode(QuoteCharacter.BACK_QUOTE),
is(LookupMode.NORMALIZED));
assertTrue(actualRule.matches("foo_name", "FOO_NAME",
QuoteCharacter.NONE));
@@ -270,7 +289,7 @@ class DatabaseIdentifierContextFactoryTest {
void assertRefreshUsesInsensitiveRuleForStorageObjectScope(final String
name, final IdentifierScope identifierScope) {
DatabaseIdentifierContext actual =
DatabaseIdentifierContextFactory.createDefault();
DatabaseIdentifierContextFactory.refresh(actual, MYSQL_DATABASE_TYPE,
MYSQL_SENSITIVE_STORAGE_RESOURCE_META_DATA, new ConfigurationProperties(new
Properties()));
- IdentifierCasePolicy actualRule = actual.getPolicy(identifierScope);
+ IdentifierCasePolicy actualRule =
actual.getMetaDataPolicy(identifierScope);
assertThat(actualRule.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
assertThat(actualRule.getLookupMode(QuoteCharacter.BACK_QUOTE),
is(LookupMode.NORMALIZED));
assertTrue(actualRule.matches("foo_name", "FOO_NAME",
QuoteCharacter.NONE));
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextTest.java
index 68079e060ed..735dbaecdb9 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/DatabaseIdentifierContextTest.java
@@ -17,35 +17,58 @@
package org.apache.shardingsphere.infra.metadata.identifier;
+import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicyFactory;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicySet;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.StandardIdentifierCasePolicy;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.Test;
import java.util.Locale;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertTrue;
class DatabaseIdentifierContextTest {
@Test
- void assertGetPolicy() {
- IdentifierCasePolicy expectedRule = createLowerRule();
- DatabaseIdentifierContext context = new DatabaseIdentifierContext(new
IdentifierCasePolicySet(expectedRule));
- IdentifierCasePolicy actualRule =
context.getPolicy(IdentifierScope.TABLE);
- assertThat(actualRule, is(expectedRule));
+ void assertRefresh() {
+ DatabaseIdentifierContext context = new DatabaseIdentifierContext(new
IdentifierCasePolicySet(createLowerRule()));
+ context.refresh(new IdentifierCasePolicySet(createUpperRule()), new
IdentifierCasePolicySet(createLowerRule()),
+ new IdentifierCasePolicySet(createUpperRule()), true);
+ assertThat(context.normalizeProtocol(IdentifierScope.TABLE, new
IdentifierValue("Foo")), is("FOO"));
+ assertThat(context.normalizeStorage(IdentifierScope.TABLE, new
IdentifierValue("Foo")), is("foo"));
+ assertTrue(context.matchesMetaData(IdentifierScope.TABLE, "FOO", new
IdentifierValue("foo")));
+ assertTrue(context.isHeterogeneousTableLookupEnabled());
}
@Test
- void assertRefresh() {
- DatabaseIdentifierContext context = new DatabaseIdentifierContext(new
IdentifierCasePolicySet(createLowerRule()));
- IdentifierCasePolicy expectedRule = createUpperRule();
- context.refresh(new IdentifierCasePolicySet(expectedRule));
- IdentifierCasePolicy actualRule =
context.getPolicy(IdentifierScope.TABLE);
- assertThat(actualRule, is(expectedRule));
+ void assertMatchesMetaData() {
+
assertTrue(createContextWithDistinctPolicies().matchesMetaData(IdentifierScope.TABLE,
"foo", new IdentifierValue("FOO")));
+ }
+
+ @Test
+ void assertNormalizeProtocol() {
+
assertThat(createContextWithDistinctPolicies().normalizeProtocol(IdentifierScope.TABLE,
new IdentifierValue("Foo")), is("FOO"));
+ }
+
+ @Test
+ void assertNormalizeStorage() {
+
assertThat(createContextWithDistinctPolicies().normalizeStorage(IdentifierScope.TABLE,
new IdentifierValue("Foo")), is("foo"));
+ }
+
+ @Test
+ void assertNormalizeStorageWithQuotedIdentifier() {
+
assertThat(createContextWithDistinctPolicies().normalizeStorage(IdentifierScope.TABLE,
new IdentifierValue("Foo", QuoteCharacter.QUOTE)), is("Foo"));
+ }
+
+ private DatabaseIdentifierContext createContextWithDistinctPolicies() {
+ return new
DatabaseIdentifierContext(IdentifierCasePolicyFactory.newUpperCasePolicySet(),
IdentifierCasePolicyFactory.newLowerCasePolicySet(),
+ IdentifierCasePolicyFactory.newInsensitivePolicySet(), false);
}
private IdentifierCasePolicy createLowerRule() {
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolverTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolverTest.java
index 6b439f120fa..da77dfb3ff9 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolverTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/IdentifierCasePolicyResolverTest.java
@@ -20,36 +20,18 @@ package org.apache.shardingsphere.infra.metadata.identifier;
import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.infra.util.props.PropertiesBuilder;
-import org.apache.shardingsphere.infra.util.props.PropertiesBuilder.Property;
import org.junit.jupiter.api.Test;
-import java.util.Properties;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class IdentifierCasePolicyResolverTest {
- @Test
- void assertResolveWithInsensitiveConfiguration() {
- IdentifierCasePolicy actual =
-
IdentifierCasePolicyResolver.resolveProtocol(TypedSPILoader.getService(DatabaseType.class,
"Oracle"), new ConfigurationProperties(createProperties("insensitive")))
- .getPolicy(IdentifierScope.TABLE);
- assertThat(actual.getLookupMode(QuoteCharacter.NONE),
is(LookupMode.NORMALIZED));
- assertTrue(actual.matches("Foo", "foo", QuoteCharacter.NONE));
- }
-
@Test
void assertResolveWithAutoPostgreSQLRule() {
- IdentifierCasePolicy actual =
IdentifierCasePolicyResolver.resolveProtocol(TypedSPILoader.getService(DatabaseType.class,
"PostgreSQL"), new ConfigurationProperties(new Properties()))
+ IdentifierCasePolicy actual =
IdentifierCasePolicyResolver.resolveProtocol(TypedSPILoader.getService(DatabaseType.class,
"PostgreSQL"))
.getPolicy(IdentifierScope.TABLE);
assertTrue(actual.matches("foo", "FOO", QuoteCharacter.NONE));
assertFalse(actual.matches("Foo", "foo", QuoteCharacter.NONE));
@@ -57,7 +39,7 @@ class IdentifierCasePolicyResolverTest {
@Test
void assertResolveWithAutoOracleRule() {
- IdentifierCasePolicy actual =
IdentifierCasePolicyResolver.resolveProtocol(TypedSPILoader.getService(DatabaseType.class,
"Oracle"), new ConfigurationProperties(new Properties()))
+ IdentifierCasePolicy actual =
IdentifierCasePolicyResolver.resolveProtocol(TypedSPILoader.getService(DatabaseType.class,
"Oracle"))
.getPolicy(IdentifierScope.TABLE);
assertTrue(actual.matches("FOO", "foo", QuoteCharacter.NONE));
assertFalse(actual.matches("Foo", "foo", QuoteCharacter.NONE));
@@ -65,13 +47,9 @@ class IdentifierCasePolicyResolverTest {
@Test
void assertResolveWithAutoMySQLRule() {
- IdentifierCasePolicy actual =
IdentifierCasePolicyResolver.resolveProtocol(TypedSPILoader.getService(DatabaseType.class,
"MySQL"), new ConfigurationProperties(new Properties()))
+ IdentifierCasePolicy actual =
IdentifierCasePolicyResolver.resolveProtocol(TypedSPILoader.getService(DatabaseType.class,
"MySQL"))
.getPolicy(IdentifierScope.TABLE);
assertTrue(actual.matches("Foo", "foo", QuoteCharacter.NONE));
assertTrue(actual.matches("Foo", "foo", QuoteCharacter.BACK_QUOTE));
}
-
- private Properties createProperties(final String value) {
- return PropertiesBuilder.build(new
Property(TemporaryConfigurationPropertyKey.METADATA_IDENTIFIER_CASE_SENSITIVITY.getKey(),
value));
- }
}
diff --git
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
index d531158d295..6731bbc2705 100644
---
a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
+++
b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/rule/SingleRule.java
@@ -19,8 +19,6 @@ package org.apache.shardingsphere.single.rule;
import com.cedarsoftware.util.CaseInsensitiveSet;
import lombok.Getter;
-import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
@@ -30,6 +28,7 @@ import
org.apache.shardingsphere.infra.metadata.database.resource.PhysicalDataSo
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
import
org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtils;
+import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
import
org.apache.shardingsphere.infra.rule.attribute.datasource.aggregate.AggregatedDataSourceRuleAttribute;
@@ -44,6 +43,7 @@ import
org.apache.shardingsphere.single.rule.attribute.SingleTableMapperRuleAttr
import
org.apache.shardingsphere.single.rule.attribute.SingleUnregisterStorageUnitRuleAttribute;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.statement.attribute.type.IndexSQLStatementAttribute;
+import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import javax.sql.DataSource;
import java.util.ArrayList;
@@ -156,19 +156,18 @@ public final class SingleRule implements DatabaseRule {
*/
public Collection<QualifiedTable> getSingleTables(final
Collection<QualifiedTable> qualifiedTables, final ShardingSphereDatabase
database) {
Collection<QualifiedTable> result = new LinkedList<>();
- IdentifierCasePolicy schemaRule =
database.getIdentifierCasePolicy(IdentifierScope.SCHEMA);
for (QualifiedTable each : qualifiedTables) {
Collection<DataNode> dataNodes =
mutableDataNodeRuleAttribute.findTableDataNodes(each.getTableName());
- if (!dataNodes.isEmpty() && containsDataNode(each, dataNodes,
schemaRule)) {
+ if (!dataNodes.isEmpty() && containsDataNode(each, dataNodes,
database.getIdentifierContext())) {
result.add(each);
}
}
return result;
}
- private boolean containsDataNode(final QualifiedTable qualifiedTable,
final Collection<DataNode> dataNodes, final IdentifierCasePolicy
databasePolicy) {
+ private boolean containsDataNode(final QualifiedTable qualifiedTable,
final Collection<DataNode> dataNodes, final DatabaseIdentifierContext
identifierContext) {
for (DataNode each : dataNodes) {
- if (databasePolicy.matches(each.getSchemaName(),
qualifiedTable.getSchemaName(), QuoteCharacter.NONE)) {
+ if (identifierContext.matchesMetaData(IdentifierScope.SCHEMA,
each.getSchemaName(), new IdentifierValue(qualifiedTable.getSchemaName()))) {
return true;
}
}
@@ -210,10 +209,9 @@ public final class SingleRule implements DatabaseRule {
* @return matched data node
*/
public Optional<DataNode> findTableDataNode(final ShardingSphereDatabase
database, final QualifiedTable qualifiedTable) {
- IdentifierCasePolicy schemaRule =
database.getIdentifierCasePolicy(IdentifierScope.SCHEMA);
Collection<DataNode> dataNodes =
mutableDataNodeRuleAttribute.findTableDataNodes(qualifiedTable.getTableName());
for (DataNode each : dataNodes) {
- if (schemaRule.matches(each.getSchemaName(),
qualifiedTable.getSchemaName(), QuoteCharacter.NONE)) {
+ if
(database.getIdentifierContext().matchesMetaData(IdentifierScope.SCHEMA,
each.getSchemaName(), new IdentifierValue(qualifiedTable.getSchemaName()))) {
return Optional.of(each);
}
}
diff --git
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
index d07fb380e63..6a621384720 100644
---
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
+++
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/route/engine/SingleRouteEngineTest.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.single.route.engine;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicySet;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.StandardIdentifierCasePolicy;
import
org.apache.shardingsphere.database.exception.core.exception.syntax.table.TableExistsException;
@@ -28,6 +28,7 @@ import
org.apache.shardingsphere.infra.exception.generic.UnsupportedSQLOperation
import org.apache.shardingsphere.infra.hint.HintValueContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
+import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
import org.apache.shardingsphere.infra.route.context.RouteContext;
import org.apache.shardingsphere.infra.route.context.RouteMapper;
import org.apache.shardingsphere.infra.route.context.RouteUnit;
@@ -241,7 +242,7 @@ class SingleRouteEngineTest {
private ShardingSphereDatabase mockDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
IdentifierCasePolicy identifierCasePolicy = new
StandardIdentifierCasePolicy(LookupMode.NORMALIZED, LookupMode.NORMALIZED, each
-> each.toLowerCase(Locale.ENGLISH), each -> true);
-
when(result.getIdentifierCasePolicy(IdentifierScope.SCHEMA)).thenReturn(identifierCasePolicy);
+ when(result.getIdentifierContext()).thenReturn(new
DatabaseIdentifierContext(new IdentifierCasePolicySet(identifierCasePolicy)));
return result;
}
}
diff --git
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/SingleRuleTest.java
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/SingleRuleTest.java
index 66678b24e2b..42ccd7cf7c5 100644
---
a/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/SingleRuleTest.java
+++
b/kernel/single/core/src/test/java/org/apache/shardingsphere/single/rule/SingleRuleTest.java
@@ -18,7 +18,7 @@
package org.apache.shardingsphere.single.rule;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicySet;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.StandardIdentifierCasePolicy;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
@@ -28,6 +28,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.schema.QualifiedTable;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
+import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.DataNodeRuleAttribute;
@@ -409,7 +410,7 @@ class SingleRuleTest {
private ShardingSphereDatabase mockDatabase() {
ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
IdentifierCasePolicy identifierCasePolicy = new
StandardIdentifierCasePolicy(LookupMode.NORMALIZED, LookupMode.NORMALIZED, each
-> each.toLowerCase(Locale.ENGLISH), each -> true);
-
when(result.getIdentifierCasePolicy(IdentifierScope.SCHEMA)).thenReturn(identifierCasePolicy);
+ when(result.getIdentifierContext()).thenReturn(new
DatabaseIdentifierContext(new IdentifierCasePolicySet(identifierCasePolicy)));
when(result.getName()).thenReturn("foo_db");
return result;
}
diff --git
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoader.java
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoader.java
index f09564e64cb..edc560226c4 100644
---
a/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoader.java
+++
b/mcp/support/src/main/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoader.java
@@ -21,7 +21,6 @@ import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicySet;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeFactory;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import
org.apache.shardingsphere.infra.exception.external.ShardingSphereExternalException;
import
org.apache.shardingsphere.infra.metadata.identifier.IdentifierCasePolicyResolver;
import
org.apache.shardingsphere.mcp.support.database.metadata.TransactionCapability;
@@ -36,7 +35,6 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
-import java.util.Properties;
import java.util.logging.Logger;
/**
@@ -91,8 +89,7 @@ public final class MCPJdbcDatabaseProfileLoader {
private IdentifierCasePolicySet resolveIdentifierCasePolicySet(final
String databaseName, final DatabaseType databaseType,
final
RuntimeDatabaseConfiguration runtimeDatabaseConfig) {
- return IdentifierCasePolicyResolver.resolveStorage(databaseType, new
ConfigurationProperties(new Properties()),
- new RuntimeDatabaseDataSource(databaseName,
runtimeDatabaseConfig));
+ return IdentifierCasePolicyResolver.resolveStorage(databaseType, new
RuntimeDatabaseDataSource(databaseName, runtimeDatabaseConfig));
}
private DatabaseType loadDatabaseType(final String databaseName, final
DatabaseMetaData databaseMetaData) throws SQLException {
diff --git
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
index efcc8c4ad7e..55d71887d54 100644
---
a/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
+++
b/mcp/support/src/test/java/org/apache/shardingsphere/mcp/support/database/metadata/jdbc/MCPJdbcDatabaseProfileLoaderTest.java
@@ -58,7 +58,7 @@ class MCPJdbcDatabaseProfileLoaderTest {
try (
MockedStatic<DatabaseTypeFactory> ignored =
SupportDatabaseTypeFactoryMocker.mockByConnectionMetadata();
MockedStatic<IdentifierCasePolicyResolver> ignoredResolver =
mockStatic(IdentifierCasePolicyResolver.class)) {
- ignoredResolver.when(() ->
IdentifierCasePolicyResolver.resolveStorage(any(), any(),
any())).thenReturn(expectedIdentifierCasePolicySet);
+ ignoredResolver.when(() ->
IdentifierCasePolicyResolver.resolveStorage(any(),
any())).thenReturn(expectedIdentifierCasePolicySet);
RuntimeDatabaseProfile actual =
new MCPJdbcDatabaseProfileLoader().load("logic_db",
createRuntimeDatabaseConfiguration(SupportDatabaseTypeFactoryMocker.createJdbcUrl("FixtureDB"),
"1.0", true, true));
assertThat(actual.getDatabase(), is("logic_db"));
@@ -107,8 +107,8 @@ class MCPJdbcDatabaseProfileLoaderTest {
try (
MockedStatic<DatabaseTypeFactory> ignored =
SupportDatabaseTypeFactoryMocker.mockByConnectionMetadata();
MockedStatic<IdentifierCasePolicyResolver> ignoredResolver =
mockStatic(IdentifierCasePolicyResolver.class)) {
- ignoredResolver.when(() ->
IdentifierCasePolicyResolver.resolveStorage(any(), any(),
any())).thenAnswer(invocation -> {
- try (Connection connection = invocation.getArgument(2,
DataSource.class).getConnection()) {
+ ignoredResolver.when(() ->
IdentifierCasePolicyResolver.resolveStorage(any(),
any())).thenAnswer(invocation -> {
+ try (Connection connection = invocation.getArgument(1,
DataSource.class).getConnection()) {
return policies.get(connection);
}
});
@@ -133,8 +133,8 @@ class MCPJdbcDatabaseProfileLoaderTest {
try (
MockedStatic<DatabaseTypeFactory> ignored =
SupportDatabaseTypeFactoryMocker.mockByConnectionMetadata();
MockedStatic<IdentifierCasePolicyResolver> ignoredResolver =
mockStatic(IdentifierCasePolicyResolver.class)) {
- ignoredResolver.when(() ->
IdentifierCasePolicyResolver.resolveStorage(any(), any(),
any())).thenAnswer(invocation -> {
- try (Connection ignoredConnection = invocation.getArgument(2,
DataSource.class).getConnection()) {
+ ignoredResolver.when(() ->
IdentifierCasePolicyResolver.resolveStorage(any(),
any())).thenAnswer(invocation -> {
+ try (Connection ignoredConnection = invocation.getArgument(1,
DataSource.class).getConnection()) {
return IdentifierCasePolicyFactory.newSensitivePolicySet();
} catch (final SQLException ex) {
assertThat(ex, is(connectionFailure));
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtils.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtils.java
index b49b502e380..966f76931b0 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtils.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtils.java
@@ -19,10 +19,7 @@ package
org.apache.shardingsphere.mode.metadata.refresher.util;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -58,12 +55,9 @@ public final class SchemaRefreshUtils {
* @return actual schema name
*/
public static String getActualSchemaName(final ShardingSphereDatabase
database, final IdentifierValue schemaIdentifier) {
- IdentifierCasePolicy policy =
database.getIdentifierContext().getPolicy(IdentifierScope.SCHEMA);
Optional<String> matchedSchemaName =
database.getAllSchemas().stream().map(ShardingSphereSchema::getName)
- .filter(each -> policy.matches(each,
schemaIdentifier.getValue(), schemaIdentifier.getQuoteCharacter())).findFirst();
- return matchedSchemaName.orElseGet(() -> QuoteCharacter.NONE ==
schemaIdentifier.getQuoteCharacter() && LookupMode.NORMALIZED ==
policy.getLookupMode(schemaIdentifier.getQuoteCharacter())
- ? policy.normalize(schemaIdentifier.getValue())
- : schemaIdentifier.getValue());
+ .filter(each ->
database.getIdentifierContext().matchesMetaData(IdentifierScope.SCHEMA, each,
schemaIdentifier)).findFirst();
+ return matchedSchemaName.orElseGet(() ->
database.getIdentifierContext().normalizeProtocol(IdentifierScope.SCHEMA,
schemaIdentifier));
}
/**
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtils.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtils.java
index 74fe57cfb99..c7e00f94aaa 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtils.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtils.java
@@ -20,10 +20,7 @@ package
org.apache.shardingsphere.mode.metadata.refresher.util;
import com.google.common.base.Joiner;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicy;
import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierScope;
-import
org.apache.shardingsphere.database.connector.core.metadata.identifier.LookupMode;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -33,6 +30,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
import
org.apache.shardingsphere.infra.rule.attribute.table.TableMapperRuleAttribute;
@@ -188,7 +186,6 @@ public final class TableRefreshUtils {
*/
public static Optional<String> findActualTableNameByIndex(final
ShardingSphereDatabase database, final String schemaName,
final
IdentifierValue indexIdentifierValue) {
- IdentifierCasePolicy policy =
database.getIdentifierContext().getPolicy(IdentifierScope.INDEX);
String actualSchemaName =
SchemaRefreshUtils.getActualSchemaName(database, new
IdentifierValue(schemaName));
ShardingSphereSchema schema = database.getSchema(actualSchemaName);
if (null == schema) {
@@ -196,7 +193,7 @@ public final class TableRefreshUtils {
}
return schema.getAllTables().stream()
.filter(each ->
each.getAllIndexes().stream().map(ShardingSphereIndex::getName)
- .anyMatch(indexName -> policy.matches(indexName,
indexIdentifierValue.getValue(), indexIdentifierValue.getQuoteCharacter())))
+ .anyMatch(indexName ->
database.getIdentifierContext().matchesMetaData(IdentifierScope.INDEX,
indexName, indexIdentifierValue)))
.map(ShardingSphereTable::getName)
.findFirst();
}
@@ -264,55 +261,47 @@ public final class TableRefreshUtils {
}
private static String getLoadCandidateName(final ShardingSphereDatabase
database, final IdentifierValue identifierValue, final IdentifierScope scope) {
- IdentifierCasePolicy policy =
database.getIdentifierContext().getPolicy(scope);
- return QuoteCharacter.NONE == identifierValue.getQuoteCharacter() &&
LookupMode.NORMALIZED ==
policy.getLookupMode(identifierValue.getQuoteCharacter())
- ? policy.normalize(identifierValue.getValue())
- : identifierValue.getValue();
+ return database.getIdentifierContext().normalizeStorage(scope,
identifierValue);
}
private static String getActualObjectName(final ShardingSphereDatabase
database, final String schemaName,
final IdentifierValue
objectIdentifierValue,
final IdentifierScope scope,
final Function<ShardingSphereSchema, java.util.stream.Stream<String>>
actualNameStream) {
- IdentifierCasePolicy policy =
database.getIdentifierContext().getPolicy(scope);
String actualSchemaName =
SchemaRefreshUtils.getActualSchemaName(database, new
IdentifierValue(schemaName));
ShardingSphereSchema schema = database.getSchema(actualSchemaName);
if (null != schema) {
Optional<String> matchedName = actualNameStream.apply(schema)
- .filter(each -> policy.matches(each,
objectIdentifierValue.getValue(),
objectIdentifierValue.getQuoteCharacter())).findFirst();
+ .filter(each ->
database.getIdentifierContext().matchesMetaData(scope, each,
objectIdentifierValue)).findFirst();
if (matchedName.isPresent()) {
return matchedName.get();
}
}
- return QuoteCharacter.NONE ==
objectIdentifierValue.getQuoteCharacter() && LookupMode.NORMALIZED ==
policy.getLookupMode(objectIdentifierValue.getQuoteCharacter())
- ? policy.normalize(objectIdentifierValue.getValue())
- : objectIdentifierValue.getValue();
+ return database.getIdentifierContext().normalizeStorage(scope,
objectIdentifierValue);
}
private static <T> String getActualObjectName(final ShardingSphereDatabase
database, final String schemaName, final String tableName,
final IdentifierValue
objectIdentifierValue, final IdentifierScope scope,
final
Function<ShardingSphereTable, Collection<T>> actualObjects, final Function<T,
String> actualNameMapper) {
- IdentifierCasePolicy policy =
database.getIdentifierContext().getPolicy(scope);
String actualSchemaName =
SchemaRefreshUtils.getActualSchemaName(database, new
IdentifierValue(schemaName));
ShardingSphereSchema schema = database.getSchema(actualSchemaName);
if (null != schema) {
String actualTableName = getActualTableName(database,
actualSchemaName, new IdentifierValue(tableName));
ShardingSphereTable table = schema.getTable(actualTableName);
- Optional<String> matchedName = getMatchedObjectName(table,
objectIdentifierValue, policy, actualObjects, actualNameMapper);
+ Optional<String> matchedName = getMatchedObjectName(table,
objectIdentifierValue, database.getIdentifierContext(), scope, actualObjects,
actualNameMapper);
if (matchedName.isPresent()) {
return matchedName.get();
}
}
- return QuoteCharacter.NONE ==
objectIdentifierValue.getQuoteCharacter() && LookupMode.NORMALIZED ==
policy.getLookupMode(objectIdentifierValue.getQuoteCharacter())
- ? policy.normalize(objectIdentifierValue.getValue())
- : objectIdentifierValue.getValue();
+ return database.getIdentifierContext().normalizeStorage(scope,
objectIdentifierValue);
}
- private static <T> Optional<String> getMatchedObjectName(final
ShardingSphereTable table, final IdentifierValue objectIdentifierValue, final
IdentifierCasePolicy policy,
+ private static <T> Optional<String> getMatchedObjectName(final
ShardingSphereTable table, final IdentifierValue objectIdentifierValue,
+ final
DatabaseIdentifierContext identifierContext, final IdentifierScope scope,
final
Function<ShardingSphereTable, Collection<T>> actualObjects, final Function<T,
String> actualNameMapper) {
if (null == table) {
return Optional.empty();
}
return actualObjects.apply(table).stream().map(actualNameMapper)
- .filter(each -> policy.matches(each,
objectIdentifierValue.getValue(),
objectIdentifierValue.getQuoteCharacter())).findFirst();
+ .filter(each -> identifierContext.matchesMetaData(scope, each,
objectIdentifierValue)).findFirst();
}
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtilsTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtilsTest.java
index 4d6f4e2051d..30dad64c37f 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtilsTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/SchemaRefreshUtilsTest.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.mode.metadata.refresher.util;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicyFactory;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.infra.binder.context.segment.table.TablesContext;
import
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
@@ -27,6 +28,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.bound.TableSegmentBoundInfo;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
@@ -44,6 +46,8 @@ import java.util.stream.Collectors;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
class SchemaRefreshUtilsTest {
@@ -61,6 +65,15 @@ class SchemaRefreshUtilsTest {
is(Arrays.asList("foo_schema", "bar_schema", "new_schema")));
}
+ @Test
+ void assertGetActualSchemaNameUsesProtocolPolicyWhenMissing() {
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ when(database.getIdentifierContext()).thenReturn(new
DatabaseIdentifierContext(IdentifierCasePolicyFactory.newUpperCasePolicySet(),
+ IdentifierCasePolicyFactory.newSensitivePolicySet(),
IdentifierCasePolicyFactory.newInsensitivePolicySet(), false));
+ when(database.getAllSchemas()).thenReturn(Collections.emptyList());
+ assertThat(SchemaRefreshUtils.getActualSchemaName(database, new
IdentifierValue("Foo_Schema")), is("FOO_SCHEMA"));
+ }
+
private ShardingSphereDatabase createDatabase() {
return new ShardingSphereDatabase("FOO_DB", databaseType, new
ResourceMetaData(Collections.emptyMap()), new
RuleMetaData(Collections.emptyList()), Collections.emptyList(),
new ConfigurationProperties(new Properties()));
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtilsTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtilsTest.java
index 80b16cb2485..3bdbf14959d 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtilsTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/refresher/util/TableRefreshUtilsTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.mode.metadata.refresher.util;
+import
org.apache.shardingsphere.database.connector.core.metadata.identifier.IdentifierCasePolicyFactory;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
@@ -29,6 +30,7 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereView;
+import
org.apache.shardingsphere.infra.metadata.identifier.DatabaseIdentifierContext;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.attribute.RuleAttributes;
import
org.apache.shardingsphere.infra.rule.attribute.datanode.MutableDataNodeRuleAttribute;
@@ -110,6 +112,21 @@ class TableRefreshUtilsTest {
assertThat(TableRefreshUtils.getViewLoadCandidateName(createDatabase(), new
IdentifierValue("Foo_View")), is("foo_view"));
}
+ @Test
+ void assertGetTableLoadCandidateNameUsesStoragePolicy() {
+
assertThat(TableRefreshUtils.getTableLoadCandidateName(createDatabaseWithDistinctPolicies(),
new IdentifierValue("Foo_Tbl")), is("FOO_TBL"));
+ }
+
+ @Test
+ void assertGetActualTableNameUsesStoragePolicyWhenMissing() {
+
assertThat(TableRefreshUtils.getActualTableName(createDatabaseWithDistinctPolicies(),
"foo_schema", new IdentifierValue("Foo_Tbl")), is("FOO_TBL"));
+ }
+
+ @Test
+ void assertGetActualIndexNameUsesStoragePolicyWhenMissing() {
+
assertThat(TableRefreshUtils.getActualIndexName(createDatabaseWithDistinctPolicies(),
"foo_schema", "foo_tbl", new IdentifierValue("Idx_Foo")), is("IDX_FOO"));
+ }
+
@Test
void assertIsSingleTableWhenDistributedTableExists() {
TableMapperRuleAttribute tableMapperRuleAttribute =
mock(TableMapperRuleAttribute.class);
@@ -262,4 +279,12 @@ class TableRefreshUtilsTest {
return new ShardingSphereDatabase("foo_db", fixtureDatabaseType, new
ResourceMetaData(Collections.emptyMap()),
new RuleMetaData(Collections.emptyList()),
Collections.singletonList(schema), new ConfigurationProperties(new
Properties()));
}
+
+ private ShardingSphereDatabase createDatabaseWithDistinctPolicies() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class);
+ when(result.getIdentifierContext()).thenReturn(new
DatabaseIdentifierContext(IdentifierCasePolicyFactory.newSensitivePolicySet(),
+ IdentifierCasePolicyFactory.newUpperCasePolicySet(),
IdentifierCasePolicyFactory.newInsensitivePolicySet(), false));
+ when(result.getAllSchemas()).thenReturn(Collections.emptyList());
+ return result;
+ }
}