mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +03:00
Fix SQL function execution to be safe with long-lived FmgrInfos.
fmgr_sql had been designed on the assumption that the FmgrInfo it's called with has only query lifespan. This is demonstrably unsafe in connection with range types, as shown in bug #7881 from Andrew Gierth. Fix things so that we re-generate the function's cache data if the (sub)transaction it was made in is no longer active. Back-patch to 9.2. This might be needed further back, but it's not clear whether the case can realistically arise without range types, so for now I'll desist from back-patching further.
This commit is contained in:
@ -570,6 +570,27 @@ GetCurrentSubTransactionId(void)
|
||||
return s->subTransactionId;
|
||||
}
|
||||
|
||||
/*
|
||||
* SubTransactionIsActive
|
||||
*
|
||||
* Test if the specified subxact ID is still active. Note caller is
|
||||
* responsible for checking whether this ID is relevant to the current xact.
|
||||
*/
|
||||
bool
|
||||
SubTransactionIsActive(SubTransactionId subxid)
|
||||
{
|
||||
TransactionState s;
|
||||
|
||||
for (s = CurrentTransactionState; s != NULL; s = s->parent)
|
||||
{
|
||||
if (s->state == TRANS_ABORT)
|
||||
continue;
|
||||
if (s->subTransactionId == subxid)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* GetCurrentCommandId
|
||||
|
Reference in New Issue
Block a user