From 034fffbf31be42c789f4a5fbe2edb62e4b07fa9c Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Sun, 31 Jan 2010 18:15:39 +0000
Subject: [PATCH] Fix memory leak created by deferrable-index-constraints
 patches.

We need to free the OID list returned by ExecInsertIndexTuples to avoid
a query-lifespan memory leak.  When many rows require rechecking, this
can be a significant leak --- it's even more than the space used for the
queued trigger events.

Dean Rasheed
---
 src/backend/commands/copy.c            | 4 +++-
 src/backend/executor/nodeModifyTable.c | 6 +++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index b7e1a175b53..cfaa3927bc7 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.321 2010/01/15 09:19:01 heikki Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.322 2010/01/31 18:15:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2172,6 +2172,8 @@ CopyFrom(CopyState cstate)
 			ExecARInsertTriggers(estate, resultRelInfo, tuple,
 								 recheckIndexes);
 
+			list_free(recheckIndexes);
+
 			/*
 			 * We count only tuples not suppressed by a BEFORE INSERT trigger;
 			 * this is the same definition used by execMain.c for counting
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 170dda31373..cad08fa8f72 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/executor/nodeModifyTable.c,v 1.4 2010/01/02 16:57:44 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/executor/nodeModifyTable.c,v 1.5 2010/01/31 18:15:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -254,6 +254,8 @@ ExecInsert(TupleTableSlot *slot,
 	/* AFTER ROW INSERT Triggers */
 	ExecARInsertTriggers(estate, resultRelInfo, tuple, recheckIndexes);
 
+	list_free(recheckIndexes);
+
 	/* Process RETURNING if present */
 	if (resultRelInfo->ri_projectReturning)
 		return ExecProcessReturning(resultRelInfo->ri_projectReturning,
@@ -570,6 +572,8 @@ lreplace:;
 	ExecARUpdateTriggers(estate, resultRelInfo, tupleid, tuple,
 						 recheckIndexes);
 
+	list_free(recheckIndexes);
+
 	/* Process RETURNING if present */
 	if (resultRelInfo->ri_projectReturning)
 		return ExecProcessReturning(resultRelInfo->ri_projectReturning,
-- 
GitLab