From 034fffbf31be42c789f4a5fbe2edb62e4b07fa9c Mon Sep 17 00:00:00 2001 From: Tom Lane 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,