Fix amcheck's handling of half-dead B-tree pages
authorHeikki Linnakangas <[email protected]>
Tue, 2 Dec 2025 19:11:15 +0000 (21:11 +0200)
committerHeikki Linnakangas <[email protected]>
Tue, 2 Dec 2025 19:15:28 +0000 (21:15 +0200)
amcheck incorrectly reported the following error if there were any
half-dead pages in the index:

ERROR:  mismatch between parent key and child high key in index
"amchecktest_id_idx"

It's expected that a half-dead page does not have a downlink in the
parent level, so skip the test.

Reported-by: Konstantin Knizhnik <[email protected]>
Reviewed-by: Peter Geoghegan <[email protected]>
Reviewed-by: Mihail Nikalayeu <[email protected]>
Discussion: https://www.postgresql.org/message-id/33e39552-6a2a-46f3-8b34-3f9f8004451f@garret.ru
Backpatch-through: 14

contrib/amcheck/verify_nbtree.c

index 29d0a33de5d4ecf109de8bd9f2c54abc33d1dfe4..e4a7c431108dffae362cebe9f1b3fad0e1e5537a 100644 (file)
@@ -2367,7 +2367,7 @@ bt_child_highkey_check(BtreeCheckState *state,
         * If we visit page with high key, check that it is equal to the
         * target key next to corresponding downlink.
         */
-       if (!rightsplit && !P_RIGHTMOST(opaque))
+       if (!rightsplit && !P_RIGHTMOST(opaque) && !P_ISHALFDEAD(opaque))
        {
            BTPageOpaque topaque;
            IndexTuple  highkey;