Avoid misinterpreting GiST pages in pageinspect.
authorPeter Geoghegan <[email protected]>
Mon, 15 Feb 2021 03:43:25 +0000 (19:43 -0800)
committerPeter Geoghegan <[email protected]>
Mon, 15 Feb 2021 03:43:25 +0000 (19:43 -0800)
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 <[email protected]>

contrib/pageinspect/gistfuncs.c

index d5da1ea839a579f2a9a51e1d3498b03335fd2705..66a7f5562f2955b9586141d6a9b13dd263f38ab5 100644 (file)
@@ -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];