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