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

Reply via email to