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 84e9ff84582 Add DialectSQLStatementCreator (#35438)
84e9ff84582 is described below

commit 84e9ff845826e23cdd3ac6aa12ed48715c9377a9
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Fri May 16 19:03:26 2025 +0800

    Add DialectSQLStatementCreator (#35438)
    
    - Add DialectSQLStatementCreator interface for creating rollback statements
    - Implement OpenGaussStatementCreator and PostgreSQLStatementCreator
    - Update DialectTransactionOption to include 
isReturnRollbackStatementWhenCommitFailed flag
    - Modify TCLBackendHandler to use new rollback statement creation logic
---
 .../database/metadata/DialectDatabaseMetaData.java |  2 +-
 .../transaction/DialectTransactionOption.java      |  2 ++
 .../database/FirebirdDatabaseMetaData.java         |  2 +-
 .../metadata/database/MySQLDatabaseMetaData.java   |  2 +-
 .../database/OpenGaussDatabaseMetaData.java        |  2 +-
 .../database/PostgreSQLDatabaseMetaData.java       |  2 +-
 .../statement/core/DialectSQLStatementCreator.java | 32 +++++++++-------------
 .../opengauss/OpenGaussStatementCreator.java       | 29 +++++++-------------
 ...arser.statement.core.DialectSQLStatementCreator | 18 ++++++++++++
 .../postgresql/PostgreSQLStatementCreator.java     | 29 +++++++-------------
 ...arser.statement.core.DialectSQLStatementCreator | 18 ++++++++++++
 .../backend/handler/tcl/TCLBackendHandler.java     | 19 ++++++-------
 12 files changed, 84 insertions(+), 73 deletions(-)

diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java
index c8119c6c963..e7ae59e80fe 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/DialectDatabaseMetaData.java
@@ -126,7 +126,7 @@ public interface DialectDatabaseMetaData extends 
DatabaseTypedSPI {
      * @return transaction option
      */
     default DialectTransactionOption getTransactionOption() {
-        return new DialectTransactionOption(false, false, false, false, true, 
Connection.TRANSACTION_READ_COMMITTED);
+        return new DialectTransactionOption(false, false, false, false, true, 
Connection.TRANSACTION_READ_COMMITTED, false);
     }
     
     /**
diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
index 833e3473998..5f125660a43 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
@@ -39,4 +39,6 @@ public final class DialectTransactionOption {
     private final boolean isSupportMetaDataRefreshInTransaction;
     
     private final int defaultIsolationLevel;
+    
+    private final boolean isReturnRollbackStatementWhenCommitFailed;
 }
diff --git 
a/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java
 
b/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java
index 8d2d4261ddc..097be08cc3b 100644
--- 
a/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java
+++ 
b/infra/database/type/firebird/src/main/java/org/apache/shardingsphere/infra/database/firebird/metadata/database/FirebirdDatabaseMetaData.java
@@ -47,7 +47,7 @@ public final class FirebirdDatabaseMetaData implements 
DialectDatabaseMetaData {
     
     @Override
     public DialectTransactionOption getTransactionOption() {
-        return new DialectTransactionOption(false, true, false, false, true, 
Connection.TRANSACTION_READ_COMMITTED);
+        return new DialectTransactionOption(false, true, false, false, true, 
Connection.TRANSACTION_READ_COMMITTED, false);
     }
     
     @Override
diff --git 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
index 74a9e3691ae..74cc7e1b391 100644
--- 
a/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
+++ 
b/infra/database/type/mysql/src/main/java/org/apache/shardingsphere/infra/database/mysql/metadata/database/MySQLDatabaseMetaData.java
@@ -68,7 +68,7 @@ public final class MySQLDatabaseMetaData implements 
DialectDatabaseMetaData {
     
     @Override
     public DialectTransactionOption getTransactionOption() {
-        return new DialectTransactionOption(false, false, true, false, true, 
Connection.TRANSACTION_REPEATABLE_READ);
+        return new DialectTransactionOption(false, false, true, false, true, 
Connection.TRANSACTION_REPEATABLE_READ, false);
     }
     
     @Override
diff --git 
a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
 
b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
index 4c3dffb0909..9dea1bfb494 100644
--- 
a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
+++ 
b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/OpenGaussDatabaseMetaData.java
@@ -75,7 +75,7 @@ public final class OpenGaussDatabaseMetaData implements 
DialectDatabaseMetaData
     
     @Override
     public DialectTransactionOption getTransactionOption() {
-        return new DialectTransactionOption(true, false, false, true, false, 
Connection.TRANSACTION_READ_COMMITTED);
+        return new DialectTransactionOption(true, false, false, true, false, 
Connection.TRANSACTION_READ_COMMITTED, true);
     }
     
     @Override
diff --git 
a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
 
b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
index 548550ddddd..599a97e3399 100644
--- 
a/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
+++ 
b/infra/database/type/postgresql/src/main/java/org/apache/shardingsphere/infra/database/postgresql/metadata/database/PostgreSQLDatabaseMetaData.java
@@ -67,7 +67,7 @@ public final class PostgreSQLDatabaseMetaData implements 
DialectDatabaseMetaData
     
     @Override
     public DialectTransactionOption getTransactionOption() {
-        return new DialectTransactionOption(false, false, false, true, false, 
Connection.TRANSACTION_READ_COMMITTED);
+        return new DialectTransactionOption(false, false, false, true, false, 
Connection.TRANSACTION_READ_COMMITTED, true);
     }
     
     @Override
diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/DialectSQLStatementCreator.java
similarity index 50%
copy from 
infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
copy to 
parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/DialectSQLStatementCreator.java
index 833e3473998..75a9ceb1756 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/DialectSQLStatementCreator.java
@@ -15,28 +15,22 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.transaction;
+package org.apache.shardingsphere.sql.parser.statement.core;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI;
+import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.RollbackStatement;
 
 /**
- * Dialect transaction option.
+ * Dialect SQL statement creator.
  */
-@RequiredArgsConstructor
-@Getter
-public final class DialectTransactionOption {
+@SingletonSPI
+public interface DialectSQLStatementCreator extends DatabaseTypedSPI {
     
-    private final boolean isSupportGlobalCSN;
-    
-    private final boolean isDDLNeedImplicitCommit;
-    
-    private final boolean isSupportAutoCommitInNestedTransaction;
-    
-    private final boolean isSupportDDLInXATransaction;
-    
-    // TODO Investgate the reason of some databases cannot support meta data 
refreshed in transaction. The method should be removed finally after metadata 
refresh supported for all database.
-    private final boolean isSupportMetaDataRefreshInTransaction;
-    
-    private final int defaultIsolationLevel;
+    /**
+     * Create rollback statement.
+     *
+     * @return created SQL statement
+     */
+    RollbackStatement createRollbackStatement();
 }
diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
 
b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/OpenGaussStatementCreator.java
similarity index 50%
copy from 
infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
copy to 
parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/OpenGaussStatementCreator.java
index 833e3473998..3f41f71b1b8 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
+++ 
b/parser/sql/statement/type/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/statement/opengauss/OpenGaussStatementCreator.java
@@ -15,28 +15,19 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.transaction;
+package org.apache.shardingsphere.sql.parser.statement.opengauss;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.RollbackStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.opengauss.tcl.OpenGaussRollbackStatement;
 
 /**
- * Dialect transaction option.
+ * Statement creator for openGauss.
  */
-@RequiredArgsConstructor
-@Getter
-public final class DialectTransactionOption {
+public final class OpenGaussStatementCreator implements 
DialectSQLStatementCreator {
     
-    private final boolean isSupportGlobalCSN;
-    
-    private final boolean isDDLNeedImplicitCommit;
-    
-    private final boolean isSupportAutoCommitInNestedTransaction;
-    
-    private final boolean isSupportDDLInXATransaction;
-    
-    // TODO Investgate the reason of some databases cannot support meta data 
refreshed in transaction. The method should be removed finally after metadata 
refresh supported for all database.
-    private final boolean isSupportMetaDataRefreshInTransaction;
-    
-    private final int defaultIsolationLevel;
+    @Override
+    public RollbackStatement createRollbackStatement() {
+        return new OpenGaussRollbackStatement();
+    }
 }
diff --git 
a/parser/sql/statement/type/opengauss/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator
 
b/parser/sql/statement/type/opengauss/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator
new file mode 100644
index 00000000000..7683cfc11a2
--- /dev/null
+++ 
b/parser/sql/statement/type/opengauss/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.sql.parser.statement.opengauss.OpenGaussStatementCreator
diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
 
b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/PostgreSQLStatementCreator.java
similarity index 50%
copy from 
infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
copy to 
parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/PostgreSQLStatementCreator.java
index 833e3473998..838a892f0e2 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/transaction/DialectTransactionOption.java
+++ 
b/parser/sql/statement/type/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/statement/postgresql/PostgreSQLStatementCreator.java
@@ -15,28 +15,19 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.transaction;
+package org.apache.shardingsphere.sql.parser.statement.postgresql;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
+import 
org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator;
+import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.RollbackStatement;
+import 
org.apache.shardingsphere.sql.parser.statement.postgresql.tcl.PostgreSQLRollbackStatement;
 
 /**
- * Dialect transaction option.
+ * Statement creator for PostgreSQL.
  */
-@RequiredArgsConstructor
-@Getter
-public final class DialectTransactionOption {
+public final class PostgreSQLStatementCreator implements 
DialectSQLStatementCreator {
     
-    private final boolean isSupportGlobalCSN;
-    
-    private final boolean isDDLNeedImplicitCommit;
-    
-    private final boolean isSupportAutoCommitInNestedTransaction;
-    
-    private final boolean isSupportDDLInXATransaction;
-    
-    // TODO Investgate the reason of some databases cannot support meta data 
refreshed in transaction. The method should be removed finally after metadata 
refresh supported for all database.
-    private final boolean isSupportMetaDataRefreshInTransaction;
-    
-    private final int defaultIsolationLevel;
+    @Override
+    public RollbackStatement createRollbackStatement() {
+        return new PostgreSQLRollbackStatement();
+    }
 }
diff --git 
a/parser/sql/statement/type/postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator
 
b/parser/sql/statement/type/postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator
new file mode 100644
index 00000000000..3746c83f966
--- /dev/null
+++ 
b/parser/sql/statement/type/postgresql/src/main/resources/META-INF/services/org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.sql.parser.statement.postgresql.PostgreSQLStatementCreator
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandler.java
index e81cf47185e..918bb63551e 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandler.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.proxy.backend.handler.tcl;
 
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.metadata.DialectDatabaseMetaData;
+import 
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.transaction.InTransactionException;
@@ -27,20 +28,18 @@ import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import 
org.apache.shardingsphere.sql.parser.statement.core.DialectSQLStatementCreator;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.ReleaseSavepointStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.RollbackStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.SavepointStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.SetAutoCommitStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.TCLStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.opengauss.tcl.OpenGaussCommitStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.opengauss.tcl.OpenGaussRollbackStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.postgresql.tcl.PostgreSQLCommitStatement;
-import 
org.apache.shardingsphere.sql.parser.statement.postgresql.tcl.PostgreSQLRollbackStatement;
 import org.apache.shardingsphere.transaction.core.TransactionOperationType;
 
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
+import java.util.Optional;
 
 /**
  * TCL backend handler.
@@ -126,15 +125,13 @@ public final class TCLBackendHandler implements 
ProxyBackendHandler {
     }
     
     private SQLStatement getSQLStatementByCommit() {
-        SQLStatement result = tclStatement;
-        if 
(connectionSession.getConnectionContext().getTransactionContext().isExceptionOccur())
 {
-            if (tclStatement instanceof OpenGaussCommitStatement) {
-                result = new OpenGaussRollbackStatement();
-            } else if (tclStatement instanceof PostgreSQLCommitStatement) {
-                result = new PostgreSQLRollbackStatement();
+        if 
(connectionSession.getConnectionContext().getTransactionContext().isExceptionOccur()
 && 
dialectDatabaseMetaData.getTransactionOption().isReturnRollbackStatementWhenCommitFailed())
 {
+            Optional<DialectSQLStatementCreator> statementCreator = 
DatabaseTypedSPILoader.findService(DialectSQLStatementCreator.class, 
connectionSession.getProtocolType());
+            if (statementCreator.isPresent()) {
+                return statementCreator.get().createRollbackStatement();
             }
         }
-        return result;
+        return tclStatement;
     }
     
     private void handleSetAutoCommit() throws SQLException {

Reply via email to