]> granicus.if.org Git - postgresql/commitdiff
When a GiST page is split during index build, it might not have a buffer.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 2 Mar 2012 11:16:09 +0000 (13:16 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 2 Mar 2012 11:16:09 +0000 (13:16 +0200)
Previously it was thought that it's impossible as the code stands, because
insertions create buffers as tuples are cascaded downwards, and index
split also creaters buffers eagerly for all halves. But the example from
Jay Levitt demonstrates that it can happen, when the root page is split.
It's in fact OK if the buffer doesn't exist, so we just need to remove the
sanity check. In fact, we've been discussing the possibility of destroying
empty buffers to conserve memory, which would render the sanity check
completely useless anyway.

Fix by Alexander Korotkov

src/backend/access/gist/gistbuildbuffers.c

index 2a5f7b3422dc470a2527fb919fe2cf721e4b7910..34a12bc79c09b5292e2d01ad86345d865ac12191 100644 (file)
@@ -606,12 +606,8 @@ gistRelocateBuildBuffersOnSplit(GISTBuildBuffers *gfbb, GISTSTATE *giststate,
                                                         HASH_FIND, &found);
        if (!found)
        {
-               /*
-                * Node buffer should exist at this point. If it didn't exist before,
-                * the insertion that caused the page to split should've created it.
-                */
-               elog(ERROR, "node buffer of page being split (%u) does not exist",
-                        blocknum);
+               /* The page has no buffer, so we have nothing to do. */
+               return;
        }
 
        /*