From 689659764faa749b27930f956aa8d1c88b73842d Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 18 Dec 2002 00:14:24 +0000
Subject: [PATCH] Prevent core dump when ExecMarkPos is called before any
 tuples have been retrieved.  This cannot happen in ordinary execution, but it
 can happen under EvalPlanQual().

---
 src/backend/executor/nodeIndexscan.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c
index 7b96723844b..a7cfce15b4c 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.75 2002/12/15 16:17:46 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.76 2002/12/18 00:14:24 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -470,10 +470,13 @@ ExecIndexMarkPos(IndexScanState *node)
 	int			indexPtr;
 
 	indexPtr = node->iss_MarkIndexPtr = node->iss_IndexPtr;
-	indexScanDescs = node->iss_ScanDescs;
-	scanDesc = indexScanDescs[indexPtr];
+	if (indexPtr >= 0 && indexPtr < node->iss_NumIndices)
+	{
+		indexScanDescs = node->iss_ScanDescs;
+		scanDesc = indexScanDescs[indexPtr];
 
-	index_markpos(scanDesc);
+		index_markpos(scanDesc);
+	}
 }
 
 /* ----------------------------------------------------------------
@@ -482,8 +485,6 @@ ExecIndexMarkPos(IndexScanState *node)
  * old comments
  *		Restores scan position by restoring the current index.
  *		Returns nothing.
- *
- *		XXX Assumes previously marked scan position belongs to current index
  * ----------------------------------------------------------------
  */
 void
@@ -494,10 +495,13 @@ ExecIndexRestrPos(IndexScanState *node)
 	int			indexPtr;
 
 	indexPtr = node->iss_IndexPtr = node->iss_MarkIndexPtr;
-	indexScanDescs = node->iss_ScanDescs;
-	scanDesc = indexScanDescs[indexPtr];
+	if (indexPtr >= 0 && indexPtr < node->iss_NumIndices)
+	{
+		indexScanDescs = node->iss_ScanDescs;
+		scanDesc = indexScanDescs[indexPtr];
 
-	index_restrpos(scanDesc);
+		index_restrpos(scanDesc);
+	}
 }
 
 /* ----------------------------------------------------------------
-- 
GitLab