summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Geoghegan2021-02-15 03:43:25 +0000
committerPeter Geoghegan2021-02-15 03:43:25 +0000
commitfa41cf8f183ac5d702e91da567e9b3375c632081 (patch)
tree6dac5a77bd6cd37f881b879fc1335d0f66dade3c
parent7cde6b13a9b630e2f04d91e2f17dedc2afee21c6 (diff)
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>
-rw-r--r--contrib/pageinspect/gistfuncs.c12
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];