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;
+    }
 }


Reply via email to