mirror of
https://github.com/postgres/postgres.git
synced 2025-08-28 18:48:04 +03:00
heap_fetch requires buffer pointer, must be released; heap_getnext
no longer returns buffer pointer, can be gotten from scan; descriptor; bootstrap can create multi-key indexes; pg_procname index now is multi-key index; oidint2, oidint4, oidname are gone (must be removed from regression tests); use System Cache rather than sequential scan in many places; heap_modifytuple no longer takes buffer parameter; remove unused buffer parameter in a few other functions; oid8 is not index-able; remove some use of single-character variable names; cleanup Buffer variables usage and scan descriptor looping; cleaned up allocation and freeing of tuples; 18k lines of diff;
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.38 1998/06/15 19:27:44 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.39 1998/08/19 02:00:53 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* The old interface functions have been converted to macros
|
||||
@@ -736,13 +736,6 @@ heap_copytuple(HeapTuple tuple)
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
return (NULL);
|
||||
|
||||
/* XXX For now, just prevent an undetectable executor related error */
|
||||
if (tuple->t_len > MAXTUPLEN)
|
||||
{
|
||||
elog(ERROR, "palloctup: cannot handle length %d tuples",
|
||||
tuple->t_len);
|
||||
}
|
||||
|
||||
newTuple = (HeapTuple) palloc(tuple->t_len);
|
||||
memmove((char *) newTuple, (char *) tuple, (int) tuple->t_len);
|
||||
return (newTuple);
|
||||
@@ -863,11 +856,11 @@ heap_formtuple(TupleDesc tupleDescriptor,
|
||||
* heap_modifytuple
|
||||
*
|
||||
* forms a new tuple from an old tuple and a set of replacement values.
|
||||
* returns a new palloc'ed tuple.
|
||||
* ----------------
|
||||
*/
|
||||
HeapTuple
|
||||
heap_modifytuple(HeapTuple tuple,
|
||||
Buffer buffer,
|
||||
Relation relation,
|
||||
Datum replValue[],
|
||||
char replNull[],
|
||||
@@ -879,7 +872,6 @@ heap_modifytuple(HeapTuple tuple,
|
||||
char *nulls;
|
||||
bool isNull;
|
||||
HeapTuple newTuple;
|
||||
int madecopy;
|
||||
uint8 infomask;
|
||||
|
||||
/* ----------------
|
||||
@@ -887,26 +879,11 @@ heap_modifytuple(HeapTuple tuple,
|
||||
* ----------------
|
||||
*/
|
||||
Assert(HeapTupleIsValid(tuple));
|
||||
Assert(BufferIsValid(buffer) || RelationIsValid(relation));
|
||||
Assert(HeapTupleIsValid(tuple));
|
||||
Assert(RelationIsValid(relation));
|
||||
Assert(PointerIsValid(replValue));
|
||||
Assert(PointerIsValid(replNull));
|
||||
Assert(PointerIsValid(repl));
|
||||
|
||||
/* ----------------
|
||||
* if we're pointing to a disk page, then first
|
||||
* make a copy of our tuple so that all the attributes
|
||||
* are available. XXX this is inefficient -cim
|
||||
* ----------------
|
||||
*/
|
||||
madecopy = 0;
|
||||
if (BufferIsValid(buffer) == true)
|
||||
{
|
||||
relation = (Relation) BufferGetRelation(buffer);
|
||||
tuple = heap_copytuple(tuple);
|
||||
madecopy = 1;
|
||||
}
|
||||
|
||||
numberOfAttributes = RelationGetRelationTupleForm(relation)->relnatts;
|
||||
|
||||
/* ----------------
|
||||
@@ -933,10 +910,7 @@ heap_modifytuple(HeapTuple tuple,
|
||||
|
||||
}
|
||||
else if (repl[attoff] != 'r')
|
||||
{
|
||||
elog(ERROR, "heap_modifytuple: repl is \\%3d", repl[attoff]);
|
||||
|
||||
}
|
||||
else
|
||||
{ /* == 'r' */
|
||||
value[attoff] = replValue[attoff];
|
||||
@@ -961,18 +935,8 @@ heap_modifytuple(HeapTuple tuple,
|
||||
(char *) &tuple->t_oid,
|
||||
((char *) &tuple->t_hoff - (char *) &tuple->t_oid)); /* XXX */
|
||||
newTuple->t_infomask = infomask;
|
||||
newTuple->t_natts = numberOfAttributes; /* fix t_natts just in
|
||||
* case */
|
||||
|
||||
/* ----------------
|
||||
* if we made a copy of the tuple, then free it.
|
||||
* ----------------
|
||||
*/
|
||||
if (madecopy)
|
||||
pfree(tuple);
|
||||
|
||||
return
|
||||
newTuple;
|
||||
newTuple->t_natts = numberOfAttributes; /* fix t_natts just in case */
|
||||
return newTuple;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/common/printtup.c,v 1.31 1998/07/26 04:30:16 scrappy Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/common/printtup.c,v 1.32 1998/08/19 02:00:54 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -46,8 +46,7 @@ typtoout(Oid type)
|
||||
0, 0, 0);
|
||||
|
||||
if (HeapTupleIsValid(typeTuple))
|
||||
return ((Oid)
|
||||
((TypeTupleForm) GETSTRUCT(typeTuple))->typoutput);
|
||||
return ((Oid) ((TypeTupleForm) GETSTRUCT(typeTuple))->typoutput);
|
||||
|
||||
elog(ERROR, "typtoout: Cache lookup of type %d failed", type);
|
||||
return (InvalidOid);
|
||||
@@ -63,8 +62,7 @@ gettypelem(Oid type)
|
||||
0, 0, 0);
|
||||
|
||||
if (HeapTupleIsValid(typeTuple))
|
||||
return ((Oid)
|
||||
((TypeTupleForm) GETSTRUCT(typeTuple))->typelem);
|
||||
return ((Oid) ((TypeTupleForm) GETSTRUCT(typeTuple))->typelem);
|
||||
|
||||
elog(ERROR, "typtoout: Cache lookup of type %d failed", type);
|
||||
return (InvalidOid);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.41 1998/07/12 21:29:13 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.42 1998/08/19 02:00:56 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* some of the executor utility code such as "ExecTypeFromTL" should be
|
||||
@@ -327,7 +327,8 @@ TupleDescInitEntry(TupleDesc desc,
|
||||
* -cim 6/14/90
|
||||
* ----------------
|
||||
*/
|
||||
tuple = SearchSysCacheTuple(TYPOID, ObjectIdGetDatum(typeid),
|
||||
tuple = SearchSysCacheTuple(TYPOID,
|
||||
ObjectIdGetDatum(typeid),
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
{
|
||||
|
@@ -87,7 +87,6 @@ gistbuild(Relation heap,
|
||||
PredInfo *predInfo)
|
||||
{
|
||||
HeapScanDesc scan;
|
||||
Buffer buffer;
|
||||
AttrNumber i;
|
||||
HeapTuple htup;
|
||||
IndexTuple itup;
|
||||
@@ -112,14 +111,15 @@ gistbuild(Relation heap,
|
||||
*oldPred;
|
||||
GISTSTATE giststate;
|
||||
GISTENTRY tmpcentry;
|
||||
Buffer buffer = InvalidBuffer;
|
||||
bool *compvec;
|
||||
|
||||
/* GiSTs only know how to do stupid locking now */
|
||||
RelationSetLockForWrite(index);
|
||||
|
||||
setheapoverride(TRUE); /* so we can see the new pg_index tuple */
|
||||
setheapoverride(true); /* so we can see the new pg_index tuple */
|
||||
initGISTstate(&giststate, index);
|
||||
setheapoverride(FALSE);
|
||||
setheapoverride(false);
|
||||
|
||||
pred = predInfo->pred;
|
||||
oldPred = predInfo->oldPred;
|
||||
@@ -170,15 +170,13 @@ gistbuild(Relation heap,
|
||||
econtext = NULL;
|
||||
}
|
||||
#endif /* OMIT_PARTIAL_INDEX */
|
||||
scan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
htup = heap_getnext(scan, 0, &buffer);
|
||||
|
||||
/* int the tuples as we insert them */
|
||||
nh = ni = 0;
|
||||
|
||||
for (; HeapTupleIsValid(htup); htup = heap_getnext(scan, 0, &buffer))
|
||||
{
|
||||
scan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
|
||||
while (HeapTupleIsValid(htup = heap_getnext(scan, 0)))
|
||||
{
|
||||
nh++;
|
||||
|
||||
/*
|
||||
@@ -240,8 +238,7 @@ gistbuild(Relation heap,
|
||||
attoff,
|
||||
attnum,
|
||||
finfo,
|
||||
&attnull,
|
||||
buffer);
|
||||
&attnull);
|
||||
nulls[attoff] = (attnull ? 'n' : ' ');
|
||||
}
|
||||
|
||||
@@ -302,8 +299,8 @@ gistbuild(Relation heap,
|
||||
* flushed. We close them to guarantee that they will be.
|
||||
*/
|
||||
|
||||
hrelid = heap->rd_id;
|
||||
irelid = index->rd_id;
|
||||
hrelid = RelationGetRelid(heap);
|
||||
irelid = RelationGetRelid(index);
|
||||
heap_close(heap);
|
||||
index_close(index);
|
||||
|
||||
@@ -1165,11 +1162,13 @@ initGISTstate(GISTSTATE *giststate, Relation index)
|
||||
fmgr_info(equal_proc, &giststate->equalFn);
|
||||
|
||||
/* see if key type is different from type of attribute being indexed */
|
||||
htup = SearchSysCacheTuple(INDEXRELID, ObjectIdGetDatum(index->rd_id),
|
||||
htup = SearchSysCacheTuple(INDEXRELID,
|
||||
ObjectIdGetDatum(RelationGetRelid(index)),
|
||||
0, 0, 0);
|
||||
itupform = (IndexTupleForm) GETSTRUCT(htup);
|
||||
if (!HeapTupleIsValid(htup))
|
||||
elog(ERROR, "initGISTstate: index %d not found", index->rd_id);
|
||||
elog(ERROR, "initGISTstate: index %d not found",
|
||||
RelationGetRelid(index));
|
||||
giststate->haskeytype = itupform->indhaskeytype;
|
||||
if (giststate->haskeytype)
|
||||
{
|
||||
|
@@ -284,12 +284,12 @@ gistdropscan(IndexScanDesc s)
|
||||
}
|
||||
|
||||
void
|
||||
gistadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum)
|
||||
gistadjscans(Relation rel, int op, BlockNumber blkno, OffsetNumber offnum)
|
||||
{
|
||||
GISTScanList l;
|
||||
Oid relid;
|
||||
|
||||
relid = r->rd_id;
|
||||
relid = RelationGetRelid(rel);
|
||||
for (l = GISTScans; l != (GISTScanList) NULL; l = l->gsl_next)
|
||||
{
|
||||
if (l->gsl_scan->relation->rd_id == relid)
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.19 1998/07/27 19:37:35 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.20 1998/08/19 02:01:00 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* This file contains only the public interface routines.
|
||||
@@ -53,7 +53,6 @@ hashbuild(Relation heap,
|
||||
PredInfo *predInfo)
|
||||
{
|
||||
HeapScanDesc hscan;
|
||||
Buffer buffer;
|
||||
HeapTuple htup;
|
||||
IndexTuple itup;
|
||||
TupleDesc htupdesc,
|
||||
@@ -65,6 +64,7 @@ hashbuild(Relation heap,
|
||||
nitups;
|
||||
int i;
|
||||
HashItem hitem;
|
||||
Buffer buffer = InvalidBuffer;
|
||||
|
||||
#ifndef OMIT_PARTIAL_INDEX
|
||||
ExprContext *econtext;
|
||||
@@ -120,14 +120,13 @@ hashbuild(Relation heap,
|
||||
}
|
||||
#endif /* OMIT_PARTIAL_INDEX */
|
||||
|
||||
/* start a heap scan */
|
||||
hscan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
htup = heap_getnext(hscan, 0, &buffer);
|
||||
|
||||
/* build the index */
|
||||
nhtups = nitups = 0;
|
||||
|
||||
for (; HeapTupleIsValid(htup); htup = heap_getnext(hscan, 0, &buffer))
|
||||
/* start a heap scan */
|
||||
hscan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
|
||||
while (HeapTupleIsValid(htup = heap_getnext(hscan, 0)))
|
||||
{
|
||||
|
||||
nhtups++;
|
||||
@@ -193,8 +192,7 @@ hashbuild(Relation heap,
|
||||
attoff,
|
||||
attnum,
|
||||
finfo,
|
||||
&attnull,
|
||||
buffer);
|
||||
&attnull);
|
||||
nulls[attoff] = (attnull ? 'n' : ' ');
|
||||
}
|
||||
|
||||
@@ -248,8 +246,8 @@ hashbuild(Relation heap,
|
||||
*/
|
||||
if (IsNormalProcessingMode())
|
||||
{
|
||||
hrelid = heap->rd_id;
|
||||
irelid = index->rd_id;
|
||||
hrelid = RelationGetRelid(heap);
|
||||
irelid = RelationGetRelid(index);
|
||||
heap_close(heap);
|
||||
index_close(index);
|
||||
UpdateStats(hrelid, nhtups, true);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.9 1998/04/26 04:05:08 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hashfunc.c,v 1.10 1998/08/19 02:01:02 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* These functions are stored in pg_amproc. For each operator class
|
||||
@@ -133,6 +133,18 @@ hashoid(Oid key)
|
||||
return ((uint32) ~key);
|
||||
}
|
||||
|
||||
uint32
|
||||
hashoid8(Oid key[])
|
||||
{
|
||||
int i;
|
||||
uint32 result = 0;
|
||||
|
||||
for (i=0; i < 8; i++)
|
||||
result = result ^ (~(uint32)key[i]);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
#define PRIME1 37
|
||||
#define PRIME2 1048583
|
||||
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hashscan.c,v 1.14 1998/06/15 19:27:50 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hashscan.c,v 1.15 1998/08/19 02:01:04 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Because we can be doing an index scan on a relation while we
|
||||
@@ -90,7 +90,7 @@ _hash_adjscans(Relation rel, ItemPointer tid)
|
||||
HashScanList l;
|
||||
Oid relid;
|
||||
|
||||
relid = rel->rd_id;
|
||||
relid = RelationGetRelid(rel);
|
||||
for (l = HashScans; l != (HashScanList) NULL; l = l->hashsl_next)
|
||||
{
|
||||
if (relid == l->hashsl_scan->relation->rd_id)
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.31 1998/07/27 19:37:36 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.32 1998/08/19 02:01:05 momjian Exp $
|
||||
*
|
||||
*
|
||||
* INTERFACE ROUTINES
|
||||
@@ -104,11 +104,11 @@ static bool ImmediateInvalidation;
|
||||
*/
|
||||
|
||||
/* ----------------
|
||||
* initsdesc - sdesc code common to heap_beginscan and heap_rescan
|
||||
* initscan - scan code common to heap_beginscan and heap_rescan
|
||||
* ----------------
|
||||
*/
|
||||
static void
|
||||
initsdesc(HeapScanDesc sdesc,
|
||||
initscan(HeapScanDesc scan,
|
||||
Relation relation,
|
||||
int atend,
|
||||
unsigned nkeys,
|
||||
@@ -120,8 +120,8 @@ initsdesc(HeapScanDesc sdesc,
|
||||
* relation is empty
|
||||
* ----------------
|
||||
*/
|
||||
sdesc->rs_ntup = sdesc->rs_ctup = sdesc->rs_ptup = NULL;
|
||||
sdesc->rs_nbuf = sdesc->rs_cbuf = sdesc->rs_pbuf = InvalidBuffer;
|
||||
scan->rs_ntup = scan->rs_ctup = scan->rs_ptup = NULL;
|
||||
scan->rs_nbuf = scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer;
|
||||
}
|
||||
else if (atend)
|
||||
{
|
||||
@@ -129,10 +129,10 @@ initsdesc(HeapScanDesc sdesc,
|
||||
* reverse scan
|
||||
* ----------------
|
||||
*/
|
||||
sdesc->rs_ntup = sdesc->rs_ctup = NULL;
|
||||
sdesc->rs_nbuf = sdesc->rs_cbuf = InvalidBuffer;
|
||||
sdesc->rs_ptup = NULL;
|
||||
sdesc->rs_pbuf = UnknownBuffer;
|
||||
scan->rs_ntup = scan->rs_ctup = NULL;
|
||||
scan->rs_nbuf = scan->rs_cbuf = InvalidBuffer;
|
||||
scan->rs_ptup = NULL;
|
||||
scan->rs_pbuf = UnknownBuffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -140,35 +140,35 @@ initsdesc(HeapScanDesc sdesc,
|
||||
* forward scan
|
||||
* ----------------
|
||||
*/
|
||||
sdesc->rs_ctup = sdesc->rs_ptup = NULL;
|
||||
sdesc->rs_cbuf = sdesc->rs_pbuf = InvalidBuffer;
|
||||
sdesc->rs_ntup = NULL;
|
||||
sdesc->rs_nbuf = UnknownBuffer;
|
||||
scan->rs_ctup = scan->rs_ptup = NULL;
|
||||
scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer;
|
||||
scan->rs_ntup = NULL;
|
||||
scan->rs_nbuf = UnknownBuffer;
|
||||
} /* invalid too */
|
||||
|
||||
/* we don't have a marked position... */
|
||||
ItemPointerSetInvalid(&(sdesc->rs_mptid));
|
||||
ItemPointerSetInvalid(&(sdesc->rs_mctid));
|
||||
ItemPointerSetInvalid(&(sdesc->rs_mntid));
|
||||
ItemPointerSetInvalid(&(sdesc->rs_mcd));
|
||||
ItemPointerSetInvalid(&(scan->rs_mptid));
|
||||
ItemPointerSetInvalid(&(scan->rs_mctid));
|
||||
ItemPointerSetInvalid(&(scan->rs_mntid));
|
||||
ItemPointerSetInvalid(&(scan->rs_mcd));
|
||||
|
||||
/* ----------------
|
||||
* copy the scan key, if appropriate
|
||||
* ----------------
|
||||
*/
|
||||
if (key != NULL)
|
||||
memmove(sdesc->rs_key, key, nkeys * sizeof(ScanKeyData));
|
||||
memmove(scan->rs_key, key, nkeys * sizeof(ScanKeyData));
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* unpinsdesc - code common to heap_rescan and heap_endscan
|
||||
* unpinscan - code common to heap_rescan and heap_endscan
|
||||
* ----------------
|
||||
*/
|
||||
static void
|
||||
unpinsdesc(HeapScanDesc sdesc)
|
||||
unpinscan(HeapScanDesc scan)
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_pbuf))
|
||||
ReleaseBuffer(sdesc->rs_pbuf);
|
||||
if (BufferIsValid(scan->rs_pbuf))
|
||||
ReleaseBuffer(scan->rs_pbuf);
|
||||
|
||||
/* ------------------------------------
|
||||
* Scan will pin buffer one for each non-NULL tuple pointer
|
||||
@@ -176,11 +176,11 @@ unpinsdesc(HeapScanDesc sdesc)
|
||||
* times.
|
||||
* ------------------------------------
|
||||
*/
|
||||
if (BufferIsValid(sdesc->rs_cbuf))
|
||||
ReleaseBuffer(sdesc->rs_cbuf);
|
||||
if (BufferIsValid(scan->rs_cbuf))
|
||||
ReleaseBuffer(scan->rs_cbuf);
|
||||
|
||||
if (BufferIsValid(sdesc->rs_nbuf))
|
||||
ReleaseBuffer(sdesc->rs_nbuf);
|
||||
if (BufferIsValid(scan->rs_nbuf))
|
||||
ReleaseBuffer(scan->rs_nbuf);
|
||||
}
|
||||
|
||||
/* ------------------------------------------
|
||||
@@ -202,13 +202,18 @@ nextpage(int page, int dir)
|
||||
*
|
||||
* routine used by heap_getnext() which does most of the
|
||||
* real work in scanning tuples.
|
||||
*
|
||||
* The scan routines handle their own buffer lock/unlocking, so
|
||||
* there is no reason to request the buffer number unless
|
||||
* to want to perform some other operation with the result,
|
||||
* like pass it to another function.
|
||||
* ----------------
|
||||
*/
|
||||
static HeapTuple
|
||||
heapgettup(Relation relation,
|
||||
ItemPointer tid,
|
||||
int dir,
|
||||
Buffer *b,
|
||||
Buffer *buf,
|
||||
Snapshot snapshot,
|
||||
int nkeys,
|
||||
ScanKey key)
|
||||
@@ -248,7 +253,7 @@ heapgettup(Relation relation,
|
||||
elog(DEBUG, "heapgettup(%s, tid=0x%x, dir=%d, ...)",
|
||||
RelationGetRelationName(relation), tid, dir);
|
||||
}
|
||||
elog(DEBUG, "heapgettup(..., b=0x%x, nkeys=%d, key=0x%x", b, nkeys, key);
|
||||
elog(DEBUG, "heapgettup(..., b=0x%x, nkeys=%d, key=0x%x", buf, nkeys, key);
|
||||
|
||||
elog(DEBUG, "heapgettup: relation(%c)=`%s', %p",
|
||||
relation->rd_rel->relkind, &relation->rd_rel->relname,
|
||||
@@ -278,19 +283,19 @@ heapgettup(Relation relation,
|
||||
/* assume it is a valid TID XXX */
|
||||
if (ItemPointerIsValid(tid) == false)
|
||||
{
|
||||
*b = InvalidBuffer;
|
||||
*buf= InvalidBuffer;
|
||||
return (NULL);
|
||||
}
|
||||
*b = RelationGetBufferWithBuffer(relation,
|
||||
*buf = RelationGetBufferWithBuffer(relation,
|
||||
ItemPointerGetBlockNumber(tid),
|
||||
*b);
|
||||
*buf);
|
||||
|
||||
#ifndef NO_BUFFERISVALID
|
||||
if (!BufferIsValid(*b))
|
||||
if (!BufferIsValid(*buf))
|
||||
elog(ERROR, "heapgettup: failed ReadBuffer");
|
||||
#endif
|
||||
|
||||
dp = (Page) BufferGetPage(*b);
|
||||
dp = (Page) BufferGetPage(*buf);
|
||||
lineoff = ItemPointerGetOffsetNumber(tid);
|
||||
lpp = PageGetItemId(dp, lineoff);
|
||||
|
||||
@@ -316,17 +321,17 @@ heapgettup(Relation relation,
|
||||
}
|
||||
if (page < 0)
|
||||
{
|
||||
*b = InvalidBuffer;
|
||||
*buf = InvalidBuffer;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
*b = RelationGetBufferWithBuffer(relation, page, *b);
|
||||
*buf = RelationGetBufferWithBuffer(relation, page, *buf);
|
||||
#ifndef NO_BUFFERISVALID
|
||||
if (!BufferIsValid(*b))
|
||||
if (!BufferIsValid(*buf))
|
||||
elog(ERROR, "heapgettup: failed ReadBuffer");
|
||||
#endif
|
||||
|
||||
dp = (Page) BufferGetPage(*b);
|
||||
dp = (Page) BufferGetPage(*buf);
|
||||
lines = PageGetMaxOffsetNumber(dp);
|
||||
if (tid == NULL)
|
||||
{
|
||||
@@ -360,18 +365,18 @@ heapgettup(Relation relation,
|
||||
|
||||
if (page >= pages)
|
||||
{
|
||||
*b = InvalidBuffer;
|
||||
*buf = InvalidBuffer;
|
||||
return (NULL);
|
||||
}
|
||||
/* page and lineoff now reference the physically next tid */
|
||||
|
||||
*b = RelationGetBufferWithBuffer(relation, page, *b);
|
||||
*buf = RelationGetBufferWithBuffer(relation, page, *buf);
|
||||
#ifndef NO_BUFFERISVALID
|
||||
if (!BufferIsValid(*b))
|
||||
if (!BufferIsValid(*buf))
|
||||
elog(ERROR, "heapgettup: failed ReadBuffer");
|
||||
#endif
|
||||
|
||||
dp = (Page) BufferGetPage(*b);
|
||||
dp = (Page) BufferGetPage(*buf);
|
||||
lines = PageGetMaxOffsetNumber(dp);
|
||||
}
|
||||
|
||||
@@ -401,7 +406,7 @@ heapgettup(Relation relation,
|
||||
* if current tuple qualifies, return it.
|
||||
* ----------------
|
||||
*/
|
||||
HeapTupleSatisfies(lpp, relation, *b, (PageHeader) dp,
|
||||
HeapTupleSatisfies(lpp, relation, *buf, (PageHeader) dp,
|
||||
snapshot, nkeys, key, rtup);
|
||||
if (rtup != NULL)
|
||||
{
|
||||
@@ -409,7 +414,6 @@ heapgettup(Relation relation,
|
||||
|
||||
if (ItemPointerGetBlockNumber(iptr) != page)
|
||||
{
|
||||
|
||||
/*
|
||||
* set block id to the correct page number --- this is
|
||||
* a hack to support the virtual fragment concept
|
||||
@@ -448,19 +452,19 @@ heapgettup(Relation relation,
|
||||
*/
|
||||
if (page < 0 || page >= pages)
|
||||
{
|
||||
if (BufferIsValid(*b))
|
||||
ReleaseBuffer(*b);
|
||||
*b = InvalidBuffer;
|
||||
if (BufferIsValid(*buf))
|
||||
ReleaseBuffer(*buf);
|
||||
*buf = InvalidBuffer;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
*b = ReleaseAndReadBuffer(*b, relation, page);
|
||||
*buf = ReleaseAndReadBuffer(*buf, relation, page);
|
||||
|
||||
#ifndef NO_BUFFERISVALID
|
||||
if (!BufferIsValid(*b))
|
||||
if (!BufferIsValid(*buf))
|
||||
elog(ERROR, "heapgettup: failed ReadBuffer");
|
||||
#endif
|
||||
dp = (Page) BufferGetPage(*b);
|
||||
dp = (Page) BufferGetPage(*buf);
|
||||
lines = lineoff = PageGetMaxOffsetNumber((Page) dp);
|
||||
linesleft = lines - 1;
|
||||
if (dir < 0)
|
||||
@@ -584,7 +588,7 @@ heap_beginscan(Relation relation,
|
||||
unsigned nkeys,
|
||||
ScanKey key)
|
||||
{
|
||||
HeapScanDesc sdesc;
|
||||
HeapScanDesc scan;
|
||||
|
||||
/* ----------------
|
||||
* increment access statistics
|
||||
@@ -620,29 +624,29 @@ heap_beginscan(Relation relation,
|
||||
* allocate and initialize scan descriptor
|
||||
* ----------------
|
||||
*/
|
||||
sdesc = (HeapScanDesc) palloc(sizeof(HeapScanDescData));
|
||||
scan = (HeapScanDesc) palloc(sizeof(HeapScanDescData));
|
||||
|
||||
relation->rd_nblocks = smgrnblocks(DEFAULT_SMGR, relation);
|
||||
sdesc->rs_rd = relation;
|
||||
scan->rs_rd = relation;
|
||||
|
||||
if (nkeys)
|
||||
|
||||
/*
|
||||
* we do this here instead of in initsdesc() because heap_rescan
|
||||
* also calls initsdesc() and we don't want to allocate memory
|
||||
* we do this here instead of in initscan() because heap_rescan
|
||||
* also calls initscan() and we don't want to allocate memory
|
||||
* again
|
||||
*/
|
||||
sdesc->rs_key = (ScanKey) palloc(sizeof(ScanKeyData) * nkeys);
|
||||
scan->rs_key = (ScanKey) palloc(sizeof(ScanKeyData) * nkeys);
|
||||
else
|
||||
sdesc->rs_key = NULL;
|
||||
scan->rs_key = NULL;
|
||||
|
||||
initsdesc(sdesc, relation, atend, nkeys, key);
|
||||
initscan(scan, relation, atend, nkeys, key);
|
||||
|
||||
sdesc->rs_atend = atend;
|
||||
sdesc->rs_snapshot = snapshot;
|
||||
sdesc->rs_nkeys = (short) nkeys;
|
||||
scan->rs_atend = atend;
|
||||
scan->rs_snapshot = snapshot;
|
||||
scan->rs_nkeys = (short) nkeys;
|
||||
|
||||
return (sdesc);
|
||||
return (scan);
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
@@ -650,7 +654,7 @@ heap_beginscan(Relation relation,
|
||||
* ----------------
|
||||
*/
|
||||
void
|
||||
heap_rescan(HeapScanDesc sdesc,
|
||||
heap_rescan(HeapScanDesc scan,
|
||||
bool scanFromEnd,
|
||||
ScanKey key)
|
||||
{
|
||||
@@ -667,14 +671,14 @@ heap_rescan(HeapScanDesc sdesc,
|
||||
* unpin scan buffers
|
||||
* ----------------
|
||||
*/
|
||||
unpinsdesc(sdesc);
|
||||
unpinscan(scan);
|
||||
|
||||
/* ----------------
|
||||
* reinitialize scan descriptor
|
||||
* ----------------
|
||||
*/
|
||||
initsdesc(sdesc, sdesc->rs_rd, scanFromEnd, sdesc->rs_nkeys, key);
|
||||
sdesc->rs_atend = (bool) scanFromEnd;
|
||||
initscan(scan, scan->rs_rd, scanFromEnd, scan->rs_nkeys, key);
|
||||
scan->rs_atend = (bool) scanFromEnd;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
@@ -685,7 +689,7 @@ heap_rescan(HeapScanDesc sdesc,
|
||||
* ----------------
|
||||
*/
|
||||
void
|
||||
heap_endscan(HeapScanDesc sdesc)
|
||||
heap_endscan(HeapScanDesc scan)
|
||||
{
|
||||
/* ----------------
|
||||
* increment access statistics
|
||||
@@ -700,36 +704,38 @@ heap_endscan(HeapScanDesc sdesc)
|
||||
* unpin scan buffers
|
||||
* ----------------
|
||||
*/
|
||||
unpinsdesc(sdesc);
|
||||
unpinscan(scan);
|
||||
|
||||
/* ----------------
|
||||
* decrement relation reference count and free scan descriptor storage
|
||||
* ----------------
|
||||
*/
|
||||
RelationDecrementReferenceCount(sdesc->rs_rd);
|
||||
RelationDecrementReferenceCount(scan->rs_rd);
|
||||
|
||||
/* ----------------
|
||||
* Non 2-phase read locks on catalog relations
|
||||
* ----------------
|
||||
*/
|
||||
if (IsSystemRelationName(RelationGetRelationName(sdesc->rs_rd)->data))
|
||||
if (IsSystemRelationName(RelationGetRelationName(scan->rs_rd)->data))
|
||||
|
||||
RelationUnsetLockForRead(sdesc->rs_rd);
|
||||
RelationUnsetLockForRead(scan->rs_rd);
|
||||
|
||||
pfree(sdesc); /* XXX */
|
||||
pfree(scan); /* XXX */
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* heap_getnext - retrieve next tuple in scan
|
||||
*
|
||||
* Fix to work with index relations.
|
||||
* We don't return the buffer anymore, but you can get it from the
|
||||
* returned HeapTuple.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
#ifdef HEAPDEBUGALL
|
||||
#define HEAPDEBUG_1 \
|
||||
elog(DEBUG, "heap_getnext([%s,nkeys=%d],backw=%d,0x%x) called", \
|
||||
sdesc->rs_rd->rd_rel->relname.data, sdesc->rs_nkeys, backw, b)
|
||||
elog(DEBUG, "heap_getnext([%s,nkeys=%d],backw=%d) called", \
|
||||
scan->rs_rd->rd_rel->relname.data, scan->rs_nkeys, backw)
|
||||
|
||||
#define HEAPDEBUG_2 \
|
||||
elog(DEBUG, "heap_getnext called with backw (no tracing yet)")
|
||||
@@ -760,12 +766,9 @@ elog(DEBUG, "heap_getnext([%s,nkeys=%d],backw=%d,0x%x) called", \
|
||||
|
||||
|
||||
HeapTuple
|
||||
heap_getnext(HeapScanDesc scandesc,
|
||||
int backw,
|
||||
Buffer *b)
|
||||
heap_getnext(HeapScanDesc scandesc, int backw)
|
||||
{
|
||||
HeapScanDesc sdesc = scandesc;
|
||||
Buffer localb;
|
||||
HeapScanDesc scan = scandesc;
|
||||
|
||||
/* ----------------
|
||||
* increment access statistics
|
||||
@@ -780,16 +783,13 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
* argument checks
|
||||
* ----------------
|
||||
*/
|
||||
if (sdesc == NULL)
|
||||
if (scan == NULL)
|
||||
elog(ERROR, "heap_getnext: NULL relscan");
|
||||
|
||||
/* ----------------
|
||||
* initialize return buffer to InvalidBuffer
|
||||
* ----------------
|
||||
*/
|
||||
if (!PointerIsValid(b))
|
||||
b = &localb;
|
||||
(*b) = InvalidBuffer;
|
||||
|
||||
HEAPDEBUG_1; /* heap_getnext( info ) */
|
||||
|
||||
@@ -801,11 +801,11 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
*/
|
||||
HEAPDEBUG_2; /* heap_getnext called with backw */
|
||||
|
||||
if (sdesc->rs_ptup == sdesc->rs_ctup &&
|
||||
BufferIsInvalid(sdesc->rs_pbuf))
|
||||
if (scan->rs_ptup == scan->rs_ctup &&
|
||||
BufferIsInvalid(scan->rs_pbuf))
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_nbuf))
|
||||
ReleaseBuffer(sdesc->rs_nbuf);
|
||||
if (BufferIsValid(scan->rs_nbuf))
|
||||
ReleaseBuffer(scan->rs_nbuf);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@@ -813,37 +813,37 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
* Copy the "current" tuple/buffer to "next". Pin/unpin the
|
||||
* buffers accordingly
|
||||
*/
|
||||
if (sdesc->rs_nbuf != sdesc->rs_cbuf)
|
||||
if (scan->rs_nbuf != scan->rs_cbuf)
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_nbuf))
|
||||
ReleaseBuffer(sdesc->rs_nbuf);
|
||||
if (BufferIsValid(sdesc->rs_cbuf))
|
||||
IncrBufferRefCount(sdesc->rs_cbuf);
|
||||
if (BufferIsValid(scan->rs_nbuf))
|
||||
ReleaseBuffer(scan->rs_nbuf);
|
||||
if (BufferIsValid(scan->rs_cbuf))
|
||||
IncrBufferRefCount(scan->rs_cbuf);
|
||||
}
|
||||
sdesc->rs_ntup = sdesc->rs_ctup;
|
||||
sdesc->rs_nbuf = sdesc->rs_cbuf;
|
||||
scan->rs_ntup = scan->rs_ctup;
|
||||
scan->rs_nbuf = scan->rs_cbuf;
|
||||
|
||||
if (sdesc->rs_ptup != NULL)
|
||||
if (scan->rs_ptup != NULL)
|
||||
{
|
||||
if (sdesc->rs_cbuf != sdesc->rs_pbuf)
|
||||
if (scan->rs_cbuf != scan->rs_pbuf)
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_cbuf))
|
||||
ReleaseBuffer(sdesc->rs_cbuf);
|
||||
if (BufferIsValid(sdesc->rs_pbuf))
|
||||
IncrBufferRefCount(sdesc->rs_pbuf);
|
||||
if (BufferIsValid(scan->rs_cbuf))
|
||||
ReleaseBuffer(scan->rs_cbuf);
|
||||
if (BufferIsValid(scan->rs_pbuf))
|
||||
IncrBufferRefCount(scan->rs_pbuf);
|
||||
}
|
||||
sdesc->rs_ctup = sdesc->rs_ptup;
|
||||
sdesc->rs_cbuf = sdesc->rs_pbuf;
|
||||
scan->rs_ctup = scan->rs_ptup;
|
||||
scan->rs_cbuf = scan->rs_pbuf;
|
||||
}
|
||||
else
|
||||
{ /* NONTUP */
|
||||
ItemPointer iptr;
|
||||
|
||||
iptr = (sdesc->rs_ctup != NULL) ?
|
||||
&(sdesc->rs_ctup->t_ctid) : (ItemPointer) NULL;
|
||||
iptr = (scan->rs_ctup != NULL) ?
|
||||
&(scan->rs_ctup->t_ctid) : (ItemPointer) NULL;
|
||||
|
||||
/*
|
||||
* Don't release sdesc->rs_cbuf at this point, because
|
||||
* Don't release scan->rs_cbuf at this point, because
|
||||
* heapgettup doesn't increase PrivateRefCount if it is
|
||||
* already set. On a backward scan, both rs_ctup and rs_ntup
|
||||
* usually point to the same buffer page, so
|
||||
@@ -851,33 +851,33 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
* instance ctup is stored in a TupleTableSlot). - 01/09/94
|
||||
*/
|
||||
|
||||
sdesc->rs_ctup = (HeapTuple)
|
||||
heapgettup(sdesc->rs_rd,
|
||||
scan->rs_ctup = (HeapTuple)
|
||||
heapgettup(scan->rs_rd,
|
||||
iptr,
|
||||
-1,
|
||||
&(sdesc->rs_cbuf),
|
||||
sdesc->rs_snapshot,
|
||||
sdesc->rs_nkeys,
|
||||
sdesc->rs_key);
|
||||
&(scan->rs_cbuf),
|
||||
scan->rs_snapshot,
|
||||
scan->rs_nkeys,
|
||||
scan->rs_key);
|
||||
}
|
||||
|
||||
if (sdesc->rs_ctup == NULL && !BufferIsValid(sdesc->rs_cbuf))
|
||||
if (scan->rs_ctup == NULL && !BufferIsValid(scan->rs_cbuf))
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_pbuf))
|
||||
ReleaseBuffer(sdesc->rs_pbuf);
|
||||
sdesc->rs_ptup = NULL;
|
||||
sdesc->rs_pbuf = InvalidBuffer;
|
||||
if (BufferIsValid(sdesc->rs_nbuf))
|
||||
ReleaseBuffer(sdesc->rs_nbuf);
|
||||
sdesc->rs_ntup = NULL;
|
||||
sdesc->rs_nbuf = InvalidBuffer;
|
||||
if (BufferIsValid(scan->rs_pbuf))
|
||||
ReleaseBuffer(scan->rs_pbuf);
|
||||
scan->rs_ptup = NULL;
|
||||
scan->rs_pbuf = InvalidBuffer;
|
||||
if (BufferIsValid(scan->rs_nbuf))
|
||||
ReleaseBuffer(scan->rs_nbuf);
|
||||
scan->rs_ntup = NULL;
|
||||
scan->rs_nbuf = InvalidBuffer;
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (BufferIsValid(sdesc->rs_pbuf))
|
||||
ReleaseBuffer(sdesc->rs_pbuf);
|
||||
sdesc->rs_ptup = NULL;
|
||||
sdesc->rs_pbuf = UnknownBuffer;
|
||||
if (BufferIsValid(scan->rs_pbuf))
|
||||
ReleaseBuffer(scan->rs_pbuf);
|
||||
scan->rs_ptup = NULL;
|
||||
scan->rs_pbuf = UnknownBuffer;
|
||||
|
||||
}
|
||||
else
|
||||
@@ -886,11 +886,11 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
* handle forward scan
|
||||
* ----------------
|
||||
*/
|
||||
if (sdesc->rs_ctup == sdesc->rs_ntup &&
|
||||
BufferIsInvalid(sdesc->rs_nbuf))
|
||||
if (scan->rs_ctup == scan->rs_ntup &&
|
||||
BufferIsInvalid(scan->rs_nbuf))
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_pbuf))
|
||||
ReleaseBuffer(sdesc->rs_pbuf);
|
||||
if (BufferIsValid(scan->rs_pbuf))
|
||||
ReleaseBuffer(scan->rs_pbuf);
|
||||
HEAPDEBUG_3; /* heap_getnext returns NULL at end */
|
||||
return (NULL);
|
||||
}
|
||||
@@ -899,38 +899,38 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
* Copy the "current" tuple/buffer to "previous". Pin/unpin the
|
||||
* buffers accordingly
|
||||
*/
|
||||
if (sdesc->rs_pbuf != sdesc->rs_cbuf)
|
||||
if (scan->rs_pbuf != scan->rs_cbuf)
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_pbuf))
|
||||
ReleaseBuffer(sdesc->rs_pbuf);
|
||||
if (BufferIsValid(sdesc->rs_cbuf))
|
||||
IncrBufferRefCount(sdesc->rs_cbuf);
|
||||
if (BufferIsValid(scan->rs_pbuf))
|
||||
ReleaseBuffer(scan->rs_pbuf);
|
||||
if (BufferIsValid(scan->rs_cbuf))
|
||||
IncrBufferRefCount(scan->rs_cbuf);
|
||||
}
|
||||
sdesc->rs_ptup = sdesc->rs_ctup;
|
||||
sdesc->rs_pbuf = sdesc->rs_cbuf;
|
||||
scan->rs_ptup = scan->rs_ctup;
|
||||
scan->rs_pbuf = scan->rs_cbuf;
|
||||
|
||||
if (sdesc->rs_ntup != NULL)
|
||||
if (scan->rs_ntup != NULL)
|
||||
{
|
||||
if (sdesc->rs_cbuf != sdesc->rs_nbuf)
|
||||
if (scan->rs_cbuf != scan->rs_nbuf)
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_cbuf))
|
||||
ReleaseBuffer(sdesc->rs_cbuf);
|
||||
if (BufferIsValid(sdesc->rs_nbuf))
|
||||
IncrBufferRefCount(sdesc->rs_nbuf);
|
||||
if (BufferIsValid(scan->rs_cbuf))
|
||||
ReleaseBuffer(scan->rs_cbuf);
|
||||
if (BufferIsValid(scan->rs_nbuf))
|
||||
IncrBufferRefCount(scan->rs_nbuf);
|
||||
}
|
||||
sdesc->rs_ctup = sdesc->rs_ntup;
|
||||
sdesc->rs_cbuf = sdesc->rs_nbuf;
|
||||
scan->rs_ctup = scan->rs_ntup;
|
||||
scan->rs_cbuf = scan->rs_nbuf;
|
||||
HEAPDEBUG_5; /* heap_getnext next tuple was cached */
|
||||
}
|
||||
else
|
||||
{ /* NONTUP */
|
||||
ItemPointer iptr;
|
||||
|
||||
iptr = (sdesc->rs_ctup != NULL) ?
|
||||
&sdesc->rs_ctup->t_ctid : (ItemPointer) NULL;
|
||||
iptr = (scan->rs_ctup != NULL) ?
|
||||
&scan->rs_ctup->t_ctid : (ItemPointer) NULL;
|
||||
|
||||
/*
|
||||
* Don't release sdesc->rs_cbuf at this point, because
|
||||
* Don't release scan->rs_cbuf at this point, because
|
||||
* heapgettup doesn't increase PrivateRefCount if it is
|
||||
* already set. On a forward scan, both rs_ctup and rs_ptup
|
||||
* usually point to the same buffer page, so
|
||||
@@ -938,34 +938,34 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
* instance ctup is stored in a TupleTableSlot). - 01/09/93
|
||||
*/
|
||||
|
||||
sdesc->rs_ctup = (HeapTuple)
|
||||
heapgettup(sdesc->rs_rd,
|
||||
scan->rs_ctup = (HeapTuple)
|
||||
heapgettup(scan->rs_rd,
|
||||
iptr,
|
||||
1,
|
||||
&sdesc->rs_cbuf,
|
||||
sdesc->rs_snapshot,
|
||||
sdesc->rs_nkeys,
|
||||
sdesc->rs_key);
|
||||
&scan->rs_cbuf,
|
||||
scan->rs_snapshot,
|
||||
scan->rs_nkeys,
|
||||
scan->rs_key);
|
||||
}
|
||||
|
||||
if (sdesc->rs_ctup == NULL && !BufferIsValid(sdesc->rs_cbuf))
|
||||
if (scan->rs_ctup == NULL && !BufferIsValid(scan->rs_cbuf))
|
||||
{
|
||||
if (BufferIsValid(sdesc->rs_nbuf))
|
||||
ReleaseBuffer(sdesc->rs_nbuf);
|
||||
sdesc->rs_ntup = NULL;
|
||||
sdesc->rs_nbuf = InvalidBuffer;
|
||||
if (BufferIsValid(sdesc->rs_pbuf))
|
||||
ReleaseBuffer(sdesc->rs_pbuf);
|
||||
sdesc->rs_ptup = NULL;
|
||||
sdesc->rs_pbuf = InvalidBuffer;
|
||||
if (BufferIsValid(scan->rs_nbuf))
|
||||
ReleaseBuffer(scan->rs_nbuf);
|
||||
scan->rs_ntup = NULL;
|
||||
scan->rs_nbuf = InvalidBuffer;
|
||||
if (BufferIsValid(scan->rs_pbuf))
|
||||
ReleaseBuffer(scan->rs_pbuf);
|
||||
scan->rs_ptup = NULL;
|
||||
scan->rs_pbuf = InvalidBuffer;
|
||||
HEAPDEBUG_6; /* heap_getnext returning EOS */
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (BufferIsValid(sdesc->rs_nbuf))
|
||||
ReleaseBuffer(sdesc->rs_nbuf);
|
||||
sdesc->rs_ntup = NULL;
|
||||
sdesc->rs_nbuf = UnknownBuffer;
|
||||
if (BufferIsValid(scan->rs_nbuf))
|
||||
ReleaseBuffer(scan->rs_nbuf);
|
||||
scan->rs_ntup = NULL;
|
||||
scan->rs_nbuf = UnknownBuffer;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
@@ -973,24 +973,31 @@ heap_getnext(HeapScanDesc scandesc,
|
||||
* point to the proper return buffer and return the tuple.
|
||||
* ----------------
|
||||
*/
|
||||
(*b) = sdesc->rs_cbuf;
|
||||
|
||||
HEAPDEBUG_7; /* heap_getnext returning tuple */
|
||||
|
||||
return (sdesc->rs_ctup);
|
||||
return scan->rs_ctup;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* heap_fetch - retrive tuple with tid
|
||||
*
|
||||
* Currently ignores LP_IVALID during processing!
|
||||
*
|
||||
* Because this is not part of a scan, there is no way to
|
||||
* automatically lock/unlock the shared buffers.
|
||||
* For this reason, we require that the user retrieve the buffer
|
||||
* value, and they are required to BuffferRelease() it when they
|
||||
* are done. If they want to make a copy of it before releasing it,
|
||||
* they can call heap_copytyple().
|
||||
|
||||
* ----------------
|
||||
*/
|
||||
HeapTuple
|
||||
heap_fetch(Relation relation,
|
||||
Snapshot snapshot,
|
||||
ItemPointer tid,
|
||||
Buffer *b)
|
||||
Buffer *userbuf)
|
||||
{
|
||||
ItemId lp;
|
||||
Buffer buffer;
|
||||
@@ -998,6 +1005,8 @@ heap_fetch(Relation relation,
|
||||
HeapTuple tuple;
|
||||
OffsetNumber offnum;
|
||||
|
||||
AssertMacro(PointerIsValid(userbuf)); /* see comments above */
|
||||
|
||||
/* ----------------
|
||||
* increment access statistics
|
||||
* ----------------
|
||||
@@ -1061,17 +1070,12 @@ heap_fetch(Relation relation,
|
||||
/* ----------------
|
||||
* all checks passed, now either return a copy of the tuple
|
||||
* or pin the buffer page and return a pointer, depending on
|
||||
* whether caller gave us a valid b.
|
||||
* whether caller gave us a valid buf.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
if (PointerIsValid(b))
|
||||
*b = buffer;
|
||||
else
|
||||
{
|
||||
tuple = heap_copytuple(tuple);
|
||||
ReleaseBuffer(buffer);
|
||||
}
|
||||
*userbuf = buffer; /* user is required to ReleaseBuffer() this */
|
||||
|
||||
return (tuple);
|
||||
}
|
||||
|
||||
@@ -1161,7 +1165,7 @@ heap_delete(Relation relation, ItemPointer tid)
|
||||
ItemId lp;
|
||||
HeapTuple tp;
|
||||
PageHeader dp;
|
||||
Buffer b;
|
||||
Buffer buf;
|
||||
|
||||
/* ----------------
|
||||
* increment access statistics
|
||||
@@ -1182,16 +1186,16 @@ heap_delete(Relation relation, ItemPointer tid)
|
||||
*/
|
||||
RelationSetLockForWrite(relation);
|
||||
|
||||
b = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
|
||||
buf = ReadBuffer(relation, ItemPointerGetBlockNumber(tid));
|
||||
|
||||
#ifndef NO_BUFFERISVALID
|
||||
if (!BufferIsValid(b))
|
||||
if (!BufferIsValid(buf))
|
||||
{ /* XXX L_SH better ??? */
|
||||
elog(ERROR, "heap_delete: failed ReadBuffer");
|
||||
}
|
||||
#endif /* NO_BUFFERISVALID */
|
||||
|
||||
dp = (PageHeader) BufferGetPage(b);
|
||||
dp = (PageHeader) BufferGetPage(buf);
|
||||
lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(tid));
|
||||
|
||||
/*
|
||||
@@ -1208,20 +1212,20 @@ heap_delete(Relation relation, ItemPointer tid)
|
||||
*/
|
||||
if (IsSystemRelationName(RelationGetRelationName(relation)->data))
|
||||
RelationUnsetLockForWrite(relation);
|
||||
ReleaseBuffer(b);
|
||||
ReleaseBuffer(buf);
|
||||
return (1);
|
||||
}
|
||||
/* ----------------
|
||||
* check that we're deleteing a valid item
|
||||
* ----------------
|
||||
*/
|
||||
HeapTupleSatisfies(lp, relation, b, dp,
|
||||
HeapTupleSatisfies(lp, relation, buf, dp,
|
||||
false, 0, (ScanKey) NULL, tp);
|
||||
if (!tp)
|
||||
{
|
||||
|
||||
/* XXX call something else */
|
||||
ReleaseBuffer(b);
|
||||
ReleaseBuffer(buf);
|
||||
|
||||
elog(ERROR, "heap_delete: (am)invalid tid");
|
||||
}
|
||||
@@ -1248,7 +1252,7 @@ heap_delete(Relation relation, ItemPointer tid)
|
||||
RelationInvalidateHeapTuple(relation, tp);
|
||||
SetRefreshWhenInvalidate((bool) !ImmediateInvalidation);
|
||||
|
||||
WriteBuffer(b);
|
||||
WriteBuffer(buf);
|
||||
if (IsSystemRelationName(RelationGetRelationName(relation)->data))
|
||||
RelationUnsetLockForWrite(relation);
|
||||
|
||||
@@ -1426,7 +1430,7 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple tup)
|
||||
* ----------------
|
||||
*/
|
||||
void
|
||||
heap_markpos(HeapScanDesc sdesc)
|
||||
heap_markpos(HeapScanDesc scan)
|
||||
{
|
||||
|
||||
/* ----------------
|
||||
@@ -1438,50 +1442,50 @@ heap_markpos(HeapScanDesc sdesc)
|
||||
|
||||
/* Note: no locking manipulations needed */
|
||||
|
||||
if (sdesc->rs_ptup == NULL &&
|
||||
BufferIsUnknown(sdesc->rs_pbuf))
|
||||
if (scan->rs_ptup == NULL &&
|
||||
BufferIsUnknown(scan->rs_pbuf))
|
||||
{ /* == NONTUP */
|
||||
sdesc->rs_ptup = (HeapTuple)
|
||||
heapgettup(sdesc->rs_rd,
|
||||
(sdesc->rs_ctup == NULL) ?
|
||||
(ItemPointer) NULL : &sdesc->rs_ctup->t_ctid,
|
||||
scan->rs_ptup = (HeapTuple)
|
||||
heapgettup(scan->rs_rd,
|
||||
(scan->rs_ctup == NULL) ?
|
||||
(ItemPointer) NULL : &scan->rs_ctup->t_ctid,
|
||||
-1,
|
||||
&sdesc->rs_pbuf,
|
||||
sdesc->rs_snapshot,
|
||||
sdesc->rs_nkeys,
|
||||
sdesc->rs_key);
|
||||
&scan->rs_pbuf,
|
||||
scan->rs_snapshot,
|
||||
scan->rs_nkeys,
|
||||
scan->rs_key);
|
||||
|
||||
}
|
||||
else if (sdesc->rs_ntup == NULL &&
|
||||
BufferIsUnknown(sdesc->rs_nbuf))
|
||||
else if (scan->rs_ntup == NULL &&
|
||||
BufferIsUnknown(scan->rs_nbuf))
|
||||
{ /* == NONTUP */
|
||||
sdesc->rs_ntup = (HeapTuple)
|
||||
heapgettup(sdesc->rs_rd,
|
||||
(sdesc->rs_ctup == NULL) ?
|
||||
(ItemPointer) NULL : &sdesc->rs_ctup->t_ctid,
|
||||
scan->rs_ntup = (HeapTuple)
|
||||
heapgettup(scan->rs_rd,
|
||||
(scan->rs_ctup == NULL) ?
|
||||
(ItemPointer) NULL : &scan->rs_ctup->t_ctid,
|
||||
1,
|
||||
&sdesc->rs_nbuf,
|
||||
sdesc->rs_snapshot,
|
||||
sdesc->rs_nkeys,
|
||||
sdesc->rs_key);
|
||||
&scan->rs_nbuf,
|
||||
scan->rs_snapshot,
|
||||
scan->rs_nkeys,
|
||||
scan->rs_key);
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
* Should not unpin the buffer pages. They may still be in use.
|
||||
* ----------------
|
||||
*/
|
||||
if (sdesc->rs_ptup != NULL)
|
||||
sdesc->rs_mptid = sdesc->rs_ptup->t_ctid;
|
||||
if (scan->rs_ptup != NULL)
|
||||
scan->rs_mptid = scan->rs_ptup->t_ctid;
|
||||
else
|
||||
ItemPointerSetInvalid(&sdesc->rs_mptid);
|
||||
if (sdesc->rs_ctup != NULL)
|
||||
sdesc->rs_mctid = sdesc->rs_ctup->t_ctid;
|
||||
ItemPointerSetInvalid(&scan->rs_mptid);
|
||||
if (scan->rs_ctup != NULL)
|
||||
scan->rs_mctid = scan->rs_ctup->t_ctid;
|
||||
else
|
||||
ItemPointerSetInvalid(&sdesc->rs_mctid);
|
||||
if (sdesc->rs_ntup != NULL)
|
||||
sdesc->rs_mntid = sdesc->rs_ntup->t_ctid;
|
||||
ItemPointerSetInvalid(&scan->rs_mctid);
|
||||
if (scan->rs_ntup != NULL)
|
||||
scan->rs_mntid = scan->rs_ntup->t_ctid;
|
||||
else
|
||||
ItemPointerSetInvalid(&sdesc->rs_mntid);
|
||||
ItemPointerSetInvalid(&scan->rs_mntid);
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
@@ -1506,7 +1510,7 @@ heap_markpos(HeapScanDesc sdesc)
|
||||
* ----------------
|
||||
*/
|
||||
void
|
||||
heap_restrpos(HeapScanDesc sdesc)
|
||||
heap_restrpos(HeapScanDesc scan)
|
||||
{
|
||||
/* ----------------
|
||||
* increment access statistics
|
||||
@@ -1519,50 +1523,50 @@ heap_restrpos(HeapScanDesc sdesc)
|
||||
|
||||
/* Note: no locking manipulations needed */
|
||||
|
||||
unpinsdesc(sdesc);
|
||||
unpinscan(scan);
|
||||
|
||||
/* force heapgettup to pin buffer for each loaded tuple */
|
||||
sdesc->rs_pbuf = InvalidBuffer;
|
||||
sdesc->rs_cbuf = InvalidBuffer;
|
||||
sdesc->rs_nbuf = InvalidBuffer;
|
||||
scan->rs_pbuf = InvalidBuffer;
|
||||
scan->rs_cbuf = InvalidBuffer;
|
||||
scan->rs_nbuf = InvalidBuffer;
|
||||
|
||||
if (!ItemPointerIsValid(&sdesc->rs_mptid))
|
||||
sdesc->rs_ptup = NULL;
|
||||
if (!ItemPointerIsValid(&scan->rs_mptid))
|
||||
scan->rs_ptup = NULL;
|
||||
else
|
||||
{
|
||||
sdesc->rs_ptup = (HeapTuple)
|
||||
heapgettup(sdesc->rs_rd,
|
||||
&sdesc->rs_mptid,
|
||||
scan->rs_ptup = (HeapTuple)
|
||||
heapgettup(scan->rs_rd,
|
||||
&scan->rs_mptid,
|
||||
0,
|
||||
&sdesc->rs_pbuf,
|
||||
&scan->rs_pbuf,
|
||||
false,
|
||||
0,
|
||||
(ScanKey) NULL);
|
||||
}
|
||||
|
||||
if (!ItemPointerIsValid(&sdesc->rs_mctid))
|
||||
sdesc->rs_ctup = NULL;
|
||||
if (!ItemPointerIsValid(&scan->rs_mctid))
|
||||
scan->rs_ctup = NULL;
|
||||
else
|
||||
{
|
||||
sdesc->rs_ctup = (HeapTuple)
|
||||
heapgettup(sdesc->rs_rd,
|
||||
&sdesc->rs_mctid,
|
||||
scan->rs_ctup = (HeapTuple)
|
||||
heapgettup(scan->rs_rd,
|
||||
&scan->rs_mctid,
|
||||
0,
|
||||
&sdesc->rs_cbuf,
|
||||
&scan->rs_cbuf,
|
||||
false,
|
||||
0,
|
||||
(ScanKey) NULL);
|
||||
}
|
||||
|
||||
if (!ItemPointerIsValid(&sdesc->rs_mntid))
|
||||
sdesc->rs_ntup = NULL;
|
||||
if (!ItemPointerIsValid(&scan->rs_mntid))
|
||||
scan->rs_ntup = NULL;
|
||||
else
|
||||
{
|
||||
sdesc->rs_ntup = (HeapTuple)
|
||||
heapgettup(sdesc->rs_rd,
|
||||
&sdesc->rs_mntid,
|
||||
scan->rs_ntup = (HeapTuple)
|
||||
heapgettup(scan->rs_rd,
|
||||
&scan->rs_mntid,
|
||||
0,
|
||||
&sdesc->rs_nbuf,
|
||||
&scan->rs_nbuf,
|
||||
false,
|
||||
0,
|
||||
(ScanKey) NULL);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/index/genam.c,v 1.12 1998/06/15 19:27:53 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/index/genam.c,v 1.13 1998/08/19 02:01:09 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* many of the old access method routines have been turned into
|
||||
@@ -216,14 +216,15 @@ IndexScanMarkPosition(IndexScanDesc scan)
|
||||
|
||||
if (scan->flags & ScanUncheckedPrevious)
|
||||
{
|
||||
result =
|
||||
index_getnext(scan, BackwardScanDirection);
|
||||
result = index_getnext(scan, BackwardScanDirection);
|
||||
|
||||
if (result != NULL)
|
||||
{
|
||||
scan->previousItemData = result->index_iptr;
|
||||
pfree(result);
|
||||
}
|
||||
else
|
||||
ItemPointerSetInvalid(&scan->previousItemData);
|
||||
|
||||
}
|
||||
else if (scan->flags & ScanUncheckedNext)
|
||||
{
|
||||
@@ -231,7 +232,10 @@ IndexScanMarkPosition(IndexScanDesc scan)
|
||||
index_getnext(scan, ForwardScanDirection);
|
||||
|
||||
if (result != NULL)
|
||||
{
|
||||
scan->nextItemData = result->index_iptr;
|
||||
pfree(result);
|
||||
}
|
||||
else
|
||||
ItemPointerSetInvalid(&scan->nextItemData);
|
||||
}
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.22 1998/06/15 18:39:23 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/index/indexam.c,v 1.23 1998/08/19 02:01:10 momjian Exp $
|
||||
*
|
||||
* INTERFACE ROUTINES
|
||||
* index_open - open an index relation by relationId
|
||||
@@ -331,8 +331,7 @@ index_getnext(IndexScanDesc scan,
|
||||
* have the am's gettuple proc do all the work.
|
||||
* ----------------
|
||||
*/
|
||||
result = (RetrieveIndexResult)
|
||||
fmgr(procedure, scan, direction);
|
||||
result = (RetrieveIndexResult)fmgr(procedure, scan, direction);
|
||||
|
||||
return result;
|
||||
}
|
||||
@@ -376,8 +375,7 @@ GetIndexValue(HeapTuple tuple,
|
||||
int attOff,
|
||||
AttrNumber attrNums[],
|
||||
FuncIndexInfo *fInfo,
|
||||
bool *attNull,
|
||||
Buffer buffer)
|
||||
bool *attNull)
|
||||
{
|
||||
Datum returnVal;
|
||||
bool isNull;
|
||||
|
@@ -8,13 +8,14 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/index/Attic/istrat.c,v 1.25 1998/08/11 22:39:32 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/index/Attic/istrat.c,v 1.26 1998/08/19 02:01:11 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "postgres.h"
|
||||
|
||||
#include "miscadmin.h"
|
||||
#include "access/heapam.h"
|
||||
#include "access/istrat.h"
|
||||
#include "catalog/catname.h"
|
||||
@@ -22,6 +23,7 @@
|
||||
#include "catalog/pg_amproc.h"
|
||||
#include "catalog/pg_index.h"
|
||||
#include "catalog/pg_operator.h"
|
||||
#include "utils/syscache.h"
|
||||
#include "fmgr.h"
|
||||
#include "utils/memutils.h" /* could have been access/itup.h */
|
||||
|
||||
@@ -30,8 +32,7 @@ static bool StrategyEvaluationIsValid(StrategyEvaluation evaluation);
|
||||
static bool
|
||||
StrategyExpressionIsValid(StrategyExpression expression,
|
||||
StrategyNumber maxStrategy);
|
||||
static ScanKey
|
||||
StrategyMapGetScanKeyEntry(StrategyMap map,
|
||||
static ScanKey StrategyMapGetScanKeyEntry(StrategyMap map,
|
||||
StrategyNumber strategyNumber);
|
||||
static bool
|
||||
StrategyOperatorIsValid(StrategyOperator operator,
|
||||
@@ -95,8 +96,7 @@ IndexStrategyGetStrategyMap(IndexStrategy indexStrategy,
|
||||
Assert(AttributeNumberIsValid(attrNum));
|
||||
|
||||
maxStrategyNum = AMStrategies(maxStrategyNum); /* XXX */
|
||||
return
|
||||
&indexStrategy->strategyMapData[maxStrategyNum * (attrNum - 1)];
|
||||
return &indexStrategy->strategyMapData[maxStrategyNum * (attrNum - 1)];
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -108,8 +108,7 @@ AttributeNumberGetIndexStrategySize(AttrNumber maxAttributeNumber,
|
||||
StrategyNumber maxStrategyNumber)
|
||||
{
|
||||
maxStrategyNumber = AMStrategies(maxStrategyNumber); /* XXX */
|
||||
return
|
||||
maxAttributeNumber * maxStrategyNumber * sizeof(ScanKeyData);
|
||||
return maxAttributeNumber * maxStrategyNumber * sizeof(ScanKeyData);
|
||||
}
|
||||
|
||||
#ifdef USE_ASSERT_CHECKING
|
||||
@@ -483,39 +482,52 @@ OperatorRelationFillScanKeyEntry(Relation operatorRelation,
|
||||
Oid operatorObjectId,
|
||||
ScanKey entry)
|
||||
{
|
||||
HeapScanDesc scan;
|
||||
ScanKeyData scanKeyData;
|
||||
HeapTuple tuple;
|
||||
HeapScanDesc scan = NULL;
|
||||
|
||||
ScanKeyEntryInitialize(&scanKeyData, 0,
|
||||
ObjectIdAttributeNumber,
|
||||
F_OIDEQ,
|
||||
ObjectIdGetDatum(operatorObjectId));
|
||||
if (!IsBootstrapProcessingMode())
|
||||
{
|
||||
tuple = SearchSysCacheTuple(OPROID,
|
||||
ObjectIdGetDatum(operatorObjectId),
|
||||
0, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ScanKeyData scanKeyData;
|
||||
|
||||
ScanKeyEntryInitialize(&scanKeyData, 0,
|
||||
ObjectIdAttributeNumber,
|
||||
F_OIDEQ,
|
||||
ObjectIdGetDatum(operatorObjectId));
|
||||
|
||||
scan = heap_beginscan(operatorRelation, false, SnapshotNow,
|
||||
1, &scanKeyData);
|
||||
scan = heap_beginscan(operatorRelation, false, SnapshotNow,
|
||||
1, &scanKeyData);
|
||||
|
||||
tuple = heap_getnext(scan, 0);
|
||||
}
|
||||
|
||||
tuple = heap_getnext(scan, false, (Buffer *) NULL);
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
{
|
||||
if (IsBootstrapProcessingMode())
|
||||
heap_endscan(scan);
|
||||
elog(ERROR, "OperatorObjectIdFillScanKeyEntry: unknown operator %lu",
|
||||
(uint32) operatorObjectId);
|
||||
}
|
||||
|
||||
entry->sk_flags = 0;
|
||||
entry->sk_procedure =
|
||||
((OperatorTupleForm) GETSTRUCT(tuple))->oprcode;
|
||||
entry->sk_procedure = ((OperatorTupleForm) GETSTRUCT(tuple))->oprcode;
|
||||
fmgr_info(entry->sk_procedure, &entry->sk_func);
|
||||
entry->sk_nargs = entry->sk_func.fn_nargs;
|
||||
|
||||
if (IsBootstrapProcessingMode())
|
||||
heap_endscan(scan);
|
||||
|
||||
if (!RegProcedureIsValid(entry->sk_procedure))
|
||||
{
|
||||
elog(ERROR,
|
||||
"OperatorObjectIdFillScanKeyEntry: no procedure for operator %lu",
|
||||
(uint32) operatorObjectId);
|
||||
}
|
||||
|
||||
heap_endscan(scan);
|
||||
}
|
||||
|
||||
|
||||
@@ -532,28 +544,38 @@ IndexSupportInitialize(IndexStrategy indexStrategy,
|
||||
StrategyNumber maxSupportNumber,
|
||||
AttrNumber maxAttributeNumber)
|
||||
{
|
||||
Relation relation;
|
||||
Relation operatorRelation;
|
||||
HeapScanDesc scan;
|
||||
HeapTuple tuple;
|
||||
Relation relation = NULL;
|
||||
HeapScanDesc scan = NULL;
|
||||
ScanKeyData entry[2];
|
||||
Relation operatorRelation;
|
||||
HeapTuple tuple;
|
||||
StrategyMap map;
|
||||
AttrNumber attributeNumber;
|
||||
int attributeIndex;
|
||||
Oid operatorClassObjectId[MaxIndexAttributeNumber];
|
||||
|
||||
maxStrategyNumber = AMStrategies(maxStrategyNumber);
|
||||
if (!IsBootstrapProcessingMode())
|
||||
{
|
||||
tuple = SearchSysCacheTuple(INDEXRELID,
|
||||
ObjectIdGetDatum(indexObjectId),
|
||||
0, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ScanKeyEntryInitialize(&entry[0], 0, Anum_pg_index_indexrelid,
|
||||
F_OIDEQ,
|
||||
ObjectIdGetDatum(indexObjectId));
|
||||
|
||||
relation = heap_openr(IndexRelationName);
|
||||
scan = heap_beginscan(relation, false, SnapshotNow, 1, entry);
|
||||
tuple = heap_getnext(scan, 0);
|
||||
}
|
||||
|
||||
ScanKeyEntryInitialize(&entry[0], 0, Anum_pg_index_indexrelid,
|
||||
F_OIDEQ,
|
||||
ObjectIdGetDatum(indexObjectId));
|
||||
|
||||
relation = heap_openr(IndexRelationName);
|
||||
scan = heap_beginscan(relation, false, SnapshotNow, 1, entry);
|
||||
tuple = heap_getnext(scan, 0, (Buffer *) NULL);
|
||||
if (!HeapTupleIsValid(tuple))
|
||||
elog(ERROR, "IndexSupportInitialize: corrupted catalogs");
|
||||
|
||||
maxStrategyNumber = AMStrategies(maxStrategyNumber);
|
||||
|
||||
/*
|
||||
* XXX note that the following assumes the INDEX tuple is well formed
|
||||
* and that the key[] and class[] are 0 terminated.
|
||||
@@ -574,9 +596,12 @@ IndexSupportInitialize(IndexStrategy indexStrategy,
|
||||
operatorClassObjectId[attributeIndex] = iform->indclass[attributeIndex];
|
||||
}
|
||||
|
||||
heap_endscan(scan);
|
||||
heap_close(relation);
|
||||
|
||||
if (IsBootstrapProcessingMode())
|
||||
{
|
||||
heap_endscan(scan);
|
||||
heap_close(relation);
|
||||
}
|
||||
|
||||
/* if support routines exist for this access method, load them */
|
||||
if (maxSupportNumber > 0)
|
||||
{
|
||||
@@ -606,8 +631,7 @@ IndexSupportInitialize(IndexStrategy indexStrategy,
|
||||
|
||||
scan = heap_beginscan(relation, false, SnapshotNow, 2, entry);
|
||||
|
||||
while (tuple = heap_getnext(scan, 0, (Buffer *) NULL),
|
||||
HeapTupleIsValid(tuple))
|
||||
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
||||
{
|
||||
form = (Form_pg_amproc) GETSTRUCT(tuple);
|
||||
loc[(form->amprocnum - 1)] = form->amproc;
|
||||
@@ -647,8 +671,7 @@ IndexSupportInitialize(IndexStrategy indexStrategy,
|
||||
|
||||
scan = heap_beginscan(relation, false, SnapshotNow, 2, entry);
|
||||
|
||||
while (tuple = heap_getnext(scan, 0, (Buffer *) NULL),
|
||||
HeapTupleIsValid(tuple))
|
||||
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
||||
{
|
||||
Form_pg_amop form;
|
||||
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtcompare.c,v 1.16 1998/04/26 04:05:19 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtcompare.c,v 1.17 1998/08/19 02:01:13 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* These functions are stored in pg_amproc. For each operator class
|
||||
@@ -30,81 +30,96 @@
|
||||
int32
|
||||
btint2cmp(int16 a, int16 b)
|
||||
{
|
||||
return ((int32) (a - b));
|
||||
return (int32) (a - b);
|
||||
}
|
||||
|
||||
int32
|
||||
btint4cmp(int32 a, int32 b)
|
||||
{
|
||||
return (a - b);
|
||||
return a - b;
|
||||
}
|
||||
|
||||
int32
|
||||
btint24cmp(int16 a, int32 b)
|
||||
{
|
||||
return (((int32) a) - b);
|
||||
return ((int32) a) - b;
|
||||
}
|
||||
|
||||
int32
|
||||
btint42cmp(int32 a, int16 b)
|
||||
{
|
||||
return (a - ((int32) b));
|
||||
return a - ((int32) b);
|
||||
}
|
||||
|
||||
int32
|
||||
btfloat4cmp(float32 a, float32 b)
|
||||
{
|
||||
if (*a > *b)
|
||||
return (1);
|
||||
return 1;
|
||||
else if (*a == *b)
|
||||
return (0);
|
||||
return 0;
|
||||
else
|
||||
return (-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int32
|
||||
btfloat8cmp(float64 a, float64 b)
|
||||
{
|
||||
if (*a > *b)
|
||||
return (1);
|
||||
return 1;
|
||||
else if (*a == *b)
|
||||
return (0);
|
||||
return 0;
|
||||
else
|
||||
return (-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int32
|
||||
btoidcmp(Oid a, Oid b)
|
||||
{
|
||||
if (a > b)
|
||||
return (1);
|
||||
return 1;
|
||||
else if (a == b)
|
||||
return (0);
|
||||
return 0;
|
||||
else
|
||||
return (-1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int32
|
||||
btoid8cmp(Oid a[], Oid b[])
|
||||
{
|
||||
int i;
|
||||
for (i=0; i < 8; i++)
|
||||
/* we use this because we need the int4gt, etc */
|
||||
if (!int4eq(a[i], b[i]))
|
||||
if (int4gt(a[i], b[i]))
|
||||
return 1;
|
||||
else
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int32
|
||||
btabstimecmp(AbsoluteTime a, AbsoluteTime b)
|
||||
{
|
||||
if (AbsoluteTimeIsBefore(a, b))
|
||||
return (-1);
|
||||
return -1;
|
||||
else if (AbsoluteTimeIsBefore(b, a))
|
||||
return (1);
|
||||
return 1;
|
||||
else
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32
|
||||
btcharcmp(char a, char b)
|
||||
{
|
||||
return ((int32) ((uint8) a - (uint8) b));
|
||||
return (int32) ((uint8) a - (uint8) b);
|
||||
}
|
||||
|
||||
int32
|
||||
btnamecmp(NameData *a, NameData *b)
|
||||
{
|
||||
return (strncmp(a->data, b->data, NAMEDATALEN));
|
||||
return strncmp(a->data, b->data, NAMEDATALEN);
|
||||
}
|
||||
|
||||
int32
|
||||
@@ -162,7 +177,7 @@ bttextcmp(struct varlena * a, struct varlena * b)
|
||||
#endif
|
||||
|
||||
if (res != 0 || VARSIZE(a) == VARSIZE(b))
|
||||
return (res);
|
||||
return res;
|
||||
|
||||
/*
|
||||
* The two strings are the same in the first len bytes, and they are
|
||||
@@ -170,7 +185,7 @@ bttextcmp(struct varlena * a, struct varlena * b)
|
||||
*/
|
||||
|
||||
if (VARSIZE(a) < VARSIZE(b))
|
||||
return (-1);
|
||||
return -1;
|
||||
else
|
||||
return (1);
|
||||
return 1;
|
||||
}
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.27 1998/07/27 19:37:39 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.28 1998/08/19 02:01:15 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -53,7 +53,8 @@ _bt_doinsert(Relation rel, BTItem btitem, bool index_is_unique, Relation heapRel
|
||||
BlockNumber blkno;
|
||||
int natts = rel->rd_rel->relnatts;
|
||||
InsertIndexResult res;
|
||||
|
||||
Buffer buffer;
|
||||
|
||||
itup = &(btitem->bti_itup);
|
||||
|
||||
/* we need a scan key to do our search, so build one */
|
||||
@@ -120,11 +121,12 @@ _bt_doinsert(Relation rel, BTItem btitem, bool index_is_unique, Relation heapRel
|
||||
{ /* they're equal */
|
||||
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offset));
|
||||
itup = &(btitem->bti_itup);
|
||||
htup = heap_fetch(heapRel, SnapshotSelf, &(itup->t_tid), NULL);
|
||||
htup = heap_fetch(heapRel, SnapshotSelf, &(itup->t_tid), &buffer);
|
||||
if (htup != (HeapTuple) NULL)
|
||||
{ /* it is a duplicate */
|
||||
elog(ERROR, "Cannot insert a duplicate key into a unique index");
|
||||
}
|
||||
/* htup null so no buffer to release */
|
||||
/* get next offnum */
|
||||
if (offset < maxoff)
|
||||
offset = OffsetNumberNext(offset);
|
||||
|
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.28 1998/07/30 05:04:49 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.29 1998/08/19 02:01:16 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* This file contains only the public interface routines.
|
||||
@@ -66,7 +66,6 @@ btbuild(Relation heap,
|
||||
PredInfo *predInfo)
|
||||
{
|
||||
HeapScanDesc hscan;
|
||||
Buffer buffer;
|
||||
HeapTuple htup;
|
||||
IndexTuple itup;
|
||||
TupleDesc htupdesc,
|
||||
@@ -113,7 +112,7 @@ btbuild(Relation heap,
|
||||
#endif
|
||||
|
||||
/* see if index is unique */
|
||||
isunique = IndexIsUniqueNoCache(RelationGetRelationId(index));
|
||||
isunique = IndexIsUniqueNoCache(RelationGetRelid(index));
|
||||
|
||||
/* initialize the btree index metadata page (if this is a new index) */
|
||||
if (oldPred == NULL)
|
||||
@@ -155,9 +154,6 @@ btbuild(Relation heap,
|
||||
#endif /* OMIT_PARTIAL_INDEX */
|
||||
|
||||
/* start a heap scan */
|
||||
hscan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
htup = heap_getnext(hscan, 0, &buffer);
|
||||
|
||||
/* build the index */
|
||||
nhtups = nitups = 0;
|
||||
|
||||
@@ -167,9 +163,10 @@ btbuild(Relation heap,
|
||||
res = (InsertIndexResult) NULL;
|
||||
}
|
||||
|
||||
for (; HeapTupleIsValid(htup); htup = heap_getnext(hscan, 0, &buffer))
|
||||
{
|
||||
hscan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
|
||||
while (HeapTupleIsValid(htup = heap_getnext(hscan, 0)))
|
||||
{
|
||||
nhtups++;
|
||||
|
||||
/*
|
||||
@@ -228,8 +225,7 @@ btbuild(Relation heap,
|
||||
attoff,
|
||||
attnum,
|
||||
finfo,
|
||||
&attnull,
|
||||
buffer);
|
||||
&attnull);
|
||||
nulls[attoff] = (attnull ? 'n' : ' ');
|
||||
}
|
||||
|
||||
@@ -323,8 +319,8 @@ btbuild(Relation heap,
|
||||
*/
|
||||
if (IsNormalProcessingMode())
|
||||
{
|
||||
hrelid = heap->rd_id;
|
||||
irelid = index->rd_id;
|
||||
hrelid = RelationGetRelid(heap);
|
||||
irelid = RelationGetRelid(index);
|
||||
heap_close(heap);
|
||||
index_close(index);
|
||||
UpdateStats(hrelid, nhtups, true);
|
||||
@@ -371,7 +367,7 @@ btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation
|
||||
btitem = _bt_formitem(itup);
|
||||
|
||||
res = _bt_doinsert(rel, btitem,
|
||||
IndexIsUnique(RelationGetRelationId(rel)), heapRel);
|
||||
IndexIsUnique(RelationGetRelid(rel)), heapRel);
|
||||
|
||||
pfree(btitem);
|
||||
pfree(itup);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/Attic/nbtscan.c,v 1.15 1998/07/30 05:04:50 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/Attic/nbtscan.c,v 1.16 1998/08/19 02:01:17 momjian Exp $
|
||||
*
|
||||
*
|
||||
* NOTES
|
||||
@@ -96,10 +96,10 @@ _bt_adjscans(Relation rel, ItemPointer tid, int op)
|
||||
BTScanList l;
|
||||
Oid relid;
|
||||
|
||||
relid = rel->rd_id;
|
||||
relid = RelationGetRelid(rel);
|
||||
for (l = BTScans; l != (BTScanList) NULL; l = l->btsl_next)
|
||||
{
|
||||
if (relid == l->btsl_scan->relation->rd_id)
|
||||
if (relid == RelationGetRelid(l->btsl_scan->relation))
|
||||
_bt_scandel(l->btsl_scan, op,
|
||||
ItemPointerGetBlockNumber(tid),
|
||||
ItemPointerGetOffsetNumber(tid));
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtutils.c,v 1.20 1998/06/15 19:27:59 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtutils.c,v 1.21 1998/08/19 02:01:18 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -61,8 +61,7 @@ _bt_mkscankey(Relation rel, IndexTuple itup)
|
||||
proc = index_getprocid(rel, i + 1, BTORDER_PROC);
|
||||
flag = 0x0;
|
||||
}
|
||||
ScanKeyEntryInitialize(&skey[i],
|
||||
flag, (AttrNumber) (i + 1), proc, arg);
|
||||
ScanKeyEntryInitialize(&skey[i], flag, (AttrNumber) (i + 1), proc, arg);
|
||||
}
|
||||
|
||||
return (skey);
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.25 1998/07/27 19:37:41 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.26 1998/08/19 02:01:20 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -86,7 +86,6 @@ rtbuild(Relation heap,
|
||||
PredInfo *predInfo)
|
||||
{
|
||||
HeapScanDesc scan;
|
||||
Buffer buffer;
|
||||
AttrNumber i;
|
||||
HeapTuple htup;
|
||||
IndexTuple itup;
|
||||
@@ -95,6 +94,7 @@ rtbuild(Relation heap,
|
||||
InsertIndexResult res;
|
||||
Datum *d;
|
||||
bool *nulls;
|
||||
Buffer buffer = InvalidBuffer;
|
||||
int nb,
|
||||
nh,
|
||||
ni;
|
||||
@@ -164,15 +164,14 @@ rtbuild(Relation heap,
|
||||
slot = NULL;
|
||||
}
|
||||
#endif /* OMIT_PARTIAL_INDEX */
|
||||
scan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
htup = heap_getnext(scan, 0, &buffer);
|
||||
|
||||
/* count the tuples as we insert them */
|
||||
nh = ni = 0;
|
||||
|
||||
for (; HeapTupleIsValid(htup); htup = heap_getnext(scan, 0, &buffer))
|
||||
{
|
||||
scan = heap_beginscan(heap, 0, SnapshotNow, 0, (ScanKey) NULL);
|
||||
|
||||
while (HeapTupleIsValid(htup = heap_getnext(scan, 0)))
|
||||
{
|
||||
nh++;
|
||||
|
||||
/*
|
||||
@@ -234,8 +233,7 @@ rtbuild(Relation heap,
|
||||
attoff,
|
||||
attnum,
|
||||
finfo,
|
||||
&attnull,
|
||||
buffer);
|
||||
&attnull);
|
||||
nulls[attoff] = (attnull ? 'n' : ' ');
|
||||
}
|
||||
|
||||
@@ -278,8 +276,8 @@ rtbuild(Relation heap,
|
||||
* flushed. We close them to guarantee that they will be.
|
||||
*/
|
||||
|
||||
hrelid = heap->rd_id;
|
||||
irelid = index->rd_id;
|
||||
hrelid = RelationGetRelid(heap);
|
||||
irelid = RelationGetRelid(index);
|
||||
heap_close(heap);
|
||||
index_close(index);
|
||||
|
||||
|
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtscan.c,v 1.16 1998/06/15 19:28:01 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtscan.c,v 1.17 1998/08/19 02:01:21 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -290,10 +290,10 @@ rtadjscans(Relation r, int op, BlockNumber blkno, OffsetNumber offnum)
|
||||
RTScanList l;
|
||||
Oid relid;
|
||||
|
||||
relid = r->rd_id;
|
||||
relid = RelationGetRelid(r);
|
||||
for (l = RTScans; l != (RTScanList) NULL; l = l->rtsl_next)
|
||||
{
|
||||
if (l->rtsl_scan->relation->rd_id == relid)
|
||||
if (RelationGetRelid(l->rtsl_scan->relation) == relid)
|
||||
rtadjone(l->rtsl_scan, op, blkno, offnum);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user