• Heikki Linnakangas's avatar
    Fix two ancient bugs in GiST code to re-find a parent after page split: · bc175eb8
    Heikki Linnakangas authored
    First, when following a right-link, we incorrectly marked the current page
    as the parent of the right sibling. In reality, the parent of the right page
    is the same as the parent of the current page (or some page to the right of
    it, gistFindCorrectParent() will sort that out).
    
    Secondly, when we follow a right-link, we must prepend, not append, the right
    page to our list of pages to visit. That's because we assume that once we
    hit a leaf page in the list, all the rest are leaf pages too, and give up.
    
    To hit these bugs, you need concurrent actions and several unlucky accidents.
    Another backend must split the root page, while you're in process of
    splitting a lower-level page. Furthermore, while you scan the internal nodes
    to re-find the parent, another backend needs to again split some more internal
    pages. Even then, the bugs don't necessarily manifest as user-visible errors
    or index corruption.
    
    While we're at it, make the error reporting a bit better if gistFindPath()
    fails to re-find the parent. It used to be an assertion, but an elog() seems
    more appropriate.
    
    Backpatch to all supported branches.
    bc175eb8
gist.c 40.7 KB