From fa41cf8f183ac5d702e91da567e9b3375c632081 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Sun, 14 Feb 2021 19:43:25 -0800 Subject: [PATCH] Avoid misinterpreting GiST pages in pageinspect. GistPageSetDeleted() sets pd_lower when deleting a page, and sets the page contents to a GISTDeletedPageContents. Avoid treating deleted GiST pages as regular slotted pages within pageinspect. Oversight in commit 756ab291. Author: Andrey Borodin --- contrib/pageinspect/gistfuncs.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index d5da1ea839..66a7f5562f 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -103,6 +103,7 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) MemoryContext oldcontext; Page page; OffsetNumber offset; + OffsetNumber maxoff = InvalidOffsetNumber; if (!superuser()) ereport(ERROR, @@ -135,11 +136,14 @@ gist_page_items_bytea(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + /* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */ if (GistPageIsDeleted(page)) elog(NOTICE, "page is deleted"); + else + maxoff = PageGetMaxOffsetNumber(page); for (offset = FirstOffsetNumber; - offset <= PageGetMaxOffsetNumber(page); + offset <= maxoff; offset++) { Datum values[4]; @@ -187,6 +191,7 @@ gist_page_items(PG_FUNCTION_ARGS) MemoryContext oldcontext; Page page; OffsetNumber offset; + OffsetNumber maxoff = InvalidOffsetNumber; if (!superuser()) ereport(ERROR, @@ -222,11 +227,14 @@ gist_page_items(PG_FUNCTION_ARGS) page = get_page_from_raw(raw_page); + /* Avoid bogus PageGetMaxOffsetNumber() call with deleted pages */ if (GistPageIsDeleted(page)) elog(NOTICE, "page is deleted"); + else + maxoff = PageGetMaxOffsetNumber(page); for (offset = FirstOffsetNumber; - offset <= PageGetMaxOffsetNumber(page); + offset <= maxoff; offset++) { Datum values[4]; -- 2.39.5