mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-11-21 03:13:05 +08:00
Fix crash when a page was split during GiST index creation.
The bug was similar to the one that was fixed in commit22251686f0
. 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 commit9155580fd5
. 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
This commit is contained in:
parent
5e7bedc5ad
commit
a7ee7c8513
@ -1345,6 +1345,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. */
|
||||
|
Loading…
Reference in New Issue
Block a user