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 bba752137e4 Fix Sharding column not tracked through aliases (#31687)
bba752137e4 is described below
commit bba752137e4f5c9723babccad7e0e890bfb85e9b
Author: LotusMoon <[email protected]>
AuthorDate: Sat Jun 15 19:36:33 2024 +0800
Fix Sharding column not tracked through aliases (#31687)
---
.../engine/WhereClauseShardingConditionEngine.java | 2 +-
.../scenario/sharding/case/dml/select.xml | 22 ++++++++++++++++++++++
2 files changed, 23 insertions(+), 1 deletion(-)
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 ce479bf669e..53ae941233e 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
@@ -120,7 +120,7 @@ public final class WhereClauseShardingConditionEngine {
for (ExpressionSegment each : predicates) {
for (ColumnSegment columnSegment : ColumnExtractor.extract(each)) {
Optional<String> tableName =
Optional.ofNullable(columnTableNames.get(columnSegment.getExpression()));
- Optional<String> shardingColumn = tableName.flatMap(optional
-> shardingRule.findShardingColumn(columnSegment.getIdentifier().getValue(),
optional));
+ Optional<String> shardingColumn = tableName.flatMap(optional
->
shardingRule.findShardingColumn(columnSegment.getColumnBoundedInfo().getOriginalColumn().getValue(),
optional));
if (!tableName.isPresent() || !shardingColumn.isPresent()) {
continue;
}
diff --git
a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml
b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml
index 1ec3880f2e9..b941901c93a 100644
--- a/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml
+++ b/test/it/rewriter/src/test/resources/scenario/sharding/case/dml/select.xml
@@ -17,6 +17,28 @@
-->
<rewrite-assertions yaml-rule="scenario/sharding/config/sharding-rule.yaml">
+ <rewrite-assertion id="select_over_aliased_shard_column"
db-types="MySQL,SQLServer,SQL92,PostgreSQL">
+ <input sql="SELECT * FROM (SELECT account_id aliased_account_id FROM
t_account) t1 WHERE aliased_account_id = ?" parameters="100" />
+ <output sql="SELECT * FROM (SELECT account_id aliased_account_id FROM
t_account_0) t1 WHERE aliased_account_id = ?" parameters="100" />
+ </rewrite-assertion>
+
+ <rewrite-assertion id="select_over_aliased_shard_column_oracle"
db-types="Oracle">
+ <input sql="SELECT * FROM (SELECT account_id aliased_account_id FROM
t_account) WHERE aliased_account_id = ?" parameters="100" />
+ <output sql="SELECT * FROM (SELECT account_id aliased_account_id FROM
t_account_0) WHERE aliased_account_id = ?" parameters="100" />
+ </rewrite-assertion>
+
+ <rewrite-assertion id="select_over_alias_as_shard_column"
db-types="MySQL,SQLServer,SQL92,PostgreSQL">
+ <input sql="SELECT * FROM (SELECT amount account_id FROM t_account) t1
WHERE account_id = ?" parameters="100" />
+ <output sql="SELECT * FROM (SELECT amount account_id FROM t_account_0)
t1 WHERE account_id = ?" parameters="100" />
+ <output sql="SELECT * FROM (SELECT amount account_id FROM t_account_1)
t1 WHERE account_id = ?" parameters="100" />
+ </rewrite-assertion>
+
+ <rewrite-assertion id="select_over_alias_as_shard_column_oracle"
db-types="Oracle">
+ <input sql="SELECT * FROM (SELECT amount account_id FROM t_account)
WHERE account_id = ?" parameters="100" />
+ <output sql="SELECT * FROM (SELECT amount account_id FROM t_account_0)
WHERE account_id = ?" parameters="100" />
+ <output sql="SELECT * FROM (SELECT amount account_id FROM t_account_1)
WHERE account_id = ?" parameters="100" />
+ </rewrite-assertion>
+
<rewrite-assertion id="select_with_sharding_value_for_parameters">
<input sql="SELECT * FROM t_account WHERE account_id = ?"
parameters="100" />
<output sql="SELECT * FROM t_account_0 WHERE account_id = ?"
parameters="100" />