Hello, everyone and Peter. I simplified the patch to reproduce the issue more effectively. Now, bt_index_parent_check fails on a valid index containing just two tuples.
Peter, I included you in this message because you are the author of bt_index_parent_check, so I thought you might find this relevant. Best regards, Mikhail. >
From 6de9549360b7d92b0184c50016aec1c41534e127 Mon Sep 17 00:00:00 2001 From: nkey <michail.nikol...@gmail.com> Date: Sun, 8 Dec 2024 17:32:15 +0100 Subject: [PATCH v2] test to reproduce issue with bt_index_parent_check and CREATE INDEX CONCURRENTLY --- contrib/amcheck/meson.build | 1 + .../t/006_cic_bt_index_parent_check.pl | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 contrib/amcheck/t/006_cic_bt_index_parent_check.pl diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build index fc08e32539..2eb7ff11bd 100644 --- a/contrib/amcheck/meson.build +++ b/contrib/amcheck/meson.build @@ -45,6 +45,7 @@ tests += { 't/003_cic_2pc.pl', 't/004_verify_nbtree_unique.pl', 't/005_pitr.pl', + 't/006_cic_bt_index_parent_check.pl', ], }, } diff --git a/contrib/amcheck/t/006_cic_bt_index_parent_check.pl b/contrib/amcheck/t/006_cic_bt_index_parent_check.pl new file mode 100644 index 0000000000..1d8bb84f22 --- /dev/null +++ b/contrib/amcheck/t/006_cic_bt_index_parent_check.pl @@ -0,0 +1,51 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Test bt_index_parent_check with index created with CREATE INDEX CONCURRENTLY +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; + +use Test::More; + +Test::More->builder->todo_start('filesystem bug') + if PostgreSQL::Test::Utils::has_wal_read_bug; + +my ($node, $result); + +# +# Test set-up +# +$node = PostgreSQL::Test::Cluster->new('CIC_bt_index_parent_check_test'); +$node->init; +$node->append_conf('postgresql.conf', 'fsync = off'); +$node->append_conf('postgresql.conf', 'autovacuum = off'); +$node->append_conf('postgresql.conf', + 'lock_timeout = ' . (1000 * $PostgreSQL::Test::Utils::timeout_default)); +$node->start; +$node->safe_psql('postgres', q(CREATE EXTENSION amcheck)); +$node->safe_psql('postgres', q(CREATE TABLE tbl(i int primary key))); +# Insert two rows into index +$node->safe_psql('postgres', q(INSERT INTO tbl SELECT i FROM generate_series(1, 2) s(i);)); + +# start background transaction +my $in_progress_h = $node->background_psql('postgres'); +$in_progress_h->query_safe( + q( +BEGIN; +SELECT pg_current_xact_id(); +)); + +# delete one row from table, while background transaction is in progress +$node->safe_psql('postgres', q(DELETE FROM tbl WHERE i = 1;)); +# create index concurrently, which will skip the deleted row +$node->safe_psql('postgres', q(CREATE INDEX CONCURRENTLY idx ON tbl(i);)); + +# check index using bt_index_parent_check +$result = $node->psql('postgres', q(SELECT bt_index_parent_check('idx', heapallindexed => true))); +# it fails, because it is expect to find the deleted row in index +is($result, '0', 'bt_index_parent_check after removed rows'); + +$in_progress_h->quit; +done_testing(); -- 2.43.0