pg.ddx.io pgsql-hackers@postgresql.org mailing list archive
help / color / mirror / Atom feedmake -C src/test/isolation failure in index-killtuples due to btree_gist
16+ messages / 4 participants
[nested] [flat]
Commits from this thread:
2025-11-24 e429c3cecb Move isolation test index-killtuples to src/test/modules/index/
* make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-08-17 23:57 Michael Paquier <michael@paquier.xyz>
0 siblings, 1 reply; 16+ messages in thread
From: Michael Paquier @ 2025-08-17 23:57 UTC (permalink / raw)
To: Postgres hackers <pgsql-hackers@lists.postgresql.org>; +Cc: Andres Freund <andres@anarazel.de>
Hi all,
(CCing committer)
The following command fails, because btree_gist is not installed in
the context of the isolation tests:
make -C src/test/isolation/
This test has been added recently by 377b7ab14524. Some efforts have
been done lately to remove any dependency to contrib/ in
src/test/regress/, like b1720fe63f34, and it does not strike me as a
good idea to begin doing that in the main isolation test suite, so
perhaps the best thing to do here is just move this test to
contrib/btree_gist/? Rewriting this test without the dependency to
the contrib module seems tricky, and there's the matter of the test
correctness.
Regards,
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-08-18 13:58 Andres Freund <andres@anarazel.de>
parent: Michael Paquier <michael@paquier.xyz>
0 siblings, 2 replies; 16+ messages in thread
From: Andres Freund @ 2025-08-18 13:58 UTC (permalink / raw)
To: Michael Paquier <michael@paquier.xyz>; +Cc: Postgres hackers <pgsql-hackers@lists.postgresql.org>
Hi,
On 2025-08-18 08:57:13 +0900, Michael Paquier wrote:
> The following command fails, because btree_gist is not installed in
> the context of the isolation tests:
> make -C src/test/isolation/
>
> This test has been added recently by 377b7ab14524. Some efforts have
> been done lately to remove any dependency to contrib/ in
> src/test/regress/, like b1720fe63f34
I don't see what the point of that effort is. All it's doing is to make it
ever harder to write tests. IMO we should go diametrically the opposite way
and assume that we have fully built postgres when running tests.
> and it does not strike me as a good idea to begin doing that in the main
> isolation test suite, so perhaps the best thing to do here is just move this
> test to contrib/btree_gist/?
No, it makes absolutely no sense to test e.g. hash killtuples support in
btree_gist.
> and there's the matter of the test correctness.
What are you trying to say here?
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-08-18 15:38 Tom Lane <tgl@sss.pgh.pa.us>
parent: Andres Freund <andres@anarazel.de>
1 sibling, 2 replies; 16+ messages in thread
From: Tom Lane @ 2025-08-18 15:38 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: Michael Paquier <michael@paquier.xyz>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
Andres Freund <andres@anarazel.de> writes:
> On 2025-08-18 08:57:13 +0900, Michael Paquier wrote:
>> The following command fails, because btree_gist is not installed in
>> the context of the isolation tests:
>> make -C src/test/isolation/
>> ...
>> and it does not strike me as a good idea to begin doing that in the main
>> isolation test suite, so perhaps the best thing to do here is just move this
>> test to contrib/btree_gist/?
> No, it makes absolutely no sense to test e.g. hash killtuples support in
> btree_gist.
I think the complaint is that nothing has been done to ensure that
these modules have been installed. You created a new dependency that
developers have to work around, rather than teaching the build system
to handle it. As a comparison point, all of the tests in
src/test/recovery, src/test/authentication, etc take care to install
required modules when you say "make check" in those directories.
You broke that for src/test/isolation, and you should fix it.
It shouldn't be much harder than setting EXTRA_INSTALL in the
Makefile case; I dunno about meson.
regards, tom lane
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-08-18 23:15 Michael Paquier <michael@paquier.xyz>
parent: Tom Lane <tgl@sss.pgh.pa.us>
1 sibling, 0 replies; 16+ messages in thread
From: Michael Paquier @ 2025-08-18 23:15 UTC (permalink / raw)
To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: Andres Freund <andres@anarazel.de>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Mon, Aug 18, 2025 at 11:38:02AM -0400, Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
>> No, it makes absolutely no sense to test e.g. hash killtuples support in
>> btree_gist.
>
> I think the complaint is that nothing has been done to ensure that
> these modules have been installed. You created a new dependency that
> developers have to work around, rather than teaching the build system
> to handle it. As a comparison point, all of the tests in
> src/test/recovery, src/test/authentication, etc take care to install
> required modules when you say "make check" in those directories.
> You broke that for src/test/isolation, and you should fix it.
> It shouldn't be much harder than setting EXTRA_INSTALL in the
> Makefile case; I dunno about meson.
All these test suites can rely on EXTRA_INSTALL because they rely on
the check/installcheck rules from Makefile.global, where checkprep is
pulled in. src/test/isolation defines its own check rules, so we
would need a trick similar to what was done before b1720fe63f34.
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-08-19 00:28 Michael Paquier <michael@paquier.xyz>
parent: Andres Freund <andres@anarazel.de>
1 sibling, 0 replies; 16+ messages in thread
From: Michael Paquier @ 2025-08-19 00:28 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Mon, Aug 18, 2025 at 09:58:28AM -0400, Andres Freund wrote:
> On 2025-08-18 08:57:13 +0900, Michael Paquier wrote:
>> and it does not strike me as a good idea to begin doing that in the main
>> isolation test suite, so perhaps the best thing to do here is just move this
>> test to contrib/btree_gist/?
>
> No, it makes absolutely no sense to test e.g. hash killtuples support in
> btree_gist.
Okay, then let's make sure that the build rules install it
automatically if one runs only the isolation tests :)
We do that everywhere else for other test suites with EXTRA_INSTALL.
Being able to use make check is much more developer-friendly than
requiring developers to use installcheck + a custom step to make sure
that the module is installed in the instance running the tests. make
check has worked for years when run independently in
src/test/isolation/, and I do quite a bit of concurrency testing
myself over time when working on a specific step of a larger
implementation. I am pretty sure to not be the only one doing that.
> What are you trying to say here?
I've quickly looked at the possibility of *not* relying on btree_gist
in this test, and also quickly concluded that you have made this
choice to keep the test faster and easier to understand. That's fine.
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-08-22 23:46 Andres Freund <andres@anarazel.de>
parent: Tom Lane <tgl@sss.pgh.pa.us>
1 sibling, 1 reply; 16+ messages in thread
From: Andres Freund @ 2025-08-22 23:46 UTC (permalink / raw)
To: Tom Lane <tgl@sss.pgh.pa.us>; +Cc: Michael Paquier <michael@paquier.xyz>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
Hi,
On 2025-08-18 11:38:02 -0400, Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
> > On 2025-08-18 08:57:13 +0900, Michael Paquier wrote:
> >> The following command fails, because btree_gist is not installed in
> >> the context of the isolation tests:
> >> make -C src/test/isolation/
> >> ...
> >> and it does not strike me as a good idea to begin doing that in the main
> >> isolation test suite, so perhaps the best thing to do here is just move this
> >> test to contrib/btree_gist/?
>
> > No, it makes absolutely no sense to test e.g. hash killtuples support in
> > btree_gist.
>
> I think the complaint is that nothing has been done to ensure that
> these modules have been installed.
Yes, clearly that needs to be fixed. Not sure why I missed that. My point in
my above - perhaps to flippant - response was just that moving it to
btree_gist doesn't make sense.
> You created a new dependency that developers have to work around, rather
> than teaching the build system to handle it. As a comparison point, all of
> the tests in src/test/recovery, src/test/authentication, etc take care to
> install required modules when you say "make check" in those directories.
> You broke that for src/test/isolation, and you should fix it. It shouldn't
> be much harder than setting EXTRA_INSTALL in the Makefile case; I dunno
> about meson.
That would be the easiest fix - but I'm starting to wonder if it shouldn't
just be its own test module, as annoying as the boilerplate for that is.
While the test improved code coverage for the various indexes noticeably, I
did subsequently realize that the new test doesn't end up testing the recovery
path :(. Better than nothing, but having any coverage of those paths might be
worth the boilerplate and the runtime overhead of a test module :/
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-10-28 07:55 Michael Paquier <michael@paquier.xyz>
parent: Andres Freund <andres@anarazel.de>
0 siblings, 1 reply; 16+ messages in thread
From: Michael Paquier @ 2025-10-28 07:55 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Fri, Aug 22, 2025 at 07:46:43PM -0400, Andres Freund wrote:
> That would be the easiest fix - but I'm starting to wonder if it shouldn't
> just be its own test module, as annoying as the boilerplate for that is.
>
> While the test improved code coverage for the various indexes noticeably, I
> did subsequently realize that the new test doesn't end up testing the recovery
> path :(. Better than nothing, but having any coverage of those paths might be
> worth the boilerplate and the runtime overhead of a test module :/
Adding just an EXTRA_INSTALL to isolation's Makefile would not work,
no? This Makefile has its own rules, which implies that fixing this
issue would be to duplicate what EXTRA_INSTALL does if we don't use
the test module solution. How about a new test/modules/gist/ then?
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-10-30 15:24 Andres Freund <andres@anarazel.de>
parent: Michael Paquier <michael@paquier.xyz>
0 siblings, 1 reply; 16+ messages in thread
From: Andres Freund @ 2025-10-30 15:24 UTC (permalink / raw)
To: Michael Paquier <michael@paquier.xyz>; +Cc: Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
Hi,
On 2025-10-28 16:55:49 +0900, Michael Paquier wrote:
> On Fri, Aug 22, 2025 at 07:46:43PM -0400, Andres Freund wrote:
> > That would be the easiest fix - but I'm starting to wonder if it shouldn't
> > just be its own test module, as annoying as the boilerplate for that is.
> >
> > While the test improved code coverage for the various indexes noticeably, I
> > did subsequently realize that the new test doesn't end up testing the recovery
> > path :(. Better than nothing, but having any coverage of those paths might be
> > worth the boilerplate and the runtime overhead of a test module :/
>
> Adding just an EXTRA_INSTALL to isolation's Makefile would not work,
> no?
How precisely to get the contrib module installed seems like a boring
detail. It's not hard to do that, if we decide that that's the way to go, even
without EXTRA_INSTALL.
> How about a new test/modules/gist/ then?
Well, it tests multiple index types, not just gist. I guess
test/modules/indexes/ or so should work? Not sure about plural or not.
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-10-31 00:41 Michael Paquier <michael@paquier.xyz>
parent: Andres Freund <andres@anarazel.de>
0 siblings, 1 reply; 16+ messages in thread
From: Michael Paquier @ 2025-10-31 00:41 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Thu, Oct 30, 2025 at 11:24:55AM -0400, Andres Freund wrote:
> Well, it tests multiple index types, not just gist. I guess
> test/modules/indexes/ or so should work? Not sure about plural or not.
test/modules/index/ would work here. If you feel strongly about being
able to do an EXTRA_INSTALL in src/test/isolation/, I have no
objections to that as that would also solve the original problem if
that's the consensus. My personal choice would be a test module for
that, as it feels cleaner.
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-11-17 15:45 Nazir Bilal Yavuz <byavuz81@gmail.com>
parent: Michael Paquier <michael@paquier.xyz>
0 siblings, 1 reply; 16+ messages in thread
From: Nazir Bilal Yavuz @ 2025-11-17 15:45 UTC (permalink / raw)
To: Michael Paquier <michael@paquier.xyz>; +Cc: Andres Freund <andres@anarazel.de>; Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
Hi,
On Fri, 31 Oct 2025 at 03:42, Michael Paquier <michael@paquier.xyz> wrote:
>
> On Thu, Oct 30, 2025 at 11:24:55AM -0400, Andres Freund wrote:
> > Well, it tests multiple index types, not just gist. I guess
> > test/modules/indexes/ or so should work? Not sure about plural or not.
>
> test/modules/index/ would work here. If you feel strongly about being
> able to do an EXTRA_INSTALL in src/test/isolation/, I have no
> objections to that as that would also solve the original problem if
> that's the consensus. My personal choice would be a test module for
> that, as it feels cleaner.
I have two patches to implement this: one moving the killtuples test
under test/modules/index/, and another adding coverage for the
recovery path.
0001 moves killtuples test under the test/modules/index/ without any
implementation change.
0002 converts the killtuples isolation test to a TAP test to exercise
the recovery path. This patch sets up a standby and additionally
re-inserts into the table while testing the GiST index to ensure
coverage of the gistRedoDeleteRecord() function.
--
Regards,
Nazir Bilal Yavuz
Microsoft
Attachments: download all (2 files, .tar.gz)
v1-0001-Move-index-killtuples-test-to-test-modules-index.patch (text/x-patch, 4.5K) download
From c665ee5e505ebea4170450ac6ca4351158b8f2a9 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: Mon, 3 Nov 2025 11:44:33 +0300
Subject: [PATCH v1 1/2] Move index-killtuples test to test/modules/index
index-killtuples test depends on btree_gin and btree_gist. Since we
don't want to depend on contrib/ in the src/test/regress/ tests, this
patch moves index-killuples test to test/modules/index/ directory. Also,
since the path has 'index' in its name, renaming index-killtuples test as
killtuples test.
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Suggested-by: Andres Freund <andres@anarazel.de>
Suggested-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/aKJsWedftW7UX1WM%40paquier.xyz
---
src/test/isolation/isolation_schedule | 1 -
src/test/modules/Makefile | 1 +
src/test/modules/index/.gitignore | 6 ++++++
src/test/modules/index/Makefile | 16 ++++++++++++++++
.../index/expected/killtuples.out} | 0
src/test/modules/index/meson.build | 12 ++++++++++++
.../index/specs/killtuples.spec} | 0
src/test/modules/meson.build | 1 +
8 files changed, 36 insertions(+), 1 deletion(-)
create mode 100644 src/test/modules/index/.gitignore
create mode 100644 src/test/modules/index/Makefile
rename src/test/{isolation/expected/index-killtuples.out => modules/index/expected/killtuples.out} (100%)
create mode 100644 src/test/modules/index/meson.build
rename src/test/{isolation/specs/index-killtuples.spec => modules/index/specs/killtuples.spec} (100%)
diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule
index 5afae33d370..112f05a3677 100644
--- a/src/test/isolation/isolation_schedule
+++ b/src/test/isolation/isolation_schedule
@@ -16,7 +16,6 @@ test: ri-trigger
test: partial-index
test: two-ids
test: multiple-row-versions
-test: index-killtuples
test: index-only-scan
test: index-only-bitmapscan
test: predicate-lock-hot-tuple
diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile
index 902a7954101..d079b91b1a2 100644
--- a/src/test/modules/Makefile
+++ b/src/test/modules/Makefile
@@ -10,6 +10,7 @@ SUBDIRS = \
delay_execution \
dummy_index_am \
dummy_seclabel \
+ index \
libpq_pipeline \
oauth_validator \
plsample \
diff --git a/src/test/modules/index/.gitignore b/src/test/modules/index/.gitignore
new file mode 100644
index 00000000000..b4903eba657
--- /dev/null
+++ b/src/test/modules/index/.gitignore
@@ -0,0 +1,6 @@
+# Generated subdirectories
+/log/
+/results/
+/output_iso/
+/tmp_check/
+/tmp_check_iso/
diff --git a/src/test/modules/index/Makefile b/src/test/modules/index/Makefile
new file mode 100644
index 00000000000..29047044ede
--- /dev/null
+++ b/src/test/modules/index/Makefile
@@ -0,0 +1,16 @@
+# src/test/modules/index/Makefile
+
+EXTRA_INSTALL = contrib/btree_gin contrib/btree_gist
+
+ISOLATION = killtuples
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/index
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/isolation/expected/index-killtuples.out b/src/test/modules/index/expected/killtuples.out
similarity index 100%
rename from src/test/isolation/expected/index-killtuples.out
rename to src/test/modules/index/expected/killtuples.out
diff --git a/src/test/modules/index/meson.build b/src/test/modules/index/meson.build
new file mode 100644
index 00000000000..15f3734567a
--- /dev/null
+++ b/src/test/modules/index/meson.build
@@ -0,0 +1,12 @@
+# Copyright (c) 2022-2025, PostgreSQL Global Development Group
+
+tests += {
+ 'name': 'index',
+ 'sd': meson.current_source_dir(),
+ 'bd': meson.current_build_dir(),
+ 'isolation': {
+ 'specs': [
+ 'killtuples',
+ ],
+ },
+}
diff --git a/src/test/isolation/specs/index-killtuples.spec b/src/test/modules/index/specs/killtuples.spec
similarity index 100%
rename from src/test/isolation/specs/index-killtuples.spec
rename to src/test/modules/index/specs/killtuples.spec
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
index 14fc761c4cf..f5114469b92 100644
--- a/src/test/modules/meson.build
+++ b/src/test/modules/meson.build
@@ -6,6 +6,7 @@ subdir('delay_execution')
subdir('dummy_index_am')
subdir('dummy_seclabel')
subdir('gin')
+subdir('index')
subdir('injection_points')
subdir('ldap_password_func')
subdir('libpq_pipeline')
--
2.51.0
v1-0002-Convert-killtuples-isolation-test-to-TAP-test.patch (text/x-patch, 37.1K) download
From 16b7927775007b6dcbb40a8d86d4f7c9dd842cb5 Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: Wed, 5 Nov 2025 15:54:11 +0300
Subject: [PATCH v1 2/2] Convert killtuples isolation test to TAP test
This patch converts isolation test to TAP test for exercising the
recovery path. There are no implementation changes except covering redo
delete case for the gist index by re-inserting to the table.
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Suggested-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/aKJsWedftW7UX1WM%40paquier.xyz
---
src/test/modules/index/.gitignore | 4 -
src/test/modules/index/Makefile | 3 +-
.../modules/index/expected/killtuples.out | 355 ------------------
src/test/modules/index/meson.build | 6 +-
src/test/modules/index/specs/killtuples.spec | 127 -------
src/test/modules/index/t/001_killtuples.pl | 343 +++++++++++++++++
6 files changed, 347 insertions(+), 491 deletions(-)
delete mode 100644 src/test/modules/index/expected/killtuples.out
delete mode 100644 src/test/modules/index/specs/killtuples.spec
create mode 100644 src/test/modules/index/t/001_killtuples.pl
diff --git a/src/test/modules/index/.gitignore b/src/test/modules/index/.gitignore
index b4903eba657..716e17f5a2a 100644
--- a/src/test/modules/index/.gitignore
+++ b/src/test/modules/index/.gitignore
@@ -1,6 +1,2 @@
# Generated subdirectories
-/log/
-/results/
-/output_iso/
/tmp_check/
-/tmp_check_iso/
diff --git a/src/test/modules/index/Makefile b/src/test/modules/index/Makefile
index 29047044ede..5dc97453cfa 100644
--- a/src/test/modules/index/Makefile
+++ b/src/test/modules/index/Makefile
@@ -1,8 +1,7 @@
# src/test/modules/index/Makefile
EXTRA_INSTALL = contrib/btree_gin contrib/btree_gist
-
-ISOLATION = killtuples
+TAP_TESTS = 1
ifdef USE_PGXS
PG_CONFIG = pg_config
diff --git a/src/test/modules/index/expected/killtuples.out b/src/test/modules/index/expected/killtuples.out
deleted file mode 100644
index be7ddd756ef..00000000000
--- a/src/test/modules/index/expected/killtuples.out
+++ /dev/null
@@ -1,355 +0,0 @@
-Parsed test spec with 1 sessions
-
-starting permutation: create_table fill_500 create_btree flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table
-step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
-step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
-step create_btree: CREATE INDEX kill_prior_tuple_btree ON kill_prior_tuple USING btree (key);
-step flush: SELECT FROM pg_stat_force_next_flush();
-step disable_seq: SET enable_seqscan = false;
-step disable_bitmap: SET enable_bitmapscan = false;
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
---------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
---------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step delete: DELETE FROM kill_prior_tuple;
-step flush: SELECT FROM pg_stat_force_next_flush();
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
---------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
---------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_btree on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 0
-(1 row)
-
-step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
-
-starting permutation: create_table fill_500 create_ext_btree_gist create_gist flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table drop_ext_btree_gist
-step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
-step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
-step create_ext_btree_gist: CREATE EXTENSION btree_gist;
-step create_gist: CREATE INDEX kill_prior_tuple_gist ON kill_prior_tuple USING gist (key);
-step flush: SELECT FROM pg_stat_force_next_flush();
-step disable_seq: SET enable_seqscan = false;
-step disable_bitmap: SET enable_bitmapscan = false;
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step delete: DELETE FROM kill_prior_tuple;
-step flush: SELECT FROM pg_stat_force_next_flush();
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 0
-(1 row)
-
-step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
-step drop_ext_btree_gist: DROP EXTENSION btree_gist;
-
-starting permutation: create_table fill_10 create_ext_btree_gist create_gist flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table drop_ext_btree_gist
-step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
-step fill_10: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 10) g(i);
-step create_ext_btree_gist: CREATE EXTENSION btree_gist;
-step create_gist: CREATE INDEX kill_prior_tuple_gist ON kill_prior_tuple USING gist (key);
-step flush: SELECT FROM pg_stat_force_next_flush();
-step disable_seq: SET enable_seqscan = false;
-step disable_bitmap: SET enable_bitmapscan = false;
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step delete: DELETE FROM kill_prior_tuple;
-step flush: SELECT FROM pg_stat_force_next_flush();
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_gist on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
-step drop_ext_btree_gist: DROP EXTENSION btree_gist;
-
-starting permutation: create_table fill_500 create_hash flush disable_seq disable_bitmap measure access flush result measure access flush result delete flush measure access flush result measure access flush result drop_table
-step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
-step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
-step create_hash: CREATE INDEX kill_prior_tuple_hash ON kill_prior_tuple USING hash (key);
-step flush: SELECT FROM pg_stat_force_next_flush();
-step disable_seq: SET enable_seqscan = false;
-step disable_bitmap: SET enable_bitmapscan = false;
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step delete: DELETE FROM kill_prior_tuple;
-step flush: SELECT FROM pg_stat_force_next_flush();
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
--------------------------------------------------------------------------------------
-Index Scan using kill_prior_tuple_hash on kill_prior_tuple (actual rows=0.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(3 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 0
-(1 row)
-
-step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
-
-starting permutation: create_table fill_500 create_ext_btree_gin create_gin flush disable_seq delete flush measure access flush result measure access flush result drop_table drop_ext_btree_gin
-step create_table: CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null);
-step fill_500: INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i);
-step create_ext_btree_gin: CREATE EXTENSION btree_gin;
-step create_gin: CREATE INDEX kill_prior_tuple_gin ON kill_prior_tuple USING gin (key);
-step flush: SELECT FROM pg_stat_force_next_flush();
-step disable_seq: SET enable_seqscan = false;
-step delete: DELETE FROM kill_prior_tuple;
-step flush: SELECT FROM pg_stat_force_next_flush();
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
---------------------------------------------------------------------------
-Bitmap Heap Scan on kill_prior_tuple (actual rows=0.00 loops=1)
- Recheck Cond: (key = 1)
- Heap Blocks: exact=1
- -> Bitmap Index Scan on kill_prior_tuple_gin (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(6 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step measure: UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
-step access: EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
-QUERY PLAN
---------------------------------------------------------------------------
-Bitmap Heap Scan on kill_prior_tuple (actual rows=0.00 loops=1)
- Recheck Cond: (key = 1)
- Heap Blocks: exact=1
- -> Bitmap Index Scan on kill_prior_tuple_gin (actual rows=1.00 loops=1)
- Index Cond: (key = 1)
- Index Searches: 1
-(6 rows)
-
-step flush: SELECT FROM pg_stat_force_next_flush();
-step result: SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
-new_heap_accesses
------------------
- 1
-(1 row)
-
-step drop_table: DROP TABLE IF EXISTS kill_prior_tuple;
-step drop_ext_btree_gin: DROP EXTENSION btree_gin;
diff --git a/src/test/modules/index/meson.build b/src/test/modules/index/meson.build
index 15f3734567a..87b6318dcae 100644
--- a/src/test/modules/index/meson.build
+++ b/src/test/modules/index/meson.build
@@ -4,9 +4,9 @@ tests += {
'name': 'index',
'sd': meson.current_source_dir(),
'bd': meson.current_build_dir(),
- 'isolation': {
- 'specs': [
- 'killtuples',
+ 'tap': {
+ 'tests': [
+ 't/001_killtuples.pl',
],
},
}
diff --git a/src/test/modules/index/specs/killtuples.spec b/src/test/modules/index/specs/killtuples.spec
deleted file mode 100644
index 77fe8c689a7..00000000000
--- a/src/test/modules/index/specs/killtuples.spec
+++ /dev/null
@@ -1,127 +0,0 @@
-# Basic testing of killtuples / kill_prior_tuples / all_dead testing
-# for various index AMs
-#
-# This tests just enough to ensure that the kill* routines are actually
-# executed and does something approximately reasonable. It's *not* sufficient
-# testing for adding killitems support to a new AM!
-#
-# This doesn't really need to be an isolation test, it could be written as a
-# regular regression test. However, writing it as an isolation test ends up a
-# *lot* less verbose.
-
-setup
-{
- CREATE TABLE counter(heap_accesses int);
- INSERT INTO counter(heap_accesses) VALUES (0);
-}
-
-teardown
-{
- DROP TABLE counter;
-}
-
-session s1
-# to ensure GUCs are reset
-setup { RESET ALL; }
-
-step disable_seq { SET enable_seqscan = false; }
-
-step disable_bitmap { SET enable_bitmapscan = false; }
-
-# use a temporary table to make sure no other session can interfere with
-# visibility determinations
-step create_table { CREATE TEMPORARY TABLE kill_prior_tuple(key int not null, cat text not null); }
-
-step fill_10 { INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 10) g(i); }
-
-step fill_500 { INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, 500) g(i); }
-
-# column-less select to make output easier to read
-step flush { SELECT FROM pg_stat_force_next_flush(); }
-
-step measure { UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple'); }
-
-step result { SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses AS new_heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple'; }
-
-step access { EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1; }
-
-step delete { DELETE FROM kill_prior_tuple; }
-
-step drop_table { DROP TABLE IF EXISTS kill_prior_tuple; }
-
-### steps for testing btree indexes ###
-step create_btree { CREATE INDEX kill_prior_tuple_btree ON kill_prior_tuple USING btree (key); }
-
-### steps for testing gist indexes ###
-# Creating the extensions takes time, so we don't want to do so when testing
-# other AMs
-step create_ext_btree_gist { CREATE EXTENSION btree_gist; }
-step drop_ext_btree_gist { DROP EXTENSION btree_gist; }
-step create_gist { CREATE INDEX kill_prior_tuple_gist ON kill_prior_tuple USING gist (key); }
-
-### steps for testing gin indexes ###
-# See create_ext_btree_gist
-step create_ext_btree_gin { CREATE EXTENSION btree_gin; }
-step drop_ext_btree_gin { DROP EXTENSION btree_gin; }
-step create_gin { CREATE INDEX kill_prior_tuple_gin ON kill_prior_tuple USING gin (key); }
-
-### steps for testing hash indexes ###
-step create_hash { CREATE INDEX kill_prior_tuple_hash ON kill_prior_tuple USING hash (key); }
-
-
-# test killtuples with btree index
-permutation
- create_table fill_500 create_btree flush
- disable_seq disable_bitmap
- # show each access to non-deleted tuple increments heap_blks_*
- measure access flush result
- measure access flush result
- delete flush
- # first access after accessing deleted tuple still needs to access heap
- measure access flush result
- # but after kill_prior_tuple did its thing, we shouldn't access heap anymore
- measure access flush result
- drop_table
-
-# Same as first permutation, except testing gist
-permutation
- create_table fill_500 create_ext_btree_gist create_gist flush
- disable_seq disable_bitmap
- measure access flush result
- measure access flush result
- delete flush
- measure access flush result
- measure access flush result
- drop_table drop_ext_btree_gist
-
-# Test gist, but with fewer rows - shows that killitems doesn't work anymore!
-permutation
- create_table fill_10 create_ext_btree_gist create_gist flush
- disable_seq disable_bitmap
- measure access flush result
- measure access flush result
- delete flush
- measure access flush result
- measure access flush result
- drop_table drop_ext_btree_gist
-
-# Same as first permutation, except testing hash
-permutation
- create_table fill_500 create_hash flush
- disable_seq disable_bitmap
- measure access flush result
- measure access flush result
- delete flush
- measure access flush result
- measure access flush result
- drop_table
-
-# # Similar to first permutation, except that gin does not have killtuples support
-permutation
- create_table fill_500 create_ext_btree_gin create_gin flush
- disable_seq
- delete flush
- measure access flush result
- # will still fetch from heap
- measure access flush result
- drop_table drop_ext_btree_gin
diff --git a/src/test/modules/index/t/001_killtuples.pl b/src/test/modules/index/t/001_killtuples.pl
new file mode 100644
index 00000000000..eda138a0b32
--- /dev/null
+++ b/src/test/modules/index/t/001_killtuples.pl
@@ -0,0 +1,343 @@
+
+# Copyright (c) 2025, PostgreSQL Global Development Group
+
+# Basic testing of killtuples / kill_prior_tuples / all_dead testing
+# for various index AMs along with the WAL replay functions.
+#
+# This tests just enough to ensure that the kill* routines are actually
+# executed and does something approximately reasonable. It's *not* sufficient
+# testing for adding killitems support to a new AM!
+
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my ($primary, $psql_primary, $standby, $psql_standby) = start_instances();
+create_extensions();
+disable_seq();
+set_bitmap('false');
+
+test_btree_index();
+test_gist_index();
+test_gist_index_fewer_rows();
+test_hash_index();
+
+set_bitmap('true');
+test_gin_index();
+
+stop_instances();
+
+# test killtuples with btree index
+sub test_btree_index
+{
+ my $test_name = 'btree';
+ prepare_table();
+ create_btree();
+
+ insert_table_n_rows(500);
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 1);
+
+ delete_table();
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 0);
+
+ drop_table();
+ check_wal_is_replayed($test_name);
+}
+
+# Same as btree_index, except testing gist
+sub test_gist_index
+{
+ my $test_name = 'gist';
+ prepare_table();
+ create_btree_gist();
+
+ insert_table_n_rows(500);
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 1);
+
+ delete_table();
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 0);
+
+ # Re-insert to test redo delete case
+ insert_table_n_rows(250);
+
+ drop_table();
+ check_wal_is_replayed($test_name);
+}
+
+# Same as gist, but with fewer rows - shows that killitems doesn't work anymore!
+sub test_gist_index_fewer_rows
+{
+ my $test_name = 'gist_but_fewer_rows';
+ prepare_table();
+ create_btree_gist();
+
+ insert_table_n_rows(10);
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 1);
+
+ delete_table();
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 1);
+
+ drop_table();
+ check_wal_is_replayed($test_name);
+}
+
+# Same as btree_index, except testing hash
+sub test_hash_index
+{
+ my $test_name = 'hash';
+ prepare_table();
+ create_hash();
+
+ insert_table_n_rows(500);
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 1);
+
+ delete_table();
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 0);
+
+ drop_table();
+ check_wal_is_replayed($test_name);
+}
+
+# Similar to btree_index, except that gin does not have killtuples support
+sub test_gin_index
+{
+ my $test_name = 'gin';
+ prepare_table();
+ create_btree_gin();
+
+ insert_table_n_rows(500);
+
+ delete_table();
+
+ do_checks($test_name, 1);
+ do_checks($test_name, 1);
+
+ drop_table();
+ check_wal_is_replayed($test_name);
+}
+
+# Create btree index
+sub create_btree
+{
+ $psql_primary->query_safe(
+ q(
+CREATE INDEX kill_prior_tuple_btree ON kill_prior_tuple USING btree (key);
+));
+}
+
+# Create btree_gist extension and index
+sub create_btree_gist
+{
+ $psql_primary->query_safe(
+ q(
+CREATE INDEX kill_prior_tuple_gist ON kill_prior_tuple USING gist (key);
+));
+}
+
+# Create btree_gin extension and index
+sub create_btree_gin
+{
+ $psql_primary->query_safe(
+ q(
+CREATE INDEX kill_prior_tuple_gin ON kill_prior_tuple USING gin (key);
+ ));
+}
+
+# Create hash index
+sub create_hash
+{
+ $psql_primary->query_safe(
+ q(
+CREATE INDEX kill_prior_tuple_hash ON kill_prior_tuple USING hash (key);
+));
+}
+
+### General helper functions
+sub start_instances
+{
+ my $backup_name = 'backup';
+ my $primary;
+ my $psql_primary;
+ my $standby;
+ my $psql_standby;
+
+ $primary = PostgreSQL::Test::Cluster->new("primary");
+ $primary->init(allows_streaming => 1);
+ $primary->start;
+ $psql_primary = $primary->background_psql('postgres');
+ $primary->backup($backup_name);
+
+ $standby = PostgreSQL::Test::Cluster->new("standby");
+ $standby->init_from_backup($primary, $backup_name, has_streaming => 1);
+ $standby->start;
+ $psql_standby = $standby->background_psql('postgres');
+
+ return $primary, $psql_primary, $standby, $psql_standby;
+}
+
+sub create_extensions
+{
+ $psql_primary->query_safe(
+ q(
+CREATE EXTENSION btree_gist;
+CREATE EXTENSION btree_gin;
+));
+}
+
+sub prepare_table
+{
+ $psql_primary->query_safe(
+ q(
+CREATE TABLE counter(heap_accesses int);
+INSERT INTO counter(heap_accesses) VALUES (0);
+CREATE TABLE kill_prior_tuple(key int not null, cat text not null);
+));
+}
+
+sub insert_table_n_rows
+{
+ my $n_rows = shift;
+
+ $psql_primary->query_safe(
+ qq(
+INSERT INTO kill_prior_tuple(key, cat) SELECT g.i, 'a' FROM generate_series(1, $n_rows) g(i);
+));
+ flush_statistics();
+}
+
+sub stop_instances
+{
+ $psql_standby->quit;
+ $standby->stop;
+
+ $psql_primary->quit;
+ $primary->stop;
+}
+
+sub drop_table
+{
+ $psql_primary->query_safe(
+ q(
+DROP TABLE IF EXISTS kill_prior_tuple;
+DROP TABLE IF EXISTS counter;
+));
+}
+
+sub delete_table
+{
+ $psql_primary->query_safe(q(DELETE FROM kill_prior_tuple;));
+ flush_statistics();
+}
+
+sub disable_seq
+{
+ $psql_primary->query_safe(
+ q(
+SET enable_seqscan = false;
+SELECT pg_reload_conf();
+));
+}
+
+sub set_bitmap
+{
+ my $val = shift;
+
+ $psql_primary->query_safe(
+ qq(
+SET enable_bitmapscan = $val;
+SELECT pg_reload_conf();
+));
+}
+
+sub flush_statistics
+{
+ $psql_primary->query_safe(q(SELECT FROM pg_stat_force_next_flush();));
+}
+
+sub update_heap_accesses
+{
+ $psql_primary->query_safe(
+ q(
+UPDATE counter SET heap_accesses = (SELECT heap_blks_read + heap_blks_hit FROM pg_statio_all_tables WHERE relname = 'kill_prior_tuple');
+));
+}
+
+sub check_index_searches
+{
+ my $test_name = shift;
+ my $result;
+
+ $result = $psql_primary->query_safe(
+ q(
+EXPLAIN (ANALYZE, COSTS OFF, TIMING OFF, SUMMARY OFF, BUFFERS OFF) SELECT * FROM kill_prior_tuple WHERE key = 1;
+));
+
+ like(
+ $result,
+ qr/Index Searches: 1/,
+ "$test_name: Number of 'Index Searches'should be equal to 1");
+}
+
+sub check_new_heap_accesses
+{
+ my ($test_name, $new_heap_accesses) = @_;
+ my $result;
+
+ $result = $psql_primary->query_safe(
+ q(
+SELECT heap_blks_read + heap_blks_hit - counter.heap_accesses FROM counter, pg_statio_all_tables WHERE relname = 'kill_prior_tuple';
+));
+
+ cmp_ok($result, '==', $new_heap_accesses,
+ "$test_name: Number of 'new_heap_accesses' should be equal to $new_heap_accesses"
+ );
+}
+
+sub do_checks
+{
+ my ($test_name, $new_heap_accesses) = @_;
+
+ # First update number of heap accesses
+ update_heap_accesses();
+ # Then check number of index searches in the EXPLAIN output
+ check_index_searches($test_name);
+ # Then force flush statistics
+ flush_statistics();
+ # Then check number of *new* heap accesses, it should be equal to
+ # $new_heap_accesses
+ check_new_heap_accesses($test_name, $new_heap_accesses);
+}
+
+sub check_wal_is_replayed
+{
+ my $test_name = shift;
+
+ my $current_lsn =
+ $psql_primary->query_safe("SELECT pg_current_wal_lsn();");
+ my $caughtup_query =
+ "SELECT '$current_lsn'::pg_lsn <= pg_last_wal_replay_lsn()";
+
+ $standby->poll_query_until('postgres', $caughtup_query)
+ or die "$test_name: Timed out while waiting for standby to catch up";
+}
+
+done_testing();
--
2.51.0
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-11-17 23:31 Michael Paquier <michael@paquier.xyz>
parent: Nazir Bilal Yavuz <byavuz81@gmail.com>
0 siblings, 1 reply; 16+ messages in thread
From: Michael Paquier @ 2025-11-17 23:31 UTC (permalink / raw)
To: Nazir Bilal Yavuz <byavuz81@gmail.com>; +Cc: Andres Freund <andres@anarazel.de>; Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Mon, Nov 17, 2025 at 06:45:30PM +0300, Nazir Bilal Yavuz wrote:
> I have two patches to implement this: one moving the killtuples test
> under test/modules/index/, and another adding coverage for the
> recovery path.
>
> 0001 moves killtuples test under the test/modules/index/ without any
> implementation change.
>
> 0002 converts the killtuples isolation test to a TAP test to exercise
> the recovery path. This patch sets up a standby and additionally
> re-inserts into the table while testing the GiST index to ensure
> coverage of the gistRedoDeleteRecord() function.
Hmm. We should try to conclude over the benefit of TAP over
isolation, and merge both patches together if the consensus is towards
a TAP test.
The isolation test feels much cleaner to me in terms of clarity and
debugging output compared to the suggested TAP test as there are many
SQL sequences the test depends on. Other opinions?
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-11-17 23:40 Michael Paquier <michael@paquier.xyz>
parent: Michael Paquier <michael@paquier.xyz>
0 siblings, 1 reply; 16+ messages in thread
From: Michael Paquier @ 2025-11-17 23:40 UTC (permalink / raw)
To: Nazir Bilal Yavuz <byavuz81@gmail.com>; +Cc: Andres Freund <andres@anarazel.de>; Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Tue, Nov 18, 2025 at 08:31:41AM +0900, Michael Paquier wrote:
> Hmm. We should try to conclude over the benefit of TAP over
> isolation, and merge both patches together if the consensus is towards
> a TAP test.
>
> The isolation test feels much cleaner to me in terms of clarity and
> debugging output compared to the suggested TAP test as there are many
> SQL sequences the test depends on. Other opinions?
By the way, an extra argument in favor of an isolation test here: the
proposed TAP tests only wants to make sure that replay is able to
finish on a standby, we don't query it. We are already doing the same
in 027_stream_regress.pl for the main regression test suite, and we
could expand this TAP test or add a new one that grabs the isolation
test suite and runs it in a TAP test with a standby plugged. Hence we
would automatically test the replay path for all isolation tests added
to the tree, including this one related to kill tuples.
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-11-18 14:00 Andres Freund <andres@anarazel.de>
parent: Michael Paquier <michael@paquier.xyz>
0 siblings, 1 reply; 16+ messages in thread
From: Andres Freund @ 2025-11-18 14:00 UTC (permalink / raw)
To: Michael Paquier <michael@paquier.xyz>; +Cc: Nazir Bilal Yavuz <byavuz81@gmail.com>; Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
Hi,
On 2025-11-18 08:40:46 +0900, Michael Paquier wrote:
> On Tue, Nov 18, 2025 at 08:31:41AM +0900, Michael Paquier wrote:
> > Hmm. We should try to conclude over the benefit of TAP over
> > isolation, and merge both patches together if the consensus is towards
> > a TAP test.
> >
> > The isolation test feels much cleaner to me in terms of clarity and
> > debugging output compared to the suggested TAP test as there are many
> > SQL sequences the test depends on. Other opinions?
>
> By the way, an extra argument in favor of an isolation test here: the
> proposed TAP tests only wants to make sure that replay is able to
> finish on a standby, we don't query it.
I think we should eventually extend the test to run amcheck etc on both
primary and standby.
> We are already doing the same in 027_stream_regress.pl for the main
> regression test suite, and we could expand this TAP test or add a new one
> that grabs the isolation test suite and runs it in a TAP test with a standby
> plugged.
I don't think we should add new things to 027_stream_regress, it's already one
of the two slowest tests and, at least for me, often the test that takes the
longest to complete in a testrun.
Greetings,
Andres Freund
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-11-19 02:30 Michael Paquier <michael@paquier.xyz>
parent: Andres Freund <andres@anarazel.de>
0 siblings, 1 reply; 16+ messages in thread
From: Michael Paquier @ 2025-11-19 02:30 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: Nazir Bilal Yavuz <byavuz81@gmail.com>; Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Tue, Nov 18, 2025 at 09:00:39AM -0500, Andres Freund wrote:
> On 2025-11-18 08:40:46 +0900, Michael Paquier wrote:
>> By the way, an extra argument in favor of an isolation test here: the
>> proposed TAP tests only wants to make sure that replay is able to
>> finish on a standby, we don't query it.
>
> I think we should eventually extend the test to run amcheck etc on both
> primary and standby.
It's also something that I was wondering we could do after a main
regression test run for some subset of objects. Not sure that it has
to be part of one test.
>> We are already doing the same in 027_stream_regress.pl for the main
>> regression test suite, and we could expand this TAP test or add a new one
>> that grabs the isolation test suite and runs it in a TAP test with a standby
>> plugged.
>
> I don't think we should add new things to 027_stream_regress, it's already one
> of the two slowest tests and, at least for me, often the test that takes the
> longest to complete in a testrun.
Of course, agreed. That's the part about adding a completely new TAP
test that's able to run one or more isolation test suites, and this
isolation test would be part of it when running things across a
standby and a primary. You're the author of the original test, so
your opinion takes priority over mine, for sure.
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-11-24 10:35 Michael Paquier <michael@paquier.xyz>
parent: Michael Paquier <michael@paquier.xyz>
0 siblings, 1 reply; 16+ messages in thread
From: Michael Paquier @ 2025-11-24 10:35 UTC (permalink / raw)
To: Andres Freund <andres@anarazel.de>; +Cc: Nazir Bilal Yavuz <byavuz81@gmail.com>; Tom Lane <tgl@sss.pgh.pa.us>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
On Wed, Nov 19, 2025 at 11:30:30AM +0900, Michael Paquier wrote:
> It's also something that I was wondering we could do after a main
> regression test run for some subset of objects. Not sure that it has
> to be part of one test.
FWIW, I still getting annoyed by this one (am I the only one?), so I
have applied the patch moving the isolation test.
--
Michael
Attachments:
signature.asc (application/pgp-signature, 832B) download
^ permalink raw reply [nested|flat] 16+ messages in thread
* Re: make -C src/test/isolation failure in index-killtuples due to btree_gist
@ 2025-11-24 15:47 Tom Lane <tgl@sss.pgh.pa.us>
parent: Michael Paquier <michael@paquier.xyz>
0 siblings, 0 replies; 16+ messages in thread
From: Tom Lane @ 2025-11-24 15:47 UTC (permalink / raw)
To: Michael Paquier <michael@paquier.xyz>; +Cc: Andres Freund <andres@anarazel.de>; Nazir Bilal Yavuz <byavuz81@gmail.com>; Postgres hackers <pgsql-hackers@lists.postgresql.org>
Michael Paquier <michael@paquier.xyz> writes:
> FWIW, I still getting annoyed by this one (am I the only one?), so I
> have applied the patch moving the isolation test.
No, you weren't the only one --- it was in my way just yesterday
while trying to update expected results for 572c40ba9. I'd not paid
attention to this thread, but the committed solution seems fine.
regards, tom lane
^ permalink raw reply [nested|flat] 16+ messages in thread
end of thread, other threads:[~2025-11-24 15:47 UTC | newest]
Thread overview: 16+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2025-08-17 23:57 make -C src/test/isolation failure in index-killtuples due to btree_gist Michael Paquier <michael@paquier.xyz>
2025-08-18 13:58 ` Andres Freund <andres@anarazel.de>
2025-08-18 15:38 ` Tom Lane <tgl@sss.pgh.pa.us>
2025-08-18 23:15 ` Michael Paquier <michael@paquier.xyz>
2025-08-22 23:46 ` Andres Freund <andres@anarazel.de>
2025-10-28 07:55 ` Michael Paquier <michael@paquier.xyz>
2025-10-30 15:24 ` Andres Freund <andres@anarazel.de>
2025-10-31 00:41 ` Michael Paquier <michael@paquier.xyz>
2025-11-17 15:45 ` Nazir Bilal Yavuz <byavuz81@gmail.com>
2025-11-17 23:31 ` Michael Paquier <michael@paquier.xyz>
2025-11-17 23:40 ` Michael Paquier <michael@paquier.xyz>
2025-11-18 14:00 ` Andres Freund <andres@anarazel.de>
2025-11-19 02:30 ` Michael Paquier <michael@paquier.xyz>
2025-11-24 10:35 ` Michael Paquier <michael@paquier.xyz>
2025-11-24 15:47 ` Tom Lane <tgl@sss.pgh.pa.us>
2025-08-19 00:28 ` Michael Paquier <michael@paquier.xyz>
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox