This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 1199b3c9bcc Use configured sharding column name when checking UPDATE
assignments (#39864)
1199b3c9bcc is described below
commit 1199b3c9bcc93eec14391e51ae0b3d7971c73025
Author: Eunbin Son <[email protected]>
AuthorDate: Tue Sep 22 23:15:44 2026 +0900
Use configured sharding column name when checking UPDATE assignments
(#39864)
Co-authored-by: Liang Zhang <[email protected]>
---
RELEASE-NOTES.md | 1 +
.../util/ShardingRouteContextCheckUtils.java | 9 ++++----
.../dml/ShardingUpdateRouteContextCheckerTest.java | 25 ++++++++++++++--------
3 files changed, 22 insertions(+), 13 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index fc22e16bf0b..87e401424b5 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -86,6 +86,7 @@
1. Sharding: Compute the Snowflake key generator epoch in UTC instead of the
JVM default timezone -
[#38932](https://github.com/apache/shardingsphere/pull/38932)
1. Sharding: Fix order-dependent data source intersection in Cartesian routing
- [#39407](https://github.com/apache/shardingsphere/pull/39407)
1. Sharding: Fix incorrect AVG(DISTINCT) merge result across shards -
[#39429](https://github.com/apache/shardingsphere/pull/39429)
+1. Sharding: Use configured sharding column name when checking UPDATE
assignments - [#39864](https://github.com/apache/shardingsphere/pull/39864)
1. Sharding: Fix INTERVAL sharding on one-sided range outside datetime bounds
- [#39862](https://github.com/apache/shardingsphere/pull/39862)
1. Sharding: Fix GROUP_CONCAT merge result when all values are NULL -
[#39860](https://github.com/apache/shardingsphere/pull/39860)
1. Sharding: Fix swapped start and stop offset in sharding value offset error
message - [#39858](https://github.com/apache/shardingsphere/pull/39858)
diff --git
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/checker/util/ShardingRouteContextCheckUtils.java
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/checker/util/ShardingRouteContextCheckUtils.java
index eb4af5c7459..7469df2f3e1 100644
---
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/checker/util/ShardingRouteContextCheckUtils.java
+++
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/route/engine/checker/util/ShardingRouteContextCheckUtils.java
@@ -105,11 +105,12 @@ public final class ShardingRouteContextCheckUtils {
Collection<ShardingConditionValue> values = new LinkedList<>();
String tableName =
sqlStatementContext.getTablesContext().getTableNames().iterator().next();
for (ColumnAssignmentSegment each : assignments) {
- String shardingColumn =
each.getColumns().get(0).getIdentifier().getValue();
- if (shardingRule.findShardingColumn(shardingColumn,
tableName).isPresent()) {
- Optional<Object> assignmentValue =
getShardingColumnAssignmentValue(each, params);
- assignmentValue.ifPresent(optional -> values.add(new
ListShardingConditionValue(shardingColumn, tableName,
Collections.singletonList(optional))));
+ Optional<String> shardingColumn =
shardingRule.findShardingColumn(each.getColumns().get(0).getIdentifier().getValue(),
tableName);
+ if (!shardingColumn.isPresent()) {
+ continue;
}
+ Optional<Object> assignmentValue =
getShardingColumnAssignmentValue(each, params);
+ assignmentValue.ifPresent(optional -> values.add(new
ListShardingConditionValue(shardingColumn.get(), tableName,
Collections.singletonList(optional))));
}
if (values.isEmpty()) {
return Optional.empty();
diff --git
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/dml/ShardingUpdateRouteContextCheckerTest.java
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/dml/ShardingUpdateRouteContextCheckerTest.java
index ad032789351..518fa37fe8a 100644
---
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/dml/ShardingUpdateRouteContextCheckerTest.java
+++
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/checker/dml/ShardingUpdateRouteContextCheckerTest.java
@@ -74,31 +74,38 @@ class ShardingUpdateRouteContextCheckerTest {
@Test
void assertCheckWhenNotUpdateShardingColumn() {
- UpdateStatementContext sqlStatementContext = new
UpdateStatementContext(createUpdateStatement());
+ UpdateStatementContext sqlStatementContext = new
UpdateStatementContext(createUpdateStatement("id"));
when(queryContext.getSqlStatementContext()).thenReturn(sqlStatementContext);
assertDoesNotThrow(() -> new
ShardingUpdateRouteContextChecker().check(shardingRule, queryContext, database,
mock(ConfigurationProperties.class), mock(RouteContext.class)));
}
@Test
void assertCheckWhenUpdateShardingColumnWithSameRouteContext() {
- mockShardingRuleForUpdateShardingColumn();
- when(queryContext.getSqlStatementContext()).thenReturn(new
UpdateStatementContext(createUpdateStatement()));
+ mockShardingRuleForUpdateShardingColumn("id");
+ when(queryContext.getSqlStatementContext()).thenReturn(new
UpdateStatementContext(createUpdateStatement("id")));
+ assertDoesNotThrow(() -> new
ShardingUpdateRouteContextChecker().check(shardingRule, queryContext, database,
mock(ConfigurationProperties.class), createSingleRouteContext()));
+ }
+
+ @Test
+ void
assertCheckWhenUpdateShardingColumnWithDifferentCaseFromConfiguration() {
+ mockShardingRuleForUpdateShardingColumn("ID");
+ when(queryContext.getSqlStatementContext()).thenReturn(new
UpdateStatementContext(createUpdateStatement("ID")));
assertDoesNotThrow(() -> new
ShardingUpdateRouteContextChecker().check(shardingRule, queryContext, database,
mock(ConfigurationProperties.class), createSingleRouteContext()));
}
@Test
void assertCheckWhenUpdateShardingColumnWithDifferentRouteContext() {
- mockShardingRuleForUpdateShardingColumn();
- when(queryContext.getSqlStatementContext()).thenReturn(new
UpdateStatementContext(createUpdateStatement()));
+ mockShardingRuleForUpdateShardingColumn("id");
+ when(queryContext.getSqlStatementContext()).thenReturn(new
UpdateStatementContext(createUpdateStatement("id")));
assertThrows(UnsupportedUpdatingShardingValueException.class,
() -> new
ShardingUpdateRouteContextChecker().check(shardingRule, queryContext, database,
mock(ConfigurationProperties.class), createFullRouteContext()));
}
- private void mockShardingRuleForUpdateShardingColumn() {
+ private void mockShardingRuleForUpdateShardingColumn(final String
assignmentColumnName) {
ShardingTable shardingTable = mock(ShardingTable.class);
when(shardingTable.getActualDataSourceNames()).thenReturn(Arrays.asList("ds_0",
"ds_1"));
when(shardingTable.getActualTableNames("ds_1")).thenReturn(Collections.singleton("user"));
- when(shardingRule.findShardingColumn("id",
"user")).thenReturn(Optional.of("id"));
+ when(shardingRule.findShardingColumn(assignmentColumnName,
"user")).thenReturn(Optional.of("id"));
when(shardingRule.getShardingTable("user")).thenReturn(shardingTable);
StandardShardingStrategyConfiguration databaseStrategyConfig =
mock(StandardShardingStrategyConfiguration.class);
when(databaseStrategyConfig.getShardingColumn()).thenReturn("id");
@@ -124,9 +131,9 @@ class ShardingUpdateRouteContextCheckerTest {
return result;
}
- private UpdateStatement createUpdateStatement() {
+ private UpdateStatement createUpdateStatement(final String
assignmentColumnName) {
List<ColumnSegment> columns = new LinkedList<>();
- columns.add(new ColumnSegment(0, 0, new IdentifierValue("id")));
+ columns.add(new ColumnSegment(0, 0, new
IdentifierValue(assignmentColumnName)));
ColumnAssignmentSegment assignment = new ColumnAssignmentSegment(0, 0,
columns, new LiteralExpressionSegment(0, 0, 1));
return UpdateStatement.builder()
.databaseType(databaseType)