This is an automated email from the ASF dual-hosted git repository.

menghaoran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new cd26460b4b3 Add isCaseSensitive in DialectDatabaseMetaData and 
refactor ShardingSphereIdentifier (#37769)
cd26460b4b3 is described below

commit cd26460b4b3c8f2a72b9efb5484bcf5306207fbd
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Jan 19 16:19:10 2026 +0800

    Add isCaseSensitive in DialectDatabaseMetaData and refactor 
ShardingSphereIdentifier (#37769)
    
    * Add isCaseSensitive in DialectDatabaseMetaData and refactor 
ShardingSphereIdentifier
    
    * Fix checkstyle
---
 .../database/metadata/DialectDatabaseMetaData.java |   9 +
 .../database/ClickHouseDatabaseMetaData.java       |   5 +
 .../database/OpenGaussDatabaseMetaData.java        |   5 +
 .../database/PostgreSQLDatabaseMetaData.java       |   5 +
 .../identifier/ShardingSphereIdentifier.java       |  63 +++--
 .../identifier/ShardingSphereIdentifierTest.java   | 285 +++++++++++++++++++--
 6 files changed, 333 insertions(+), 39 deletions(-)

diff --git 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
index 2bc58420072..342b0d455c8 100644
--- 
a/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
+++ 
b/database/connector/core/src/main/java/org/apache/shardingsphere/database/connector/core/metadata/database/metadata/DialectDatabaseMetaData.java
@@ -62,6 +62,15 @@ public interface DialectDatabaseMetaData extends 
DatabaseTypedSPI {
      */
     IdentifierPatternType getIdentifierPatternType();
     
+    /**
+     * Whether identifier is case-sensitive.
+     *
+     * @return is case-sensitive or insensitive
+     */
+    default boolean isCaseSensitive() {
+        return false;
+    }
+    
     /**
      * Get default nulls order type.
      *
diff --git 
a/database/connector/dialect/clickhouse/src/main/java/org/apache/shardingsphere/database/connector/clickhouse/database/ClickHouseDatabaseMetaData.java
 
b/database/connector/dialect/clickhouse/src/main/java/org/apache/shardingsphere/database/connector/clickhouse/database/ClickHouseDatabaseMetaData.java
index 9048a3ae424..d9b68e10e00 100644
--- 
a/database/connector/dialect/clickhouse/src/main/java/org/apache/shardingsphere/database/connector/clickhouse/database/ClickHouseDatabaseMetaData.java
+++ 
b/database/connector/dialect/clickhouse/src/main/java/org/apache/shardingsphere/database/connector/clickhouse/database/ClickHouseDatabaseMetaData.java
@@ -42,6 +42,11 @@ public final class ClickHouseDatabaseMetaData implements 
DialectDatabaseMetaData
         return NullsOrderType.LOW;
     }
     
+    @Override
+    public boolean isCaseSensitive() {
+        return true;
+    }
+    
     @Override
     public String getDatabaseType() {
         return "ClickHouse";
diff --git 
a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
 
b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
index f81dd99ecad..1dc8843f78f 100644
--- 
a/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
+++ 
b/database/connector/dialect/opengauss/src/main/java/org/apache/shardingsphere/database/connector/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
@@ -85,6 +85,11 @@ public final class OpenGaussDatabaseMetaData implements 
DialectDatabaseMetaData
         return new DialectProtocolVersionOption("9.2.4");
     }
     
+    @Override
+    public boolean isCaseSensitive() {
+        return true;
+    }
+    
     @Override
     public String getDatabaseType() {
         return "openGauss";
diff --git 
a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
 
b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
index dff34a05d69..492c430b18e 100644
--- 
a/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
+++ 
b/database/connector/dialect/postgresql/src/main/java/org/apache/shardingsphere/database/connector/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
@@ -77,6 +77,11 @@ public final class PostgreSQLDatabaseMetaData implements 
DialectDatabaseMetaData
         return new DialectProtocolVersionOption("12.3");
     }
     
+    @Override
+    public boolean isCaseSensitive() {
+        return true;
+    }
+    
     @Override
     public String getDatabaseType() {
         return "PostgreSQL";
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifier.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifier.java
index 45d734406df..ccd638b6c9d 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifier.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifier.java
@@ -18,10 +18,10 @@
 package org.apache.shardingsphere.infra.metadata.identifier;
 
 import com.cedarsoftware.util.CaseInsensitiveMap.CaseInsensitiveString;
+import lombok.Getter;
 import 
org.apache.shardingsphere.database.connector.core.metadata.database.enums.QuoteCharacter;
-import 
org.apache.shardingsphere.database.connector.core.metadata.identifier.DatabaseDialectIdentifierHandler;
-import 
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.DialectDatabaseMetaData;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 /**
@@ -29,29 +29,48 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.Iden
  */
 public final class ShardingSphereIdentifier {
     
-    private final boolean isCaseSensitive;
-    
     private final CaseInsensitiveString value;
     
+    @Getter
+    private final String standardizeValue;
+    
+    private final boolean caseSensitive;
+    
     public ShardingSphereIdentifier(final String value) {
-        isCaseSensitive = false;
         this.value = new CaseInsensitiveString(value);
+        standardizeValue = value;
+        caseSensitive = false;
     }
     
-    public ShardingSphereIdentifier(final String value, final DatabaseType 
databaseType) {
-        isCaseSensitive = 
DatabaseTypedSPILoader.findService(DatabaseDialectIdentifierHandler.class, 
databaseType).map(DatabaseDialectIdentifierHandler::isCaseSensitive).orElse(false);
+    public ShardingSphereIdentifier(final String value, final 
DialectDatabaseMetaData dialectDatabaseMetaData) {
         this.value = new CaseInsensitiveString(value);
+        standardizeValue = standardizeValue(value, dialectDatabaseMetaData, 
false);
+        caseSensitive = dialectDatabaseMetaData.isCaseSensitive();
     }
     
-    public ShardingSphereIdentifier(final IdentifierValue value) {
-        isCaseSensitive = QuoteCharacter.NONE != value.getQuoteCharacter();
-        this.value = new CaseInsensitiveString(value.getValue());
+    public ShardingSphereIdentifier(final IdentifierValue identifierValue, 
final DialectDatabaseMetaData dialectDatabaseMetaData) {
+        value = new CaseInsensitiveString(identifierValue.getValue());
+        standardizeValue = standardizeValue(identifierValue.getValue(), 
dialectDatabaseMetaData, QuoteCharacter.NONE != 
identifierValue.getQuoteCharacter());
+        caseSensitive = dialectDatabaseMetaData.isCaseSensitive();
     }
     
-    public ShardingSphereIdentifier(final IdentifierValue value, final 
DatabaseType databaseType) {
-        isCaseSensitive = QuoteCharacter.NONE != value.getQuoteCharacter()
-                && 
DatabaseTypedSPILoader.findService(DatabaseDialectIdentifierHandler.class, 
databaseType).map(DatabaseDialectIdentifierHandler::isCaseSensitive).orElse(false);
-        this.value = new CaseInsensitiveString(value.getValue());
+    private static String standardizeValue(final String value, final 
DialectDatabaseMetaData dialectDatabaseMetaData, final boolean quoted) {
+        if (null == value) {
+            return null;
+        }
+        if (quoted) {
+            return value;
+        }
+        IdentifierPatternType patternType = 
dialectDatabaseMetaData.getIdentifierPatternType();
+        switch (patternType) {
+            case UPPER_CASE:
+                return value.toUpperCase();
+            case LOWER_CASE:
+                return value.toLowerCase();
+            case KEEP_ORIGIN:
+            default:
+                return value;
+        }
     }
     
     /**
@@ -68,16 +87,22 @@ public final class ShardingSphereIdentifier {
         if (!(obj instanceof ShardingSphereIdentifier)) {
             return false;
         }
-        if (null == getValue() && null == ((ShardingSphereIdentifier) 
obj).getValue()) {
+        ShardingSphereIdentifier other = (ShardingSphereIdentifier) obj;
+        if (null == getValue() && null == other.getValue()) {
             return true;
         }
-        boolean shouldUseCaseSensitive = isCaseSensitive || 
((ShardingSphereIdentifier) obj).isCaseSensitive;
-        return shouldUseCaseSensitive ? 
String.valueOf(getValue()).equals(((ShardingSphereIdentifier) obj).getValue()) 
: value.equals(((ShardingSphereIdentifier) obj).value);
+        if (null == standardizeValue || null == other.getStandardizeValue()) {
+            return false;
+        }
+        return caseSensitive ? 
standardizeValue.equals(other.getStandardizeValue()) : 
value.equals(other.value);
     }
     
     @Override
     public int hashCode() {
-        return isCaseSensitive ? String.valueOf(getValue()).hashCode() : 
value.hashCode();
+        if (null == standardizeValue) {
+            return 0;
+        }
+        return caseSensitive ? standardizeValue.hashCode() : value.hashCode();
     }
     
     @Override
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifierTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifierTest.java
index 2c39a156f36..1c1492f3c6a 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifierTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/identifier/ShardingSphereIdentifierTest.java
@@ -17,21 +17,45 @@
 
 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.database.metadata.DialectDatabaseMetaData;
+import 
org.apache.shardingsphere.database.connector.core.metadata.database.metadata.option.IdentifierPatternType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 import org.junit.jupiter.api.Test;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class ShardingSphereIdentifierTest {
     
     @Test
-    void assertConstructor() {
-        assertThat(new ShardingSphereIdentifier("foo", mock()).getValue(), 
is("foo"));
-        assertThat(new ShardingSphereIdentifier(new 
IdentifierValue("`foo`")).getValue(), is("foo"));
-        assertThat(new ShardingSphereIdentifier(new IdentifierValue("`foo`"), 
mock()).getValue(), is("foo"));
+    void assertConstructorWithValue() {
+        assertThat(new ShardingSphereIdentifier("foo").getValue(), is("foo"));
+        assertThat(new ShardingSphereIdentifier("foo").getStandardizeValue(), 
is("foo"));
+    }
+    
+    @Test
+    void assertConstructorWithValueAndMetaData() {
+        DialectDatabaseMetaData mockMetaData = mockPostgreSQLMetaData();
+        assertThat(new ShardingSphereIdentifier("foo", 
mockMetaData).getValue(), is("foo"));
+        assertThat(new ShardingSphereIdentifier("foo", 
mockMetaData).getStandardizeValue(), is("foo"));
+        assertThat(new ShardingSphereIdentifier("FOO", 
mockMetaData).getStandardizeValue(), is("foo"));
+    }
+    
+    @Test
+    void assertConstructorWithIdentifierValue() {
+        DialectDatabaseMetaData mockMetaData = mockPostgreSQLMetaData();
+        assertThat(new ShardingSphereIdentifier(new IdentifierValue("foo"), 
mockMetaData).getValue(), is("foo"));
+        assertThat(new ShardingSphereIdentifier(new IdentifierValue("FOO"), 
mockMetaData).getStandardizeValue(), is("foo"));
+        assertThat(new ShardingSphereIdentifier(new IdentifierValue("foo", 
QuoteCharacter.QUOTE), mockMetaData).getStandardizeValue(), is("foo"));
+        assertThat(new ShardingSphereIdentifier(new IdentifierValue("FOO", 
QuoteCharacter.QUOTE), mockMetaData).getStandardizeValue(), is("FOO"));
     }
     
     @Test
@@ -47,34 +71,255 @@ class ShardingSphereIdentifierTest {
     }
     
     @Test
-    void assertEqualsWithCaseSensitive() {
-        assertThat(new ShardingSphereIdentifier(new IdentifierValue("`foo`")), 
is(new ShardingSphereIdentifier(new IdentifierValue("`foo`"))));
-        assertThat(new ShardingSphereIdentifier(new IdentifierValue("`foo`")), 
is(new ShardingSphereIdentifier(new IdentifierValue("foo"))));
-        assertThat(new ShardingSphereIdentifier(new IdentifierValue("`foo`")), 
not(new ShardingSphereIdentifier("FOO")));
+    void assertEqualsWithNoDialectMetadata() {
+        assertThat(new ShardingSphereIdentifier("foo"), is(new 
ShardingSphereIdentifier("foo")));
+        assertThat(new ShardingSphereIdentifier("foo"), is(new 
ShardingSphereIdentifier("FOO")));
     }
     
     @Test
-    void assertEqualsWithCaseInsensitive() {
-        assertThat(new ShardingSphereIdentifier("foo"), is(new 
ShardingSphereIdentifier("foo")));
-        assertThat(new ShardingSphereIdentifier("foo"), is(new 
ShardingSphereIdentifier("FOO")));
+    void assertHashCodeWithNoDialectMetadata() {
+        assertThat(new ShardingSphereIdentifier("foo").hashCode(), is(new 
ShardingSphereIdentifier("foo").hashCode()));
+        assertThat(new ShardingSphereIdentifier("foo").hashCode(), is(new 
ShardingSphereIdentifier("FOO").hashCode()));
+    }
+    
+    @Test
+    void assertToString() {
+        DialectDatabaseMetaData mockMetaData = mockPostgreSQLMetaData();
+        assertThat(new ShardingSphereIdentifier("foo", 
mockMetaData).toString(), is("foo"));
+        assertThat(new ShardingSphereIdentifier("FOO", 
mockMetaData).toString(), is("FOO"));
+        assertThat(new ShardingSphereIdentifier(new IdentifierValue("foo"), 
mockMetaData).toString(), is("foo"));
+    }
+    
+    @Test
+    void assertPostgreSQLLowerCaseUnquoted() {
+        DialectDatabaseMetaData postgres = mockPostgreSQLMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier("mytable", postgres), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier("MYTABLE", postgres)), 
is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier("mytable", postgres)), 
is("value1"));
+    }
+    
+    @Test
+    void assertPostgreSQLQuotedCaseSensitive() {
+        DialectDatabaseMetaData postgres = mockPostgreSQLMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier(new IdentifierValue("MyTable", 
QuoteCharacter.QUOTE), postgres), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), postgres)), is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.NONE), postgres)), is(nullValue()));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.NONE), postgres)), is(nullValue()));
+    }
+    
+    @Test
+    void assertPostgreSQLStandardizeValue() {
+        DialectDatabaseMetaData postgres = mockPostgreSQLMetaData();
+        ShardingSphereIdentifier unquoted = new 
ShardingSphereIdentifier("MyTable", postgres);
+        assertThat(unquoted.getValue(), is("MyTable"));
+        assertThat(unquoted.getStandardizeValue(), is("mytable"));
+        ShardingSphereIdentifier quoted = new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), postgres);
+        assertThat(quoted.getValue(), is("MyTable"));
+        assertThat(quoted.getStandardizeValue(), is("MyTable"));
+    }
+    
+    @Test
+    void assertOracleUpperCaseUnquoted() {
+        DialectDatabaseMetaData oracle = mockOracleMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier("MYTABLE", oracle), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier("mytable", oracle)), 
is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier("MYTABLE", oracle)), 
is("value1"));
+    }
+    
+    @Test
+    void assertOracleQuotedCaseSensitive() {
+        DialectDatabaseMetaData oracle = mockOracleMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier(new IdentifierValue("MYTABLE", 
QuoteCharacter.QUOTE), oracle), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("MYTABLE", QuoteCharacter.QUOTE), oracle)), is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.QUOTE), oracle)), is(nullValue()));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.NONE), oracle)), is("value1"));
+    }
+    
+    @Test
+    void assertOracleStandardizeValue() {
+        DialectDatabaseMetaData oracle = mockOracleMetaData();
+        ShardingSphereIdentifier unquoted = new 
ShardingSphereIdentifier("mytable", oracle);
+        assertThat(unquoted.getValue(), is("mytable"));
+        assertThat(unquoted.getStandardizeValue(), is("MYTABLE"));
+        ShardingSphereIdentifier quoted = new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.QUOTE), oracle);
+        assertThat(quoted.getValue(), is("mytable"));
+        assertThat(quoted.getStandardizeValue(), is("mytable"));
+    }
+    
+    @Test
+    void assertClickHouseKeepOriginUnquoted() {
+        DialectDatabaseMetaData clickhouse = mockClickHouseMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier("MyTable", clickhouse), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier("MyTable", 
clickhouse)), is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier("mytable", 
clickhouse)), is(nullValue()));
+    }
+    
+    @Test
+    void assertClickHouseQuotedCaseSensitive() {
+        DialectDatabaseMetaData clickhouse = mockClickHouseMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier(new IdentifierValue("MyTable", 
QuoteCharacter.QUOTE), clickhouse), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), clickhouse)), is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.QUOTE), clickhouse)), 
is(nullValue()));
+    }
+    
+    @Test
+    void assertClickHouseStandardizeValue() {
+        DialectDatabaseMetaData clickhouse = mockClickHouseMetaData();
+        ShardingSphereIdentifier unquoted = new 
ShardingSphereIdentifier("MyTable", clickhouse);
+        assertThat(unquoted.getValue(), is("MyTable"));
+        assertThat(unquoted.getStandardizeValue(), is("MyTable"));
+        ShardingSphereIdentifier quoted = new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), clickhouse);
+        assertThat(quoted.getValue(), is("MyTable"));
+        assertThat(quoted.getStandardizeValue(), is("MyTable"));
     }
     
     @Test
     void assertHashCodeWithCaseSensitive() {
-        assertThat(new ShardingSphereIdentifier(new 
IdentifierValue("`foo`")).hashCode(), is(new ShardingSphereIdentifier(new 
IdentifierValue("`foo`")).hashCode()));
-        assertThat(new ShardingSphereIdentifier(new 
IdentifierValue("`foo`")).hashCode(), not(new ShardingSphereIdentifier(new 
IdentifierValue("`FOO`")).hashCode()));
+        DialectDatabaseMetaData postgres = mockPostgreSQLMetaData();
+        ShardingSphereIdentifier quoted1 = new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), postgres);
+        ShardingSphereIdentifier quoted2 = new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), postgres);
+        ShardingSphereIdentifier quoted3 = new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.QUOTE), postgres);
+        assertThat(quoted1.hashCode(), is(quoted2.hashCode()));
+        assertThat(quoted1.hashCode(), not(quoted3.hashCode()));
     }
     
     @Test
-    void assertHashCodeWithCaseInsensitive() {
-        assertThat(new ShardingSphereIdentifier("foo").hashCode(), is(new 
ShardingSphereIdentifier("foo").hashCode()));
-        assertThat(new ShardingSphereIdentifier("foo").hashCode(), is(new 
ShardingSphereIdentifier("FOO").hashCode()));
+    void assertNullValue() {
+        DialectDatabaseMetaData postgres = mockPostgreSQLMetaData();
+        ShardingSphereIdentifier nullIdentifier = new 
ShardingSphereIdentifier((String) null);
+        assertThat(nullIdentifier.getValue(), is(nullValue()));
+        assertThat(nullIdentifier.getStandardizeValue(), is(nullValue()));
+        ShardingSphereIdentifier nullIdentifierWithMetaData = new 
ShardingSphereIdentifier(new IdentifierValue((String) null), postgres);
+        assertThat(nullIdentifierWithMetaData.getValue(), is(nullValue()));
+        assertThat(nullIdentifierWithMetaData.getStandardizeValue(), 
is(nullValue()));
     }
     
     @Test
-    void assertToString() {
-        assertThat(new ShardingSphereIdentifier("foo").toString(), is("foo"));
-        assertThat(new ShardingSphereIdentifier("FOO").toString(), is("FOO"));
-        assertThat(new ShardingSphereIdentifier(new 
IdentifierValue("`foo`")).toString(), is("foo"));
+    void assertEqualsWithNullValues() {
+        DialectDatabaseMetaData postgres = mockPostgreSQLMetaData();
+        ShardingSphereIdentifier null1 = new ShardingSphereIdentifier((String) 
null);
+        ShardingSphereIdentifier null2 = new ShardingSphereIdentifier((String) 
null);
+        assertThat(null1, is(null2));
+        assertThat(null1.hashCode(), is(null2.hashCode()));
+        ShardingSphereIdentifier null3 = new ShardingSphereIdentifier(new 
IdentifierValue((String) null), postgres);
+        ShardingSphereIdentifier null4 = new ShardingSphereIdentifier(new 
IdentifierValue((String) null), postgres);
+        assertThat(null3, is(null4));
+        assertThat(null3.hashCode(), is(null4.hashCode()));
+    }
+    
+    @Test
+    void assertNotEqualsWithOneNullValue() {
+        DialectDatabaseMetaData postgres = mockPostgreSQLMetaData();
+        ShardingSphereIdentifier nullIdentifier = new 
ShardingSphereIdentifier((String) null);
+        ShardingSphereIdentifier nonNullIdentifier = new 
ShardingSphereIdentifier("foo");
+        assertThat(nullIdentifier, not(nonNullIdentifier));
+        ShardingSphereIdentifier nullIdentifierWithMeta = new 
ShardingSphereIdentifier(new IdentifierValue((String) null), postgres);
+        ShardingSphereIdentifier nonNullIdentifierWithMeta = new 
ShardingSphereIdentifier("foo", postgres);
+        assertThat(nullIdentifierWithMeta, not(nonNullIdentifierWithMeta));
+    }
+    
+    @Test
+    void assertMySQLKeepOriginUnquoted() {
+        DialectDatabaseMetaData mysql = mockMySQLMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier("MyTable", mysql), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier("MyTable", mysql)), 
is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier("mytable", mysql)), 
is("value1"));
+    }
+    
+    @Test
+    void assertMySQLQuotedCaseSensitive() {
+        DialectDatabaseMetaData mysql = mockMySQLMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier(new IdentifierValue("MyTable", 
QuoteCharacter.BACK_QUOTE), mysql), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.BACK_QUOTE), mysql)), is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.BACK_QUOTE), mysql)), is("value1"));
+    }
+    
+    @Test
+    void assertMySQLStandardizeValue() {
+        DialectDatabaseMetaData mysql = mockMySQLMetaData();
+        ShardingSphereIdentifier unquoted = new 
ShardingSphereIdentifier("MyTable", mysql);
+        assertThat(unquoted.getValue(), is("MyTable"));
+        assertThat(unquoted.getStandardizeValue(), is("MyTable"));
+        ShardingSphereIdentifier quoted = new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.BACK_QUOTE), mysql);
+        assertThat(quoted.getValue(), is("MyTable"));
+        assertThat(quoted.getStandardizeValue(), is("MyTable"));
+    }
+    
+    @Test
+    void assertOpenGaussLowerCaseUnquoted() {
+        DialectDatabaseMetaData opengauss = mockOpenGaussMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier("mytable", opengauss), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier("MYTABLE", 
opengauss)), is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier("mytable", 
opengauss)), is("value1"));
+    }
+    
+    @Test
+    void assertOpenGaussQuotedCaseSensitive() {
+        DialectDatabaseMetaData opengauss = mockOpenGaussMetaData();
+        Map<ShardingSphereIdentifier, String> map = new HashMap<>();
+        map.put(new ShardingSphereIdentifier(new IdentifierValue("MyTable", 
QuoteCharacter.QUOTE), opengauss), "value1");
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), opengauss)), is("value1"));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.NONE), opengauss)), is(nullValue()));
+        assertThat(map.get(new ShardingSphereIdentifier(new 
IdentifierValue("mytable", QuoteCharacter.NONE), opengauss)), is(nullValue()));
+    }
+    
+    @Test
+    void assertOpenGaussStandardizeValue() {
+        DialectDatabaseMetaData opengauss = mockOpenGaussMetaData();
+        ShardingSphereIdentifier unquoted = new 
ShardingSphereIdentifier("MyTable", opengauss);
+        assertThat(unquoted.getValue(), is("MyTable"));
+        assertThat(unquoted.getStandardizeValue(), is("mytable"));
+        ShardingSphereIdentifier quoted = new ShardingSphereIdentifier(new 
IdentifierValue("MyTable", QuoteCharacter.QUOTE), opengauss);
+        assertThat(quoted.getValue(), is("MyTable"));
+        assertThat(quoted.getStandardizeValue(), is("MyTable"));
+    }
+    
+    private DialectDatabaseMetaData mockPostgreSQLMetaData() {
+        DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
+        when(result.getQuoteCharacter()).thenReturn(QuoteCharacter.QUOTE);
+        
when(result.getIdentifierPatternType()).thenReturn(IdentifierPatternType.LOWER_CASE);
+        when(result.isCaseSensitive()).thenReturn(true);
+        return result;
+    }
+    
+    private DialectDatabaseMetaData mockOracleMetaData() {
+        DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
+        when(result.getQuoteCharacter()).thenReturn(QuoteCharacter.QUOTE);
+        
when(result.getIdentifierPatternType()).thenReturn(IdentifierPatternType.UPPER_CASE);
+        when(result.isCaseSensitive()).thenReturn(true);
+        return result;
+    }
+    
+    private DialectDatabaseMetaData mockClickHouseMetaData() {
+        DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
+        when(result.getQuoteCharacter()).thenReturn(QuoteCharacter.QUOTE);
+        
when(result.getIdentifierPatternType()).thenReturn(IdentifierPatternType.KEEP_ORIGIN);
+        when(result.isCaseSensitive()).thenReturn(true);
+        return result;
+    }
+    
+    private DialectDatabaseMetaData mockMySQLMetaData() {
+        DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
+        when(result.getQuoteCharacter()).thenReturn(QuoteCharacter.BACK_QUOTE);
+        
when(result.getIdentifierPatternType()).thenReturn(IdentifierPatternType.KEEP_ORIGIN);
+        when(result.isCaseSensitive()).thenReturn(false);
+        return result;
+    }
+    
+    private DialectDatabaseMetaData mockOpenGaussMetaData() {
+        DialectDatabaseMetaData result = mock(DialectDatabaseMetaData.class);
+        when(result.getQuoteCharacter()).thenReturn(QuoteCharacter.QUOTE);
+        
when(result.getIdentifierPatternType()).thenReturn(IdentifierPatternType.LOWER_CASE);
+        when(result.isCaseSensitive()).thenReturn(true);
+        return result;
     }
 }

Reply via email to