diff options
author | Peter Geoghegan <pg@bowt.ie> | 2021-02-14 19:43:25 -0800 |
---|---|---|
committer | Peter Geoghegan <pg@bowt.ie> | 2021-02-14 19:43:25 -0800 |
commit | fa41cf8f183ac5d702e91da567e9b3375c632081 (patch) | |
tree | 6dac5a77bd6cd37f881b879fc1335d0f66dade3c /contrib/pageinspect/gistfuncs.c | |
parent | 7cde6b13a9b630e2f04d91e2f17dedc2afee21c6 (diff) | |
download | postgresql-fa41cf8f183ac5d702e91da567e9b3375c632081.tar.gz postgresql-fa41cf8f183ac5d702e91da567e9b3375c632081.zip |
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 <x4mmm@yandex-team.ru>
Diffstat (limited to 'contrib/pageinspect/gistfuncs.c')
-rw-r--r-- | contrib/pageinspect/gistfuncs.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index d5da1ea839a..66a7f5562f2 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]; |