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 824dff269e8 Add XATransactionSQLException (#30787)
824dff269e8 is described below

commit 824dff269e88846ad8aadb8e04263b3acf00d820
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Apr 6 12:35:24 2024 +0800

    Add XATransactionSQLException (#30787)
    
    * Refactor TransactionSQLException's impl
    
    * Refactor TransactionSQLException's impl
    
    * Add XATransactionSQLException
---
 .../user-manual/error-code/sql-error-code.cn.md    | 26 ++++++++++-----------
 .../user-manual/error-code/sql-error-code.en.md    | 27 ++++++++++------------
 .../MySQLXATransactionPrivilegeChecker.java        | 10 ++++----
 .../exception/XADataSourceInitializeException.java |  5 ++--
 .../XATransactionNestedBeginException.java         |  5 ++--
 ...a => XATransactionPrivilegeCheckException.java} | 13 +++++------
 ...ception.java => XATransactionSQLException.java} | 24 ++++++++++++++-----
 .../MySQLXATransactionPrivilegeCheckerTest.java    |  7 +++---
 8 files changed, 60 insertions(+), 57 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 33e343a8225..989d0933f7e 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
@@ -82,20 +82,18 @@ SQL 错误码以标准的 SQL State,Vendor Code 和详细错误信息提供,
 
 ### 事务
 
-| Vendor Code | SQL State | 错误信息                                               
                            |
-|-------------|-----------|--------------------------------------------------------------------------------|
-| 14000       | 25000     | Switch transaction type failed, please terminate 
the current transaction.      |
-| 14001       | 42S02     | Can not find transaction manager of '%s'.          
                            |
-| 14002       | 44000     | Max length of unique resource name '%s' exceeded, 
should be less than 45.      |
-| 14003       | 25000     | Transaction timeout should more than 0.            
                            |
-| 14004       | 25000     | Close transaction manager failed.                  
                            |
-| 14200       | 25000     | Can not start new XA transaction in a active 
transaction.                      |
-| 14201       | 25000     | Failed to create \`%s\` XA data source.            
                            |
-| 14202       | 25000     | Max length of xa unique resource name \`%s\` 
exceeded: should be less than 45. |
-| 14203       | 25000     | Check privileges failed on data source, reason is: 
\`%s\`                      |
-| 14204       | 25000     | Failed to create XA transaction manager, requires 
\`%s\` privileges            |
-| 14301       | 25000     | ShardingSphere Seata-AT transaction has been 
disabled.                         |
-| 14302       | 25000     | Please config application id within seata.conf 
file.                           |
+| Vendor Code | SQL State | 错误信息                                               
                                       |
+|-------------|-----------|-------------------------------------------------------------------------------------------|
+| 14000       | 25000     | Switch transaction type failed, please terminate 
the current transaction.                 |
+| 14001       | 42S02     | Can not find transaction manager of '%s'.          
                                       |
+| 14002       | 44000     | Max length of unique resource name '%s' exceeded, 
should be less than 45.                 |
+| 14003       | 25000     | Transaction timeout should more than 0.            
                                       |
+| 14004       | 25000     | Close transaction manager failed.                  
                                       |
+| 14100       | 25000     | Failed to create '%s' XA data source.              
                                       |
+| 14101       | 25000     | Can not start new XA transaction in a active 
transaction.                                 |
+| 14102       | 25000     | Check XA transaction privileges failed on data 
source, please grant '%s' to current user. |
+| 14301       | 25000     | ShardingSphere Seata-AT transaction has been 
disabled.                                    |
+| 14302       | 25000     | Please config application id within seata.conf 
file.                                      |
 
 ### 集群
 
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 50e11a6ded0..797f76eb9d6 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
@@ -83,21 +83,18 @@ SQL error codes provide by standard `SQL State`, `Vendor 
Code` and `Reason`, whi
 
 ### Transaction
 
-| Vendor Code | SQL State | Reason                                             
                            |
-|-------------|-----------|--------------------------------------------------------------------------------|
-| 14000       | 25000     | Switch transaction type failed, please terminate 
the current transaction.      |
-| 14001       | 42S02     | Can not find transaction manager of '%s'.          
                            |
-| 14002       | 44000     | Max length of unique resource name '%s' exceeded, 
should be less than 45.      |
-| 14003       | 25000     | Transaction timeout should more than 0.            
                            |
-| 14004       | 25000     | Close transaction manager failed.                  
                            |
-| 14200       | 25000     | Can not start new XA transaction in a active 
transaction.                      |
-| 14201       | 25000     | Failed to create \`%s\` XA data source.            
                            |
-| 14202       | 25000     | Max length of xa unique resource name \`%s\` 
exceeded: should be less than 45. |
-| 14203       | 25000     | Check privileges failed on data source, reason is: 
\`%s\`                      |
-| 14204       | 25000     | Failed to create XA transaction manager, requires 
\`%s\` privileges            |
-| 14205       | 25000     | Close transaction manager failed.                  
                            |
-| 14301       | 25000     | ShardingSphere Seata-AT transaction has been 
disabled.                         |
-| 14302       | 25000     | Please config application id within seata.conf 
file.                           |
+| Vendor Code | SQL State | Reason                                             
                                       |
+|-------------|-----------|-------------------------------------------------------------------------------------------|
+| 14000       | 25000     | Switch transaction type failed, please terminate 
the current transaction.                 |
+| 14001       | 42S02     | Can not find transaction manager of '%s'.          
                                       |
+| 14002       | 44000     | Max length of unique resource name '%s' exceeded, 
should be less than 45.                 |
+| 14003       | 25000     | Transaction timeout should more than 0.            
                                       |
+| 14004       | 25000     | Close transaction manager failed.                  
                                       |
+| 14100       | 25000     | Failed to create '%s' XA data source.              
                                       |
+| 14101       | 25000     | Can not start new XA transaction in a active 
transaction.                                 |
+| 14102       | 25000     | Check XA transaction privileges failed on data 
source, please grant '%s' to current user. |
+| 14301       | 25000     | ShardingSphere Seata-AT transaction has been 
disabled.                                    |
+| 14302       | 25000     | Please config application id within seata.conf 
file.                                      |
 
 ### Cluster
 
diff --git 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/dialect/MySQLXATransactionPrivilegeChecker.java
 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/dialect/MySQLXATransactionPrivilegeChecker.java
index 38f8f8f6972..fba038c0a32 100644
--- 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/dialect/MySQLXATransactionPrivilegeChecker.java
+++ 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/dialect/MySQLXATransactionPrivilegeChecker.java
@@ -17,9 +17,9 @@
 
 package 
org.apache.shardingsphere.transaction.xa.jta.datasource.checker.dialect;
 
+import org.apache.shardingsphere.infra.exception.generic.UnknownSQLException;
 import 
org.apache.shardingsphere.transaction.xa.jta.datasource.checker.XATransactionPrivilegeChecker;
-import 
org.apache.shardingsphere.transaction.xa.jta.exception.XATransactionCheckPrivilegeFailedException;
-import 
org.apache.shardingsphere.transaction.xa.jta.exception.XATransactionPrivilegeException;
+import 
org.apache.shardingsphere.transaction.xa.jta.exception.XATransactionPrivilegeCheckException;
 
 import javax.sql.DataSource;
 import java.sql.Connection;
@@ -46,7 +46,7 @@ public final class MySQLXATransactionPrivilegeChecker 
implements XATransactionPr
                 checkPrivilege(connection);
             }
         } catch (final SQLException ex) {
-            throw new XATransactionCheckPrivilegeFailedException(ex);
+            throw new UnknownSQLException(ex);
         }
     }
     
@@ -61,9 +61,9 @@ public final class MySQLXATransactionPrivilegeChecker 
implements XATransactionPr
                 }
             }
         } catch (final SQLException ex) {
-            throw new XATransactionCheckPrivilegeFailedException(ex, "GRANT 
XA_RECOVER_ADMIN TO currentUser");
+            throw new XATransactionPrivilegeCheckException("XA_RECOVER_ADMIN", 
ex);
         }
-        throw new XATransactionPrivilegeException("XA_RECOVER_ADMIN");
+        throw new XATransactionPrivilegeCheckException("XA_RECOVER_ADMIN");
     }
     
     private boolean matchPrivileges(final String privilege) {
diff --git 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XADataSourceInitializeException.java
 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XADataSourceInitializeException.java
index 36bf76d438e..263b722acbf 100644
--- 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XADataSourceInitializeException.java
+++ 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XADataSourceInitializeException.java
@@ -18,17 +18,16 @@
 package org.apache.shardingsphere.transaction.xa.jta.exception;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.TransactionSQLException;
 import 
org.apache.shardingsphere.transaction.xa.jta.datasource.properties.XADataSourceDefinition;
 
 /**
  * XA data source initialize exception.
  */
-public final class XADataSourceInitializeException extends 
TransactionSQLException {
+public final class XADataSourceInitializeException extends 
XATransactionSQLException {
     
     private static final long serialVersionUID = -4515239569528215614L;
     
     public XADataSourceInitializeException(final XADataSourceDefinition 
xaDataSourceDefinition) {
-        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 201, "Failed to create 
`%s` XA data source.", xaDataSourceDefinition.getType());
+        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 0, "Failed to create 
'%s' XA data source.", xaDataSourceDefinition.getType());
     }
 }
diff --git 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionNestedBeginException.java
 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionNestedBeginException.java
index 1133c916b3e..11a37982610 100644
--- 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionNestedBeginException.java
+++ 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionNestedBeginException.java
@@ -18,16 +18,15 @@
 package org.apache.shardingsphere.transaction.xa.jta.exception;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.TransactionSQLException;
 
 /**
  * XA transaction nested begin exception.
  */
-public final class XATransactionNestedBeginException extends 
TransactionSQLException {
+public final class XATransactionNestedBeginException extends 
XATransactionSQLException {
     
     private static final long serialVersionUID = 7761100591709104351L;
     
     public XATransactionNestedBeginException() {
-        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 200, "Can not start new 
XA transaction in a active transaction.");
+        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 1, "Can not start new 
XA transaction in a active transaction.");
     }
 }
diff --git 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionCheckPrivilegeFailedException.java
 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionPrivilegeCheckException.java
similarity index 57%
rename from 
kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionCheckPrivilegeFailedException.java
rename to 
kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionPrivilegeCheckException.java
index b9ca5372f72..1748fd9bc39 100644
--- 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionCheckPrivilegeFailedException.java
+++ 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionPrivilegeCheckException.java
@@ -18,22 +18,21 @@
 package org.apache.shardingsphere.transaction.xa.jta.exception;
 
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.TransactionSQLException;
 
 import java.sql.SQLException;
 
 /**
- * XA transaction check privilege failed exception.
+ * XA transaction privilege check exception.
  */
-public final class XATransactionCheckPrivilegeFailedException extends 
TransactionSQLException {
+public final class XATransactionPrivilegeCheckException extends 
XATransactionSQLException {
     
     private static final long serialVersionUID = 6073175429050058508L;
     
-    public XATransactionCheckPrivilegeFailedException(final SQLException 
cause) {
-        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 203, 
String.format("Check xa transaction privileges failed on data source, reason 
is: `%s`", cause.getMessage()), cause);
+    public XATransactionPrivilegeCheckException(final String privilege) {
+        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 2, "Check XA 
transaction privileges failed on data source, please grant '%s' to current 
user.", privilege);
     }
     
-    public XATransactionCheckPrivilegeFailedException(final SQLException 
cause, final String advice) {
-        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 203, 
String.format("Check xa transaction privileges failed on data source, reason 
is: `%s`, please `%s`", cause.getMessage(), advice), cause);
+    public XATransactionPrivilegeCheckException(final String privilege, final 
SQLException cause) {
+        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 2, String.format("Check 
XA transaction privileges failed on data source, please grant '%s' to current 
user.", privilege), cause);
     }
 }
diff --git 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionPrivilegeException.java
 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionSQLException.java
similarity index 53%
rename from 
kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionPrivilegeException.java
rename to 
kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionSQLException.java
index bad94efaa3e..3533c35e264 100644
--- 
a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionPrivilegeException.java
+++ 
b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/exception/XATransactionSQLException.java
@@ -17,17 +17,29 @@
 
 package org.apache.shardingsphere.transaction.xa.jta.exception;
 
-import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import com.google.common.base.Preconditions;
+import 
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.SQLState;
 import 
org.apache.shardingsphere.infra.exception.core.external.sql.type.kernel.category.TransactionSQLException;
 
 /**
- * XA transaction privilege exception.
+ * XA transaction SQL exception.
  */
-public final class XATransactionPrivilegeException extends 
TransactionSQLException {
+public class XATransactionSQLException extends TransactionSQLException {
     
-    private static final long serialVersionUID = -1565168229743080642L;
+    private static final long serialVersionUID = 7649367025303908263L;
     
-    public XATransactionPrivilegeException(final String errorMessage) {
-        super(XOpenSQLState.INVALID_TRANSACTION_STATE, 204, "Failed to create 
XA transaction manager, requires `%s` privileges", errorMessage);
+    private static final int XA_CODE = 1;
+    
+    protected XATransactionSQLException(final SQLState sqlState, final int 
errorCode, final String reason, final Object... messageArgs) {
+        super(sqlState, getErrorCode(errorCode), reason, messageArgs);
+    }
+    
+    protected XATransactionSQLException(final SQLState sqlState, final int 
errorCode, final String reason, final Exception cause) {
+        super(sqlState, getErrorCode(errorCode), reason, cause);
+    }
+    
+    private static int getErrorCode(final int errorCode) {
+        Preconditions.checkArgument(errorCode >= 0 && errorCode < 100, "The 
value range of error code should be [0, 100).");
+        return XA_CODE * 100 + errorCode;
     }
 }
diff --git 
a/kernel/transaction/type/xa/core/src/test/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/MySQLXATransactionPrivilegeCheckerTest.java
 
b/kernel/transaction/type/xa/core/src/test/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/MySQLXATransactionPrivilegeCheckerTest.java
index 21bb51e795c..c3f71baccdd 100644
--- 
a/kernel/transaction/type/xa/core/src/test/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/MySQLXATransactionPrivilegeCheckerTest.java
+++ 
b/kernel/transaction/type/xa/core/src/test/java/org/apache/shardingsphere/transaction/xa/jta/datasource/checker/MySQLXATransactionPrivilegeCheckerTest.java
@@ -18,8 +18,7 @@
 package org.apache.shardingsphere.transaction.xa.jta.datasource.checker;
 
 import 
org.apache.shardingsphere.transaction.xa.jta.datasource.checker.dialect.MySQLXATransactionPrivilegeChecker;
-import 
org.apache.shardingsphere.transaction.xa.jta.exception.XATransactionCheckPrivilegeFailedException;
-import 
org.apache.shardingsphere.transaction.xa.jta.exception.XATransactionPrivilegeException;
+import 
org.apache.shardingsphere.transaction.xa.jta.exception.XATransactionPrivilegeCheckException;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -86,7 +85,7 @@ class MySQLXATransactionPrivilegeCheckerTest {
     void assertCheckPrivilegeLackPrivilegesInMySQL8() throws SQLException {
         when(preparedStatement.executeQuery()).thenReturn(resultSet);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(8);
-        assertThrows(XATransactionPrivilegeException.class, () -> new 
MySQLXATransactionPrivilegeChecker().check(dataSource));
+        assertThrows(XATransactionPrivilegeCheckException.class, () -> new 
MySQLXATransactionPrivilegeChecker().check(dataSource));
     }
     
     @Test
@@ -94,6 +93,6 @@ class MySQLXATransactionPrivilegeCheckerTest {
         when(preparedStatement.executeQuery()).thenReturn(resultSet);
         
when(dataSource.getConnection().getMetaData().getDatabaseMajorVersion()).thenReturn(8);
         when(resultSet.next()).thenThrow(new SQLException(""));
-        assertThrows(XATransactionCheckPrivilegeFailedException.class, () -> 
new MySQLXATransactionPrivilegeChecker().check(dataSource));
+        assertThrows(XATransactionPrivilegeCheckException.class, () -> new 
MySQLXATransactionPrivilegeChecker().check(dataSource));
     }
 }

Reply via email to