]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Don't be so eager to execute 'begin'
authorDaniel Fortunov <github@danielfortunov.com>
Thu, 6 Aug 2020 23:48:25 +0000 (00:48 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 7 Aug 2020 01:59:46 +0000 (02:59 +0100)
Only execute an automatic 'begin' statement if the TransactionStatus is
IDLE, so that a failure to execute 'begin' doesn't overshadow a failure
to execute a user query.

psycopg3/psycopg3/connection.py
tests/test_connection.py

index 0f0e320da309c0423b7daecc809c99e0367dcd3f..8529b44462f83b06bc329410192c2cf5f2a15dc5 100644 (file)
@@ -241,7 +241,7 @@ class Connection(BaseConnection):
         if self._autocommit:
             return
 
-        if self.pgconn.transaction_status == TransactionStatus.INTRANS:
+        if self.pgconn.transaction_status != TransactionStatus.IDLE:
             return
 
         self.pgconn.send_query(b"begin")
@@ -349,7 +349,7 @@ class AsyncConnection(BaseConnection):
         if self._autocommit:
             return
 
-        if self.pgconn.transaction_status == TransactionStatus.INTRANS:
+        if self.pgconn.transaction_status != TransactionStatus.IDLE:
             return
 
         self.pgconn.send_query(b"begin")
index 4bcd95693957c1295fb5868e21c4f77db4335b3a..562a54dd8475836fb0b0c78e91c8b2cb68b7e225 100644 (file)
@@ -107,6 +107,9 @@ def test_auto_transaction_fail(conn):
         cur.execute("meh")
     assert conn.pgconn.transaction_status == conn.TransactionStatus.INERROR
 
+    with pytest.raises(psycopg3.errors.InFailedSqlTransaction):
+        cur.execute("select 1")
+
     conn.commit()
     assert conn.pgconn.transaction_status == conn.TransactionStatus.IDLE
     assert cur.execute("select * from foo").fetchone() is None