]> granicus.if.org Git - postgresql/commitdiff
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 5410c364e0af5e26129b4c47f71100f17148110e..d4fa794bc3d9da607c0131edddc25ade97219ba6 100644 (file)
@@ -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;
+       }
 }