]> granicus.if.org Git - postgresql/commitdiff
Fix my brain fade in TRUNCATE triggers patch: can't release relcache refcounts
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 31 Mar 2008 03:34:27 +0000 (03:34 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 31 Mar 2008 03:34:27 +0000 (03:34 +0000)
while EState still contains pointers to those relations.  Exposed by the
CLOBBER_CACHE_ALWAYS tests that buildfarm member jaguar is running (I knew
those cycles would pay off...)

src/backend/commands/tablecmds.c

index e97a4fc13aab6375554d24c9fa58a4420a2bbe8a..b507f17b7b65505edc513cee53bb4540e9ee9ed1 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.249 2008/03/28 00:21:55 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.250 2008/03/31 03:34:27 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -662,8 +662,6 @@ ExecuteTruncate(TruncateStmt *stmt)
                heap_relid = RelationGetRelid(rel);
                toast_relid = rel->rd_rel->reltoastrelid;
 
-               heap_close(rel, NoLock);
-
                /*
                 * The same for the toast table, if any.
                 */
@@ -696,6 +694,14 @@ ExecuteTruncate(TruncateStmt *stmt)
 
        /* We can clean up the EState now */
        FreeExecutorState(estate);
+
+       /* And close the rels (can't do this while EState still holds refs) */
+       foreach(cell, rels)
+       {
+               Relation        rel = (Relation) lfirst(cell);
+
+               heap_close(rel, NoLock);
+       }
 }
 
 /*