mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
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
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user