[BUG] false positive in bt_index_check in case of short 4B varlena datum
Michael Zhilin <m.zhilin@postgrespro.ru>
From: Michael Zhilin <m.zhilin@postgrespro.ru>
To: pgsql-bugs@postgresql.org
Cc: y sokolov <y.sokolov@postgrespro.ru>
Date: 2023-12-14T16:18:11Z
Lists: pgsql-bugs
Attachments
- 0001-contrib-amcheck-must-support-different-header-size-o.patch (text/x-patch) patch 0001
Hi,
Following example produces error raised from bt_index_check.
drop table if exists t;
create table t (v text);
alter table t alter column v set storage plain;
insert into t values ('x');
copy t to '/tmp/1.lst';
copy t from '/tmp/1.lst';
create index t_idx on t(v);
create extension if not exists amcheck;
select bt_index_check('t_idx', true);
postgres=# select bt_index_check('t_idx', true);
ERROR: heap tuple (0,2) from table "t" lacks matching index tuple
within index "t_idx"
HINT: Retrying verification using the function bt_index_parent_check()
might provide a more specific error.
As result table contains 2 logically identical tuples:
- one contains varlena 'x' with 1B (1-byte) header (added by INSERT
statement)
- one contains varlena 'x' with 4B (4-bytes) header (added by COPY
statement)
CREATE INDEX statement builds index with posting list referencing both
heap tuples.
The function bt_index_check calculates fingerprints of 1B and 4B header
datums,
they are different and function returns error.
The attached patch allows to avoid such kind of false positives by
converting short
4B datums to 1B before fingerprinting. Also it contains test for
provided case.
Thank you,
Michael
--
Michael Zhilin
Postgres Professional
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
amcheck: Use correct varlena size accessor in bt_normalize_tuple()
- 4284476c0f67 15 (unreleased) landed
- c89a1ca01344 16 (unreleased) landed
- 8abb8a1555f4 17 (unreleased) landed
- af09b18cbadb 14 (unreleased) landed
- 897e79486296 18 (unreleased) landed
- da1eff08a5be 19 (unreleased) landed