Fix bug in COMMIT AND CHAIN command.
authorFujii Masao <[email protected]>
Fri, 19 Feb 2021 12:57:52 +0000 (21:57 +0900)
committerFujii Masao <[email protected]>
Fri, 19 Feb 2021 12:57:52 +0000 (21:57 +0900)
This commit fixes COMMIT AND CHAIN command so that it starts new transaction
immediately even if savepoints are defined within the transaction to commit.
Previously COMMIT AND CHAIN command did not in that case because
commit 280a408b48 forgot to make CommitTransactionCommand() handle
a transaction chaining when the transaction state was TBLOCK_SUBCOMMIT.

Also this commit adds the regression test for COMMIT AND CHAIN command
when savepoints are defined.

Back-patch to v12 where transaction chaining was added.

Reported-by: Arthur Nascimento
Author: Fujii Masao
Reviewed-by: Arthur Nascimento, Vik Fearing
Discussion: https://postgr.es/m/16867-3475744069228158@postgresql.org

src/backend/access/transam/xact.c
src/test/regress/expected/transactions.out
src/test/regress/sql/transactions.sql

index 17fbc41bbb71c1a38a216d5714d370abae138dee..4e6a3df6b874252261a4ee44f9c5e964f3f1f746 100644 (file)
@@ -3105,6 +3105,13 @@ CommitTransactionCommand(void)
                Assert(s->parent == NULL);
                CommitTransaction();
                s->blockState = TBLOCK_DEFAULT;
+               if (s->chain)
+               {
+                   StartTransaction();
+                   s->blockState = TBLOCK_INPROGRESS;
+                   s->chain = false;
+                   RestoreTransactionCharacteristics();
+               }
            }
            else if (s->blockState == TBLOCK_PREPARE)
            {
index 1b033100298d4f04d3a8304b57835f56649cfcf0..75dc6558d82ec5e29c6560e157a5d41d844e805e 100644 (file)
@@ -774,6 +774,46 @@ SHOW transaction_deferrable;
 (1 row)
 
 INSERT INTO abc VALUES (5);
+COMMIT;
+START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE;
+SHOW transaction_isolation;
+ transaction_isolation 
+-----------------------
+ repeatable read
+(1 row)
+
+SHOW transaction_read_only;
+ transaction_read_only 
+-----------------------
+ off
+(1 row)
+
+SHOW transaction_deferrable;
+ transaction_deferrable 
+------------------------
+ on
+(1 row)
+
+SAVEPOINT x;
+COMMIT AND CHAIN;  -- TBLOCK_SUBCOMMIT
+SHOW transaction_isolation;
+ transaction_isolation 
+-----------------------
+ repeatable read
+(1 row)
+
+SHOW transaction_read_only;
+ transaction_read_only 
+-----------------------
+ off
+(1 row)
+
+SHOW transaction_deferrable;
+ transaction_deferrable 
+------------------------
+ on
+(1 row)
+
 COMMIT;
 -- different mix of options just for fun
 START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE, NOT DEFERRABLE;
index bf1016489d1ec91d4f6d350077fa7152c843266b..d1b6ed0280d65aed5ab36af89c746d523310c761 100644 (file)
@@ -458,6 +458,17 @@ SHOW transaction_deferrable;
 INSERT INTO abc VALUES (5);
 COMMIT;
 
+START TRANSACTION ISOLATION LEVEL REPEATABLE READ, READ WRITE, DEFERRABLE;
+SHOW transaction_isolation;
+SHOW transaction_read_only;
+SHOW transaction_deferrable;
+SAVEPOINT x;
+COMMIT AND CHAIN;  -- TBLOCK_SUBCOMMIT
+SHOW transaction_isolation;
+SHOW transaction_read_only;
+SHOW transaction_deferrable;
+COMMIT;
+
 -- different mix of options just for fun
 START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE, NOT DEFERRABLE;
 SHOW transaction_isolation;