diff options
| author | Peter Geoghegan | 2026-08-17 21:31:03 +0000 |
|---|---|---|
| committer | Peter Geoghegan | 2026-08-17 21:31:03 +0000 |
| commit | 9476134a38ac0df0caaa9546447a00852efbe604 (patch) | |
| tree | 6f36c841060504eaf1b6eeb81aa2e264ab461a53 | |
| parent | 1035eab491bf86db9bbb754854ba3d02ac80f4c4 (diff) | |
GiST: Deprecate F_TUPLES_DELETED opaque area flag.
This flag hasn't been useful since the removal of old-style VACUUM FULL,
so remove it now (this includes removing vestigial code that
unnecessarily set the flag).
Also add test coverage of gistprunepage(). Had that test case been
available before now, the issue fixed by this commit would have been
detected by wal_consistency_checking buildfarm animals.
Author: Peter Geoghegan <pg@bowt.ie>
Reviewed-by: Michael Paquiër <michael@paquier.xyz>
Discussion: https://postgr.es/m/CAH2-WznbTsQCrjmd=eSawfPqcxCjSFUkk6Qzd3z+gpNte5i03Q@mail.gmail.com
Backpatch-through: 14
| -rw-r--r-- | src/backend/access/gist/gistvacuum.c | 1 | ||||
| -rw-r--r-- | src/backend/access/gist/gistxlog.c | 3 | ||||
| -rw-r--r-- | src/include/access/gist.h | 8 | ||||
| -rw-r--r-- | src/test/regress/expected/gist.out | 26 | ||||
| -rw-r--r-- | src/test/regress/sql/gist.sql | 21 |
5 files changed, 49 insertions, 10 deletions
diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index f190decdff2..9695cadad28 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -364,7 +364,6 @@ restart: MarkBufferDirty(buffer); PageIndexMultiDelete(page, todelete, ntodelete); - GistMarkTuplesDeleted(page); if (RelationNeedsWAL(rel)) { diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c index c46132e6b7d..5088347c54b 100644 --- a/src/backend/access/gist/gistxlog.c +++ b/src/backend/access/gist/gistxlog.c @@ -117,8 +117,6 @@ gistRedoPageUpdateRecord(XLogReaderState *record) data += sizeof(OffsetNumber) * xldata->ntodelete; PageIndexMultiDelete(page, todelete, xldata->ntodelete); - if (GistPageIsLeaf(page)) - GistMarkTuplesDeleted(page); } /* Add new tuples if any */ @@ -212,7 +210,6 @@ gistRedoDeleteRecord(XLogReaderState *record) } GistClearPageHasGarbage(page); - GistMarkTuplesDeleted(page); PageSetLSN(page, lsn); MarkBufferDirty(buffer); diff --git a/src/include/access/gist.h b/src/include/access/gist.h index a3337627b8f..155fae7b495 100644 --- a/src/include/access/gist.h +++ b/src/include/access/gist.h @@ -45,8 +45,8 @@ */ #define F_LEAF (1 << 0) /* leaf page */ #define F_DELETED (1 << 1) /* the page has been deleted */ -#define F_TUPLES_DELETED (1 << 2) /* some tuples on the page were - * deleted */ +#define F_TUPLES_DELETED (1 << 2) /* old-style VACUUM FULL flag + * (deprecated) */ #define F_FOLLOW_RIGHT (1 << 3) /* page to the right has no downlink */ #define F_HAS_GARBAGE (1 << 4) /* some tuples on the page are dead, * but not deleted yet */ @@ -171,10 +171,6 @@ typedef struct GISTENTRY #define GistPageIsDeleted(page) ( GistPageGetOpaque(page)->flags & F_DELETED) -#define GistTuplesDeleted(page) ( GistPageGetOpaque(page)->flags & F_TUPLES_DELETED) -#define GistMarkTuplesDeleted(page) ( GistPageGetOpaque(page)->flags |= F_TUPLES_DELETED) -#define GistClearTuplesDeleted(page) ( GistPageGetOpaque(page)->flags &= ~F_TUPLES_DELETED) - #define GistPageHasGarbage(page) ( GistPageGetOpaque(page)->flags & F_HAS_GARBAGE) #define GistMarkPageHasGarbage(page) ( GistPageGetOpaque(page)->flags |= F_HAS_GARBAGE) #define GistClearPageHasGarbage(page) ( GistPageGetOpaque(page)->flags &= ~F_HAS_GARBAGE) diff --git a/src/test/regress/expected/gist.out b/src/test/regress/expected/gist.out index 57b0815c7cb..d2b0f753955 100644 --- a/src/test/regress/expected/gist.out +++ b/src/test/regress/expected/gist.out @@ -423,6 +423,32 @@ select lower(r) = repeat('7', 200)::numeric as lower_ok, (1 row) drop table gist_ios_tupdesc; +-- test deletion of LP_DEAD-marked index tuples +create table gist_prune_tbl (k int, p point); +create index gist_prune_tbl_p_index on gist_prune_tbl using gist (p); +begin; +insert into gist_prune_tbl select i, point(1, i) from generate_series(1, 600) i; +rollback; +set enable_bitmapscan = off; +set enable_indexonlyscan = off; +set enable_seqscan = off; +select count(*) from gist_prune_tbl where p <@ box(point(0,0), point(2,1000)); + count +------- + 0 +(1 row) + +insert into gist_prune_tbl select i, point(1, i) from generate_series(1, 600) i; +select count(*) from gist_prune_tbl where p <@ box(point(0,0), point(2,1000)); + count +------- + 600 +(1 row) + +reset enable_bitmapscan; +reset enable_indexonlyscan; +reset enable_seqscan; +drop table gist_prune_tbl; -- Clean up reset enable_seqscan; reset enable_bitmapscan; diff --git a/src/test/regress/sql/gist.sql b/src/test/regress/sql/gist.sql index 83add8ffba3..795f2adcd1e 100644 --- a/src/test/regress/sql/gist.sql +++ b/src/test/regress/sql/gist.sql @@ -198,6 +198,27 @@ select lower(r) = repeat('7', 200)::numeric as lower_ok, drop table gist_ios_tupdesc; +-- test deletion of LP_DEAD-marked index tuples +create table gist_prune_tbl (k int, p point); +create index gist_prune_tbl_p_index on gist_prune_tbl using gist (p); + +begin; +insert into gist_prune_tbl select i, point(1, i) from generate_series(1, 600) i; +rollback; + +set enable_bitmapscan = off; +set enable_indexonlyscan = off; +set enable_seqscan = off; + +select count(*) from gist_prune_tbl where p <@ box(point(0,0), point(2,1000)); +insert into gist_prune_tbl select i, point(1, i) from generate_series(1, 600) i; +select count(*) from gist_prune_tbl where p <@ box(point(0,0), point(2,1000)); + +reset enable_bitmapscan; +reset enable_indexonlyscan; +reset enable_seqscan; +drop table gist_prune_tbl; + -- Clean up reset enable_seqscan; reset enable_bitmapscan; |
