Make ginbuild's funcCtx be independent of its tmpCtx.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 Mar 2015 18:02:58 +0000 (14:02 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 29 Mar 2015 18:02:58 +0000 (14:02 -0400)
Previously the funcCtx was a child of the tmpCtx, but that was broken
by commit eaa5808e8ec4e82ce1a87103a6b6f687666e4e4c, which made
MemoryContextReset() delete, not reset, child contexts.  The behavior of
having a tmpCtx reset also clear the other context seems rather dubious
anyway, so let's just disentangle them.  Per report from Erik Rijkers.

In passing, fix badly-inaccurate comments about these contexts.

src/backend/access/gin/gininsert.c

index cc8d9d92ee918e39b21a4f89ac5b37303c203e1f..fc44f0205d07e3611c7a41437c2ef5d3c1958fb7 100644 (file)
@@ -370,8 +370,8 @@ ginbuild(PG_FUNCTION_ARGS)
    buildstate.buildStats.nEntryPages++;
 
    /*
-    * create a temporary memory context that is reset once for each tuple
-    * inserted into the index
+    * create a temporary memory context that is used to hold data not yet
+    * dumped out to the index
     */
    buildstate.tmpCtx = AllocSetContextCreate(CurrentMemoryContext,
                                              "Gin build temporary context",
@@ -379,7 +379,11 @@ ginbuild(PG_FUNCTION_ARGS)
                                              ALLOCSET_DEFAULT_INITSIZE,
                                              ALLOCSET_DEFAULT_MAXSIZE);
 
-   buildstate.funcCtx = AllocSetContextCreate(buildstate.tmpCtx,
+   /*
+    * create a temporary memory context that is used for calling
+    * ginExtractEntries(), and can be reset after each tuple
+    */
+   buildstate.funcCtx = AllocSetContextCreate(CurrentMemoryContext,
                     "Gin build temporary context for user-defined function",
                                               ALLOCSET_DEFAULT_MINSIZE,
                                               ALLOCSET_DEFAULT_INITSIZE,
@@ -408,6 +412,7 @@ ginbuild(PG_FUNCTION_ARGS)
    }
    MemoryContextSwitchTo(oldCtx);
 
+   MemoryContextDelete(buildstate.funcCtx);
    MemoryContextDelete(buildstate.tmpCtx);
 
    /*