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

Reply via email to