mirror of
https://github.com/postgres/postgres.git
synced 2025-06-06 00:02:36 -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
|
* 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 "access/heapam.h"
|
||||||
#include "parser/parsetree.h"
|
#include "parser/parsetree.h"
|
||||||
|
|
||||||
static int TidListCreate(List *, ExprContext *, ItemPointer *);
|
static int TidListCreate(List *, ExprContext *, ItemPointerData []);
|
||||||
static TupleTableSlot *TidNext(TidScan *node);
|
static TupleTableSlot *TidNext(TidScan *node);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
TidListCreate(List *evalList, ExprContext *econtext, ItemPointer *tidList)
|
TidListCreate(List *evalList, ExprContext *econtext, ItemPointerData tidList[])
|
||||||
{
|
{
|
||||||
List *lst;
|
List *lst;
|
||||||
ItemPointer itemptr;
|
ItemPointer itemptr;
|
||||||
@ -49,7 +49,7 @@ TidListCreate(List *evalList, ExprContext *econtext, ItemPointer *tidList)
|
|||||||
NULL));
|
NULL));
|
||||||
if (!isNull && itemptr && ItemPointerIsValid(itemptr))
|
if (!isNull && itemptr && ItemPointerIsValid(itemptr))
|
||||||
{
|
{
|
||||||
tidList[numTids] = itemptr;
|
tidList[numTids] = *itemptr;
|
||||||
numTids++;
|
numTids++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -80,8 +80,7 @@ TidNext(TidScan *node)
|
|||||||
|
|
||||||
bool bBackward;
|
bool bBackward;
|
||||||
int tidNumber;
|
int tidNumber;
|
||||||
ItemPointer *tidList,
|
ItemPointerData* tidList;
|
||||||
itemptr;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* extract necessary information from tid scan node
|
* extract necessary information from tid scan node
|
||||||
@ -146,14 +145,10 @@ TidNext(TidScan *node)
|
|||||||
{
|
{
|
||||||
bool slot_is_valid = false;
|
bool slot_is_valid = false;
|
||||||
|
|
||||||
itemptr = tidList[tidstate->tss_TidPtr];
|
|
||||||
tuple->t_datamcxt = NULL;
|
tuple->t_datamcxt = NULL;
|
||||||
tuple->t_data = NULL;
|
tuple->t_data = NULL;
|
||||||
if (itemptr)
|
tuple->t_self = tidList[tidstate->tss_TidPtr];
|
||||||
{
|
|
||||||
tuple->t_self = *(itemptr);
|
|
||||||
heap_fetch(heapRelation, snapshot, tuple, &buffer, NULL);
|
heap_fetch(heapRelation, snapshot, tuple, &buffer, NULL);
|
||||||
}
|
|
||||||
if (tuple->t_data != NULL)
|
if (tuple->t_data != NULL)
|
||||||
{
|
{
|
||||||
bool prev_matches = false;
|
bool prev_matches = false;
|
||||||
@ -187,7 +182,7 @@ TidNext(TidScan *node)
|
|||||||
for (prev_tid = 0; prev_tid < tidstate->tss_TidPtr;
|
for (prev_tid = 0; prev_tid < tidstate->tss_TidPtr;
|
||||||
prev_tid++)
|
prev_tid++)
|
||||||
{
|
{
|
||||||
if (ItemPointerEquals(tidList[prev_tid], &tuple->t_self))
|
if (ItemPointerEquals(&tidList[prev_tid], &tuple->t_self))
|
||||||
{
|
{
|
||||||
prev_matches = true;
|
prev_matches = true;
|
||||||
break;
|
break;
|
||||||
@ -254,7 +249,7 @@ ExecTidReScan(TidScan *node, ExprContext *exprCtxt, Plan *parent)
|
|||||||
{
|
{
|
||||||
EState *estate;
|
EState *estate;
|
||||||
TidScanState *tidstate;
|
TidScanState *tidstate;
|
||||||
ItemPointer *tidList;
|
ItemPointerData* tidList;
|
||||||
|
|
||||||
tidstate = node->tidstate;
|
tidstate = node->tidstate;
|
||||||
estate = node->scan.plan.state;
|
estate = node->scan.plan.state;
|
||||||
@ -381,7 +376,7 @@ ExecInitTidScan(TidScan *node, EState *estate, Plan *parent)
|
|||||||
{
|
{
|
||||||
TidScanState *tidstate;
|
TidScanState *tidstate;
|
||||||
CommonScanState *scanstate;
|
CommonScanState *scanstate;
|
||||||
ItemPointer *tidList;
|
ItemPointerData* tidList;
|
||||||
int numTids;
|
int numTids;
|
||||||
int tidPtr;
|
int tidPtr;
|
||||||
List *rangeTable;
|
List *rangeTable;
|
||||||
@ -436,7 +431,7 @@ ExecInitTidScan(TidScan *node, EState *estate, Plan *parent)
|
|||||||
/*
|
/*
|
||||||
* get the tid node information
|
* get the tid node information
|
||||||
*/
|
*/
|
||||||
tidList = (ItemPointer *) palloc(length(node->tideval) * sizeof(ItemPointer));
|
tidList = (ItemPointerData *) palloc(length(node->tideval) * sizeof(ItemPointerData));
|
||||||
numTids = 0;
|
numTids = 0;
|
||||||
if (!node->needRescan)
|
if (!node->needRescan)
|
||||||
numTids = TidListCreate(node->tideval, scanstate->cstate.cs_ExprContext, tidList);
|
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) 1996-2001, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* 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_NumTids;
|
||||||
int tss_TidPtr;
|
int tss_TidPtr;
|
||||||
int tss_MarkTidPtr;
|
int tss_MarkTidPtr;
|
||||||
ItemPointer *tss_TidList;
|
ItemPointerData* tss_TidList;
|
||||||
HeapTupleData tss_htup;
|
HeapTupleData tss_htup;
|
||||||
} TidScanState;
|
} TidScanState;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user