amcheck: Fixes for right page check during unique constraint check
authorAlexander Korotkov <akorotkov@postgresql.org>
Sun, 26 May 2024 04:14:12 +0000 (07:14 +0300)
committerAlexander Korotkov <akorotkov@postgresql.org>
Sun, 26 May 2024 04:14:12 +0000 (07:14 +0300)
 * Don't forget to pfree() the right page when it's to be ignored.
 * Report error on unexpected non-leaf right page even if this page is not
   to be ignored.  This restores the logic which was unintendedly changed
   in 97e5b0026f.

Reported-by: Pavel Borisov
contrib/amcheck/verify_nbtree.c

index 4347f9594c9c95940da9604253d9a05a7b24cbce..34990c5cea3f3605bc54966dc94bef2ea632f864 100644 (file)
@@ -1901,17 +1901,19 @@ bt_target_page_check(BtreeCheckState *state)
 
                    if (P_IGNORE(topaque))
                    {
-                       if (unlikely(!P_ISLEAF(topaque)))
-                           ereport(ERROR,
-                                   (errcode(ERRCODE_INDEX_CORRUPTED),
-                                    errmsg("right block of leaf block is non-leaf for index \"%s\"",
-                                           RelationGetRelationName(state->rel)),
-                                    errdetail_internal("Block=%u page lsn=%X/%X.",
-                                                       state->targetblock,
-                                                       LSN_FORMAT_ARGS(state->targetlsn))));
-                       else
-                           break;
+                       pfree(rightpage);
+                       break;
                    }
+
+                   if (unlikely(!P_ISLEAF(topaque)))
+                       ereport(ERROR,
+                               (errcode(ERRCODE_INDEX_CORRUPTED),
+                                errmsg("right block of leaf block is non-leaf for index \"%s\"",
+                                       RelationGetRelationName(state->rel)),
+                                errdetail_internal("Block=%u page lsn=%X/%X.",
+                                                   state->targetblock,
+                                                   LSN_FORMAT_ARGS(state->targetlsn))));
+
                    itemid = PageGetItemIdCareful(state, rightblock_number,
                                                  rightpage,
                                                  rightfirstoffset);