From ae48e7bb715cb4a303f995b6cfbf6d315ce9097b Mon Sep 17 00:00:00 2001
From: Aleksander Alekseev <aleksander@timescale.com>
Date: Mon, 28 Nov 2022 12:26:50 +0300
Subject: [PATCH v1] Check 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 an overhead in release builds.

Aleksander Alekseev, reported by Sven Klemm
---
 src/backend/access/index/indexam.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c
index fe80b8b0ba..dc303995e5 100644
--- a/src/backend/access/index/indexam.c
+++ b/src/backend/access/index/indexam.c
@@ -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),
-- 
2.38.1

