summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorPeter Eisentraut <peter@eisentraut.org>2019-03-24 10:33:14 +0100
committerPeter Eisentraut <peter@eisentraut.org>2019-03-24 11:33:02 +0100
commit280a408b48d5ee42969f981bceb9e9426c3a344c (patch)
tree07cb0ab7cfdbb369e76130ef2cff56f65d0285a2 /src/include
parentb2db277057a375ccbcc98cc3bbce8ce5b4d788ea (diff)
Transaction chaining
Add command variants COMMIT AND CHAIN and ROLLBACK AND CHAIN, which start new transactions with the same transaction characteristics as the just finished one, per SQL standard. Support for transaction chaining in PL/pgSQL is also added. This functionality is especially useful when running COMMIT in a loop in PL/pgSQL. Reviewed-by: Fabien COELHO <coelho@cri.ensmp.fr> Discussion: https://www.postgresql.org/message-id/flat/28536681-324b-10dc-ade8-ab46f7645a5a@2ndquadrant.com
Diffstat (limited to 'src/include')
-rw-r--r--src/include/access/xact.h6
-rw-r--r--src/include/executor/spi.h2
-rw-r--r--src/include/nodes/parsenodes.h1
3 files changed, 7 insertions, 2 deletions
diff --git a/src/include/access/xact.h b/src/include/access/xact.h
index 426e77846f9..e8579dcd478 100644
--- a/src/include/access/xact.h
+++ b/src/include/access/xact.h
@@ -368,12 +368,14 @@ extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
extern void CommandCounterIncrement(void);
extern void ForceSyncCommit(void);
extern void StartTransactionCommand(void);
+extern void SaveTransactionCharacteristics(void);
+extern void RestoreTransactionCharacteristics(void);
extern void CommitTransactionCommand(void);
extern void AbortCurrentTransaction(void);
extern void BeginTransactionBlock(void);
-extern bool EndTransactionBlock(void);
+extern bool EndTransactionBlock(bool chain);
extern bool PrepareTransactionBlock(const char *gid);
-extern void UserAbortTransactionBlock(void);
+extern void UserAbortTransactionBlock(bool chain);
extern void BeginImplicitTransactionBlock(void);
extern void EndImplicitTransactionBlock(void);
extern void ReleaseSavepoint(const char *name);
diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h
index eafcc7a4e4d..83c28b79bfa 100644
--- a/src/include/executor/spi.h
+++ b/src/include/executor/spi.h
@@ -160,7 +160,9 @@ extern int SPI_register_trigger_data(TriggerData *tdata);
extern void SPI_start_transaction(void);
extern void SPI_commit(void);
+extern void SPI_commit_and_chain(void);
extern void SPI_rollback(void);
+extern void SPI_rollback_and_chain(void);
extern void SPICleanup(void);
extern void AtEOXact_SPI(bool isCommit);
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 81278e40197..bdd2bd2fd9c 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -2998,6 +2998,7 @@ typedef struct TransactionStmt
List *options; /* for BEGIN/START commands */
char *savepoint_name; /* for savepoint commands */
char *gid; /* for two-phase-commit related commands */
+ bool chain; /* AND CHAIN option */
} TransactionStmt;
/* ----------------------