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 8b74d49e11c Fix SQL hint sharding value aliases being ignored during
routing (#40072)
8b74d49e11c is described below
commit 8b74d49e11cf1cfcceb0d303ceaf60b59a979ab5
Author: Eunbin Son <[email protected]>
AuthorDate: Fri Oct 16 15:04:10 2026 +0900
Fix SQL hint sharding value aliases being ignored during routing (#40072)
* Fix SQL hint sharding value aliases being ignored during routing
* Preserve table prefix when normalizing SQL hint sharding value keys
Normalize only the property name after the last dot so a table name that
contains the alias, such as t_shardingDatabaseValue, still matches the key
HintValueContext looks up.
---
RELEASE-NOTES.md | 1 +
.../apache/shardingsphere/infra/hint/SQLHintUtils.java | 9 +++++++--
.../shardingsphere/infra/hint/SQLHintUtilsTest.java | 18 ++++++++++++++++--
3 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 1f71f6341eb..c99eca3b9a9 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -113,6 +113,7 @@
1. Sharding: Rewrite generated ORDER BY column owners to actual table names -
[#39866](https://github.com/apache/shardingsphere/pull/39866)
1. Sharding: Reject sharding auto table configured with none sharding strategy
- [#39869](https://github.com/apache/shardingsphere/pull/39869)
1. Sharding: Fix IN predicates with an expression item routing only to the
shards of the other items -
[#40128](https://github.com/apache/shardingsphere/issues/40128)
+1. Sharding: Fix SQL hint sharding value aliases being ignored during routing
- [#40072](https://github.com/apache/shardingsphere/pull/40072)
1. Readwrite-splitting: Evaluate inline expressions in data source names of
rule configuration checker -
[#39374](https://github.com/apache/shardingsphere/pull/39374)
1. SQL Federation: Fix SQL Federation pagination binding for long LIMIT
parameters - [#39237](https://github.com/apache/shardingsphere/pull/39237)
1. Broadcast: Fix case-sensitive table name lookup in broadcast data node rule
attribute - [#39153](https://github.com/apache/shardingsphere/pull/39153)
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java
index 2f5b0a91d91..21c4599fee3 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/hint/SQLHintUtils.java
@@ -85,10 +85,10 @@ public final class SQLHintUtils {
for (Entry<String, String> entry : hintKeyValues.entrySet()) {
Comparable<?> value = convert(entry.getValue());
if (containsHintKey(Objects.toString(entry.getKey()),
SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY)) {
-
result.getShardingDatabaseValues().put(Objects.toString(entry.getKey()).toUpperCase(),
value);
+
result.getShardingDatabaseValues().put(getShardingValueKey(Objects.toString(entry.getKey()),
SQLHintPropertiesKey.SHARDING_DATABASE_VALUE_KEY), value);
}
if (containsHintKey(Objects.toString(entry.getKey()),
SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY)) {
-
result.getShardingTableValues().put(Objects.toString(entry.getKey()).toUpperCase(),
value);
+
result.getShardingTableValues().put(getShardingValueKey(Objects.toString(entry.getKey()),
SQLHintPropertiesKey.SHARDING_TABLE_VALUE_KEY), value);
}
}
return result;
@@ -134,6 +134,11 @@ public final class SQLHintUtils {
return hintPropKey.contains(sqlHintPropsKey.getKey()) ||
hintPropKey.contains(sqlHintPropsKey.getAlias());
}
+ private static String getShardingValueKey(final String hintPropKey, final
SQLHintPropertiesKey sqlHintPropsKey) {
+ int propertyNameIndex = hintPropKey.lastIndexOf('.') + 1;
+ return (hintPropKey.substring(0, propertyNameIndex) +
hintPropKey.substring(propertyNameIndex).replace(sqlHintPropsKey.getAlias(),
sqlHintPropsKey.getKey())).toUpperCase();
+ }
+
private static String getHintValue(final Map<String, String>
hintKeyValues, final SQLHintPropertiesKey sqlHintPropsKey) {
String result = hintKeyValues.get(sqlHintPropsKey.getKey());
return null == result ? hintKeyValues.get(sqlHintPropsKey.getAlias())
: result;
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java
index 4e69e1bfedb..f416cea23d2 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/hint/SQLHintUtilsTest.java
@@ -58,12 +58,24 @@ class SQLHintUtilsTest {
assertThat(SQLHintUtils.extractHint(sql).getHintShardingDatabaseValue("t_order"),
is(expectedValues));
}
+ @Test
+ void
assertExtractHintWithShardingDatabaseValueWhenTableNameContainsAlias() {
+ assertThat(SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT:
t_shardingDatabaseValue.SHARDING_DATABASE_VALUE=1
*/").getHintShardingDatabaseValue("t_shardingDatabaseValue"),
+ is(Collections.<Comparable<?>>singletonList(new
BigInteger("1"))));
+ }
+
@ParameterizedTest(name = "{0}")
@MethodSource("extractHintShardingTableValueArguments")
void assertExtractHintWithShardingTableValue(final String name, final
String sql, final Collection<Comparable<?>> expectedValues) {
assertThat(SQLHintUtils.extractHint(sql).getHintShardingTableValue("t_order"),
is(expectedValues));
}
+ @Test
+ void assertExtractHintWithShardingTableValueWhenTableNameContainsAlias() {
+ assertThat(SQLHintUtils.extractHint("/* SHARDINGSPHERE_HINT:
t_shardingTableValue.SHARDING_TABLE_VALUE=1
*/").getHintShardingTableValue("t_shardingTableValue"),
+ is(Collections.<Comparable<?>>singletonList(new
BigInteger("1"))));
+ }
+
@ParameterizedTest(name = "{0}")
@MethodSource("extractHintDataSourceNameArguments")
void assertExtractHintWithDataSourceName(final String name, final String
sql, final String expectedDataSourceName) {
@@ -89,16 +101,18 @@ class SQLHintUtilsTest {
private static Stream<Arguments>
extractHintShardingDatabaseValueArguments() {
return Stream.of(
Arguments.of("default_numeric_value", "/* SHARDINGSPHERE_HINT:
SHARDING_DATABASE_VALUE=10 */", Collections.<Comparable<?>>singletonList(new
BigInteger("10"))),
+ Arguments.of("default_alias_numeric_value", "/*
SHARDINGSPHERE_HINT: shardingDatabaseValue=10 */",
Collections.<Comparable<?>>singletonList(new BigInteger("10"))),
Arguments.of("table_numeric_value", "/* SHARDINGSPHERE_HINT:
t_order.SHARDING_DATABASE_VALUE=10 */",
Collections.<Comparable<?>>singletonList(new BigInteger("10"))),
- Arguments.of("table_alias_numeric_value", "/*
SHARDINGSPHERE_HINT: t_order.shardingDatabaseValue=10 */",
Collections.<Comparable<?>>emptyList()),
+ Arguments.of("table_alias_numeric_value", "/*
SHARDINGSPHERE_HINT: t_order.shardingDatabaseValue=10 */",
Collections.<Comparable<?>>singletonList(new BigInteger("10"))),
Arguments.of("table_string_value", "/* SHARDINGSPHERE_HINT:
t_order.SHARDING_DATABASE_VALUE=a */",
Collections.<Comparable<?>>singletonList("a")));
}
private static Stream<Arguments> extractHintShardingTableValueArguments() {
return Stream.of(
Arguments.of("default_numeric_value", "/* SHARDINGSPHERE_HINT:
SHARDING_TABLE_VALUE=10 */", Collections.<Comparable<?>>singletonList(new
BigInteger("10"))),
+ Arguments.of("default_alias_numeric_value", "/*
SHARDINGSPHERE_HINT: shardingTableValue=10 */",
Collections.<Comparable<?>>singletonList(new BigInteger("10"))),
Arguments.of("table_numeric_value", "/* SHARDINGSPHERE_HINT:
t_order.SHARDING_TABLE_VALUE=10 */",
Collections.<Comparable<?>>singletonList(new BigInteger("10"))),
- Arguments.of("table_alias_numeric_value", "/*
SHARDINGSPHERE_HINT: t_order.shardingTableValue=10 */",
Collections.<Comparable<?>>emptyList()),
+ Arguments.of("table_alias_numeric_value", "/*
SHARDINGSPHERE_HINT: t_order.shardingTableValue=10 */",
Collections.<Comparable<?>>singletonList(new BigInteger("10"))),
Arguments.of("table_string_value", "/* SHARDINGSPHERE_HINT:
t_order.SHARDING_TABLE_VALUE=a */",
Collections.<Comparable<?>>singletonList("a")));
}