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

duanzhengqiang 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 945379aae7a Fix wrong sharding condition merge when sharding column in 
case-sensitive (#37389)
945379aae7a is described below

commit 945379aae7aea48e4d9f6af48a212f9d32c3b8e7
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Mon Dec 15 18:43:26 2025 +0800

    Fix wrong sharding condition merge when sharding column in case-sensitive 
(#37389)
---
 RELEASE-NOTES.md                                   |  1 +
 .../checker/ShardingRouteCacheableChecker.java     | 22 ++++++++---------
 .../InsertClauseShardingConditionEngine.java       |  2 +-
 .../condition/engine/ShardingConditionEngine.java  |  2 +-
 .../engine/WhereClauseShardingConditionEngine.java | 28 ++++++++++++++++++----
 .../WhereClauseShardingConditionEngineTest.java    | 20 +++++++++++++++-
 .../ConditionValueGeneratorFactoryTest.java        |  2 +-
 ...ConditionValueBetweenOperatorGeneratorTest.java |  2 +-
 ...ConditionValueCompareOperatorGeneratorTest.java |  2 +-
 .../ConditionValueInOperatorGeneratorTest.java     |  2 +-
 .../infra/metadata/database/schema/HashColumn.java |  7 ++++--
 .../metadata/database/schema/HashColumnTest.java   | 16 ++++++-------
 12 files changed, 73 insertions(+), 33 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 3bc4649cf15..09d3ee51c6e 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -103,6 +103,7 @@
 1. Encrypt: Resolve rewrite issue in nested concat function - 
[#35815](https://github.com/apache/shardingsphere/pull/35815)
 1. Sharding: Fix mod sharding algorithm judgement 
-[#36386](https://github.com/apache/shardingsphere/pull/36386)
 1. Sharding: Fix check inline sharding algorithms in table rules - 
[#36999](https://github.com/apache/shardingsphere/pull/36999)
+1. Sharding: Fix wrong sharding condition merge when sharding column in 
case-sensitive - [#37389](https://github.com/apache/shardingsphere/pull/37389)
 1. Pipeline: Recover value of migration incremental importer batch size - 
[#34670](https://github.com/apache/shardingsphere/pull/34670)
 1. Pipeline: Fix InventoryDumper first time dump SQL without ORDER BY on 
multiple columns unique key table - 
[#34736](https://github.com/apache/shardingsphere/pull/34736)
 1. Pipeline: Fix MySQL JDBC query properties extension when SSL is required on 
server - [#36581](https://github.com/apache/shardingsphere/pull/36581)
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java
index 3a9b219cb2e..5c4a255daf7 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableChecker.java
@@ -85,13 +85,13 @@ public final class ShardingRouteCacheableChecker {
         SQLStatementContext sqlStatementContext = key.getSqlStatementContext();
         ShardingRouteCacheableCheckResult result;
         if (sqlStatementContext instanceof SelectStatementContext) {
-            result = checkSelectCacheable((SelectStatementContext) 
sqlStatementContext, key.getParameters());
+            result = checkSelectCacheable((SelectStatementContext) 
sqlStatementContext, key.getParameters(), key.getDatabase());
         } else if (sqlStatementContext instanceof UpdateStatementContext) {
-            result = checkUpdateCacheable((UpdateStatementContext) 
sqlStatementContext, key.getParameters());
+            result = checkUpdateCacheable((UpdateStatementContext) 
sqlStatementContext, key.getParameters(), key.getDatabase());
         } else if (sqlStatementContext instanceof InsertStatementContext) {
             result = checkInsertCacheable((InsertStatementContext) 
sqlStatementContext, key.getParameters(), key.getDatabase());
         } else if (sqlStatementContext instanceof DeleteStatementContext) {
-            result = checkDeleteCacheable((DeleteStatementContext) 
sqlStatementContext, key.getParameters());
+            result = checkDeleteCacheable((DeleteStatementContext) 
sqlStatementContext, key.getParameters(), key.getDatabase());
         } else {
             result = new ShardingRouteCacheableCheckResult(false, 
Collections.emptyList());
         }
@@ -99,7 +99,7 @@ public final class ShardingRouteCacheableChecker {
         return result;
     }
     
-    private ShardingRouteCacheableCheckResult checkSelectCacheable(final 
SelectStatementContext statementContext, final List<Object> params) {
+    private ShardingRouteCacheableCheckResult checkSelectCacheable(final 
SelectStatementContext statementContext, final List<Object> params, final 
ShardingSphereDatabase database) {
         Collection<String> tableNames = new 
HashSet<>(statementContext.getTablesContext().getTableNames());
         if (!shardingRule.isAllShardingTables(tableNames)) {
             return new ShardingRouteCacheableCheckResult(false, 
Collections.emptyList());
@@ -107,12 +107,12 @@ public final class ShardingRouteCacheableChecker {
         if (1 != tableNames.size() && 
!shardingRule.isAllConfigBindingTables(tableNames) || 
containsNonCacheableShardingAlgorithm(tableNames)) {
             return new ShardingRouteCacheableCheckResult(false, 
Collections.emptyList());
         }
-        List<ShardingCondition> shardingConditions = new 
WhereClauseShardingConditionEngine(shardingRule, 
timestampServiceRule).createShardingConditions(statementContext, params);
+        List<ShardingCondition> shardingConditions = new 
WhereClauseShardingConditionEngine(database, shardingRule, 
timestampServiceRule).createShardingConditions(statementContext, params);
         return checkShardingConditionsCacheable(shardingConditions);
     }
     
-    private ShardingRouteCacheableCheckResult checkUpdateCacheable(final 
UpdateStatementContext statementContext, final List<Object> params) {
-        return checkUpdateOrDeleteCacheable(statementContext, params);
+    private ShardingRouteCacheableCheckResult checkUpdateCacheable(final 
UpdateStatementContext statementContext, final List<Object> params, final 
ShardingSphereDatabase database) {
+        return checkUpdateOrDeleteCacheable(statementContext, params, 
database);
     }
     
     private ShardingRouteCacheableCheckResult checkInsertCacheable(final 
InsertStatementContext statementContext, final List<Object> params, final 
ShardingSphereDatabase database) {
@@ -139,11 +139,11 @@ public final class ShardingRouteCacheableChecker {
         return checkShardingConditionsCacheable(shardingConditions);
     }
     
-    private ShardingRouteCacheableCheckResult checkDeleteCacheable(final 
DeleteStatementContext statementContext, final List<Object> params) {
-        return checkUpdateOrDeleteCacheable(statementContext, params);
+    private ShardingRouteCacheableCheckResult checkDeleteCacheable(final 
DeleteStatementContext statementContext, final List<Object> params, final 
ShardingSphereDatabase database) {
+        return checkUpdateOrDeleteCacheable(statementContext, params, 
database);
     }
     
-    private ShardingRouteCacheableCheckResult 
checkUpdateOrDeleteCacheable(final SQLStatementContext sqlStatementContext, 
final List<Object> params) {
+    private ShardingRouteCacheableCheckResult 
checkUpdateOrDeleteCacheable(final SQLStatementContext sqlStatementContext, 
final List<Object> params, final ShardingSphereDatabase database) {
         Collection<String> tableNames = 
sqlStatementContext.getTablesContext().getTableNames();
         if (1 != tableNames.size()) {
             return new ShardingRouteCacheableCheckResult(false, 
Collections.emptyList());
@@ -152,7 +152,7 @@ public final class ShardingRouteCacheableChecker {
         if (!isShardingTable || 
containsNonCacheableShardingAlgorithm(tableNames)) {
             return new ShardingRouteCacheableCheckResult(false, 
Collections.emptyList());
         }
-        List<ShardingCondition> shardingConditions = new 
WhereClauseShardingConditionEngine(shardingRule, 
timestampServiceRule).createShardingConditions(sqlStatementContext, params);
+        List<ShardingCondition> shardingConditions = new 
WhereClauseShardingConditionEngine(database, shardingRule, 
timestampServiceRule).createShardingConditions(sqlStatementContext, params);
         return checkShardingConditionsCacheable(shardingConditions);
     }
     
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
index 22002473f01..641b3ec6c58 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngine.java
@@ -164,7 +164,7 @@ public final class InsertClauseShardingConditionEngine {
     
     private List<ShardingCondition> 
createShardingConditionsWithInsertSelect(final InsertStatementContext 
sqlStatementContext, final List<Object> params) {
         SelectStatementContext selectStatementContext = 
sqlStatementContext.getInsertSelectContext().getSelectStatementContext();
-        return new LinkedList<>(new WhereClauseShardingConditionEngine(rule, 
timestampServiceRule).createShardingConditions(selectStatementContext, params));
+        return new LinkedList<>(new 
WhereClauseShardingConditionEngine(database, rule, 
timestampServiceRule).createShardingConditions(selectStatementContext, params));
     }
     
     private void appendGeneratedKeyConditions(final InsertStatementContext 
sqlStatementContext, final List<ShardingCondition> shardingConditions) {
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java
index d8f5c1ec73a..3b446099e18 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/ShardingConditionEngine.java
@@ -51,6 +51,6 @@ public final class ShardingConditionEngine {
         TimestampServiceRule timestampServiceRule = 
globalRuleMetaData.getSingleRule(TimestampServiceRule.class);
         return sqlStatementContext instanceof InsertStatementContext
                 ? new InsertClauseShardingConditionEngine(database, 
shardingRule, 
timestampServiceRule).createShardingConditions((InsertStatementContext) 
sqlStatementContext, params)
-                : new WhereClauseShardingConditionEngine(shardingRule, 
timestampServiceRule).createShardingConditions(sqlStatementContext, params);
+                : new WhereClauseShardingConditionEngine(database, 
shardingRule, 
timestampServiceRule).createShardingConditions(sqlStatementContext, params);
     }
 }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
index 88f66351e4f..0d66b1b67e1 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngine.java
@@ -17,12 +17,18 @@
 
 package org.apache.shardingsphere.sharding.route.engine.condition.engine;
 
+import com.cedarsoftware.util.CaseInsensitiveSet;
 import com.google.common.collect.Range;
 import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.infra.binder.context.available.WhereContextAvailable;
 import 
org.apache.shardingsphere.infra.binder.context.extractor.SQLStatementContextExtractor;
 import 
org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext;
+import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.exception.kernel.metadata.SchemaNotFoundException;
+import 
org.apache.shardingsphere.infra.exception.kernel.metadata.TableNotFoundException;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.schema.HashColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import 
org.apache.shardingsphere.sharding.exception.data.ShardingValueDataTypeException;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.AlwaysFalseShardingCondition;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
@@ -59,6 +65,8 @@ import java.util.Set;
 @RequiredArgsConstructor
 public final class WhereClauseShardingConditionEngine {
     
+    private final ShardingSphereDatabase database;
+    
     private final ShardingRule rule;
     
     private final TimestampServiceRule timestampServiceRule;
@@ -106,7 +114,11 @@ public final class WhereClauseShardingConditionEngine {
                 if (!shardingColumn.isPresent()) {
                     continue;
                 }
-                HashColumn column = new HashColumn(shardingColumn.get(), 
tableName);
+                String schemaName = 
columnSegment.getColumnBoundInfo().getOriginalSchema().getValue();
+                
ShardingSpherePreconditions.checkState(database.containsSchema(schemaName), () 
-> new SchemaNotFoundException(schemaName));
+                ShardingSphereSchema schema = database.getSchema(schemaName);
+                
ShardingSpherePreconditions.checkState(schema.containsTable(tableName), () -> 
new TableNotFoundException(schemaName));
+                HashColumn column = new HashColumn(shardingColumn.get(), 
tableName, 
schema.getTable(tableName).getColumn(shardingColumn.get()).isCaseSensitive());
                 Optional<ShardingConditionValue> shardingConditionValue = 
ConditionValueGeneratorFactory.generate(each, column, params, 
timestampServiceRule);
                 if (!shardingConditionValue.isPresent()) {
                     continue;
@@ -141,7 +153,7 @@ public final class WhereClauseShardingConditionEngine {
         for (ShardingConditionValue each : shardingConditionValues) {
             parameterMarkerIndexes.addAll(each.getParameterMarkerIndexes());
             if (each instanceof ListShardingConditionValue) {
-                listValue = 
mergeListShardingValues(((ListShardingConditionValue) each).getValues(), 
listValue);
+                listValue = mergeListShardingValues(column, 
((ListShardingConditionValue) each).getValues(), listValue);
                 if (listValue.isEmpty()) {
                     return new AlwaysFalseShardingConditionValue();
                 }
@@ -164,12 +176,18 @@ public final class WhereClauseShardingConditionEngine {
                 : new ListShardingConditionValue<>(column.getName(), 
column.getTableName(), listValue, new ArrayList<>(parameterMarkerIndexes));
     }
     
-    private Collection<Comparable<?>> mergeListShardingValues(final 
Collection<Comparable<?>> value1, final Collection<Comparable<?>> value2) {
+    private Collection<Comparable<?>> mergeListShardingValues(final HashColumn 
column, final Collection<Comparable<?>> value1, final Collection<Comparable<?>> 
value2) {
         if (null == value2) {
             return value1;
         }
-        value1.retainAll(value2);
-        return value1;
+        if (column.isCaseSensitive()) {
+            value1.retainAll(value2);
+            return value1;
+        }
+        Collection<Comparable<?>> caseInSensitiveValue1 = new 
CaseInsensitiveSet<>(value1);
+        Collection<Comparable<?>> caseInSensitiveValue2 = new 
CaseInsensitiveSet<>(value2);
+        caseInSensitiveValue1.retainAll(caseInSensitiveValue2);
+        return caseInSensitiveValue1;
     }
     
     private Range<Comparable<?>> mergeRangeShardingValues(final 
Range<Comparable<?>> value1, final Range<Comparable<?>> value2) {
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java
index 9adf16f95cf..0a70e5fe82b 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/WhereClauseShardingConditionEngineTest.java
@@ -18,6 +18,10 @@
 package org.apache.shardingsphere.sharding.route.engine.condition.engine;
 
 import 
org.apache.shardingsphere.infra.binder.context.statement.type.dml.SelectStatementContext;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereTable;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.ShardingCondition;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.value.ListShardingConditionValue;
 import 
org.apache.shardingsphere.sharding.route.engine.condition.value.RangeShardingConditionValue;
@@ -62,10 +66,24 @@ class WhereClauseShardingConditionEngineTest {
     @Mock
     private WhereSegment whereSegment;
     
+    @Mock
+    private ShardingSphereDatabase database;
+    
+    @Mock
+    private ShardingSphereSchema schema;
+    
+    @Mock
+    private ShardingSphereTable table;
+    
     @BeforeEach
     void setUp() {
-        shardingConditionEngine = new WhereClauseShardingConditionEngine(rule, 
mock(TimestampServiceRule.class));
+        shardingConditionEngine = new 
WhereClauseShardingConditionEngine(database, rule, 
mock(TimestampServiceRule.class));
         
when(sqlStatementContext.getWhereSegments()).thenReturn(Collections.singleton(whereSegment));
+        when(database.containsSchema("")).thenReturn(true);
+        when(database.getSchema("")).thenReturn(schema);
+        when(schema.containsTable("")).thenReturn(true);
+        when(schema.getTable("")).thenReturn(table);
+        
when(table.getColumn("foo_sharding_col")).thenReturn(mock(ShardingSphereColumn.class));
     }
     
     @Test
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValueGeneratorFactoryTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValueGeneratorFactoryTest.java
index 23d8265312a..b16bf7e2fdc 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValueGeneratorFactoryTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/ConditionValueGeneratorFactoryTest.java
@@ -45,7 +45,7 @@ import static org.mockito.Mockito.mock;
 
 class ConditionValueGeneratorFactoryTest {
     
-    private final HashColumn column = new HashColumn("id", "tbl");
+    private final HashColumn column = new HashColumn("id", "tbl", false);
     
     @Test
     void assertGenerateBinaryOperationExpression() {
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java
index 0308b785035..e4c6f848411 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueBetweenOperatorGeneratorTest.java
@@ -56,7 +56,7 @@ class ConditionValueBetweenOperatorGeneratorTest {
     
     private final ConditionValueBetweenOperatorGenerator generator = new 
ConditionValueBetweenOperatorGenerator();
     
-    private final HashColumn column = new HashColumn("id", "tbl");
+    private final HashColumn column = new HashColumn("id", "tbl", false);
     
     private final TimestampServiceRule timestampServiceRule = new 
TimestampServiceRule(new TimestampServiceRuleConfiguration("System", new 
Properties()));
     
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java
index b34c2fe1e3d..064dc876a69 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueCompareOperatorGeneratorTest.java
@@ -46,7 +46,7 @@ class ConditionValueCompareOperatorGeneratorTest {
     
     private final ConditionValueCompareOperatorGenerator generator = new 
ConditionValueCompareOperatorGenerator();
     
-    private final HashColumn column = new HashColumn("id", "tbl");
+    private final HashColumn column = new HashColumn("id", "tbl", false);
     
     @SuppressWarnings("unchecked")
     @Test
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
index 6c193daa238..0ab5579bbaf 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/generator/impl/ConditionValueInOperatorGeneratorTest.java
@@ -48,7 +48,7 @@ class ConditionValueInOperatorGeneratorTest {
     
     private final ConditionValueInOperatorGenerator generator = new 
ConditionValueInOperatorGenerator();
     
-    private final HashColumn column = new HashColumn("id", "tbl");
+    private final HashColumn column = new HashColumn("id", "tbl", false);
     
     private final TimestampServiceRule timestampServiceRule = new 
TimestampServiceRule(new TimestampServiceRuleConfiguration("System", new 
Properties()));
     
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumn.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumn.java
index fccb5627abf..c9f2d5833ee 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumn.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumn.java
@@ -33,11 +33,14 @@ public final class HashColumn {
     
     private final String tableName;
     
+    private final boolean caseSensitive;
+    
     private final int hashCode;
     
-    public HashColumn(final String name, final String tableName) {
+    public HashColumn(final String name, final String tableName, final boolean 
caseSensitive) {
         this.name = name;
         this.tableName = tableName;
+        this.caseSensitive = caseSensitive;
         hashCode = Objects.hash(name.toUpperCase(), tableName.toUpperCase());
     }
     
@@ -45,7 +48,7 @@ public final class HashColumn {
     public boolean equals(final Object obj) {
         if (obj instanceof HashColumn) {
             HashColumn column = (HashColumn) obj;
-            return name.equalsIgnoreCase(column.name) && 
tableName.equalsIgnoreCase(column.tableName);
+            return name.equalsIgnoreCase(column.name) && 
tableName.equalsIgnoreCase(column.tableName) && caseSensitive == 
column.caseSensitive;
         }
         return false;
     }
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumnTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumnTest.java
index 70d11f23a0c..0dd09edd62b 100644
--- 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumnTest.java
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/schema/HashColumnTest.java
@@ -27,19 +27,19 @@ class HashColumnTest {
     
     @Test
     void assertEquals() {
-        assertThat(new HashColumn("col", "tbl"), not(new Object()));
-        assertThat(new HashColumn("col", "tbl"), is(new HashColumn("COL", 
"TBL")));
-        assertThat(new HashColumn("col", "tbl"), not(new HashColumn("col1", 
"tbl")));
-        assertThat(new HashColumn("col", "tbl"), not(new HashColumn("col", 
"tbl1")));
-        HashColumn column1 = new HashColumn("col", "tbl");
-        HashColumn column2 = new HashColumn("COL", "TBL");
+        assertThat(new HashColumn("col", "tbl", false), not(new Object()));
+        assertThat(new HashColumn("col", "tbl", false), is(new 
HashColumn("COL", "TBL", false)));
+        assertThat(new HashColumn("col", "tbl", false), not(new 
HashColumn("col1", "tbl", false)));
+        assertThat(new HashColumn("col", "tbl", false), not(new 
HashColumn("col", "tbl1", false)));
+        HashColumn column1 = new HashColumn("col", "tbl", false);
+        HashColumn column2 = new HashColumn("COL", "TBL", false);
         assertThat(column1.equals(column2), is(true));
         assertThat(column2.equals(column1), is(true));
     }
     
     @Test
     void assertHashCode() {
-        assertThat(new HashColumn("col", "tbl").hashCode(), is(new 
HashColumn("COL", "TBL").hashCode()));
-        assertThat(new HashColumn("col", "tbl").hashCode(), not(new 
HashColumn("different_col", "tbl").hashCode()));
+        assertThat(new HashColumn("col", "tbl", false).hashCode(), is(new 
HashColumn("COL", "TBL", false).hashCode()));
+        assertThat(new HashColumn("col", "tbl", false).hashCode(), not(new 
HashColumn("different_col", "tbl", false).hashCode()));
     }
 }

Reply via email to