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