Prevent intratransaction memory leak when a subtransaction is aborted
authorTom Lane
Tue, 21 Nov 2006 22:35:29 +0000 (22:35 +0000)
committerTom Lane
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;
+   }
 }