aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/transam
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/access/transam
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/access/transam')
-rw-r--r--src/backend/access/transam/xact.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index bb1f1069463..adf763a8ea4 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -2983,24 +2983,20 @@ StartTransactionCommand(void)
* GUC system resets the characteristics at transaction end, so for example
* just skipping the reset in StartTransaction() won't work.)
*/
-static int save_XactIsoLevel;
-static bool save_XactReadOnly;
-static bool save_XactDeferrable;
-
void
-SaveTransactionCharacteristics(void)
+SaveTransactionCharacteristics(SavedTransactionCharacteristics *s)
{
- save_XactIsoLevel = XactIsoLevel;
- save_XactReadOnly = XactReadOnly;
- save_XactDeferrable = XactDeferrable;
+ s->save_XactIsoLevel = XactIsoLevel;
+ s->save_XactReadOnly = XactReadOnly;
+ s->save_XactDeferrable = XactDeferrable;
}
void
-RestoreTransactionCharacteristics(void)
+RestoreTransactionCharacteristics(const SavedTransactionCharacteristics *s)
{
- XactIsoLevel = save_XactIsoLevel;
- XactReadOnly = save_XactReadOnly;
- XactDeferrable = save_XactDeferrable;
+ XactIsoLevel = s->save_XactIsoLevel;
+ XactReadOnly = s->save_XactReadOnly;
+ XactDeferrable = s->save_XactDeferrable;
}
@@ -3011,9 +3007,9 @@ void
CommitTransactionCommand(void)
{
TransactionState s = CurrentTransactionState;
+ SavedTransactionCharacteristics savetc;
- if (s->chain)
- SaveTransactionCharacteristics();
+ SaveTransactionCharacteristics(&savetc);
switch (s->blockState)
{
@@ -3071,7 +3067,7 @@ CommitTransactionCommand(void)
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
break;
@@ -3097,7 +3093,7 @@ CommitTransactionCommand(void)
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
break;
@@ -3115,7 +3111,7 @@ CommitTransactionCommand(void)
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
break;
@@ -3182,7 +3178,7 @@ CommitTransactionCommand(void)
StartTransaction();
s->blockState = TBLOCK_INPROGRESS;
s->chain = false;
- RestoreTransactionCharacteristics();
+ RestoreTransactionCharacteristics(&savetc);
}
}
else if (s->blockState == TBLOCK_PREPARE)