From 53b2e00491a2ea3016b5cd66498e58883dde1785 Mon Sep 17 00:00:00 2001
From: Hiroshi Inoue <inoue@tpf.co.jp>
Date: Sat, 29 Sep 2001 07:57:06 +0000
Subject: [PATCH] Keep the contents of ItemPointerData not the pointers so that
 per tuple memory context doesn't discard them.

---
 src/backend/executor/nodeTidscan.c | 27 +++++++++++----------------
 src/include/nodes/execnodes.h      |  4 ++--
 2 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c
index 29ad660800c..404ed6a2153 100644
--- a/src/backend/executor/nodeTidscan.c
+++ b/src/backend/executor/nodeTidscan.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.18 2001/06/22 19:16:22 wieck Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/nodeTidscan.c,v 1.19 2001/09/29 07:57:06 inoue Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -29,11 +29,11 @@
 #include "access/heapam.h"
 #include "parser/parsetree.h"
 
-static int	TidListCreate(List *, ExprContext *, ItemPointer *);
+static int	TidListCreate(List *, ExprContext *, ItemPointerData []);
 static TupleTableSlot *TidNext(TidScan *node);
 
 static int
-TidListCreate(List *evalList, ExprContext *econtext, ItemPointer *tidList)
+TidListCreate(List *evalList, ExprContext *econtext, ItemPointerData tidList[])
 {
 	List	   *lst;
 	ItemPointer itemptr;
@@ -49,7 +49,7 @@ TidListCreate(List *evalList, ExprContext *econtext, ItemPointer *tidList)
 													  NULL));
 		if (!isNull && itemptr && ItemPointerIsValid(itemptr))
 		{
-			tidList[numTids] = itemptr;
+			tidList[numTids] = *itemptr;
 			numTids++;
 		}
 	}
@@ -80,8 +80,7 @@ TidNext(TidScan *node)
 
 	bool		bBackward;
 	int			tidNumber;
-	ItemPointer *tidList,
-				itemptr;
+	ItemPointerData* tidList;
 
 	/*
 	 * extract necessary information from tid scan node
@@ -146,14 +145,10 @@ TidNext(TidScan *node)
 	{
 		bool		slot_is_valid = false;
 
-		itemptr = tidList[tidstate->tss_TidPtr];
 		tuple->t_datamcxt = NULL;
 		tuple->t_data = NULL;
-		if (itemptr)
-		{
-			tuple->t_self = *(itemptr);
-			heap_fetch(heapRelation, snapshot, tuple, &buffer, NULL);
-		}
+		tuple->t_self = tidList[tidstate->tss_TidPtr];
+		heap_fetch(heapRelation, snapshot, tuple, &buffer, NULL);
 		if (tuple->t_data != NULL)
 		{
 			bool		prev_matches = false;
@@ -187,7 +182,7 @@ TidNext(TidScan *node)
 			for (prev_tid = 0; prev_tid < tidstate->tss_TidPtr;
 				 prev_tid++)
 			{
-				if (ItemPointerEquals(tidList[prev_tid], &tuple->t_self))
+				if (ItemPointerEquals(&tidList[prev_tid], &tuple->t_self))
 				{
 					prev_matches = true;
 					break;
@@ -254,7 +249,7 @@ ExecTidReScan(TidScan *node, ExprContext *exprCtxt, Plan *parent)
 {
 	EState	   *estate;
 	TidScanState *tidstate;
-	ItemPointer *tidList;
+	ItemPointerData* tidList;
 
 	tidstate = node->tidstate;
 	estate = node->scan.plan.state;
@@ -381,7 +376,7 @@ ExecInitTidScan(TidScan *node, EState *estate, Plan *parent)
 {
 	TidScanState *tidstate;
 	CommonScanState *scanstate;
-	ItemPointer *tidList;
+	ItemPointerData*	tidList;
 	int			numTids;
 	int			tidPtr;
 	List	   *rangeTable;
@@ -436,7 +431,7 @@ ExecInitTidScan(TidScan *node, EState *estate, Plan *parent)
 	/*
 	 * get the tid node information
 	 */
-	tidList = (ItemPointer *) palloc(length(node->tideval) * sizeof(ItemPointer));
+	tidList = (ItemPointerData *) palloc(length(node->tideval) * sizeof(ItemPointerData));
 	numTids = 0;
 	if (!node->needRescan)
 		numTids = TidListCreate(node->tideval, scanstate->cstate.cs_ExprContext, tidList);
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index 4e1bc683d5b..ef880505c18 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: execnodes.h,v 1.62 2001/07/16 05:07:00 tgl Exp $
+ * $Id: execnodes.h,v 1.63 2001/09/29 07:57:04 inoue Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -461,7 +461,7 @@ typedef struct TidScanState
 	int			tss_NumTids;
 	int			tss_TidPtr;
 	int			tss_MarkTidPtr;
-	ItemPointer *tss_TidList;
+	ItemPointerData*	tss_TidList;
 	HeapTupleData tss_htup;
 } TidScanState;
 
-- 
GitLab