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