mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-09 08:10:09 +08:00
Prevent intratransaction memory leak when a subtransaction is aborted
in the middle of executing a SPI query. This doesn't entirely fix the problem of memory leakage in plpgsql exception handling, but it should get rid of the lion's share of leakage.
This commit is contained in:
parent
5fc2d7e451
commit
7ec1c5a867
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.164 2006/10/04 00:29:53 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/executor/spi.c,v 1.165 2006/11/21 22:35:29 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -254,6 +254,19 @@ AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid)
|
||||
(errcode(ERRCODE_WARNING),
|
||||
errmsg("subtransaction left non-empty SPI stack"),
|
||||
errhint("Check for missing \"SPI_finish\" calls.")));
|
||||
|
||||
/*
|
||||
* If we are aborting a subtransaction and there is an open SPI context
|
||||
* surrounding the subxact, clean up to prevent memory leakage.
|
||||
*/
|
||||
if (_SPI_current && !isCommit)
|
||||
{
|
||||
/* free Executor memory the same as _SPI_end_call would do */
|
||||
MemoryContextResetAndDeleteChildren(_SPI_current->execCxt);
|
||||
/* throw away any partially created tuple-table */
|
||||
SPI_freetuptable(_SPI_current->tuptable);
|
||||
_SPI_current->tuptable = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user