Check the snapshot argument of index_beginscan and family

Passing a NULL snapshot (InvalidSnapshot) is going to work but only as long
as the index can't find any matching rows.  This can be confusing for
the extension authors, so add an explicit check for this argument.  The check
is implemented with Assert() in order to avoid overhead in release builds.

Reported-by: Sven Klemm
Discussion: https://postgr.es/m/CAJ7c6TPxitD4vbKyP-mpmC1XwyHdPPqvjLzm%2BVpB88h8LGgneQ%40mail.gmail.com
Author: Aleksander Alekseev
Reviewed-by: Pavel Borisov
This commit is contained in:
Alexander Korotkov 2022-12-06 03:29:18 +03:00
parent a7885c9bb2
commit 941aa6a626

View File

@ -209,6 +209,8 @@ index_beginscan(Relation heapRelation,
{
IndexScanDesc scan;
Assert(snapshot != InvalidSnapshot);
scan = index_beginscan_internal(indexRelation, nkeys, norderbys, snapshot, NULL, false);
/*
@ -237,6 +239,8 @@ index_beginscan_bitmap(Relation indexRelation,
{
IndexScanDesc scan;
Assert(snapshot != InvalidSnapshot);
scan = index_beginscan_internal(indexRelation, nkeys, 0, snapshot, NULL, false);
/*
@ -403,6 +407,8 @@ index_parallelscan_estimate(Relation indexRelation, Snapshot snapshot)
{
Size nbytes;
Assert(snapshot != InvalidSnapshot);
RELATION_CHECKS;
nbytes = offsetof(ParallelIndexScanDescData, ps_snapshot_data);
@ -437,6 +443,8 @@ index_parallelscan_initialize(Relation heapRelation, Relation indexRelation,
{
Size offset;
Assert(snapshot != InvalidSnapshot);
RELATION_CHECKS;
offset = add_size(offsetof(ParallelIndexScanDescData, ps_snapshot_data),