This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 78a6bbee553 Fix postgresql savepoint E2E (#31797)
78a6bbee553 is described below
commit 78a6bbee553c56527f9a3193662c73eb01f662f4
Author: ZhangCheng <[email protected]>
AuthorDate: Fri Jun 21 18:11:28 2024 +0800
Fix postgresql savepoint E2E (#31797)
* Fix postgresql savepoint E2E
* Fix postgresql savepoint E2E
* Fix postgresql savepoint E2E
* Fix postgresql savepoint E2E
---
.../core/connection/ShardingSphereConnection.java | 19 +++++++++---
.../savepoint/OpenGaussSavePointTestCase.java | 34 ++++++----------------
.../savepoint/PostgreSQLSavePointTestCase.java | 32 ++++----------------
.../src/test/resources/env/it-env.properties | 4 +--
4 files changed, 32 insertions(+), 57 deletions(-)
diff --git
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
index 71d969da96e..af66bd91801 100644
---
a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
+++
b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ShardingSphereConnection.java
@@ -26,6 +26,8 @@ import
org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePrepar
import
org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement;
import org.apache.shardingsphere.driver.jdbc.core.statement.StatementManager;
import org.apache.shardingsphere.infra.annotation.HighFrequencyInvocation;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.executor.sql.process.ProcessEngine;
import
org.apache.shardingsphere.infra.session.connection.transaction.TransactionConnectionContext;
@@ -196,28 +198,32 @@ public final class ShardingSphereConnection extends
AbstractConnectionAdapter {
@Override
public void rollback(final Savepoint savepoint) throws SQLException {
checkClose();
+
ShardingSpherePreconditions.checkState(databaseConnectionManager.getConnectionTransaction().isHoldTransaction(autoCommit)
|| !isSchemaSupportedDatabaseType(),
+ () -> new SQLFeatureNotSupportedException("ROLLBACK TO
SAVEPOINT can only be used in transaction blocks"));
databaseConnectionManager.rollback(savepoint);
}
@Override
public Savepoint setSavepoint(final String name) throws SQLException {
checkClose();
-
ShardingSpherePreconditions.checkState(databaseConnectionManager.getConnectionTransaction().isHoldTransaction(autoCommit),
- () -> new SQLFeatureNotSupportedException("Savepoint can only
be used in transaction blocks."));
+
ShardingSpherePreconditions.checkState(databaseConnectionManager.getConnectionTransaction().isHoldTransaction(autoCommit)
|| !isSchemaSupportedDatabaseType(),
+ () -> new SQLFeatureNotSupportedException("Savepoint can only
be used in transaction blocks"));
return databaseConnectionManager.setSavepoint(name);
}
@Override
public Savepoint setSavepoint() throws SQLException {
checkClose();
-
ShardingSpherePreconditions.checkState(databaseConnectionManager.getConnectionTransaction().isHoldTransaction(autoCommit),
- () -> new SQLFeatureNotSupportedException("Savepoint can only
be used in transaction blocks."));
+
ShardingSpherePreconditions.checkState(databaseConnectionManager.getConnectionTransaction().isHoldTransaction(autoCommit)
|| !isSchemaSupportedDatabaseType(),
+ () -> new SQLFeatureNotSupportedException("Savepoint can only
be used in transaction blocks"));
return databaseConnectionManager.setSavepoint();
}
@Override
public void releaseSavepoint(final Savepoint savepoint) throws
SQLException {
checkClose();
+
ShardingSpherePreconditions.checkState(databaseConnectionManager.getConnectionTransaction().isHoldTransaction(autoCommit)
|| !isSchemaSupportedDatabaseType(),
+ () -> new SQLFeatureNotSupportedException("RELEASE SAVEPOINT
can only be used in transaction blocks"));
if
(databaseConnectionManager.getConnectionTransaction().isHoldTransaction(autoCommit))
{
databaseConnectionManager.releaseSavepoint(savepoint);
}
@@ -227,6 +233,11 @@ public final class ShardingSphereConnection extends
AbstractConnectionAdapter {
ShardingSpherePreconditions.checkState(!isClosed(), () -> new
ConnectionClosedException().toSQLException());
}
+ private boolean isSchemaSupportedDatabaseType() {
+ DatabaseType databaseType =
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getProtocolType();
+ return new
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getDefaultSchema().isPresent();
+ }
+
@SuppressWarnings("MagicConstant")
@Override
public int getTransactionIsolation() throws SQLException {
diff --git
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
index 888f8cc072a..428ac3bb4bc 100644
---
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
+++
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/OpenGaussSavePointTestCase.java
@@ -17,18 +17,16 @@
package org.apache.shardingsphere.test.e2e.transaction.cases.savepoint;
+import lombok.SneakyThrows;
import
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionContainerComposer;
import
org.apache.shardingsphere.test.e2e.transaction.engine.base.TransactionTestCase;
import
org.apache.shardingsphere.test.e2e.transaction.engine.constants.TransactionTestConstants;
-import org.opengauss.jdbc.PSQLSavepoint;
+import org.postgresql.jdbc.PSQLSavepoint;
import java.sql.Connection;
import java.sql.SQLException;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
+import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* OpenGauss savepoint transaction integration test.
@@ -44,29 +42,15 @@ public final class OpenGaussSavePointTestCase extends
BaseSavePointTestCase {
public void executeTest(final TransactionContainerComposer
containerComposer) throws SQLException {
assertRollbackToSavepoint();
assertReleaseSavepoint();
- assertErrors();
+ assertSavepointNotInTransaction();
}
- private void assertErrors() throws SQLException {
+ @SneakyThrows(SQLException.class)
+ private void assertSavepointNotInTransaction() {
try (Connection connection = getDataSource().getConnection()) {
- try {
- connection.setSavepoint("point");
- fail("Expect exception, but no exception report.");
- } catch (final SQLException ex) {
- assertThat(ex.getMessage(), is("Cannot establish a savepoint
in auto-commit mode."));
- }
- try {
- connection.rollback(new PSQLSavepoint("point1"));
- fail("Expect exception, but no exception report.");
- } catch (final SQLException ex) {
- assertTrue(ex.getMessage().endsWith("ERROR: ROLLBACK TO
SAVEPOINT can only be used in transaction blocks"));
- }
- try {
- connection.releaseSavepoint(new PSQLSavepoint("point1"));
- fail("Expect exception, but no exception report.");
- } catch (final SQLException ex) {
- assertTrue(ex.getMessage().endsWith("ERROR: RELEASE SAVEPOINT
can only be used in transaction blocks"));
- }
+ assertThrows(SQLException.class, () ->
connection.setSavepoint("point"));
+ assertThrows(SQLException.class, () -> connection.rollback(new
org.postgresql.jdbc.PSQLSavepoint("point1")));
+ assertThrows(SQLException.class, () ->
connection.releaseSavepoint(new PSQLSavepoint("point1")));
}
}
}
diff --git
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
index b35bcd84f81..6595eeda603 100644
---
a/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
+++
b/test/e2e/operation/transaction/src/test/java/org/apache/shardingsphere/test/e2e/transaction/cases/savepoint/PostgreSQLSavePointTestCase.java
@@ -26,10 +26,7 @@ import org.postgresql.jdbc.PSQLSavepoint;
import java.sql.Connection;
import java.sql.SQLException;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
+import static org.junit.jupiter.api.Assertions.assertThrows;
/**
* PostgreSQL savepoint transaction integration test.
@@ -45,32 +42,15 @@ public final class PostgreSQLSavePointTestCase extends
BaseSavePointTestCase {
public void executeTest(final TransactionContainerComposer
containerComposer) throws SQLException {
assertRollbackToSavepoint();
assertReleaseSavepoint();
- assertErrors();
+ assertSavepointNotInTransaction();
}
@SneakyThrows(SQLException.class)
- private void assertErrors() {
+ private void assertSavepointNotInTransaction() {
try (Connection connection = getDataSource().getConnection()) {
- try {
- connection.setSavepoint("point");
- fail("Expect exception, but no exception report.");
- } catch (final SQLException ex) {
- assertThat(ex.getMessage(), is("Savepoint can only be used in
transaction blocks."));
- }
- try {
- connection.rollback(new PSQLSavepoint("point1"));
- fail("Expect exception, but no exception report.");
- } catch (final SQLException ex) {
- // TODO can not run to get the correct result in JDBC mode.
- assertTrue(ex.getMessage().endsWith("ERROR: ROLLBACK TO
SAVEPOINT can only be used in transaction blocks"));
- }
- try {
- connection.releaseSavepoint(new PSQLSavepoint("point1"));
- fail("Expect exception, but no exception report.");
- } catch (final SQLException ex) {
- // TODO can not run to get the correct result in JDBC mode.
- assertTrue(ex.getMessage().endsWith("ERROR: RELEASE SAVEPOINT
can only be used in transaction blocks"));
- }
+ assertThrows(SQLException.class, () ->
connection.setSavepoint("point"));
+ assertThrows(SQLException.class, () -> connection.rollback(new
PSQLSavepoint("point1")));
+ assertThrows(SQLException.class, () ->
connection.releaseSavepoint(new PSQLSavepoint("point1")));
}
}
}
diff --git
a/test/e2e/operation/transaction/src/test/resources/env/it-env.properties
b/test/e2e/operation/transaction/src/test/resources/env/it-env.properties
index 9f33956987c..4fd7273922e 100644
--- a/test/e2e/operation/transaction/src/test/resources/env/it-env.properties
+++ b/test/e2e/operation/transaction/src/test/resources/env/it-env.properties
@@ -17,8 +17,8 @@
# transaction.it.type=NONE,DOCKER,NATIVE
transaction.it.env.type=NONE
# transaction.it.proxy.binding.ports=63308:3308
-# transaction.it.env.cases=ClassicTransferTestCase, PostgreSQLSavePointTestCase
-transaction.it.env.cases=TransactionDeadlockTestCase,
MultiJDBCConnectionsTestCase, MultiTransactionInConnectionTestCase,
MultiOperationsCommitAndRollbackTestCase, MySQLAutoCommitTestCase,
PostgreSQLAutoCommitTestCase, BroadcastTableTransactionTestCase,
ExceptionInTransactionTestCase, MultiTableCommitAndRollbackTestCase,
SingleTableCommitAndRollbackTestCase, MySQLSetReadOnlyTestCase,
MySQLLocalTruncateTestCase, MySQLXATruncateTestCase, OpenGaussCursorTestCase,
NestedTransactionTestCase, [...]
+# transaction.it.env.cases=ClassicTransferTestCase
+transaction.it.env.cases=TransactionDeadlockTestCase,
MultiJDBCConnectionsTestCase, MultiTransactionInConnectionTestCase,
MultiOperationsCommitAndRollbackTestCase, MySQLAutoCommitTestCase,
PostgreSQLAutoCommitTestCase, BroadcastTableTransactionTestCase,
ExceptionInTransactionTestCase, MultiTableCommitAndRollbackTestCase,
SingleTableCommitAndRollbackTestCase, MySQLSetReadOnlyTestCase,
MySQLLocalTruncateTestCase, MySQLXATruncateTestCase, OpenGaussCursorTestCase,
NestedTransactionTestCase, [...]
# transaction.it.env.transtypes=LOCAL, XA, BASE
transaction.it.env.transtypes=LOCAL, XA
# transaction.it.env.xa.providers=Atomikos, Narayana