aboutsummaryrefslogtreecommitdiff
path: root/src/backend/executor
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2022-02-28 12:54:12 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2022-02-28 12:54:12 -0500
commit12d768e70497afc5a57acf73c251316997b5175a (patch)
tree129fc68a13e888875e85770beda5cddd6de775d7 /src/backend/executor
parent2e517818f4af4abe93bf56442469944544f10d4b (diff)
downloadpostgresql-12d768e70497afc5a57acf73c251316997b5175a.tar.gz
postgresql-12d768e70497afc5a57acf73c251316997b5175a.zip
Don't use static storage for SaveTransactionCharacteristics().
This is pretty queasy-making on general principles, and the more so once you notice that CommitTransactionCommand() is actually stomping on the values saved by _SPI_commit(). It's okay as long as the active values didn't change during HoldPinnedPortals(); but that's a larger assumption than I think we want to make, especially since the fix is so simple. Discussion: https://postgr.es/m/1533956.1645731245@sss.pgh.pa.us
Diffstat (limited to 'src/backend/executor')
-rw-r--r--src/backend/executor/spi.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 7971050746f..5b353cb93a7 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -228,6 +228,7 @@ static void
_SPI_commit(bool chain)
{
MemoryContext oldcontext = CurrentMemoryContext;
+ SavedTransactionCharacteristics savetc;
/*
* Complain if we are in a context that doesn't permit transaction
@@ -255,9 +256,8 @@ _SPI_commit(bool chain)
(errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
errmsg("cannot commit while a subtransaction is active")));
- /* XXX this ain't re-entrant enough for my taste */
if (chain)
- SaveTransactionCharacteristics();
+ SaveTransactionCharacteristics(&savetc);
/* Catch any error occurring during the COMMIT */
PG_TRY();
@@ -281,7 +281,7 @@ _SPI_commit(bool chain)
/* Immediately start a new transaction */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);
@@ -305,7 +305,7 @@ _SPI_commit(bool chain)
/* ... and start a new one */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);
@@ -333,6 +333,7 @@ static void
_SPI_rollback(bool chain)
{
MemoryContext oldcontext = CurrentMemoryContext;
+ SavedTransactionCharacteristics savetc;
/* see under SPI_commit() */
if (_SPI_current->atomic)
@@ -346,9 +347,8 @@ _SPI_rollback(bool chain)
(errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION),
errmsg("cannot roll back while a subtransaction is active")));
- /* XXX this ain't re-entrant enough for my taste */
if (chain)
- SaveTransactionCharacteristics();
+ SaveTransactionCharacteristics(&savetc);
/* Catch any error occurring during the ROLLBACK */
PG_TRY();
@@ -373,7 +373,7 @@ _SPI_rollback(bool chain)
/* Immediately start a new transaction */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);
@@ -398,7 +398,7 @@ _SPI_rollback(bool chain)
/* ... and start a new one */
StartTransactionCommand();
if (chain)
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
MemoryContextSwitchTo(oldcontext);