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 cf1719bd5ad fix issue-27424 when the table contains case-sensitive 
fields (#27904)
cf1719bd5ad is described below

commit cf1719bd5ad0ca96f02a9e70c4ad96bffcb3b19a
Author: bpzhang <[email protected]>
AuthorDate: Sun Sep 17 17:47:20 2023 +0800

    fix issue-27424 when the table contains case-sensitive fields (#27904)
    
    * fix issue-27424 when the table contains case-sensitive fields
    
    * add unit test
    
    * format code style
    
    ---------
    
    Co-authored-by: bpzhang <[email protected]>
---
 .../engine/InsertClauseShardingConditionEngine.java          |  2 +-
 .../engine/InsertClauseShardingConditionEngineTest.java      | 12 ++++++++++--
 .../binder/context/statement/dml/InsertStatementContext.java |  2 +-
 3 files changed, 12 insertions(+), 4 deletions(-)

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 c70613582ab..c6b2b889b0b 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
@@ -100,7 +100,7 @@ public final class InsertClauseShardingConditionEngine {
             return;
         }
         for (String each : allColumnNames) {
-            if (!columnNames.contains(each) && 
!shardingRule.isGenerateKeyColumn(each, tableName) && 
shardingRule.findShardingColumn(each, tableName).isPresent()) {
+            if (!columnNames.contains(each.toLowerCase()) && 
!shardingRule.isGenerateKeyColumn(each, tableName) && 
shardingRule.findShardingColumn(each, tableName).isPresent()) {
                 appendMissingShardingConditions(shardingConditions, each, 
tableName);
             }
         }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngineTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngineTest.java
index 87be0cbb26c..58b5150a6a0 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngineTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/condition/engine/InsertClauseShardingConditionEngineTest.java
@@ -82,7 +82,7 @@ class InsertClauseShardingConditionEngineTest {
         InsertStatement insertStatement = mockInsertStatement();
         shardingConditionEngine = new 
InsertClauseShardingConditionEngine(database, shardingRule, new 
TimestampServiceRule(new TimestampServiceRuleConfiguration("System", new 
Properties())));
         
when(insertStatementContext.getSqlStatement()).thenReturn(insertStatement);
-        
when(insertStatementContext.getColumnNames()).thenReturn(Collections.singletonList("foo_col_1"));
+        
when(insertStatementContext.getColumnNames()).thenReturn(Arrays.asList("foo_col_1",
 "foo_col_3"));
         
when(insertStatementContext.getInsertValueContexts()).thenReturn(Collections.singletonList(createInsertValueContext()));
         when(insertStatementContext.getInsertSelectContext()).thenReturn(null);
         
when(insertStatementContext.getDatabaseType()).thenReturn(TypedSPILoader.getService(DatabaseType.class,
 "FIXTURE"));
@@ -94,7 +94,7 @@ class InsertClauseShardingConditionEngineTest {
         when(result.getName()).thenReturn(DefaultDatabase.LOGIC_NAME);
         ShardingSphereSchema schema = mock(ShardingSphereSchema.class, 
RETURNS_DEEP_STUBS);
         when(schema.containsTable("foo_table")).thenReturn(true);
-        
when(schema.getTable("foo_table").getColumnNames()).thenReturn(Arrays.asList("foo_col_1",
 "foo_col_2"));
+        
when(schema.getTable("foo_table").getColumnNames()).thenReturn(Arrays.asList("foo_col_1",
 "foo_col_2", "foo_Col_3"));
         when(result.getSchema(DefaultDatabase.LOGIC_NAME)).thenReturn(schema);
         return result;
     }
@@ -209,4 +209,12 @@ class InsertClauseShardingConditionEngineTest {
         assertThat(actual.get(0).getValues().get(0).getColumnName(), 
is("foo_col_2"));
         assertThat(actual.get(0).getValues().get(0).getTableName(), 
is("foo_table"));
     }
+    
+    @Test
+    void assertCreateShardingConditionsWithCaseSensitiveField() {
+        when(shardingRule.findShardingColumn("foo_Col_3", 
"foo_table")).thenReturn(Optional.of("foo_Col_3"));
+        List<ShardingCondition> actual = 
shardingConditionEngine.createShardingConditions(insertStatementContext, 
Collections.emptyList());
+        assertThat(actual.size(), is(1));
+        
+    }
 }
diff --git 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
index a7848404c7f..fb5a29bb906 100644
--- 
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
+++ 
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/statement/dml/InsertStatementContext.java
@@ -94,7 +94,7 @@ public final class InsertStatementContext extends 
CommonSQLStatementContext impl
         onDuplicateKeyUpdateValueContext = 
getOnDuplicateKeyUpdateValueContext(params, parametersOffset).orElse(null);
         tablesContext = new TablesContext(getAllSimpleTableSegments(), 
getDatabaseType());
         ShardingSphereSchema schema = getSchema(metaData, defaultDatabaseName);
-        columnNames = containsInsertColumns() ? insertColumnNames : 
schema.getVisibleColumnNames(sqlStatement.getTable().getTableName().getIdentifier().getValue());
+        columnNames = containsInsertColumns() ? insertColumnNames : 
schema.getVisibleColumnNames(sqlStatement.getTable().getTableName().getIdentifier().getValue().toLowerCase());
         generatedKeyContext = new GeneratedKeyContextEngine(sqlStatement, 
schema).createGenerateKeyContext(insertColumnNames, 
getAllValueExpressions(sqlStatement), params).orElse(null);
     }
     

Reply via email to