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 {