summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2025-12-02 21:10:51 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2025-12-02 21:10:51 +0200
commit6c05ef5729c04d47400660cd994305bc44a3c757 (patch)
treeb4c69fd04004c212b5ba6e88dbcd4ebd58140923
parent1e4e5783e7d77adb283ae7fa1ac99b0910a041b2 (diff)
Fix amcheck's handling of incomplete root splits in B-tree
When the root page is being split, it's normal that root page according to the metapage is not marked BTP_ROOT. Fix bogus error in amcheck about that case. Reviewed-by: Peter Geoghegan <pg@bowt.ie> Discussion: https://www.postgresql.org/message-id/abd65090-5336-42cc-b768-2bdd66738404@iki.fi Backpatch-through: 14
-rw-r--r--contrib/amcheck/verify_nbtree.c2
-rw-r--r--src/test/modules/nbtree/Makefile2
-rw-r--r--src/test/modules/nbtree/expected/nbtree_incomplete_splits.out7
-rw-r--r--src/test/modules/nbtree/sql/nbtree_incomplete_splits.sql7
4 files changed, 16 insertions, 2 deletions
diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
index 0949c88983a..f26c20b59aa 100644
--- a/contrib/amcheck/verify_nbtree.c
+++ b/contrib/amcheck/verify_nbtree.c
@@ -721,7 +721,7 @@ bt_check_level_from_leftmost(BtreeCheckState *state, BtreeLevel level)
errmsg("block %u is not leftmost in index \"%s\"",
current, RelationGetRelationName(state->rel))));
- if (level.istruerootlevel && !P_ISROOT(opaque))
+ if (level.istruerootlevel && (!P_ISROOT(opaque) && !P_INCOMPLETE_SPLIT(opaque)))
ereport(ERROR,
(errcode(ERRCODE_INDEX_CORRUPTED),
errmsg("block %u is not true root in index \"%s\"",
diff --git a/src/test/modules/nbtree/Makefile b/src/test/modules/nbtree/Makefile
index 34946a84445..970e2e629fe 100644
--- a/src/test/modules/nbtree/Makefile
+++ b/src/test/modules/nbtree/Makefile
@@ -1,6 +1,6 @@
# src/test/modules/nbtree/Makefile
-EXTRA_INSTALL = src/test/modules/injection_points
+EXTRA_INSTALL = src/test/modules/injection_points contrib/amcheck
REGRESS = nbtree_incomplete_splits
diff --git a/src/test/modules/nbtree/expected/nbtree_incomplete_splits.out b/src/test/modules/nbtree/expected/nbtree_incomplete_splits.out
index 88e87e875c8..161eb3cbfa8 100644
--- a/src/test/modules/nbtree/expected/nbtree_incomplete_splits.out
+++ b/src/test/modules/nbtree/expected/nbtree_incomplete_splits.out
@@ -14,6 +14,7 @@
-- splits in "incomplete" state
set client_min_messages TO 'warning';
create extension if not exists injection_points;
+create extension if not exists amcheck;
reset client_min_messages;
-- Make all injection points local to this process, for concurrency.
SELECT injection_points_set_local();
@@ -87,6 +88,12 @@ begin
if c <> 200 then
raise 'unexpected count % ', c;
end if;
+
+ -- Also check the index with amcheck. Both to test that the index is
+ -- valid, but also to test that amcheck doesn't wrongly complain
+ -- about incomplete splits.
+ perform bt_index_parent_check('nbtree_incomplete_splits_i_idx'::regclass, true, true);
+
return true;
end;
$$;
diff --git a/src/test/modules/nbtree/sql/nbtree_incomplete_splits.sql b/src/test/modules/nbtree/sql/nbtree_incomplete_splits.sql
index 0609ed7464e..f6b22786d37 100644
--- a/src/test/modules/nbtree/sql/nbtree_incomplete_splits.sql
+++ b/src/test/modules/nbtree/sql/nbtree_incomplete_splits.sql
@@ -15,6 +15,7 @@
-- splits in "incomplete" state
set client_min_messages TO 'warning';
create extension if not exists injection_points;
+create extension if not exists amcheck;
reset client_min_messages;
-- Make all injection points local to this process, for concurrency.
@@ -86,6 +87,12 @@ begin
if c <> 200 then
raise 'unexpected count % ', c;
end if;
+
+ -- Also check the index with amcheck. Both to test that the index is
+ -- valid, but also to test that amcheck doesn't wrongly complain
+ -- about incomplete splits.
+ perform bt_index_parent_check('nbtree_incomplete_splits_i_idx'::regclass, true, true);
+
return true;
end;
$$;