More paranoia in AtEOSubXact_SPI: don't assume we can safely use SPI_finish
for cleaning up. It seems possible that the memory contexts SPI_finish would try to touch are already gone; and there's no need for SPI itself to delete them, since the containing contexts will surely be going away anyway at transaction end.
This commit is contained in:
parent
1732cb0dbe
commit
25ee160acd
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.119 2004/07/01 00:50:26 tgl Exp $
|
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.120 2004/07/01 21:17:13 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -206,16 +206,27 @@ AtEOSubXact_SPI(bool isCommit, TransactionId childXid)
|
|||||||
while (_SPI_connected >= 0)
|
while (_SPI_connected >= 0)
|
||||||
{
|
{
|
||||||
_SPI_connection *connection = &(_SPI_stack[_SPI_connected]);
|
_SPI_connection *connection = &(_SPI_stack[_SPI_connected]);
|
||||||
int res;
|
|
||||||
|
|
||||||
if (connection->connectXid != childXid)
|
if (connection->connectXid != childXid)
|
||||||
break; /* couldn't be any underneath it either */
|
break; /* couldn't be any underneath it either */
|
||||||
|
|
||||||
found = true;
|
found = true;
|
||||||
|
|
||||||
_SPI_curid = _SPI_connected - 1; /* avoid begin_call error */
|
/*
|
||||||
res = SPI_finish();
|
* Pop the stack entry and reset global variables. Unlike
|
||||||
Assert(res == SPI_OK_FINISH);
|
* SPI_finish(), we don't risk switching to memory contexts that
|
||||||
|
* might be already gone, or deleting memory contexts that have been
|
||||||
|
* or will be thrown away anyway.
|
||||||
|
*/
|
||||||
|
_SPI_connected--;
|
||||||
|
_SPI_curid = _SPI_connected;
|
||||||
|
if (_SPI_connected == -1)
|
||||||
|
_SPI_current = NULL;
|
||||||
|
else
|
||||||
|
_SPI_current = &(_SPI_stack[_SPI_connected]);
|
||||||
|
SPI_processed = 0;
|
||||||
|
SPI_lastoid = InvalidOid;
|
||||||
|
SPI_tuptable = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found && isCommit)
|
if (found && isCommit)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user