Avoid misinterpreting GiST pages in pageinspect.
authorPeter Geoghegan <pg@bowt.ie>
Mon, 15 Feb 2021 03:43:25 +0000 (19:43 -0800)
committerPeter Geoghegan <pg@bowt.ie>
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 <x4mmm@yandex-team.ru>

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];