Prevent intratransaction memory leak when a subtransaction is aborted
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Nov 2006 22:35:29 +0000 (22:35 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 21 Nov 2006 22:35:29 +0000 (22:35 +0000)
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.

src/backend/executor/spi.c

index 7d4485838ef269b022f6a1bd072b205a80cdb99f..ab7e7937447873ec5f12fa13caf3e5a366da07b5 100644 (file)
@@ -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;
+       }
 }