1
0
mirror of https://github.com/postgres/postgres.git synced 2026-10-23 13:29:09 +03:00

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
This commit is contained in:
Peter Geoghegan
2026-08-17 17:31:05 -04:00
parent 794473ec22
commit 945f0581c1
5 changed files with 49 additions and 10 deletions

View File

@@ -364,7 +364,6 @@ restart:
MarkBufferDirty(buffer);
PageIndexMultiDelete(page, todelete, ntodelete);
GistMarkTuplesDeleted(page);
if (RelationNeedsWAL(rel))
{

View File

@@ -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 */
@@ -208,7 +206,6 @@ gistRedoDeleteRecord(XLogReaderState *record)
PageIndexMultiDelete(page, toDelete, xldata->ntodelete);
GistClearPageHasGarbage(page);
GistMarkTuplesDeleted(page);
PageSetLSN(page, lsn);
MarkBufferDirty(buffer);

View File

@@ -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)

View File

@@ -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;
-- Force an index build using buffering.
create index gist_tbl_box_index_forcing_buffering on gist_tbl using gist (p)
with (buffering=on, fillfactor=50);

View File

@@ -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;
-- Force an index build using buffering.
create index gist_tbl_box_index_forcing_buffering on gist_tbl using gist (p)
with (buffering=on, fillfactor=50);