postgres.git / summary / log / commit / refs

commit    70c4f500eaeb2ccc3ed49764ee925482bd5c33e0
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Fri Dec 13 21:58:10 2019 +0000
First released in: 13.0, 12.2

    Fix crash when a page was split during GiST index creation.
    
    The bug was similar to the one that was fixed in commit 22251686f0. When
    we split page X and insert the downlink for the new page, the parent page
    might also need to be split. When that happens, the downlink offset number
    we remembered for X is no longer valid. We correctly called
    gistFindCorrectParent() to re-find it, but gistFindCorrectParent() doesn't
    do anything if the LSN of the page hasn't changed, and we stopped updating
    LSNs during index build in commit 9155580fd5. The buggy codepath was taken
    if the page was split into three or more pages, and inserting the downlink
    caused the parent page to split. To fix, explicitly mark the downlink
    offset number as invalid, to force gistFindCorrectParent() to re-find it.
    
    Fixes bug #16134 reported by Alexander Lakhin, reported again as #16162 by
    Andreas Kunert. Thanks to Jeff Janes, Tom Lane and Tomas Vondra for
    debugging. Backpatch to v12, where we stopped WAL-logging during index
    build.
    
    Discussion: https://www.postgresql.org/message-id/16134-0423f729671dec64%40postgresql.org
    Discussion: https://www.postgresql.org/message-id/16162-45d21b7b6c1a3105%40postgresql.org


src/backend/access/gist/gist.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 79030e77153..a44112befce 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -1358,6 +1358,7 @@ gistfinishsplit(GISTInsertState *state, GISTInsertStack *stack, * If the parent page was split, need to relocate the original * parent pointer. */ + stack->downlinkoffnum = InvalidOffsetNumber; gistFindCorrectParent(state->r, stack); } /* gistinserttuples() released the lock on right->buf. */ [parent: 07c4b6ac7d6e]