]> granicus.if.org Git - postgresql/commitdiff
Reset the per-output-tuple exprcontext each time through the main loop in
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 18 Aug 2010 21:52:24 +0000 (21:52 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 18 Aug 2010 21:52:24 +0000 (21:52 +0000)
ExecModifyTable().  This avoids memory leakage when trigger functions leave
junk behind in that context (as they more or less must).  Problem and solution
identified by Dean Rasheed.

I'm a bit concerned about the longevity of this solution --- once a plan can
have multiple ModifyTable nodes, we are very possibly going to have to do
something different.  But it should hold up for 9.0.

src/backend/executor/nodeModifyTable.c

index a5e24def37236a36e22791ac641a48d4d492afdd..65414b9267714a635cac499747bfc1187082f8aa 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/executor/nodeModifyTable.c,v 1.8 2010/07/12 17:01:05 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/executor/nodeModifyTable.c,v 1.9 2010/08/18 21:52:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -682,6 +682,14 @@ ExecModifyTable(ModifyTableState *node)
         */
        for (;;)
        {
+               /*
+                * Reset the per-output-tuple exprcontext.  This is needed because
+                * triggers expect to use that context as workspace.  It's a bit ugly
+                * to do this below the top level of the plan, however.  We might need
+                * to rethink this later.
+                */
+               ResetPerTupleExprContext(estate);
+
                planSlot = ExecProcNode(subplanstate);
 
                if (TupIsNull(planSlot))