mirror of
https://github.com/postgres/postgres.git
synced 2025-05-31 00:01:57 -04:00
Keep the contents of ItemPointerData not the pointers so that
per tuple memory context doesn't discard them.
This commit is contained in:
parent
793bcc67b2
commit
53b2e00491
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user