postgres.git / summary / log / commit / refs

commit    2502f45979fca76a6b19a07c98d7a41737a3dc7b
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Fri Mar 02 11:16:09 2012 +0000
First released in: 9.2.0

    When a GiST page is split during index build, it might not have a buffer.
    
    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 | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/backend/access/gist/gistbuildbuffers.c b/src/backend/access/gist/gistbuildbuffers.c index 2a5f7b3422d..34a12bc79c0 100644 --- a/src/backend/access/gist/gistbuildbuffers.c +++ b/src/backend/access/gist/gistbuildbuffers.c @@ -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; } /* [parent: bc8765e91c74]