This is an automated email from the ASF dual-hosted git repository.

zhangliang 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 a99f76f810d Refactor InvalidBindingTablesException to accept a custom 
message and enhance binding table validation logic (#37142)
a99f76f810d is described below

commit a99f76f810dd2e28fd3c7700918108befb027e96
Author: Liang Zhang <[email protected]>
AuthorDate: Wed Nov 19 21:45:54 2025 +0800

    Refactor InvalidBindingTablesException to accept a custom message and 
enhance binding table validation logic (#37142)
    
    * Refactor InvalidBindingTablesException to accept a custom message and 
enhance binding table validation logic
    
    * Refactor InvalidBindingTablesException to accept a custom message and 
enhance binding table validation logic
---
 AGENTS.md                                          |  1 -
 RELEASE-NOTES.md                                   |  1 +
 .../metadata/InvalidBindingTablesException.java    |  4 +--
 .../sharding/rule/checker/ShardingRuleChecker.java | 39 +++++++++++++++++++---
 .../sharding/rule/ShardingRuleTest.java            | 17 ++++++++++
 5 files changed, 54 insertions(+), 8 deletions(-)

diff --git a/AGENTS.md b/AGENTS.md
index 7bbbd58cf89..70d3a86c1bb 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -98,7 +98,6 @@ This guide is written **for AI coding agents only**. Follow 
it literally; improv
 ### After Completion
 - Validate functional correctness and code quality.
 - Update related tests and documentation.
-- Summarize key learnings, constraints, and best practices for this task 
inside `AGENTS.md`.
 
 ## Terminal Output Style Guide
 
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index ee7726e2d3a..a9307fd8e6e 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -49,6 +49,7 @@
 1. Proxy: Implement write bool binary data type for PostgreSQL protocol - 
[#35831](https://github.com/apache/shardingsphere/pull/35831)
 1. Proxy: Add authority check on SQL `SHOW CREATE DATABASE` for MySQL - 
[#36862](https://github.com/apache/shardingsphere/pull/36862)
 1. Sharding: Using cache to avoid memory overflow from inline expression 
parsing - [#22196](https://github.com/apache/shardingsphere/issues/22196)
+1. Sharding: Add digital suffix check with binding table names - 
[#35293](https://github.com/apache/shardingsphere/issues/35293)
 1. Encrypt: Use EncryptDerivedColumnSuffix to enhance encrypt table subquery 
rewrite logic - [#34829](https://github.com/apache/shardingsphere/pull/34829)
 1. Encrypt: Add quotes to encrypt rewrite derived columns - 
[#34950](https://github.com/apache/shardingsphere/pull/34950)
 1. Encrypt: Support NOT LIKE operator in encryption feature - 
[#35984](https://github.com/apache/shardingsphere/pull/35984)
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/InvalidBindingTablesException.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/InvalidBindingTablesException.java
index a0e11cfc933..6843284572c 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/InvalidBindingTablesException.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/exception/metadata/InvalidBindingTablesException.java
@@ -27,7 +27,7 @@ public final class InvalidBindingTablesException extends 
ShardingSQLException {
     
     private static final long serialVersionUID = 6913516240331555395L;
     
-    public InvalidBindingTablesException() {
-        super(XOpenSQLState.CHECK_OPTION_VIOLATION, 10, "Invalid binding table 
configuration.");
+    public InvalidBindingTablesException(final String message) {
+        super(XOpenSQLState.CHECK_OPTION_VIOLATION, 10, message);
     }
 }
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/checker/ShardingRuleChecker.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/checker/ShardingRuleChecker.java
index 881d942f04f..f7abb48888f 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/checker/ShardingRuleChecker.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/rule/checker/ShardingRuleChecker.java
@@ -69,11 +69,40 @@ public class ShardingRuleChecker {
     }
     
     private void checkBindingTableConfiguration(final 
ShardingRuleConfiguration ruleConfig) {
-        ShardingSpherePreconditions.checkState(
-                
isValidBindingTableConfiguration(shardingRule.getShardingTables(),
-                        new 
BindingTableCheckedConfiguration(shardingRule.getDataSourceNames(), 
shardingRule.getShardingAlgorithms(), ruleConfig.getBindingTableGroups(),
-                                
shardingRule.getDefaultDatabaseShardingStrategyConfig(), 
shardingRule.getDefaultTableShardingStrategyConfig(), 
shardingRule.getDefaultShardingColumn())),
-                InvalidBindingTablesException::new);
+        checkBindingTablesNumericSuffix(ruleConfig.getBindingTableGroups(), 
shardingRule.getShardingTables());
+        BindingTableCheckedConfiguration checkedConfig = new 
BindingTableCheckedConfiguration(shardingRule.getDataSourceNames(), 
shardingRule.getShardingAlgorithms(),
+                ruleConfig.getBindingTableGroups(), 
shardingRule.getDefaultDatabaseShardingStrategyConfig(), 
shardingRule.getDefaultTableShardingStrategyConfig(),
+                shardingRule.getDefaultShardingColumn());
+        
ShardingSpherePreconditions.checkState(isValidBindingTableConfiguration(shardingRule.getShardingTables(),
 checkedConfig),
+                () -> new InvalidBindingTablesException("Invalid binding table 
configuration."));
+    }
+    
+    private void checkBindingTablesNumericSuffix(final 
Collection<ShardingTableReferenceRuleConfiguration> bindingTableGroups, final 
Map<String, ShardingTable> shardingTables) {
+        for (ShardingTableReferenceRuleConfiguration each : 
bindingTableGroups) {
+            Collection<String> bindingTables = 
Splitter.on(",").trimResults().splitToList(each.getReference());
+            if (bindingTables.size() <= 1) {
+                continue;
+            }
+            for (String logicTable : bindingTables) {
+                
ShardingSpherePreconditions.checkState(hasValidNumericSuffix(getShardingTable(logicTable,
 shardingTables)),
+                        () -> new 
InvalidBindingTablesException(String.format("Alphabetical table suffixes are 
not supported in binding tables '%s'.", each.getReference())));
+            }
+        }
+    }
+    
+    private boolean hasValidNumericSuffix(final ShardingTable shardingTable) {
+        String logicTable = shardingTable.getLogicTable();
+        int logicTableLength = logicTable.length();
+        for (DataNode each : shardingTable.getActualDataNodes()) {
+            String tableName = each.getTableName();
+            if (tableName.equalsIgnoreCase(logicTable)) {
+                continue;
+            }
+            if (tableName.length() > logicTableLength && 
tableName.regionMatches(true, 0, logicTable, 0, logicTableLength) && 
!Character.isDigit(tableName.charAt(tableName.length() - 1))) {
+                return false;
+            }
+        }
+        return true;
     }
     
     private boolean isValidBindingTableConfiguration(final Map<String, 
ShardingTable> shardingTables, final BindingTableCheckedConfiguration 
checkedConfig) {
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
index 6ab39ae9e63..a157e5fc7b5 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/rule/ShardingRuleTest.java
@@ -447,6 +447,23 @@ class ShardingRuleTest {
         assertThrows(InvalidBindingTablesException.class, () -> new 
ShardingRule(shardingRuleConfig, createDataSources(), 
mock(ComputeNodeInstanceContext.class), Collections.emptyList()));
     }
     
+    @Test
+    void assertCreateBindingTablesWithAlphabeticalSuffixesFailure() {
+        ShardingTableRuleConfiguration shardingTableRuleConfig = new 
ShardingTableRuleConfiguration("t_order", "ds_${0..1}.t_order_${['a','b']}");
+        shardingTableRuleConfig.setDatabaseShardingStrategy(new 
NoneShardingStrategyConfiguration());
+        shardingTableRuleConfig.setTableShardingStrategy(new 
NoneShardingStrategyConfiguration());
+        ShardingTableRuleConfiguration subTableRuleConfig = new 
ShardingTableRuleConfiguration("t_order_item", 
"ds_${0..1}.t_order_item_${['a','b']}");
+        subTableRuleConfig.setDatabaseShardingStrategy(new 
NoneShardingStrategyConfiguration());
+        subTableRuleConfig.setTableShardingStrategy(new 
NoneShardingStrategyConfiguration());
+        ShardingRuleConfiguration shardingRuleConfig = new 
ShardingRuleConfiguration();
+        shardingRuleConfig.getTables().add(shardingTableRuleConfig);
+        shardingRuleConfig.getTables().add(subTableRuleConfig);
+        shardingRuleConfig.getBindingTableGroups().add(new 
ShardingTableReferenceRuleConfiguration("foo", "t_order,t_order_item"));
+        InvalidBindingTablesException actual = 
assertThrows(InvalidBindingTablesException.class,
+                () -> new ShardingRule(shardingRuleConfig, 
createDataSources(), mock(ComputeNodeInstanceContext.class), 
Collections.emptyList()));
+        assertThat(actual.getMessage(), is("Alphabetical table suffixes are 
not supported in binding tables 't_order,t_order_item'."));
+    }
+    
     @Test
     void assertGenerateKeyWithDefaultKeyGenerator() {
         AlgorithmSQLContext generateContext = mock(AlgorithmSQLContext.class);

Reply via email to