I also think that we could have better conventional regression test coverage here.
I tried to minimize Michael's test case and add it to patch. -- Teodor Sigaev E-mail: teo...@sigaev.ru WWW: http://www.sigaev.ru/
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index beef089ba8..e6fe4ba90e 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -1714,7 +1714,7 @@ _bt_unlink_halfdead_page(Relation rel, Buffer leafbuf, bool *rightsib_empty) * parent in the branch. Set 'target' and 'buf' to reference the page * actually being unlinked. */ - if (ItemPointerIsValid(leafhikey)) + if (ItemPointerGetBlockNumberNoCheck(leafhikey) != InvalidBlockNumber) { target = ItemPointerGetBlockNumberNoCheck(leafhikey); Assert(target != leafblkno); diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index fe5b698669..fc81088d4b 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -3052,6 +3052,16 @@ explain (costs off) Filter: (NOT b) (4 rows) +-- +-- Test for multilevel page deletion +-- +CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint); +INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,80000) i; +ALTER TABLE delete_test_table ADD PRIMARY KEY (a,b,c,d); +DELETE FROM delete_test_table WHERE a > 40000; +VACUUM delete_test_table; +DELETE FROM delete_test_table WHERE a > 10; +VACUUM delete_test_table; -- -- REINDEX (VERBOSE) -- diff --git a/src/test/regress/expected/sanity_check.out b/src/test/regress/expected/sanity_check.out index 8afb1f2f7e..0aa5357917 100644 --- a/src/test/regress/expected/sanity_check.out +++ b/src/test/regress/expected/sanity_check.out @@ -38,6 +38,7 @@ d_star|f date_tbl|f default_tbl|f defaultexpr_tbl|f +delete_test_table|t dept|f dupindexcols|t e_star|f diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index f7731265a0..f9e7118f0d 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -1061,6 +1061,17 @@ explain (costs off) explain (costs off) select * from boolindex where not b order by i limit 10; +-- +-- Test for multilevel page deletion +-- +CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint); +INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,80000) i; +ALTER TABLE delete_test_table ADD PRIMARY KEY (a,b,c,d); +DELETE FROM delete_test_table WHERE a > 40000; +VACUUM delete_test_table; +DELETE FROM delete_test_table WHERE a > 10; +VACUUM delete_test_table; + -- -- REINDEX (VERBOSE) --