v4-0003-Document-indexallkeysmatch-parameter-for-amcheck-.patch
application/octet-stream
Filename: v4-0003-Document-indexallkeysmatch-parameter-for-amcheck-.patch
Type: application/octet-stream
Part: 3
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: format-patch
Series: patch v4-0003
Subject: Document indexallkeysmatch parameter for amcheck B-Tree verification
| File | + | − |
|---|---|---|
| doc/src/sgml/amcheck.sgml | 49 | 6 |
From dd4434408fc931bb45ed947818ac62487dd9ef9f Mon Sep 17 00:00:00 2001
From: Andrey Borodin <amborodin@acm.org>
Date: Thu, 26 Feb 2026 22:01:16 +0500
Subject: [PATCH v4 3/5] Document indexallkeysmatch parameter for amcheck
B-Tree verification
Add indexallkeysmatch to bt_index_check and bt_index_parent_check
signatures, describe the parameter, add a dedicated section explaining
the verification, and mention it in the corruption detection list.
---
doc/src/sgml/amcheck.sgml | 55 ++++++++++++++++++++++++++++++++++-----
1 file changed, 49 insertions(+), 6 deletions(-)
diff --git a/doc/src/sgml/amcheck.sgml b/doc/src/sgml/amcheck.sgml
index 08006856579..793fd1661ff 100644
--- a/doc/src/sgml/amcheck.sgml
+++ b/doc/src/sgml/amcheck.sgml
@@ -61,7 +61,7 @@
<variablelist>
<varlistentry>
<term>
- <function>bt_index_check(index regclass, heapallindexed boolean, checkunique boolean) returns void</function>
+ <function>bt_index_check(index regclass, heapallindexed boolean, checkunique boolean, indexallkeysmatch boolean) returns void</function>
<indexterm>
<primary>bt_index_check</primary>
</indexterm>
@@ -118,7 +118,10 @@ ORDER BY c.relpages DESC LIMIT 10;
that span child/parent relationships, but will verify the
presence of all heap tuples as index tuples within the index
when <parameter>heapallindexed</parameter> is
- <literal>true</literal>. When <parameter>checkunique</parameter>
+ <literal>true</literal>. When <parameter>indexallkeysmatch</parameter>
+ is <literal>true</literal>, it verifies that each index tuple
+ points to a heap tuple with the same key (the reverse of
+ <parameter>heapallindexed</parameter>). When <parameter>checkunique</parameter>
is <literal>true</literal> <function>bt_index_check</function> will
check that no more than one among duplicate entries in unique
index is visible. When a routine, lightweight test for
@@ -132,7 +135,7 @@ ORDER BY c.relpages DESC LIMIT 10;
<varlistentry>
<term>
- <function>bt_index_parent_check(index regclass, heapallindexed boolean, rootdescend boolean, checkunique boolean) returns void</function>
+ <function>bt_index_parent_check(index regclass, heapallindexed boolean, rootdescend boolean, checkunique boolean, indexallkeysmatch boolean) returns void</function>
<indexterm>
<primary>bt_index_parent_check</primary>
</indexterm>
@@ -145,7 +148,9 @@ ORDER BY c.relpages DESC LIMIT 10;
Optionally, when the <parameter>heapallindexed</parameter>
argument is <literal>true</literal>, the function verifies the
presence of all heap tuples that should be found within the
- index. When <parameter>checkunique</parameter>
+ index. When <parameter>indexallkeysmatch</parameter> is
+ <literal>true</literal>, it verifies that each index tuple
+ points to a heap tuple with the same key. When <parameter>checkunique</parameter>
is <literal>true</literal> <function>bt_index_parent_check</function> will
check that no more than one among duplicate entries in unique
index is visible. When the optional <parameter>rootdescend</parameter>
@@ -416,6 +421,41 @@ SET client_min_messages = DEBUG1;
</sect2>
+ <sect2 id="amcheck-optional-indexallkeysmatch-verification">
+ <title>Optional <parameter>indexallkeysmatch</parameter> Verification</title>
+ <para>
+ When the <parameter>indexallkeysmatch</parameter> argument to B-Tree
+ verification functions is <literal>true</literal>, an additional
+ phase verifies that each index tuple points to a heap tuple with the
+ same key. This is the reverse of <parameter>heapallindexed</parameter>:
+ <parameter>heapallindexed</parameter> checks that every heap tuple is
+ in the index, while <parameter>indexallkeysmatch</parameter> checks
+ that every index tuple points to a matching heap tuple.
+ </para>
+ <para>
+ The implementation uses a Bloom filter to amortize random heap
+ lookups. A sequential heap scan first fingerprints all visible
+ (key, tid) pairs. During the index scan, each leaf tuple is probed
+ against this filter. Only when the filter says "not present" does
+ an actual heap fetch and key comparison occur. Corruption is
+ reported when an index tuple points to a non-existent heap slot, or
+ when the heap tuple's key (as computed by <function>FormIndexDatum</function>)
+ differs from the index tuple's key.
+ </para>
+ <para>
+ Like <parameter>heapallindexed</parameter>, this check requires an
+ MVCC snapshot to obtain a consistent view of the heap and index.
+ Index tuples that point to dead heap tuples (not visible to the
+ snapshot) are skipped.
+ </para>
+ <para>
+ The summarizing structure is bound in size by
+ <varname>maintenance_work_mem</varname>, using the same sizing
+ approach as <parameter>heapallindexed</parameter>.
+ </para>
+
+ </sect2>
+
<sect2 id="amcheck-using-amcheck-effectively">
<title>Using <filename>amcheck</filename> Effectively</title>
@@ -458,12 +498,15 @@ SET client_min_messages = DEBUG1;
<listitem>
<para>
Structural inconsistencies between indexes and the heap relations
- that are indexed (when <parameter>heapallindexed</parameter>
- verification is performed).
+ that are indexed (when <parameter>heapallindexed</parameter> or
+ <parameter>indexallkeysmatch</parameter> verification is performed).
</para>
<para>
There is no cross-checking of indexes against their heap relation
during normal operation. Symptoms of heap corruption can be subtle.
+ <parameter>indexallkeysmatch</parameter> detects cases where an index
+ tuple stores a different key than the heap tuple it points to, or
+ points to a non-existent heap slot.
</para>
</listitem>
<listitem>
--
2.51.2