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

sunnianjun 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 4dfa96469f6 Refactor ReadwriteSplittingSQLException (#30884)
4dfa96469f6 is described below

commit 4dfa96469f62fae695225b7fc5b85e437da84cb8
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Apr 14 23:48:29 2024 +0800

    Refactor ReadwriteSplittingSQLException (#30884)
    
    * Rename MissingRequiredReadwriteSplittingDataSourceRuleNameException
    
    * Remove MissingRequiredReadStorageUnitException
    
    * Refactor MissingRequiredReadwriteSplittingDataSourceRuleNameException
    
    * Refactor DuplicateReadwriteSplittingActualDataSourceException
    
    * Add ReadwriteSplittingRuleExceptionIdentifier
    
    * Refactor ReadwriteSplittingActualDataSourceNameNotFoundException
    
    * Rename ReadwriteSplittingActualDataSourceNotFoundException
    
    * Rename InvalidInlineExpressionDataSourcesException
    
    * Refactor ReadwriteSplittingSQLException
---
 .../user-manual/error-code/sql-error-code.cn.md    | 16 ++++----
 .../user-manual/error-code/sql-error-code.en.md    | 16 ++++----
 ...ReadwriteSplittingRuleConfigurationChecker.java | 38 ++++++++++--------
 .../MissingRequiredReadStorageUnitException.java   | 32 ---------------
 ...issingRequiredWriteDataSourceNameException.java | 32 ---------------
 ...ReadwriteSplittingRuleExceptionIdentifier.java} | 16 +++++---
 ...adwriteSplittingActualDataSourceException.java} | 13 ++++---
 ...ActualDataSourceInlineExpressionException.java} | 13 ++++---
 ...iteSplittingActualDataSourceNameException.java} | 13 ++++---
 ...plittingActualDataSourceNotFoundException.java} | 13 ++++---
 ...writeSplittingDataSourceRuleNameException.java} | 14 +++----
 .../rule/ReadwriteSplittingRule.java               | 21 +++++-----
 ...writeSplittingRuleConfigurationCheckerTest.java | 12 +++---
 .../ReadwriteSplittingRuleStatementChecker.java    | 45 +++++++++++++---------
 ...eadwriteSplittingStorageUnitStatusExecutor.java | 11 ++++--
 .../AlterReadwriteSplittingRuleExecutorTest.java   | 10 ++---
 .../CreateReadwriteSplittingRuleExecutorTest.java  | 11 +++---
 17 files changed, 146 insertions(+), 180 deletions(-)

diff --git a/docs/document/content/user-manual/error-code/sql-error-code.cn.md 
b/docs/document/content/user-manual/error-code/sql-error-code.cn.md
index 7994f3ed0db..bfc7b29cd88 100644
--- a/docs/document/content/user-manual/error-code/sql-error-code.cn.md
+++ b/docs/document/content/user-manual/error-code/sql-error-code.cn.md
@@ -192,15 +192,13 @@ SQL 错误码以标准的 SQL State,Vendor Code 和详细错误信息提供,
 
 ### 读写分离
 
-| Vendor Code | SQL State | 错误信息                                               
   |
-|-------------|-----------|-------------------------------------------------------|
-| 20200       | 42S02     | Data source name is required in database '%s'.     
   |
-| 20201       | 42S02     | Write data source name is required in database 
'%s'.  |
-| 20202       | 42S02     | Read data source names is required in database 
'%s'.  |
-| 20203       | 44000     | Duplicated %s data source '%s' in database '%s'.   
   |
-| 20204       | 42S02     | %s data source name '%s' not in database '%s'.     
   |
-| 20205       | 44000     | %s data source names size error on inline 
expression. |
-| 20210       | 42S02     | Read storage unit '%s' does not exist in rule 
'%s'.   |
+| Vendor Code | SQL State | 错误信息                                               
                         |
+|-------------|-----------|-----------------------------------------------------------------------------|
+| 20200       | 42S02     | Readwrite-splitting data source rule name is 
required in database '%s'.     |
+| 20201       | 42S02     | Readwrite-splitting [READ/WRITE] data source name 
is required in %s.        |
+| 20202       | 42S02     | Can not find readwrite-splitting [READ/WRITE] data 
source '%s' in %s.       |
+| 20203       | 42S01     | Readwrite-splitting [READ/WRITE] data source '%s' 
is duplicated in %s.      |
+| 20204       | 44000     | Readwrite-splitting [READ/WRITE] data source 
inline expression error in %s. |
 
 ### SQL 方言转换
 
diff --git a/docs/document/content/user-manual/error-code/sql-error-code.en.md 
b/docs/document/content/user-manual/error-code/sql-error-code.en.md
index fd987707192..497cd2ff6d5 100644
--- a/docs/document/content/user-manual/error-code/sql-error-code.en.md
+++ b/docs/document/content/user-manual/error-code/sql-error-code.en.md
@@ -193,15 +193,13 @@ SQL error codes provide by standard `SQL State`, `Vendor 
Code` and `Reason`, whi
 
 ### Readwrite-splitting
 
-| Vendor Code | SQL State | Reason                                             
   |
-|-------------|-----------|-------------------------------------------------------|
-| 20200       | 42S02     | Data source name is required in database '%s'.     
   |
-| 20201       | 42S02     | Write data source name is required in database 
'%s'.  |
-| 20202       | 42S02     | Read data source names is required in database 
'%s'.  |
-| 20203       | 44000     | Duplicated %s data source '%s' in database '%s'.   
   |
-| 20204       | 42S02     | %s data source name '%s' not in database '%s'.     
   |
-| 20205       | 44000     | %s data source names size error on inline 
expression. |
-| 20210       | 42S02     | Read storage unit '%s' does not exist in rule 
'%s'.   |
+| Vendor Code | SQL State | Reason                                             
                         |
+|-------------|-----------|-----------------------------------------------------------------------------|
+| 20200       | 42S02     | Readwrite-splitting data source rule name is 
required in database '%s'.     |
+| 20201       | 42S02     | Readwrite-splitting [READ/WRITE] data source name 
is required in %s.        |
+| 20202       | 42S02     | Can not find readwrite-splitting [READ/WRITE] data 
source '%s' in %s.       |
+| 20203       | 42S01     | Readwrite-splitting [READ/WRITE] data source '%s' 
is duplicated in %s.      |
+| 20204       | 44000     | Readwrite-splitting [READ/WRITE] data source 
inline expression error in %s. |
 
 ### SQL Dialect Translator
 
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
index 8a2ce891dca..c1b6913184c 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
@@ -31,11 +31,11 @@ import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
-import 
org.apache.shardingsphere.readwritesplitting.exception.DataSourceNameNotExistedException;
-import 
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
-import 
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredDataSourceNameException;
-import 
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredReadDataSourceNamesException;
-import 
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredWriteDataSourceNameException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.ReadwriteSplittingActualDataSourceNotFoundException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.MissingRequiredReadwriteSplittingActualDataSourceNameException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.logic.MissingRequiredReadwriteSplittingDataSourceRuleNameException;
 
 import javax.sql.DataSource;
 import java.util.Collection;
@@ -61,27 +61,30 @@ public final class 
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
         Collection<String> writeDataSourceNames = new HashSet<>();
         Collection<String> readDataSourceNames = new HashSet<>();
         for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
-            
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(each.getName()), 
() -> new MissingRequiredDataSourceNameException(databaseName));
+            
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(each.getName()), 
() -> new 
MissingRequiredReadwriteSplittingDataSourceRuleNameException(databaseName));
             checkDataSources(databaseName, dataSourceMap, each, 
writeDataSourceNames, readDataSourceNames, builtRules);
         }
     }
     
     private void checkDataSources(final String databaseName, final Map<String, 
DataSource> dataSourceMap, final ReadwriteSplittingDataSourceRuleConfiguration 
config,
                                   final Collection<String> 
writeDataSourceNames, final Collection<String> readDataSourceNames, final 
Collection<ShardingSphereRule> builtRules) {
-        
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(config.getWriteDataSourceName()),
 () -> new MissingRequiredWriteDataSourceNameException(databaseName));
-        
ShardingSpherePreconditions.checkState(!config.getReadDataSourceNames().isEmpty(),
 () -> new MissingRequiredReadDataSourceNamesException(databaseName));
+        
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(config.getWriteDataSourceName()),
 () -> new MissingRequiredReadwriteSplittingActualDataSourceNameException(
+                ReadwriteSplittingDataSourceType.WRITE, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
+        
ShardingSpherePreconditions.checkState(!config.getReadDataSourceNames().isEmpty(),
 () -> new MissingRequiredReadwriteSplittingActualDataSourceNameException(
+                ReadwriteSplittingDataSourceType.READ, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
         checkWriteDataSourceNames(databaseName, dataSourceMap, 
writeDataSourceNames, config, builtRules);
         for (String each : config.getReadDataSourceNames()) {
-            checkReadeDataSourceNames(databaseName, dataSourceMap, 
readDataSourceNames, each, builtRules);
+            checkReadeDataSourceNames(databaseName, dataSourceMap, 
readDataSourceNames, each, config, builtRules);
         }
     }
     
     private void checkWriteDataSourceNames(final String databaseName, final 
Map<String, DataSource> dataSourceMap, final Collection<String> 
writeDataSourceNames,
                                            final 
ReadwriteSplittingDataSourceRuleConfiguration config, final 
Collection<ShardingSphereRule> builtRules) {
         for (String each : 
InlineExpressionParserFactory.newInstance(config.getWriteDataSourceName()).splitAndEvaluate())
 {
-            
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) || 
containsInOtherRules(each, builtRules),
-                    () -> new 
DataSourceNameNotExistedException(ReadwriteSplittingDataSourceType.WRITE, each, 
databaseName));
-            
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(each), () -> 
new DuplicateDataSourceException(ReadwriteSplittingDataSourceType.WRITE, each, 
databaseName));
+            
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) || 
containsInOtherRules(each, builtRules), () -> new 
ReadwriteSplittingActualDataSourceNotFoundException(
+                    ReadwriteSplittingDataSourceType.WRITE, each, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
+            
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(each), () -> 
new DuplicateReadwriteSplittingActualDataSourceException(
+                    ReadwriteSplittingDataSourceType.WRITE, each, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
         }
     }
     
@@ -90,12 +93,13 @@ public final class 
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
                 .anyMatch(optional -> optional.isPresent() && 
optional.get().getDataSourceMapper().containsKey(datasourceName));
     }
     
-    private void checkReadeDataSourceNames(final String databaseName, final 
Map<String, DataSource> dataSourceMap,
-                                           final Collection<String> 
readDataSourceNames, final String readDataSourceName, final 
Collection<ShardingSphereRule> builtRules) {
+    private void checkReadeDataSourceNames(final String databaseName, final 
Map<String, DataSource> dataSourceMap, final Collection<String> 
readDataSourceNames,
+                                           final String readDataSourceName, 
final ReadwriteSplittingDataSourceRuleConfiguration config, final 
Collection<ShardingSphereRule> builtRules) {
         for (String each : 
InlineExpressionParserFactory.newInstance(readDataSourceName).splitAndEvaluate())
 {
-            
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) || 
containsInOtherRules(each, builtRules),
-                    () -> new 
DataSourceNameNotExistedException(ReadwriteSplittingDataSourceType.READ, each, 
databaseName));
-            
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new 
DuplicateDataSourceException(ReadwriteSplittingDataSourceType.READ, each, 
databaseName));
+            
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) || 
containsInOtherRules(each, builtRules), () -> new 
ReadwriteSplittingActualDataSourceNotFoundException(
+                    ReadwriteSplittingDataSourceType.READ, each, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
+            
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new 
DuplicateReadwriteSplittingActualDataSourceException(
+                    ReadwriteSplittingDataSourceType.READ, each, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
         }
     }
     
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadStorageUnitException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadStorageUnitException.java
deleted file mode 100644
index 2b52f1075fe..00000000000
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadStorageUnitException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.readwritesplitting.exception;
-
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-
-/**
- * Missing required read storage unit exception.
- */
-public final class MissingRequiredReadStorageUnitException extends 
ReadwriteSplittingSQLException {
-    
-    private static final long serialVersionUID = -4252553422332603648L;
-    
-    public MissingRequiredReadStorageUnitException(final String ruleName, 
final String storageUnitName) {
-        super(XOpenSQLState.NOT_FOUND, 10, "Read storage unit '%s' does not 
exist in rule '%s'.", storageUnitName, ruleName);
-    }
-}
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredWriteDataSourceNameException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredWriteDataSourceNameException.java
deleted file mode 100644
index 754cb725970..00000000000
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredWriteDataSourceNameException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.readwritesplitting.exception;
-
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-
-/**
- * Missing required write data source name exception.
- */
-public final class MissingRequiredWriteDataSourceNameException extends 
ReadwriteSplittingSQLException {
-    
-    private static final long serialVersionUID = -3310589272704868388L;
-    
-    public MissingRequiredWriteDataSourceNameException(final String 
databaseName) {
-        super(XOpenSQLState.NOT_FOUND, 1, "Write data source name is required 
in database '%s'.", databaseName);
-    }
-}
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredDataSourceNameException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/ReadwriteSplittingRuleExceptionIdentifier.java
similarity index 64%
rename from 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredDataSourceNameException.java
rename to 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/ReadwriteSplittingRuleExceptionIdentifier.java
index 160657f491f..1dfca7c46e8 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredDataSourceNameException.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/ReadwriteSplittingRuleExceptionIdentifier.java
@@ -17,16 +17,20 @@
 
 package org.apache.shardingsphere.readwritesplitting.exception;
 
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import lombok.RequiredArgsConstructor;
 
 /**
- * Missing required data source name exception.
+ * Readwrite-splitting rule exception identifier.
  */
-public final class MissingRequiredDataSourceNameException extends 
ReadwriteSplittingSQLException {
+@RequiredArgsConstructor
+public final class ReadwriteSplittingRuleExceptionIdentifier {
     
-    private static final long serialVersionUID = 8006957930250488016L;
+    private final String database;
     
-    public MissingRequiredDataSourceNameException(final String databaseName) {
-        super(XOpenSQLState.NOT_FOUND, 0, "Data source name is required in 
database '%s'.", databaseName);
+    private final String dataSourceRule;
+    
+    @Override
+    public String toString() {
+        return String.format("database.data_source_rule: '%s'.'%s'", database, 
dataSourceRule);
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/DuplicateReadwriteSplittingActualDataSourceException.java
similarity index 55%
copy from 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
copy to 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/DuplicateReadwriteSplittingActualDataSourceException.java
index 252eb4c3593..dc9fafd6e53 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/DuplicateReadwriteSplittingActualDataSourceException.java
@@ -15,19 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
 
 /**
- * Duplicate write data source exception.
+ * Duplicate readwrite-splitting actual data source exception.
  */
-public final class DuplicateDataSourceException extends 
ReadwriteSplittingSQLException {
+public final class DuplicateReadwriteSplittingActualDataSourceException 
extends ReadwriteSplittingSQLException {
     
     private static final long serialVersionUID = -58671655670347084L;
     
-    public DuplicateDataSourceException(final ReadwriteSplittingDataSourceType 
dataSourceType, final String dataSourceName, final String databaseName) {
-        super(XOpenSQLState.DUPLICATE, 3, "Duplicated %s data source '%s' in 
database '%s'.", dataSourceType, dataSourceName, databaseName);
+    public DuplicateReadwriteSplittingActualDataSourceException(final 
ReadwriteSplittingDataSourceType dataSourceType,
+                                                                final String 
dataSourceName, final ReadwriteSplittingRuleExceptionIdentifier 
exceptionIdentifier) {
+        super(XOpenSQLState.DUPLICATE, 3, "Readwrite-splitting %s data source 
'%s' is duplicated in %s.", dataSourceName, dataSourceType, 
exceptionIdentifier);
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/InvalidInlineExpressionDataSourcesException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/InvalidReadwriteSplittingActualDataSourceInlineExpressionException.java
similarity index 54%
rename from 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/InvalidInlineExpressionDataSourcesException.java
rename to 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/InvalidReadwriteSplittingActualDataSourceInlineExpressionException.java
index cf97c84faf6..a1b562e078a 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/InvalidInlineExpressionDataSourcesException.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/InvalidReadwriteSplittingActualDataSourceInlineExpressionException.java
@@ -15,19 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
 
 /**
- * Invalid inline expression data sources exception.
+ * Invalid readwrite-splitting actual data source inline expression exception.
  */
-public final class InvalidInlineExpressionDataSourcesException extends 
ReadwriteSplittingSQLException {
+public final class 
InvalidReadwriteSplittingActualDataSourceInlineExpressionException extends 
ReadwriteSplittingSQLException {
     
     private static final long serialVersionUID = 87659916563551964L;
     
-    public InvalidInlineExpressionDataSourcesException(final 
ReadwriteSplittingDataSourceType dataSourceType) {
-        super(XOpenSQLState.CHECK_OPTION_VIOLATION, 5, "%s data source names 
size error on inline expression.", dataSourceType);
+    public 
InvalidReadwriteSplittingActualDataSourceInlineExpressionException(final 
ReadwriteSplittingDataSourceType dataSourceType,
+                                                                              
final ReadwriteSplittingRuleExceptionIdentifier exceptionIdentifier) {
+        super(XOpenSQLState.CHECK_OPTION_VIOLATION, 4, "Readwrite-splitting %s 
data source inline expression error in %s.", dataSourceType, 
exceptionIdentifier);
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadDataSourceNamesException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/MissingRequiredReadwriteSplittingActualDataSourceNameException.java
similarity index 52%
rename from 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadDataSourceNamesException.java
rename to 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/MissingRequiredReadwriteSplittingActualDataSourceNameException.java
index c1319048bb3..ae3372d6975 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadDataSourceNamesException.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/MissingRequiredReadwriteSplittingActualDataSourceNameException.java
@@ -15,18 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
 
 /**
- * Missing required read data source names exception.
+ * Missing readwrite-splitting required actual data source name exception.
  */
-public final class MissingRequiredReadDataSourceNamesException extends 
ReadwriteSplittingSQLException {
+public final class 
MissingRequiredReadwriteSplittingActualDataSourceNameException extends 
ReadwriteSplittingSQLException {
     
     private static final long serialVersionUID = 3795576963060485964L;
     
-    public MissingRequiredReadDataSourceNamesException(final String 
databaseName) {
-        super(XOpenSQLState.NOT_FOUND, 2, "Read data source names is required 
in database '%s'.", databaseName);
+    public 
MissingRequiredReadwriteSplittingActualDataSourceNameException(final 
ReadwriteSplittingDataSourceType dataSourceType, final 
ReadwriteSplittingRuleExceptionIdentifier exceptionIdentifier) {
+        super(XOpenSQLState.NOT_FOUND, 1, "Readwrite-splitting %s data source 
name is required in %s.", dataSourceType, exceptionIdentifier);
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DataSourceNameNotExistedException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/ReadwriteSplittingActualDataSourceNotFoundException.java
similarity index 55%
rename from 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DataSourceNameNotExistedException.java
rename to 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/ReadwriteSplittingActualDataSourceNotFoundException.java
index 9f90523d99e..f1a85d60305 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DataSourceNameNotExistedException.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/ReadwriteSplittingActualDataSourceNotFoundException.java
@@ -15,19 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
 
 /**
- * Data source name not existed exception.
+ * Readwrite-splitting actual data source not found exception.
  */
-public final class DataSourceNameNotExistedException extends 
ReadwriteSplittingSQLException {
+public final class ReadwriteSplittingActualDataSourceNotFoundException extends 
ReadwriteSplittingSQLException {
     
     private static final long serialVersionUID = 1284608200400804784L;
     
-    public DataSourceNameNotExistedException(final 
ReadwriteSplittingDataSourceType dataSourceType, final String dataSourceName, 
final String databaseName) {
-        super(XOpenSQLState.NOT_FOUND, 4, "%s data source name '%s' not in 
database '%s'.", dataSourceType, dataSourceName, databaseName);
+    public ReadwriteSplittingActualDataSourceNotFoundException(final 
ReadwriteSplittingDataSourceType dataSourceType,
+                                                               final String 
dataSourceName, final ReadwriteSplittingRuleExceptionIdentifier 
exceptionIdentifier) {
+        super(XOpenSQLState.NOT_FOUND, 2, "Can not find readwrite-splitting %s 
data source '%s' in %s.", dataSourceType, dataSourceName, exceptionIdentifier);
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/logic/MissingRequiredReadwriteSplittingDataSourceRuleNameException.java
similarity index 58%
rename from 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
rename to 
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/logic/MissingRequiredReadwriteSplittingDataSourceRuleNameException.java
index 252eb4c3593..bb73a0aac07 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/logic/MissingRequiredReadwriteSplittingDataSourceRuleNameException.java
@@ -15,19 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.logic;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
 
 /**
- * Duplicate write data source exception.
+ * Missing required readwrite-splitting data source rule name exception.
  */
-public final class DuplicateDataSourceException extends 
ReadwriteSplittingSQLException {
+public final class 
MissingRequiredReadwriteSplittingDataSourceRuleNameException extends 
ReadwriteSplittingSQLException {
     
-    private static final long serialVersionUID = -58671655670347084L;
+    private static final long serialVersionUID = 8006957930250488016L;
     
-    public DuplicateDataSourceException(final ReadwriteSplittingDataSourceType 
dataSourceType, final String dataSourceName, final String databaseName) {
-        super(XOpenSQLState.DUPLICATE, 3, "Duplicated %s data source '%s' in 
database '%s'.", dataSourceType, dataSourceName, databaseName);
+    public MissingRequiredReadwriteSplittingDataSourceRuleNameException(final 
String databaseName) {
+        super(XOpenSQLState.NOT_FOUND, 0, "Readwrite-splitting data source 
rule name is required in database '%s'.", databaseName);
     }
 }
diff --git 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index e88c0f19a9d..39071060474 100644
--- 
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++ 
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -29,7 +29,8 @@ import 
org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
-import 
org.apache.shardingsphere.readwritesplitting.exception.InvalidInlineExpressionDataSourcesException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.InvalidReadwriteSplittingActualDataSourceInlineExpressionException;
 import 
org.apache.shardingsphere.readwritesplitting.rule.attribute.ReadwriteSplittingDataSourceMapperRuleAttribute;
 import 
org.apache.shardingsphere.readwritesplitting.rule.attribute.ReadwriteSplittingExportableRuleAttribute;
 import 
org.apache.shardingsphere.readwritesplitting.rule.attribute.ReadwriteSplittingStaticDataSourceRuleAttribute;
@@ -61,7 +62,7 @@ public final class ReadwriteSplittingRule implements 
DatabaseRule {
     public ReadwriteSplittingRule(final String databaseName, final 
ReadwriteSplittingRuleConfiguration ruleConfig, final InstanceContext 
instanceContext) {
         configuration = ruleConfig;
         loadBalancers = createLoadBalancers(ruleConfig);
-        dataSourceRules = createDataSourceRules(ruleConfig);
+        dataSourceRules = createDataSourceRules(databaseName, ruleConfig);
         attributes = new RuleAttributes(
                 new 
ReadwriteSplittingDataSourceMapperRuleAttribute(dataSourceRules.values()), new 
ReadwriteSplittingStaticDataSourceRuleAttribute(databaseName, dataSourceRules, 
instanceContext),
                 new 
ReadwriteSplittingExportableRuleAttribute(dataSourceRules), new 
ReadwriteSplittingStorageConnectorReusableRuleAttribute());
@@ -78,30 +79,32 @@ public final class ReadwriteSplittingRule implements 
DatabaseRule {
         return result;
     }
     
-    private Map<String, ReadwriteSplittingDataSourceRule> 
createDataSourceRules(final ReadwriteSplittingRuleConfiguration ruleConfig) {
+    private Map<String, ReadwriteSplittingDataSourceRule> 
createDataSourceRules(final String databaseName, final 
ReadwriteSplittingRuleConfiguration ruleConfig) {
         Map<String, ReadwriteSplittingDataSourceRule> result = new 
HashMap<>(ruleConfig.getDataSources().size(), 1F);
         for (ReadwriteSplittingDataSourceRuleConfiguration each : 
ruleConfig.getDataSources()) {
-            result.putAll(createDataSourceRules(each));
+            result.putAll(createDataSourceRules(databaseName, each));
         }
         return result;
     }
     
-    private Map<String, ReadwriteSplittingDataSourceRule> 
createDataSourceRules(final ReadwriteSplittingDataSourceRuleConfiguration 
config) {
+    private Map<String, ReadwriteSplittingDataSourceRule> 
createDataSourceRules(final String databaseName, final 
ReadwriteSplittingDataSourceRuleConfiguration config) {
         LoadBalanceAlgorithm loadBalanceAlgorithm = loadBalancers.getOrDefault(
                 config.getName() + "." + config.getLoadBalancerName(), 
TypedSPILoader.getService(LoadBalanceAlgorithm.class, null));
-        return createStaticDataSourceRules(config, loadBalanceAlgorithm);
+        return createStaticDataSourceRules(databaseName, config, 
loadBalanceAlgorithm);
     }
     
-    private Map<String, ReadwriteSplittingDataSourceRule> 
createStaticDataSourceRules(final ReadwriteSplittingDataSourceRuleConfiguration 
config,
+    private Map<String, ReadwriteSplittingDataSourceRule> 
createStaticDataSourceRules(final String databaseName, final 
ReadwriteSplittingDataSourceRuleConfiguration config,
                                                                                
       final LoadBalanceAlgorithm loadBalanceAlgorithm) {
         List<String> inlineReadwriteDataSourceNames = 
InlineExpressionParserFactory.newInstance(config.getName()).splitAndEvaluate();
         List<String> inlineWriteDatasourceNames = 
InlineExpressionParserFactory.newInstance(config.getWriteDataSourceName()).splitAndEvaluate();
         List<List<String>> inlineReadDatasourceNames = 
config.getReadDataSourceNames().stream()
                 .map(each -> 
InlineExpressionParserFactory.newInstance(each).splitAndEvaluate()).collect(Collectors.toList());
         
ShardingSpherePreconditions.checkState(inlineWriteDatasourceNames.size() == 
inlineReadwriteDataSourceNames.size(),
-                () -> new 
InvalidInlineExpressionDataSourcesException(ReadwriteSplittingDataSourceType.WRITE));
+                () -> new 
InvalidReadwriteSplittingActualDataSourceInlineExpressionException(
+                        ReadwriteSplittingDataSourceType.WRITE, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
         inlineReadDatasourceNames.forEach(each -> 
ShardingSpherePreconditions.checkState(each.size() == 
inlineReadwriteDataSourceNames.size(),
-                () -> new 
InvalidInlineExpressionDataSourcesException(ReadwriteSplittingDataSourceType.READ)));
+                () -> new 
InvalidReadwriteSplittingActualDataSourceInlineExpressionException(
+                        ReadwriteSplittingDataSourceType.READ, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName()))));
         Map<String, ReadwriteSplittingDataSourceRule> result = new 
LinkedHashMap<>(inlineReadwriteDataSourceNames.size(), 1F);
         for (int i = 0; i < inlineReadwriteDataSourceNames.size(); i++) {
             ReadwriteSplittingDataSourceRuleConfiguration staticConfig = 
createStaticDataSourceRuleConfiguration(
diff --git 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
index 70492bd2dad..5e24dd98699 100644
--- 
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
+++ 
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
@@ -26,9 +26,9 @@ import 
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMappe
 import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
 import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import 
org.apache.shardingsphere.readwritesplitting.exception.DataSourceNameNotExistedException;
-import 
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
-import 
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredWriteDataSourceNameException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.ReadwriteSplittingActualDataSourceNotFoundException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.MissingRequiredReadwriteSplittingActualDataSourceNameException;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.util.PropertiesBuilder;
 import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
@@ -54,7 +54,7 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
     void assertInvalidCheck() {
         ReadwriteSplittingRuleConfiguration config = 
createInvalidConfiguration();
         RuleConfigurationChecker checker = 
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class, 
Collections.singleton(config.getClass())).get(config.getClass());
-        assertThrows(MissingRequiredWriteDataSourceNameException.class, () -> 
checker.check("test", config, Collections.emptyMap(), Collections.emptyList()));
+        
assertThrows(MissingRequiredReadwriteSplittingActualDataSourceNameException.class,
 () -> checker.check("test", config, Collections.emptyMap(), 
Collections.emptyList()));
     }
     
     private ReadwriteSplittingRuleConfiguration createInvalidConfiguration() {
@@ -73,7 +73,7 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
                 "write_ds_0", Arrays.asList("read_ds_0", "read_ds_1")), 
createDataSourceRuleConfiguration("write_ds_2", Arrays.asList("read_ds_0", 
"read_ds_1")));
         when(config.getDataSources()).thenReturn(configs);
         RuleConfigurationChecker checker = 
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class, 
Collections.singleton(config.getClass())).get(config.getClass());
-        assertThrows(DataSourceNameNotExistedException.class, () -> 
checker.check("test", config, mockDataSources(), Collections.emptyList()));
+        
assertThrows(ReadwriteSplittingActualDataSourceNotFoundException.class, () -> 
checker.check("test", config, mockDataSources(), Collections.emptyList()));
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
@@ -84,7 +84,7 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
                 "write_ds_0", Arrays.asList("read_ds_0", "read_ds_0")), 
createDataSourceRuleConfiguration("write_ds_1", Arrays.asList("read_ds_0", 
"read_ds_0")));
         when(config.getDataSources()).thenReturn(configs);
         RuleConfigurationChecker checker = 
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class, 
Collections.singleton(config.getClass())).get(config.getClass());
-        assertThrows(DuplicateDataSourceException.class, () -> 
checker.check("test", config, mockDataSources(), Collections.emptyList()));
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class, () -> 
checker.check("test", config, mockDataSources(), Collections.emptyList()));
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
index 190ed3f9321..de1a4550a0a 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
@@ -36,7 +36,8 @@ import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingD
 import 
org.apache.shardingsphere.readwritesplitting.api.transaction.TransactionalReadQueryStrategy;
 import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.segment.ReadwriteSplittingRuleSegment;
-import 
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -161,42 +162,48 @@ public final class ReadwriteSplittingRuleStatementChecker 
{
         Collection<String> existedReadDataSourceNames = new HashSet<>();
         if (null != currentRuleConfig) {
             Collection<String> toBeAlteredRuleNames = isCreating ? 
Collections.emptySet() : getToBeAlteredRuleNames(segments);
-            currentRuleConfig.getDataSources().forEach(each -> {
-                if (!toBeAlteredRuleNames.contains(each.getName())) {
-                    
existedWriteDataSourceNames.add(each.getWriteDataSourceName());
-                    
existedReadDataSourceNames.addAll(each.getReadDataSourceNames());
+            for (ReadwriteSplittingDataSourceRuleConfiguration each : 
currentRuleConfig.getDataSources()) {
+                if (toBeAlteredRuleNames.contains(each.getName())) {
+                    continue;
                 }
-            });
+                existedWriteDataSourceNames.add(each.getWriteDataSourceName());
+                
existedReadDataSourceNames.addAll(each.getReadDataSourceNames());
+            }
         }
-        checkDuplicateWriteDataSourceNames(databaseName, segments, 
existedWriteDataSourceNames);
-        checkDuplicateReadDataSourceNames(databaseName, segments, 
existedReadDataSourceNames);
+        checkDuplicateWriteDataSourceNames(segments, databaseName, 
existedWriteDataSourceNames);
+        checkDuplicateReadDataSourceNames(segments, databaseName, 
existedReadDataSourceNames);
     }
     
     private static Collection<String> getToBeAlteredRuleNames(final 
Collection<ReadwriteSplittingRuleSegment> segments) {
         return 
segments.stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
     }
     
-    private static void checkDuplicateWriteDataSourceNames(final String 
databaseName, final Collection<ReadwriteSplittingRuleSegment> segments, final 
Collection<String> writeDataSourceNames) {
-        segments.forEach(each -> {
-            if (!Strings.isNullOrEmpty(each.getWriteDataSource())) {
-                String writeDataSource = each.getWriteDataSource();
-                
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(writeDataSource),
-                        () -> new 
DuplicateDataSourceException(ReadwriteSplittingDataSourceType.WRITE, 
writeDataSource, databaseName));
+    private static void checkDuplicateWriteDataSourceNames(final 
Collection<ReadwriteSplittingRuleSegment> segments, final String databaseName,
+                                                           final 
Collection<String> writeDataSourceNames) {
+        for (ReadwriteSplittingRuleSegment each : segments) {
+            if (Strings.isNullOrEmpty(each.getWriteDataSource())) {
+                continue;
             }
-        });
+            String writeDataSource = each.getWriteDataSource();
+            
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(writeDataSource),
 () -> new DuplicateReadwriteSplittingActualDataSourceException(
+                    ReadwriteSplittingDataSourceType.WRITE, writeDataSource, 
new ReadwriteSplittingRuleExceptionIdentifier(databaseName, "")));
+        }
     }
     
-    private static void checkDuplicateReadDataSourceNames(final String 
databaseName, final Collection<ReadwriteSplittingRuleSegment> segments, final 
Collection<String> readDataSourceNames) {
+    private static void checkDuplicateReadDataSourceNames(final 
Collection<ReadwriteSplittingRuleSegment> segments, final String databaseName,
+                                                          final 
Collection<String> readDataSourceNames) {
         for (ReadwriteSplittingRuleSegment each : segments) {
             if (null != each.getReadDataSources()) {
-                checkDuplicateReadDataSourceNames(databaseName, each, 
readDataSourceNames);
+                checkDuplicateReadDataSourceNames(each, databaseName, 
readDataSourceNames);
             }
         }
     }
     
-    private static void checkDuplicateReadDataSourceNames(final String 
databaseName, final ReadwriteSplittingRuleSegment segment, final 
Collection<String> readDataSourceNames) {
+    private static void checkDuplicateReadDataSourceNames(final 
ReadwriteSplittingRuleSegment segment, final String databaseName,
+                                                          final 
Collection<String> readDataSourceNames) {
         for (String each : segment.getReadDataSources()) {
-            
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new 
DuplicateDataSourceException(ReadwriteSplittingDataSourceType.READ, each, 
databaseName));
+            
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new 
DuplicateReadwriteSplittingActualDataSourceException(
+                    ReadwriteSplittingDataSourceType.READ, each, new 
ReadwriteSplittingRuleExceptionIdentifier(databaseName, "")));
         }
     }
     
diff --git 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
index 5d05e5ac455..90e26186b7c 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
@@ -21,16 +21,18 @@ import lombok.Setter;
 import 
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorDatabaseAware;
 import 
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorRuleAware;
 import 
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
-import 
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import 
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.InvalidStorageUnitStatusException;
+import 
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.MissingRequiredRuleException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.storage.service.StorageNodeStatusService;
-import 
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.InvalidStorageUnitStatusException;
-import 
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredReadStorageUnitException;
+import 
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.statement.AlterReadwriteSplittingStorageUnitStatusStatement;
+import 
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.ReadwriteSplittingActualDataSourceNotFoundException;
 import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataSourceRule;
 import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 
@@ -61,7 +63,8 @@ public final class 
AlterReadwriteSplittingStorageUnitStatusExecutor
         Optional<ReadwriteSplittingDataSourceRule> dataSourceRule = 
rule.getDataSourceRules().values().stream().filter(each -> 
each.getName().equalsIgnoreCase(sqlStatement.getRuleName())).findAny();
         ShardingSpherePreconditions.checkState(dataSourceRule.isPresent(), () 
-> new MissingRequiredRuleException("Readwrite-splitting", database.getName(), 
sqlStatement.getRuleName()));
         
ShardingSpherePreconditions.checkState(dataSourceRule.get().getReadwriteSplittingGroup().getReadDataSources().contains(sqlStatement.getStorageUnitName()),
-                () -> new 
MissingRequiredReadStorageUnitException(dataSourceRule.get().getName(), 
sqlStatement.getStorageUnitName()));
+                () -> new ReadwriteSplittingActualDataSourceNotFoundException(
+                        ReadwriteSplittingDataSourceType.READ, 
sqlStatement.getStorageUnitName(), new 
ReadwriteSplittingRuleExceptionIdentifier(database.getName(), 
dataSourceRule.get().getName())));
         if (sqlStatement.isEnable()) {
             
ShardingSpherePreconditions.checkState(dataSourceRule.get().getDisabledDataSourceNames().contains(sqlStatement.getStorageUnitName()),
                     () -> new InvalidStorageUnitStatusException("storage unit 
is not disabled"));
diff --git 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
index 29bf42bdaa8..75050a1ccb2 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
@@ -27,7 +27,7 @@ import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.segment.ReadwriteSplittingRuleSegment;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.statement.AlterReadwriteSplittingRuleStatement;
-import 
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
 import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -99,7 +99,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
         ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
         
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
         executor.setRule(rule);
-        assertThrows(DuplicateDataSourceException.class,
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
                 () -> 
executor.checkBeforeUpdate(createSQLStatementWithDuplicateWriteResourceNames("readwrite_ds_0",
 "readwrite_ds_1", "TEST")));
     }
     
@@ -110,7 +110,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
         ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
         
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
         executor.setRule(rule);
-        assertThrows(DuplicateDataSourceException.class,
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
                 () -> executor.checkBeforeUpdate(
                         createSQLStatement("readwrite_ds_0", "ds_write_1", 
Arrays.asList("read_ds_0", "read_ds_1"), "TEST")));
     }
@@ -122,7 +122,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
         ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
         
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
         executor.setRule(rule);
-        assertThrows(DuplicateDataSourceException.class,
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
                 () -> 
executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadResourceNames("readwrite_ds_0",
 "readwrite_ds_1", "TEST")));
     }
     
@@ -133,7 +133,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
         ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
         
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
         executor.setRule(rule);
-        assertThrows(DuplicateDataSourceException.class,
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
                 () -> 
executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "write_ds_1", 
Arrays.asList("read_ds_0_0", "read_ds_0_1"), "TEST")));
     }
     
diff --git 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
index b3a4bb7b800..fad29f3bc2a 100644
--- 
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
+++ 
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
@@ -29,7 +29,7 @@ import 
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
 import 
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.segment.ReadwriteSplittingRuleSegment;
 import 
org.apache.shardingsphere.readwritesplitting.distsql.statement.CreateReadwriteSplittingRuleStatement;
-import 
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
+import 
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
 import 
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
@@ -108,7 +108,7 @@ class CreateReadwriteSplittingRuleExecutorTest {
     
     @Test
     void assertCheckSQLStatementWithDuplicateWriteResourceNamesInStatement() {
-        assertThrows(DuplicateDataSourceException.class,
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
                 () -> 
executor.checkBeforeUpdate(createSQLStatementWithDuplicateWriteResourceNames("write_ds_0",
 "write_ds_1", "TEST")));
     }
     
@@ -117,13 +117,14 @@ class CreateReadwriteSplittingRuleExecutorTest {
         ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
         
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfiguration());
         executor.setRule(rule);
-        assertThrows(DuplicateDataSourceException.class,
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
                 () -> 
executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "ds_write", 
Arrays.asList("read_ds_0", "read_ds_1"), "TEST")));
     }
     
     @Test
     void assertCheckSQLStatementWithDuplicateReadResourceNamesInStatement() {
-        assertThrows(DuplicateDataSourceException.class, () -> 
executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadResourceNames("write_ds_0",
 "write_ds_1", "TEST")));
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
+                () -> 
executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadResourceNames("write_ds_0",
 "write_ds_1", "TEST")));
     }
     
     @Test
@@ -131,7 +132,7 @@ class CreateReadwriteSplittingRuleExecutorTest {
         ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
         
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfiguration());
         executor.setRule(rule);
-        assertThrows(DuplicateDataSourceException.class,
+        
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
                 () -> 
executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "write_ds_1", 
Arrays.asList("read_ds_0", "read_ds_1"), "TEST")));
     }
     

Reply via email to