New HeapTuple structure/interface.
This commit is contained in:
parent
2435c7d501
commit
6beba218d7
@ -34,7 +34,7 @@
|
|||||||
#
|
#
|
||||||
#
|
#
|
||||||
# IDENTIFICATION
|
# IDENTIFICATION
|
||||||
# $Header: /cvsroot/pgsql/src/backend/Makefile,v 1.33 1998/04/27 04:04:05 momjian Exp $
|
# $Header: /cvsroot/pgsql/src/backend/Makefile,v 1.34 1998/11/27 19:51:27 vadim Exp $
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -86,6 +86,9 @@ catalog/global1.description catalog/local1_template1.description:
|
|||||||
postgres.o: $(OBJS)
|
postgres.o: $(OBJS)
|
||||||
$(CC) -r -o postgres.o $(OBJS) $(LDFLAGS)
|
$(CC) -r -o postgres.o $(OBJS) $(LDFLAGS)
|
||||||
|
|
||||||
|
fast:
|
||||||
|
$(CC) -r -o postgres.o $(OBJS) $(LDFLAGS)
|
||||||
|
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
# The following targets are specified in make commands that appear in the
|
# The following targets are specified in make commands that appear in the
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.45 1998/10/08 18:29:10 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.46 1998/11/27 19:51:27 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* The old interface functions have been converted to macros
|
* The old interface functions have been converted to macros
|
||||||
@ -36,12 +36,12 @@
|
|||||||
/* Used by heap_getattr() macro, for speed */
|
/* Used by heap_getattr() macro, for speed */
|
||||||
long heap_sysoffset[] = {
|
long heap_sysoffset[] = {
|
||||||
/* Only the first one is pass-by-ref, and is handled specially in the macro */
|
/* Only the first one is pass-by-ref, and is handled specially in the macro */
|
||||||
offsetof(HeapTupleData, t_ctid),
|
offsetof(HeapTupleHeaderData, t_ctid),
|
||||||
offsetof(HeapTupleData, t_oid),
|
offsetof(HeapTupleHeaderData, t_oid),
|
||||||
offsetof(HeapTupleData, t_xmin),
|
offsetof(HeapTupleHeaderData, t_xmin),
|
||||||
offsetof(HeapTupleData, t_cmin),
|
offsetof(HeapTupleHeaderData, t_cmin),
|
||||||
offsetof(HeapTupleData, t_xmax),
|
offsetof(HeapTupleHeaderData, t_xmax),
|
||||||
offsetof(HeapTupleData, t_cmax)
|
offsetof(HeapTupleHeaderData, t_cmax)
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
@ -167,14 +167,14 @@ DataFill(char *data,
|
|||||||
int
|
int
|
||||||
heap_attisnull(HeapTuple tup, int attnum)
|
heap_attisnull(HeapTuple tup, int attnum)
|
||||||
{
|
{
|
||||||
if (attnum > (int) tup->t_natts)
|
if (attnum > (int) tup->t_data->t_natts)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (HeapTupleNoNulls(tup))
|
if (HeapTupleNoNulls(tup))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (attnum > 0)
|
if (attnum > 0)
|
||||||
return att_isnull(attnum - 1, tup->t_bits);
|
return att_isnull(attnum - 1, tup->t_data->t_bits);
|
||||||
else
|
else
|
||||||
switch (attnum)
|
switch (attnum)
|
||||||
{
|
{
|
||||||
@ -210,7 +210,7 @@ heap_attisnull(HeapTuple tup, int attnum)
|
|||||||
int
|
int
|
||||||
heap_sysattrlen(AttrNumber attno)
|
heap_sysattrlen(AttrNumber attno)
|
||||||
{
|
{
|
||||||
HeapTupleData *f = NULL;
|
HeapTupleHeader f = NULL;
|
||||||
|
|
||||||
switch (attno)
|
switch (attno)
|
||||||
{
|
{
|
||||||
@ -323,12 +323,13 @@ heap_getsysattr(HeapTuple tup, Buffer b, int attnum)
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
Datum
|
Datum
|
||||||
nocachegetattr(HeapTuple tup,
|
nocachegetattr(HeapTuple tuple,
|
||||||
int attnum,
|
int attnum,
|
||||||
TupleDesc tupleDesc,
|
TupleDesc tupleDesc,
|
||||||
bool *isnull)
|
bool *isnull)
|
||||||
{
|
{
|
||||||
char *tp; /* ptr to att in tuple */
|
char *tp; /* ptr to att in tuple */
|
||||||
|
HeapTupleHeader tup = tuple->t_data;
|
||||||
bits8 *bp = tup->t_bits; /* ptr to att in tuple */
|
bits8 *bp = tup->t_bits; /* ptr to att in tuple */
|
||||||
int slow; /* do we have to walk nulls? */
|
int slow; /* do we have to walk nulls? */
|
||||||
Form_pg_attribute *att = tupleDesc->attrs;
|
Form_pg_attribute *att = tupleDesc->attrs;
|
||||||
@ -351,7 +352,7 @@ nocachegetattr(HeapTuple tup,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (HeapTupleNoNulls(tup))
|
if (HeapTupleNoNulls(tuple))
|
||||||
{
|
{
|
||||||
attnum--;
|
attnum--;
|
||||||
|
|
||||||
@ -449,7 +450,7 @@ nocachegetattr(HeapTuple tup,
|
|||||||
}
|
}
|
||||||
else if (attnum == 0)
|
else if (attnum == 0)
|
||||||
return (Datum) fetchatt(&(att[0]), (char *) tp);
|
return (Datum) fetchatt(&(att[0]), (char *) tp);
|
||||||
else if (!HeapTupleAllFixed(tup))
|
else if (!HeapTupleAllFixed(tuple))
|
||||||
{
|
{
|
||||||
int j = 0;
|
int j = 0;
|
||||||
|
|
||||||
@ -491,8 +492,8 @@ nocachegetattr(HeapTuple tup,
|
|||||||
/* Can we compute more? We will probably need them */
|
/* Can we compute more? We will probably need them */
|
||||||
(j < tup->t_natts &&
|
(j < tup->t_natts &&
|
||||||
att[j]->attcacheoff == -1 &&
|
att[j]->attcacheoff == -1 &&
|
||||||
(HeapTupleNoNulls(tup) || !att_isnull(j, bp)) &&
|
(HeapTupleNoNulls(tuple) || !att_isnull(j, bp)) &&
|
||||||
(HeapTupleAllFixed(tup) ||
|
(HeapTupleAllFixed(tuple) ||
|
||||||
att[j]->attlen > 0 || VARLENA_FIXED_SIZE(att[j]))); j++)
|
att[j]->attlen > 0 || VARLENA_FIXED_SIZE(att[j]))); j++)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -527,7 +528,7 @@ nocachegetattr(HeapTuple tup,
|
|||||||
|
|
||||||
for (i = 0; i < attnum; i++)
|
for (i = 0; i < attnum; i++)
|
||||||
{
|
{
|
||||||
if (!HeapTupleNoNulls(tup))
|
if (!HeapTupleNoNulls(tuple))
|
||||||
{
|
{
|
||||||
if (att_isnull(i, bp))
|
if (att_isnull(i, bp))
|
||||||
{
|
{
|
||||||
@ -570,14 +571,41 @@ heap_copytuple(HeapTuple tuple)
|
|||||||
{
|
{
|
||||||
HeapTuple newTuple;
|
HeapTuple newTuple;
|
||||||
|
|
||||||
if (!HeapTupleIsValid(tuple))
|
if (!HeapTupleIsValid(tuple) || tuple->t_data == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
newTuple = (HeapTuple) palloc(tuple->t_len);
|
newTuple = (HeapTuple) palloc(HEAPTUPLESIZE + tuple->t_len);
|
||||||
memmove((char *) newTuple, (char *) tuple, (int) tuple->t_len);
|
newTuple->t_len = tuple->t_len;
|
||||||
|
newTuple->t_self = tuple->t_self;
|
||||||
|
newTuple->t_data = (HeapTupleHeader) ((char *) newTuple + HEAPTUPLESIZE);
|
||||||
|
memmove((char *) newTuple->t_data,
|
||||||
|
(char *) tuple->t_data, (int) tuple->t_len);
|
||||||
return newTuple;
|
return newTuple;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* heap_copytuple_with_tuple
|
||||||
|
*
|
||||||
|
* returns a copy of an tuple->t_data
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest)
|
||||||
|
{
|
||||||
|
if (!HeapTupleIsValid(src) || src->t_data == NULL)
|
||||||
|
{
|
||||||
|
dest->t_data = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest->t_len = src->t_len;
|
||||||
|
dest->t_self = src->t_self;
|
||||||
|
dest->t_data = (HeapTupleHeader) palloc(src->t_len);
|
||||||
|
memmove((char *) dest->t_data,
|
||||||
|
(char *) src->t_data, (int) src->t_len);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef NOT_USED
|
#ifdef NOT_USED
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* heap_deformtuple
|
* heap_deformtuple
|
||||||
@ -637,8 +665,8 @@ heap_formtuple(TupleDesc tupleDescriptor,
|
|||||||
Datum *value,
|
Datum *value,
|
||||||
char *nulls)
|
char *nulls)
|
||||||
{
|
{
|
||||||
char *tp; /* tuple pointer */
|
|
||||||
HeapTuple tuple; /* return tuple */
|
HeapTuple tuple; /* return tuple */
|
||||||
|
HeapTupleHeader td; /* tuple data */
|
||||||
int bitmaplen;
|
int bitmaplen;
|
||||||
long len;
|
long len;
|
||||||
int hoff;
|
int hoff;
|
||||||
@ -646,7 +674,7 @@ heap_formtuple(TupleDesc tupleDescriptor,
|
|||||||
int i;
|
int i;
|
||||||
int numberOfAttributes = tupleDescriptor->natts;
|
int numberOfAttributes = tupleDescriptor->natts;
|
||||||
|
|
||||||
len = offsetof(HeapTupleData, t_bits);
|
len = offsetof(HeapTupleHeaderData, t_bits);
|
||||||
|
|
||||||
for (i = 0; i < numberOfAttributes && !hasnull; i++)
|
for (i = 0; i < numberOfAttributes && !hasnull; i++)
|
||||||
{
|
{
|
||||||
@ -668,23 +696,24 @@ heap_formtuple(TupleDesc tupleDescriptor,
|
|||||||
|
|
||||||
len += ComputeDataSize(tupleDescriptor, value, nulls);
|
len += ComputeDataSize(tupleDescriptor, value, nulls);
|
||||||
|
|
||||||
tp = (char *) palloc(len);
|
tuple = (HeapTuple) palloc(HEAPTUPLESIZE + len);
|
||||||
tuple = (HeapTuple) tp;
|
td = tuple->t_data = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE);;
|
||||||
|
|
||||||
MemSet(tp, 0, (int) len);
|
MemSet((char *) td, 0, (int) len);
|
||||||
|
|
||||||
tuple->t_len = len;
|
tuple->t_len = len;
|
||||||
tuple->t_natts = numberOfAttributes;
|
ItemPointerSetInvalid(&(tuple->t_self));
|
||||||
tuple->t_hoff = hoff;
|
td->t_natts = numberOfAttributes;
|
||||||
|
td->t_hoff = hoff;
|
||||||
|
|
||||||
DataFill((char *) tuple + tuple->t_hoff,
|
DataFill((char *) td + td->t_hoff,
|
||||||
tupleDescriptor,
|
tupleDescriptor,
|
||||||
value,
|
value,
|
||||||
nulls,
|
nulls,
|
||||||
&tuple->t_infomask,
|
&td->t_infomask,
|
||||||
(hasnull ? tuple->t_bits : NULL));
|
(hasnull ? td->t_bits : NULL));
|
||||||
|
|
||||||
tuple->t_infomask |= HEAP_XMAX_INVALID;
|
td->t_infomask |= HEAP_XMAX_INVALID;
|
||||||
|
|
||||||
return tuple;
|
return tuple;
|
||||||
}
|
}
|
||||||
@ -767,13 +796,15 @@ heap_modifytuple(HeapTuple tuple,
|
|||||||
* copy the header except for t_len, t_natts, t_hoff, t_bits, t_infomask
|
* copy the header except for t_len, t_natts, t_hoff, t_bits, t_infomask
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
infomask = newTuple->t_infomask;
|
infomask = newTuple->t_data->t_infomask;
|
||||||
memmove((char *) &newTuple->t_oid, /* XXX */
|
memmove((char *) &newTuple->t_data->t_oid, /* XXX */
|
||||||
(char *) &tuple->t_oid,
|
(char *) &tuple->t_data->t_oid,
|
||||||
((char *) &tuple->t_hoff - (char *) &tuple->t_oid)); /* XXX */
|
((char *) &tuple->t_data->t_hoff -
|
||||||
newTuple->t_infomask = infomask;
|
(char *) &tuple->t_data->t_oid)); /* XXX */
|
||||||
newTuple->t_natts = numberOfAttributes; /* fix t_natts just in
|
newTuple->t_data->t_infomask = infomask;
|
||||||
* case */
|
newTuple->t_data->t_natts = numberOfAttributes;
|
||||||
|
newTuple->t_self = tuple->t_self;
|
||||||
|
|
||||||
return newTuple;
|
return newTuple;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -787,28 +818,30 @@ heap_addheader(uint32 natts, /* max domain index */
|
|||||||
int structlen, /* its length */
|
int structlen, /* its length */
|
||||||
char *structure) /* pointer to the struct */
|
char *structure) /* pointer to the struct */
|
||||||
{
|
{
|
||||||
char *tp; /* tuple data pointer */
|
HeapTuple tuple;
|
||||||
HeapTuple tup;
|
HeapTupleHeader td; /* tuple data */
|
||||||
long len;
|
long len;
|
||||||
int hoff;
|
int hoff;
|
||||||
|
|
||||||
AssertArg(natts > 0);
|
AssertArg(natts > 0);
|
||||||
|
|
||||||
len = offsetof(HeapTupleData, t_bits);
|
len = offsetof(HeapTupleHeaderData, t_bits);
|
||||||
|
|
||||||
hoff = len = DOUBLEALIGN(len); /* be conservative */
|
hoff = len = DOUBLEALIGN(len); /* be conservative */
|
||||||
len += structlen;
|
len += structlen;
|
||||||
tp = (char *) palloc(len);
|
tuple = (HeapTuple) palloc(HEAPTUPLESIZE + len);
|
||||||
tup = (HeapTuple) tp;
|
td = tuple->t_data = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE);
|
||||||
MemSet((char *) tup, 0, len);
|
|
||||||
|
|
||||||
tup->t_len = len;
|
MemSet((char *) td, 0, (int) len);
|
||||||
tp += tup->t_hoff = hoff;
|
|
||||||
tup->t_natts = natts;
|
|
||||||
tup->t_infomask = 0;
|
|
||||||
tup->t_infomask |= HEAP_XMAX_INVALID;
|
|
||||||
|
|
||||||
memmove(tp, structure, structlen);
|
tuple->t_len = len;
|
||||||
|
ItemPointerSetInvalid(&(tuple->t_self));
|
||||||
|
td->t_hoff = hoff;
|
||||||
|
td->t_natts = natts;
|
||||||
|
td->t_infomask = 0;
|
||||||
|
td->t_infomask |= HEAP_XMAX_INVALID;
|
||||||
|
|
||||||
return tup;
|
memmove((char *) td + hoff, structure, structlen);
|
||||||
|
|
||||||
|
return tuple;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/common/Attic/heapvalid.c,v 1.21 1997/09/22 03:58:32 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/common/Attic/heapvalid.c,v 1.22 1998/11/27 19:51:28 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -25,9 +25,9 @@
|
|||||||
bool
|
bool
|
||||||
TupleUpdatedByCurXactAndCmd(HeapTuple t)
|
TupleUpdatedByCurXactAndCmd(HeapTuple t)
|
||||||
{
|
{
|
||||||
if (TransactionIdEquals(t->t_xmax,
|
if (TransactionIdEquals(t->t_data->t_xmax,
|
||||||
GetCurrentTransactionId()) &&
|
GetCurrentTransactionId()) &&
|
||||||
CommandIdGEScanCommandId(t->t_cmax))
|
CommandIdGEScanCommandId(t->t_data->t_cmax))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/common/printtup.c,v 1.35 1998/09/01 04:26:40 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/common/printtup.c,v 1.36 1998/11/27 19:51:28 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -100,7 +100,7 @@ printtup(HeapTuple tuple, TupleDesc typeinfo)
|
|||||||
*/
|
*/
|
||||||
j = 0;
|
j = 0;
|
||||||
k = 1 << 7;
|
k = 1 << 7;
|
||||||
for (i = 0; i < tuple->t_natts;)
|
for (i = 0; i < tuple->t_data->t_natts;)
|
||||||
{
|
{
|
||||||
i++; /* heap_getattr is a macro, so no
|
i++; /* heap_getattr is a macro, so no
|
||||||
* increment */
|
* increment */
|
||||||
@ -122,7 +122,7 @@ printtup(HeapTuple tuple, TupleDesc typeinfo)
|
|||||||
* send the attributes of this tuple
|
* send the attributes of this tuple
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < tuple->t_natts; ++i)
|
for (i = 0; i < tuple->t_data->t_natts; ++i)
|
||||||
{
|
{
|
||||||
attr = heap_getattr(tuple, i + 1, typeinfo, &isnull);
|
attr = heap_getattr(tuple, i + 1, typeinfo, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
@ -204,7 +204,7 @@ debugtup(HeapTuple tuple, TupleDesc typeinfo)
|
|||||||
bool isnull;
|
bool isnull;
|
||||||
Oid typoutput;
|
Oid typoutput;
|
||||||
|
|
||||||
for (i = 0; i < tuple->t_natts; ++i)
|
for (i = 0; i < tuple->t_data->t_natts; ++i)
|
||||||
{
|
{
|
||||||
attr = heap_getattr(tuple, i + 1, typeinfo, &isnull);
|
attr = heap_getattr(tuple, i + 1, typeinfo, &isnull);
|
||||||
typoutput = typtoout((Oid) typeinfo->attrs[i]->atttypid);
|
typoutput = typtoout((Oid) typeinfo->attrs[i]->atttypid);
|
||||||
@ -251,7 +251,7 @@ printtup_internal(HeapTuple tuple, TupleDesc typeinfo)
|
|||||||
*/
|
*/
|
||||||
j = 0;
|
j = 0;
|
||||||
k = 1 << 7;
|
k = 1 << 7;
|
||||||
for (i = 0; i < tuple->t_natts;)
|
for (i = 0; i < tuple->t_data->t_natts;)
|
||||||
{
|
{
|
||||||
i++; /* heap_getattr is a macro, so no
|
i++; /* heap_getattr is a macro, so no
|
||||||
* increment */
|
* increment */
|
||||||
@ -274,9 +274,9 @@ printtup_internal(HeapTuple tuple, TupleDesc typeinfo)
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
#ifdef IPORTAL_DEBUG
|
#ifdef IPORTAL_DEBUG
|
||||||
fprintf(stderr, "sending tuple with %d atts\n", tuple->t_natts);
|
fprintf(stderr, "sending tuple with %d atts\n", tuple->t_data->t_natts);
|
||||||
#endif
|
#endif
|
||||||
for (i = 0; i < tuple->t_natts; ++i)
|
for (i = 0; i < tuple->t_data->t_natts; ++i)
|
||||||
{
|
{
|
||||||
int32 len = typeinfo->attrs[i]->attlen;
|
int32 len = typeinfo->attrs[i]->attlen;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.44 1998/09/01 04:26:41 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.45 1998/11/27 19:51:28 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* some of the executor utility code such as "ExecTypeFromTL" should be
|
* some of the executor utility code such as "ExecTypeFromTL" should be
|
||||||
@ -351,7 +351,7 @@ TupleDescInitEntry(TupleDesc desc,
|
|||||||
*/
|
*/
|
||||||
typeForm = (Form_pg_type) GETSTRUCT(tuple);
|
typeForm = (Form_pg_type) GETSTRUCT(tuple);
|
||||||
|
|
||||||
att->atttypid = tuple->t_oid;
|
att->atttypid = tuple->t_data->t_oid;
|
||||||
att->attalign = typeForm->typalign;
|
att->attalign = typeForm->typalign;
|
||||||
|
|
||||||
/* ------------------------
|
/* ------------------------
|
||||||
|
@ -248,7 +248,7 @@ gistbuild(Relation heap,
|
|||||||
|
|
||||||
/* form an index tuple and point it at the heap tuple */
|
/* form an index tuple and point it at the heap tuple */
|
||||||
itup = index_formtuple(id, &d[0], nulls);
|
itup = index_formtuple(id, &d[0], nulls);
|
||||||
itup->t_tid = htup->t_ctid;
|
itup->t_tid = htup->t_self;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since we already have the index relation locked, we call
|
* Since we already have the index relation locked, we call
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.22 1998/09/01 04:26:48 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.23 1998/11/27 19:51:31 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* This file contains only the public interface routines.
|
* This file contains only the public interface routines.
|
||||||
@ -216,7 +216,7 @@ hashbuild(Relation heap,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
itup->t_tid = htup->t_ctid;
|
itup->t_tid = htup->t_self;
|
||||||
hitem = _hash_formitem(itup);
|
hitem = _hash_formitem(itup);
|
||||||
res = _hash_doinsert(index, hitem);
|
res = _hash_doinsert(index, hitem);
|
||||||
pfree(hitem);
|
pfree(hitem);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.37 1998/10/12 00:53:30 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.38 1998/11/27 19:51:36 vadim Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* INTERFACE ROUTINES
|
* INTERFACE ROUTINES
|
||||||
@ -120,7 +120,8 @@ initscan(HeapScanDesc scan,
|
|||||||
* relation is empty
|
* relation is empty
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
scan->rs_ntup = scan->rs_ctup = scan->rs_ptup = NULL;
|
scan->rs_ntup.t_data = scan->rs_ctup.t_data =
|
||||||
|
scan->rs_ptup.t_data = NULL;
|
||||||
scan->rs_nbuf = scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer;
|
scan->rs_nbuf = scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer;
|
||||||
}
|
}
|
||||||
else if (atend)
|
else if (atend)
|
||||||
@ -129,9 +130,9 @@ initscan(HeapScanDesc scan,
|
|||||||
* reverse scan
|
* reverse scan
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
scan->rs_ntup = scan->rs_ctup = NULL;
|
scan->rs_ntup.t_data = scan->rs_ctup.t_data = NULL;
|
||||||
scan->rs_nbuf = scan->rs_cbuf = InvalidBuffer;
|
scan->rs_nbuf = scan->rs_cbuf = InvalidBuffer;
|
||||||
scan->rs_ptup = NULL;
|
scan->rs_ptup.t_data = NULL;
|
||||||
scan->rs_pbuf = UnknownBuffer;
|
scan->rs_pbuf = UnknownBuffer;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -140,9 +141,9 @@ initscan(HeapScanDesc scan,
|
|||||||
* forward scan
|
* forward scan
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
scan->rs_ctup = scan->rs_ptup = NULL;
|
scan->rs_ctup.t_data = scan->rs_ptup.t_data = NULL;
|
||||||
scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer;
|
scan->rs_cbuf = scan->rs_pbuf = InvalidBuffer;
|
||||||
scan->rs_ntup = NULL;
|
scan->rs_ntup.t_data = NULL;
|
||||||
scan->rs_nbuf = UnknownBuffer;
|
scan->rs_nbuf = UnknownBuffer;
|
||||||
} /* invalid too */
|
} /* invalid too */
|
||||||
|
|
||||||
@ -209,9 +210,9 @@ nextpage(int page, int dir)
|
|||||||
* like pass it to another function.
|
* like pass it to another function.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
static HeapTuple
|
static void
|
||||||
heapgettup(Relation relation,
|
heapgettup(Relation relation,
|
||||||
ItemPointer tid,
|
HeapTuple tuple,
|
||||||
int dir,
|
int dir,
|
||||||
Buffer *buf,
|
Buffer *buf,
|
||||||
Snapshot snapshot,
|
Snapshot snapshot,
|
||||||
@ -223,9 +224,10 @@ heapgettup(Relation relation,
|
|||||||
int page;
|
int page;
|
||||||
int pages;
|
int pages;
|
||||||
int lines;
|
int lines;
|
||||||
HeapTuple rtup;
|
|
||||||
OffsetNumber lineoff;
|
OffsetNumber lineoff;
|
||||||
int linesleft;
|
int linesleft;
|
||||||
|
ItemPointer tid = (tuple->t_data == NULL) ?
|
||||||
|
(ItemPointer) NULL : &(tuple->t_self);
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* increment access statistics
|
* increment access statistics
|
||||||
@ -268,7 +270,10 @@ heapgettup(Relation relation,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if (!(pages = relation->rd_nblocks))
|
if (!(pages = relation->rd_nblocks))
|
||||||
return NULL;
|
{
|
||||||
|
tuple->t_data = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* calculate next starting lineoff, given scan direction
|
* calculate next starting lineoff, given scan direction
|
||||||
@ -284,7 +289,8 @@ heapgettup(Relation relation,
|
|||||||
if (ItemPointerIsValid(tid) == false)
|
if (ItemPointerIsValid(tid) == false)
|
||||||
{
|
{
|
||||||
*buf = InvalidBuffer;
|
*buf = InvalidBuffer;
|
||||||
return NULL;
|
tuple->t_data = NULL;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
*buf = RelationGetBufferWithBuffer(relation,
|
*buf = RelationGetBufferWithBuffer(relation,
|
||||||
ItemPointerGetBlockNumber(tid),
|
ItemPointerGetBlockNumber(tid),
|
||||||
@ -299,8 +305,9 @@ heapgettup(Relation relation,
|
|||||||
lineoff = ItemPointerGetOffsetNumber(tid);
|
lineoff = ItemPointerGetOffsetNumber(tid);
|
||||||
lpp = PageGetItemId(dp, lineoff);
|
lpp = PageGetItemId(dp, lineoff);
|
||||||
|
|
||||||
rtup = (HeapTuple) PageGetItem((Page) dp, lpp);
|
tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
|
||||||
return rtup;
|
tuple->t_len = ItemIdGetLength(lpp);
|
||||||
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (dir < 0)
|
else if (dir < 0)
|
||||||
@ -322,7 +329,8 @@ heapgettup(Relation relation,
|
|||||||
if (page < 0)
|
if (page < 0)
|
||||||
{
|
{
|
||||||
*buf = InvalidBuffer;
|
*buf = InvalidBuffer;
|
||||||
return NULL;
|
tuple->t_data = NULL;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*buf = RelationGetBufferWithBuffer(relation, page, *buf);
|
*buf = RelationGetBufferWithBuffer(relation, page, *buf);
|
||||||
@ -366,7 +374,8 @@ heapgettup(Relation relation,
|
|||||||
if (page >= pages)
|
if (page >= pages)
|
||||||
{
|
{
|
||||||
*buf = InvalidBuffer;
|
*buf = InvalidBuffer;
|
||||||
return NULL;
|
tuple->t_data = NULL;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
/* page and lineoff now reference the physically next tid */
|
/* page and lineoff now reference the physically next tid */
|
||||||
|
|
||||||
@ -402,26 +411,19 @@ heapgettup(Relation relation,
|
|||||||
{
|
{
|
||||||
while (linesleft >= 0)
|
while (linesleft >= 0)
|
||||||
{
|
{
|
||||||
|
if (ItemIdIsUsed(lpp))
|
||||||
|
{
|
||||||
|
tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lpp);
|
||||||
|
tuple->t_len = ItemIdGetLength(lpp);
|
||||||
|
ItemPointerSet(&(tuple->t_self), page, lineoff);
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* if current tuple qualifies, return it.
|
* if current tuple qualifies, return it.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
HeapTupleSatisfies(lpp, relation, *buf, (PageHeader) dp,
|
HeapTupleSatisfies(tuple, relation, *buf, (PageHeader) dp,
|
||||||
snapshot, nkeys, key, rtup);
|
snapshot, nkeys, key);
|
||||||
if (rtup != NULL)
|
if (tuple->t_data != NULL)
|
||||||
{
|
return;
|
||||||
ItemPointer iptr = &(rtup->t_ctid);
|
|
||||||
|
|
||||||
if (ItemPointerGetBlockNumber(iptr) != page)
|
|
||||||
{
|
|
||||||
|
|
||||||
/*
|
|
||||||
* set block id to the correct page number --- this is
|
|
||||||
* a hack to support the virtual fragment concept
|
|
||||||
*/
|
|
||||||
ItemPointerSetBlockNumber(iptr, page);
|
|
||||||
}
|
|
||||||
return rtup;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -432,11 +434,12 @@ heapgettup(Relation relation,
|
|||||||
if (dir < 0)
|
if (dir < 0)
|
||||||
{
|
{
|
||||||
--lpp; /* move back in this page's ItemId array */
|
--lpp; /* move back in this page's ItemId array */
|
||||||
|
--lineoff;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
++lpp; /* move forward in this page's ItemId
|
++lpp; /* move forward in this page's ItemId array */
|
||||||
* array */
|
++lineoff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -456,7 +459,8 @@ heapgettup(Relation relation,
|
|||||||
if (BufferIsValid(*buf))
|
if (BufferIsValid(*buf))
|
||||||
ReleaseBuffer(*buf);
|
ReleaseBuffer(*buf);
|
||||||
*buf = InvalidBuffer;
|
*buf = InvalidBuffer;
|
||||||
return NULL;
|
tuple->t_data = NULL;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*buf = ReleaseAndReadBuffer(*buf, relation, page);
|
*buf = ReleaseAndReadBuffer(*buf, relation, page);
|
||||||
@ -466,14 +470,20 @@ heapgettup(Relation relation,
|
|||||||
elog(ERROR, "heapgettup: failed ReadBuffer");
|
elog(ERROR, "heapgettup: failed ReadBuffer");
|
||||||
#endif
|
#endif
|
||||||
dp = (Page) BufferGetPage(*buf);
|
dp = (Page) BufferGetPage(*buf);
|
||||||
lines = lineoff = PageGetMaxOffsetNumber((Page) dp);
|
lines = PageGetMaxOffsetNumber((Page) dp);
|
||||||
linesleft = lines - 1;
|
linesleft = lines - 1;
|
||||||
if (dir < 0)
|
if (dir < 0)
|
||||||
lpp = PageGetItemId(dp, lineoff);
|
{
|
||||||
|
lineoff = lines;
|
||||||
|
lpp = PageGetItemId(dp, lines);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
lineoff = FirstOffsetNumber;
|
||||||
lpp = PageGetItemId(dp, FirstOffsetNumber);
|
lpp = PageGetItemId(dp, FirstOffsetNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
doinsert(Relation relation, HeapTuple tup)
|
doinsert(Relation relation, HeapTuple tup)
|
||||||
@ -786,7 +796,7 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
*/
|
*/
|
||||||
HEAPDEBUG_2; /* heap_getnext called with backw */
|
HEAPDEBUG_2; /* heap_getnext called with backw */
|
||||||
|
|
||||||
if (scan->rs_ptup == scan->rs_ctup &&
|
if (scan->rs_ptup.t_data == scan->rs_ctup.t_data &&
|
||||||
BufferIsInvalid(scan->rs_pbuf))
|
BufferIsInvalid(scan->rs_pbuf))
|
||||||
{
|
{
|
||||||
if (BufferIsValid(scan->rs_nbuf))
|
if (BufferIsValid(scan->rs_nbuf))
|
||||||
@ -808,7 +818,7 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
scan->rs_ntup = scan->rs_ctup;
|
scan->rs_ntup = scan->rs_ctup;
|
||||||
scan->rs_nbuf = scan->rs_cbuf;
|
scan->rs_nbuf = scan->rs_cbuf;
|
||||||
|
|
||||||
if (scan->rs_ptup != NULL)
|
if (scan->rs_ptup.t_data != NULL)
|
||||||
{
|
{
|
||||||
if (scan->rs_cbuf != scan->rs_pbuf)
|
if (scan->rs_cbuf != scan->rs_pbuf)
|
||||||
{
|
{
|
||||||
@ -822,11 +832,6 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* NONTUP */
|
{ /* NONTUP */
|
||||||
ItemPointer iptr;
|
|
||||||
|
|
||||||
iptr = (scan->rs_ctup != NULL) ?
|
|
||||||
&(scan->rs_ctup->t_ctid) : (ItemPointer) NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't release scan->rs_cbuf at this point, because
|
* Don't release scan->rs_cbuf at this point, because
|
||||||
* heapgettup doesn't increase PrivateRefCount if it is
|
* heapgettup doesn't increase PrivateRefCount if it is
|
||||||
@ -836,9 +841,8 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
* instance ctup is stored in a TupleTableSlot). - 01/09/94
|
* instance ctup is stored in a TupleTableSlot). - 01/09/94
|
||||||
*/
|
*/
|
||||||
|
|
||||||
scan->rs_ctup = (HeapTuple)
|
|
||||||
heapgettup(scan->rs_rd,
|
heapgettup(scan->rs_rd,
|
||||||
iptr,
|
&(scan->rs_ctup),
|
||||||
-1,
|
-1,
|
||||||
&(scan->rs_cbuf),
|
&(scan->rs_cbuf),
|
||||||
scan->rs_snapshot,
|
scan->rs_snapshot,
|
||||||
@ -846,22 +850,22 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
scan->rs_key);
|
scan->rs_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scan->rs_ctup == NULL && !BufferIsValid(scan->rs_cbuf))
|
if (scan->rs_ctup.t_data == NULL && !BufferIsValid(scan->rs_cbuf))
|
||||||
{
|
{
|
||||||
if (BufferIsValid(scan->rs_pbuf))
|
if (BufferIsValid(scan->rs_pbuf))
|
||||||
ReleaseBuffer(scan->rs_pbuf);
|
ReleaseBuffer(scan->rs_pbuf);
|
||||||
scan->rs_ptup = NULL;
|
scan->rs_ptup.t_data = NULL;
|
||||||
scan->rs_pbuf = InvalidBuffer;
|
scan->rs_pbuf = InvalidBuffer;
|
||||||
if (BufferIsValid(scan->rs_nbuf))
|
if (BufferIsValid(scan->rs_nbuf))
|
||||||
ReleaseBuffer(scan->rs_nbuf);
|
ReleaseBuffer(scan->rs_nbuf);
|
||||||
scan->rs_ntup = NULL;
|
scan->rs_ntup.t_data = NULL;
|
||||||
scan->rs_nbuf = InvalidBuffer;
|
scan->rs_nbuf = InvalidBuffer;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferIsValid(scan->rs_pbuf))
|
if (BufferIsValid(scan->rs_pbuf))
|
||||||
ReleaseBuffer(scan->rs_pbuf);
|
ReleaseBuffer(scan->rs_pbuf);
|
||||||
scan->rs_ptup = NULL;
|
scan->rs_ptup.t_data = NULL;
|
||||||
scan->rs_pbuf = UnknownBuffer;
|
scan->rs_pbuf = UnknownBuffer;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -871,7 +875,7 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
* handle forward scan
|
* handle forward scan
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if (scan->rs_ctup == scan->rs_ntup &&
|
if (scan->rs_ctup.t_data == scan->rs_ntup.t_data &&
|
||||||
BufferIsInvalid(scan->rs_nbuf))
|
BufferIsInvalid(scan->rs_nbuf))
|
||||||
{
|
{
|
||||||
if (BufferIsValid(scan->rs_pbuf))
|
if (BufferIsValid(scan->rs_pbuf))
|
||||||
@ -894,7 +898,7 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
scan->rs_ptup = scan->rs_ctup;
|
scan->rs_ptup = scan->rs_ctup;
|
||||||
scan->rs_pbuf = scan->rs_cbuf;
|
scan->rs_pbuf = scan->rs_cbuf;
|
||||||
|
|
||||||
if (scan->rs_ntup != NULL)
|
if (scan->rs_ntup.t_data != NULL)
|
||||||
{
|
{
|
||||||
if (scan->rs_cbuf != scan->rs_nbuf)
|
if (scan->rs_cbuf != scan->rs_nbuf)
|
||||||
{
|
{
|
||||||
@ -909,11 +913,6 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* NONTUP */
|
{ /* NONTUP */
|
||||||
ItemPointer iptr;
|
|
||||||
|
|
||||||
iptr = (scan->rs_ctup != NULL) ?
|
|
||||||
&scan->rs_ctup->t_ctid : (ItemPointer) NULL;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't release scan->rs_cbuf at this point, because
|
* Don't release scan->rs_cbuf at this point, because
|
||||||
* heapgettup doesn't increase PrivateRefCount if it is
|
* heapgettup doesn't increase PrivateRefCount if it is
|
||||||
@ -923,9 +922,8 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
* instance ctup is stored in a TupleTableSlot). - 01/09/93
|
* instance ctup is stored in a TupleTableSlot). - 01/09/93
|
||||||
*/
|
*/
|
||||||
|
|
||||||
scan->rs_ctup = (HeapTuple)
|
|
||||||
heapgettup(scan->rs_rd,
|
heapgettup(scan->rs_rd,
|
||||||
iptr,
|
&(scan->rs_ctup),
|
||||||
1,
|
1,
|
||||||
&scan->rs_cbuf,
|
&scan->rs_cbuf,
|
||||||
scan->rs_snapshot,
|
scan->rs_snapshot,
|
||||||
@ -933,15 +931,15 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
scan->rs_key);
|
scan->rs_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scan->rs_ctup == NULL && !BufferIsValid(scan->rs_cbuf))
|
if (scan->rs_ctup.t_data == NULL && !BufferIsValid(scan->rs_cbuf))
|
||||||
{
|
{
|
||||||
if (BufferIsValid(scan->rs_nbuf))
|
if (BufferIsValid(scan->rs_nbuf))
|
||||||
ReleaseBuffer(scan->rs_nbuf);
|
ReleaseBuffer(scan->rs_nbuf);
|
||||||
scan->rs_ntup = NULL;
|
scan->rs_ntup.t_data = NULL;
|
||||||
scan->rs_nbuf = InvalidBuffer;
|
scan->rs_nbuf = InvalidBuffer;
|
||||||
if (BufferIsValid(scan->rs_pbuf))
|
if (BufferIsValid(scan->rs_pbuf))
|
||||||
ReleaseBuffer(scan->rs_pbuf);
|
ReleaseBuffer(scan->rs_pbuf);
|
||||||
scan->rs_ptup = NULL;
|
scan->rs_ptup.t_data = NULL;
|
||||||
scan->rs_pbuf = InvalidBuffer;
|
scan->rs_pbuf = InvalidBuffer;
|
||||||
HEAPDEBUG_6; /* heap_getnext returning EOS */
|
HEAPDEBUG_6; /* heap_getnext returning EOS */
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -949,7 +947,7 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
|
|
||||||
if (BufferIsValid(scan->rs_nbuf))
|
if (BufferIsValid(scan->rs_nbuf))
|
||||||
ReleaseBuffer(scan->rs_nbuf);
|
ReleaseBuffer(scan->rs_nbuf);
|
||||||
scan->rs_ntup = NULL;
|
scan->rs_ntup.t_data = NULL;
|
||||||
scan->rs_nbuf = UnknownBuffer;
|
scan->rs_nbuf = UnknownBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -961,7 +959,7 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
|
|
||||||
HEAPDEBUG_7; /* heap_getnext returning tuple */
|
HEAPDEBUG_7; /* heap_getnext returning tuple */
|
||||||
|
|
||||||
return scan->rs_ctup;
|
return ((scan->rs_ctup.t_data == NULL) ? NULL : &(scan->rs_ctup));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -972,22 +970,22 @@ heap_getnext(HeapScanDesc scandesc, int backw)
|
|||||||
* Because this is not part of a scan, there is no way to
|
* Because this is not part of a scan, there is no way to
|
||||||
* automatically lock/unlock the shared buffers.
|
* automatically lock/unlock the shared buffers.
|
||||||
* For this reason, we require that the user retrieve the buffer
|
* For this reason, we require that the user retrieve the buffer
|
||||||
* value, and they are required to BuffferRelease() it when they
|
* value, and they are required to BufferRelease() it when they
|
||||||
* are done. If they want to make a copy of it before releasing it,
|
* are done. If they want to make a copy of it before releasing it,
|
||||||
* they can call heap_copytyple().
|
* they can call heap_copytyple().
|
||||||
|
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
HeapTuple
|
void
|
||||||
heap_fetch(Relation relation,
|
heap_fetch(Relation relation,
|
||||||
Snapshot snapshot,
|
Snapshot snapshot,
|
||||||
ItemPointer tid,
|
HeapTuple tuple,
|
||||||
Buffer *userbuf)
|
Buffer *userbuf)
|
||||||
{
|
{
|
||||||
ItemId lp;
|
ItemId lp;
|
||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
PageHeader dp;
|
PageHeader dp;
|
||||||
HeapTuple tuple;
|
ItemPointer tid = &(tuple->t_self);
|
||||||
OffsetNumber offnum;
|
OffsetNumber offnum;
|
||||||
|
|
||||||
AssertMacro(PointerIsValid(userbuf)); /* see comments above */
|
AssertMacro(PointerIsValid(userbuf)); /* see comments above */
|
||||||
@ -1038,18 +1036,21 @@ heap_fetch(Relation relation,
|
|||||||
|
|
||||||
Assert(ItemIdIsUsed(lp));
|
Assert(ItemIdIsUsed(lp));
|
||||||
|
|
||||||
|
tuple->t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
|
||||||
|
tuple->t_len = ItemIdGetLength(lp);
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* check time qualification of tid
|
* check time qualification of tid
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
HeapTupleSatisfies(lp, relation, buffer, dp,
|
HeapTupleSatisfies(tuple, relation, buffer, dp,
|
||||||
snapshot, 0, (ScanKey) NULL, tuple);
|
snapshot, 0, (ScanKey) NULL);
|
||||||
|
|
||||||
if (tuple == NULL)
|
if (tuple->t_data == NULL)
|
||||||
{
|
{
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
return NULL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -1062,7 +1063,7 @@ heap_fetch(Relation relation,
|
|||||||
*userbuf = buffer; /* user is required to ReleaseBuffer()
|
*userbuf = buffer; /* user is required to ReleaseBuffer()
|
||||||
* this */
|
* this */
|
||||||
|
|
||||||
return tuple;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -1107,19 +1108,19 @@ heap_insert(Relation relation, HeapTuple tup)
|
|||||||
* another).
|
* another).
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if (!OidIsValid(tup->t_oid))
|
if (!OidIsValid(tup->t_data->t_oid))
|
||||||
{
|
{
|
||||||
tup->t_oid = newoid();
|
tup->t_data->t_oid = newoid();
|
||||||
LastOidProcessed = tup->t_oid;
|
LastOidProcessed = tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
CheckMaxObjectId(tup->t_oid);
|
CheckMaxObjectId(tup->t_data->t_oid);
|
||||||
|
|
||||||
TransactionIdStore(GetCurrentTransactionId(), &(tup->t_xmin));
|
TransactionIdStore(GetCurrentTransactionId(), &(tup->t_data->t_xmin));
|
||||||
tup->t_cmin = GetCurrentCommandId();
|
tup->t_data->t_cmin = GetCurrentCommandId();
|
||||||
StoreInvalidTransactionId(&(tup->t_xmax));
|
StoreInvalidTransactionId(&(tup->t_data->t_xmax));
|
||||||
tup->t_infomask &= ~(HEAP_XACT_MASK);
|
tup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
|
||||||
tup->t_infomask |= HEAP_XMAX_INVALID;
|
tup->t_data->t_infomask |= HEAP_XMAX_INVALID;
|
||||||
|
|
||||||
doinsert(relation, tup);
|
doinsert(relation, tup);
|
||||||
|
|
||||||
@ -1134,7 +1135,7 @@ heap_insert(Relation relation, HeapTuple tup)
|
|||||||
RelationInvalidateHeapTuple(relation, tup);
|
RelationInvalidateHeapTuple(relation, tup);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tup->t_oid;
|
return tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -1147,7 +1148,7 @@ int
|
|||||||
heap_delete(Relation relation, ItemPointer tid)
|
heap_delete(Relation relation, ItemPointer tid)
|
||||||
{
|
{
|
||||||
ItemId lp;
|
ItemId lp;
|
||||||
HeapTuple tp;
|
HeapTupleData tp;
|
||||||
PageHeader dp;
|
PageHeader dp;
|
||||||
Buffer buf;
|
Buffer buf;
|
||||||
|
|
||||||
@ -1186,9 +1187,11 @@ heap_delete(Relation relation, ItemPointer tid)
|
|||||||
* Just like test against non-functional updates we try to catch
|
* Just like test against non-functional updates we try to catch
|
||||||
* non-functional delete attempts. - vadim 05/05/97
|
* non-functional delete attempts. - vadim 05/05/97
|
||||||
*/
|
*/
|
||||||
tp = (HeapTuple) PageGetItem((Page) dp, lp);
|
tp.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
|
||||||
Assert(HeapTupleIsValid(tp));
|
tp.t_len = ItemIdGetLength(lp);
|
||||||
if (TupleUpdatedByCurXactAndCmd(tp))
|
tp.t_self = *tid;
|
||||||
|
|
||||||
|
if (TupleUpdatedByCurXactAndCmd(&tp))
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1204,9 +1207,9 @@ heap_delete(Relation relation, ItemPointer tid)
|
|||||||
* check that we're deleteing a valid item
|
* check that we're deleteing a valid item
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
HeapTupleSatisfies(lp, relation, buf, dp,
|
HeapTupleSatisfies((&tp), relation, buf, dp,
|
||||||
false, 0, (ScanKey) NULL, tp);
|
false, 0, (ScanKey) NULL);
|
||||||
if (!tp)
|
if (!(tp.t_data))
|
||||||
{
|
{
|
||||||
|
|
||||||
/* XXX call something else */
|
/* XXX call something else */
|
||||||
@ -1225,15 +1228,15 @@ heap_delete(Relation relation, ItemPointer tid)
|
|||||||
* store transaction information of xact deleting the tuple
|
* store transaction information of xact deleting the tuple
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
TransactionIdStore(GetCurrentTransactionId(), &(tp->t_xmax));
|
TransactionIdStore(GetCurrentTransactionId(), &(tp.t_data->t_xmax));
|
||||||
tp->t_cmax = GetCurrentCommandId();
|
tp.t_data->t_cmax = GetCurrentCommandId();
|
||||||
tp->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
|
tp.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* invalidate caches
|
* invalidate caches
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
RelationInvalidateHeapTuple(relation, tp);
|
RelationInvalidateHeapTuple(relation, &tp);
|
||||||
|
|
||||||
WriteBuffer(buf);
|
WriteBuffer(buf);
|
||||||
if (IsSystemRelationName(RelationGetRelationName(relation)->data))
|
if (IsSystemRelationName(RelationGetRelationName(relation)->data))
|
||||||
@ -1257,13 +1260,12 @@ heap_delete(Relation relation, ItemPointer tid)
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
heap_replace(Relation relation, ItemPointer otid, HeapTuple replace_tuple)
|
heap_replace(Relation relation, ItemPointer otid, HeapTuple newtup)
|
||||||
{
|
{
|
||||||
ItemId lp;
|
ItemId lp;
|
||||||
HeapTuple old_tuple;
|
HeapTupleData oldtup;
|
||||||
Page dp;
|
Page dp;
|
||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
HeapTuple tuple;
|
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* increment access statistics
|
* increment access statistics
|
||||||
@ -1286,13 +1288,8 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple replace_tuple)
|
|||||||
RelationSetLockForWrite(relation);
|
RelationSetLockForWrite(relation);
|
||||||
|
|
||||||
buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(otid));
|
buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(otid));
|
||||||
#ifndef NO_BUFFERISVALID
|
|
||||||
if (!BufferIsValid(buffer))
|
if (!BufferIsValid(buffer))
|
||||||
{
|
|
||||||
/* XXX L_SH better ??? */
|
|
||||||
elog(ERROR, "amreplace: failed ReadBuffer");
|
elog(ERROR, "amreplace: failed ReadBuffer");
|
||||||
}
|
|
||||||
#endif /* NO_BUFFERISVALID */
|
|
||||||
|
|
||||||
dp = (Page) BufferGetPage(buffer);
|
dp = (Page) BufferGetPage(buffer);
|
||||||
lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(otid));
|
lp = PageGetItemId(dp, ItemPointerGetOffsetNumber(otid));
|
||||||
@ -1302,8 +1299,9 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple replace_tuple)
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
old_tuple = (HeapTuple) PageGetItem(dp, lp);
|
oldtup.t_data = (HeapTupleHeader) PageGetItem(dp, lp);
|
||||||
Assert(HeapTupleIsValid(old_tuple));
|
oldtup.t_len = ItemIdGetLength(lp);
|
||||||
|
oldtup.t_self = *otid;
|
||||||
|
|
||||||
/* -----------------
|
/* -----------------
|
||||||
* the following test should be able to catch all non-functional
|
* the following test should be able to catch all non-functional
|
||||||
@ -1316,7 +1314,7 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple replace_tuple)
|
|||||||
* -----------------
|
* -----------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (TupleUpdatedByCurXactAndCmd(old_tuple))
|
if (TupleUpdatedByCurXactAndCmd(&oldtup))
|
||||||
{
|
{
|
||||||
elog(NOTICE, "Non-functional update, only first update is performed");
|
elog(NOTICE, "Non-functional update, only first update is performed");
|
||||||
if (IsSystemRelationName(RelationGetRelationName(relation)->data))
|
if (IsSystemRelationName(RelationGetRelationName(relation)->data))
|
||||||
@ -1335,34 +1333,33 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple replace_tuple)
|
|||||||
* xact, we only want to flag the 'non-functional' NOTICE. -mer
|
* xact, we only want to flag the 'non-functional' NOTICE. -mer
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
HeapTupleSatisfies(lp,
|
HeapTupleSatisfies((&oldtup),
|
||||||
relation,
|
relation,
|
||||||
buffer,
|
buffer,
|
||||||
(PageHeader) dp,
|
(PageHeader) dp,
|
||||||
false,
|
false,
|
||||||
0,
|
0,
|
||||||
(ScanKey) NULL,
|
(ScanKey) NULL);
|
||||||
tuple);
|
if (!(oldtup.t_data))
|
||||||
if (!tuple)
|
|
||||||
{
|
{
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
elog(ERROR, "heap_replace: (am)invalid otid");
|
elog(ERROR, "heap_replace: (am)invalid otid");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX order problems if not atomic assignment ??? */
|
/* XXX order problems if not atomic assignment ??? */
|
||||||
replace_tuple->t_oid = old_tuple->t_oid;
|
newtup->t_data->t_oid = oldtup.t_data->t_oid;
|
||||||
TransactionIdStore(GetCurrentTransactionId(), &(replace_tuple->t_xmin));
|
TransactionIdStore(GetCurrentTransactionId(), &(newtup->t_data->t_xmin));
|
||||||
replace_tuple->t_cmin = GetCurrentCommandId();
|
newtup->t_data->t_cmin = GetCurrentCommandId();
|
||||||
StoreInvalidTransactionId(&(replace_tuple->t_xmax));
|
StoreInvalidTransactionId(&(newtup->t_data->t_xmax));
|
||||||
replace_tuple->t_infomask &= ~(HEAP_XACT_MASK);
|
newtup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
|
||||||
replace_tuple->t_infomask |= HEAP_XMAX_INVALID;
|
newtup->t_data->t_infomask |= HEAP_XMAX_INVALID;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* insert new item
|
* insert new item
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if ((unsigned) DOUBLEALIGN(replace_tuple->t_len) <= PageGetFreeSpace((Page) dp))
|
if ((unsigned) DOUBLEALIGN(newtup->t_len) <= PageGetFreeSpace((Page) dp))
|
||||||
RelationPutHeapTuple(relation, BufferGetBlockNumber(buffer), replace_tuple);
|
RelationPutHeapTuple(relation, BufferGetBlockNumber(buffer), newtup);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -1370,22 +1367,22 @@ heap_replace(Relation relation, ItemPointer otid, HeapTuple replace_tuple)
|
|||||||
* for a new place to put it.
|
* for a new place to put it.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
doinsert(relation, replace_tuple);
|
doinsert(relation, newtup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* new item in place, now record transaction information
|
* new item in place, now record transaction information
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
TransactionIdStore(GetCurrentTransactionId(), &(old_tuple->t_xmax));
|
TransactionIdStore(GetCurrentTransactionId(), &(oldtup.t_data->t_xmax));
|
||||||
old_tuple->t_cmax = GetCurrentCommandId();
|
oldtup.t_data->t_cmax = GetCurrentCommandId();
|
||||||
old_tuple->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
|
oldtup.t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* invalidate caches
|
* invalidate caches
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
RelationInvalidateHeapTuple(relation, old_tuple);
|
RelationInvalidateHeapTuple(relation, &oldtup);
|
||||||
|
|
||||||
WriteBuffer(buffer);
|
WriteBuffer(buffer);
|
||||||
|
|
||||||
@ -1423,13 +1420,12 @@ heap_markpos(HeapScanDesc scan)
|
|||||||
|
|
||||||
/* Note: no locking manipulations needed */
|
/* Note: no locking manipulations needed */
|
||||||
|
|
||||||
if (scan->rs_ptup == NULL &&
|
if (scan->rs_ptup.t_data == NULL &&
|
||||||
BufferIsUnknown(scan->rs_pbuf))
|
BufferIsUnknown(scan->rs_pbuf))
|
||||||
{ /* == NONTUP */
|
{ /* == NONTUP */
|
||||||
scan->rs_ptup = (HeapTuple)
|
scan->rs_ptup = scan->rs_ctup;
|
||||||
heapgettup(scan->rs_rd,
|
heapgettup(scan->rs_rd,
|
||||||
(scan->rs_ctup == NULL) ?
|
&(scan->rs_ptup),
|
||||||
(ItemPointer) NULL : &scan->rs_ctup->t_ctid,
|
|
||||||
-1,
|
-1,
|
||||||
&scan->rs_pbuf,
|
&scan->rs_pbuf,
|
||||||
scan->rs_snapshot,
|
scan->rs_snapshot,
|
||||||
@ -1437,13 +1433,12 @@ heap_markpos(HeapScanDesc scan)
|
|||||||
scan->rs_key);
|
scan->rs_key);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (scan->rs_ntup == NULL &&
|
else if (scan->rs_ntup.t_data == NULL &&
|
||||||
BufferIsUnknown(scan->rs_nbuf))
|
BufferIsUnknown(scan->rs_nbuf))
|
||||||
{ /* == NONTUP */
|
{ /* == NONTUP */
|
||||||
scan->rs_ntup = (HeapTuple)
|
scan->rs_ntup = scan->rs_ctup;
|
||||||
heapgettup(scan->rs_rd,
|
heapgettup(scan->rs_rd,
|
||||||
(scan->rs_ctup == NULL) ?
|
&(scan->rs_ntup),
|
||||||
(ItemPointer) NULL : &scan->rs_ctup->t_ctid,
|
|
||||||
1,
|
1,
|
||||||
&scan->rs_nbuf,
|
&scan->rs_nbuf,
|
||||||
scan->rs_snapshot,
|
scan->rs_snapshot,
|
||||||
@ -1455,16 +1450,16 @@ heap_markpos(HeapScanDesc scan)
|
|||||||
* Should not unpin the buffer pages. They may still be in use.
|
* Should not unpin the buffer pages. They may still be in use.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if (scan->rs_ptup != NULL)
|
if (scan->rs_ptup.t_data != NULL)
|
||||||
scan->rs_mptid = scan->rs_ptup->t_ctid;
|
scan->rs_mptid = scan->rs_ptup.t_self;
|
||||||
else
|
else
|
||||||
ItemPointerSetInvalid(&scan->rs_mptid);
|
ItemPointerSetInvalid(&scan->rs_mptid);
|
||||||
if (scan->rs_ctup != NULL)
|
if (scan->rs_ctup.t_data != NULL)
|
||||||
scan->rs_mctid = scan->rs_ctup->t_ctid;
|
scan->rs_mctid = scan->rs_ctup.t_self;
|
||||||
else
|
else
|
||||||
ItemPointerSetInvalid(&scan->rs_mctid);
|
ItemPointerSetInvalid(&scan->rs_mctid);
|
||||||
if (scan->rs_ntup != NULL)
|
if (scan->rs_ntup.t_data != NULL)
|
||||||
scan->rs_mntid = scan->rs_ntup->t_ctid;
|
scan->rs_mntid = scan->rs_ntup.t_self;
|
||||||
else
|
else
|
||||||
ItemPointerSetInvalid(&scan->rs_mntid);
|
ItemPointerSetInvalid(&scan->rs_mntid);
|
||||||
}
|
}
|
||||||
@ -1512,40 +1507,43 @@ heap_restrpos(HeapScanDesc scan)
|
|||||||
scan->rs_nbuf = InvalidBuffer;
|
scan->rs_nbuf = InvalidBuffer;
|
||||||
|
|
||||||
if (!ItemPointerIsValid(&scan->rs_mptid))
|
if (!ItemPointerIsValid(&scan->rs_mptid))
|
||||||
scan->rs_ptup = NULL;
|
scan->rs_ptup.t_data = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan->rs_ptup = (HeapTuple)
|
scan->rs_ptup.t_self = scan->rs_mptid;
|
||||||
|
scan->rs_ptup.t_data = (HeapTupleHeader) 0x1; /* for heapgettup */
|
||||||
heapgettup(scan->rs_rd,
|
heapgettup(scan->rs_rd,
|
||||||
&scan->rs_mptid,
|
&(scan->rs_ptup),
|
||||||
0,
|
0,
|
||||||
&scan->rs_pbuf,
|
&(scan->rs_pbuf),
|
||||||
false,
|
false,
|
||||||
0,
|
0,
|
||||||
(ScanKey) NULL);
|
(ScanKey) NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ItemPointerIsValid(&scan->rs_mctid))
|
if (!ItemPointerIsValid(&scan->rs_mctid))
|
||||||
scan->rs_ctup = NULL;
|
scan->rs_ctup.t_data = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan->rs_ctup = (HeapTuple)
|
scan->rs_ctup.t_self = scan->rs_mctid;
|
||||||
|
scan->rs_ctup.t_data = (HeapTupleHeader) 0x1; /* for heapgettup */
|
||||||
heapgettup(scan->rs_rd,
|
heapgettup(scan->rs_rd,
|
||||||
&scan->rs_mctid,
|
&(scan->rs_ctup),
|
||||||
0,
|
0,
|
||||||
&scan->rs_cbuf,
|
&(scan->rs_cbuf),
|
||||||
false,
|
false,
|
||||||
0,
|
0,
|
||||||
(ScanKey) NULL);
|
(ScanKey) NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ItemPointerIsValid(&scan->rs_mntid))
|
if (!ItemPointerIsValid(&scan->rs_mntid))
|
||||||
scan->rs_ntup = NULL;
|
scan->rs_ntup.t_data = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scan->rs_ntup = (HeapTuple)
|
scan->rs_ntup.t_self = scan->rs_mntid;
|
||||||
|
scan->rs_ntup.t_data = (HeapTupleHeader) 0x1; /* for heapgettup */
|
||||||
heapgettup(scan->rs_rd,
|
heapgettup(scan->rs_rd,
|
||||||
&scan->rs_mntid,
|
&(scan->rs_ntup),
|
||||||
0,
|
0,
|
||||||
&scan->rs_nbuf,
|
&scan->rs_nbuf,
|
||||||
false,
|
false,
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Id: hio.c,v 1.13 1998/01/07 21:01:23 momjian Exp $
|
* $Id: hio.c,v 1.14 1998/11/27 19:51:36 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -69,17 +69,17 @@ RelationPutHeapTuple(Relation relation,
|
|||||||
len = (unsigned) DOUBLEALIGN(tuple->t_len); /* be conservative */
|
len = (unsigned) DOUBLEALIGN(tuple->t_len); /* be conservative */
|
||||||
Assert((int) len <= PageGetFreeSpace(pageHeader));
|
Assert((int) len <= PageGetFreeSpace(pageHeader));
|
||||||
|
|
||||||
offnum = PageAddItem((Page) pageHeader, (Item) tuple,
|
offnum = PageAddItem((Page) pageHeader, (Item) tuple->t_data,
|
||||||
tuple->t_len, InvalidOffsetNumber, LP_USED);
|
tuple->t_len, InvalidOffsetNumber, LP_USED);
|
||||||
|
|
||||||
itemId = PageGetItemId((Page) pageHeader, offnum);
|
itemId = PageGetItemId((Page) pageHeader, offnum);
|
||||||
item = PageGetItem((Page) pageHeader, itemId);
|
item = PageGetItem((Page) pageHeader, itemId);
|
||||||
|
|
||||||
ItemPointerSet(&((HeapTuple) item)->t_ctid, blockIndex, offnum);
|
ItemPointerSet(&((HeapTupleHeader) item)->t_ctid, blockIndex, offnum);
|
||||||
|
|
||||||
WriteBuffer(buffer);
|
WriteBuffer(buffer);
|
||||||
/* return an accurate tuple */
|
/* return an accurate tuple */
|
||||||
ItemPointerSet(&tuple->t_ctid, blockIndex, offnum);
|
ItemPointerSet(&tuple->t_self, blockIndex, offnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -160,7 +160,7 @@ RelationPutHeapTupleAtEnd(Relation relation, HeapTuple tuple)
|
|||||||
elog(ERROR, "Tuple is too big: size %d", len);
|
elog(ERROR, "Tuple is too big: size %d", len);
|
||||||
}
|
}
|
||||||
|
|
||||||
offnum = PageAddItem((Page) pageHeader, (Item) tuple,
|
offnum = PageAddItem((Page) pageHeader, (Item) tuple->t_data,
|
||||||
tuple->t_len, InvalidOffsetNumber, LP_USED);
|
tuple->t_len, InvalidOffsetNumber, LP_USED);
|
||||||
|
|
||||||
itemId = PageGetItemId((Page) pageHeader, offnum);
|
itemId = PageGetItemId((Page) pageHeader, offnum);
|
||||||
@ -168,10 +168,10 @@ RelationPutHeapTupleAtEnd(Relation relation, HeapTuple tuple)
|
|||||||
|
|
||||||
lastblock = BufferGetBlockNumber(buffer);
|
lastblock = BufferGetBlockNumber(buffer);
|
||||||
|
|
||||||
ItemPointerSet(&((HeapTuple) item)->t_ctid, lastblock, offnum);
|
ItemPointerSet(&((HeapTupleHeader) item)->t_ctid, lastblock, offnum);
|
||||||
|
|
||||||
/* return an accurate tuple */
|
/* return an accurate tuple */
|
||||||
ItemPointerSet(&tuple->t_ctid, lastblock, offnum);
|
ItemPointerSet(&tuple->t_self, lastblock, offnum);
|
||||||
|
|
||||||
WriteBuffer(buffer);
|
WriteBuffer(buffer);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.30 1998/09/01 04:27:01 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtinsert.c,v 1.31 1998/11/27 19:51:40 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -98,8 +98,7 @@ _bt_doinsert(Relation rel, BTItem btitem, bool index_is_unique, Relation heapRel
|
|||||||
{
|
{
|
||||||
TupleDesc itupdesc;
|
TupleDesc itupdesc;
|
||||||
BTItem btitem;
|
BTItem btitem;
|
||||||
IndexTuple itup;
|
HeapTupleData htup;
|
||||||
HeapTuple htup;
|
|
||||||
BTPageOpaque opaque;
|
BTPageOpaque opaque;
|
||||||
Buffer nbuf;
|
Buffer nbuf;
|
||||||
BlockNumber blkno;
|
BlockNumber blkno;
|
||||||
@ -120,9 +119,9 @@ _bt_doinsert(Relation rel, BTItem btitem, bool index_is_unique, Relation heapRel
|
|||||||
while (_bt_isequal(itupdesc, page, offset, natts, itup_scankey))
|
while (_bt_isequal(itupdesc, page, offset, natts, itup_scankey))
|
||||||
{ /* they're equal */
|
{ /* they're equal */
|
||||||
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offset));
|
btitem = (BTItem) PageGetItem(page, PageGetItemId(page, offset));
|
||||||
itup = &(btitem->bti_itup);
|
htup.t_self = btitem->bti_itup.t_tid;
|
||||||
htup = heap_fetch(heapRel, SnapshotSelf, &(itup->t_tid), &buffer);
|
heap_fetch(heapRel, SnapshotSelf, &htup, &buffer);
|
||||||
if (htup != (HeapTuple) NULL)
|
if (htup.t_data != NULL)
|
||||||
{ /* it is a duplicate */
|
{ /* it is a duplicate */
|
||||||
elog(ERROR, "Cannot insert a duplicate key into a unique index");
|
elog(ERROR, "Cannot insert a duplicate key into a unique index");
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.33 1998/09/07 05:35:33 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.34 1998/11/27 19:51:40 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* This file contains only the public interface routines.
|
* This file contains only the public interface routines.
|
||||||
@ -256,7 +256,7 @@ btbuild(Relation heap,
|
|||||||
* if (itup->t_info & INDEX_NULL_MASK) { pfree(itup); continue; }
|
* if (itup->t_info & INDEX_NULL_MASK) { pfree(itup); continue; }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
itup->t_tid = htup->t_ctid;
|
itup->t_tid = htup->t_self;
|
||||||
btitem = _bt_formitem(itup);
|
btitem = _bt_formitem(itup);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.28 1998/09/01 04:27:10 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.29 1998/11/27 19:51:41 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -233,7 +233,7 @@ rtbuild(Relation heap,
|
|||||||
|
|
||||||
/* form an index tuple and point it at the heap tuple */
|
/* form an index tuple and point it at the heap tuple */
|
||||||
itup = index_formtuple(id, &d[0], nulls);
|
itup = index_formtuple(id, &d[0], nulls);
|
||||||
itup->t_tid = htup->t_ctid;
|
itup->t_tid = htup->t_self;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since we already have the index relation locked, we call
|
* Since we already have the index relation locked, we call
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.51 1998/09/01 04:27:21 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.52 1998/11/27 19:51:45 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -473,7 +473,7 @@ boot_openrel(char *relname)
|
|||||||
app = Typ;
|
app = Typ;
|
||||||
while (HeapTupleIsValid(tup = heap_getnext(scan, 0)))
|
while (HeapTupleIsValid(tup = heap_getnext(scan, 0)))
|
||||||
{
|
{
|
||||||
(*app)->am_oid = tup->t_oid;
|
(*app)->am_oid = tup->t_data->t_oid;
|
||||||
memmove((char *) &(*app++)->am_typ,
|
memmove((char *) &(*app++)->am_typ,
|
||||||
(char *) GETSTRUCT(tup),
|
(char *) GETSTRUCT(tup),
|
||||||
sizeof((*app)->am_typ));
|
sizeof((*app)->am_typ));
|
||||||
@ -634,7 +634,7 @@ InsertOneTuple(Oid objectid)
|
|||||||
pfree(tupDesc); /* just free's tupDesc, not the attrtypes */
|
pfree(tupDesc); /* just free's tupDesc, not the attrtypes */
|
||||||
|
|
||||||
if (objectid != (Oid) 0)
|
if (objectid != (Oid) 0)
|
||||||
tuple->t_oid = objectid;
|
tuple->t_data->t_oid = objectid;
|
||||||
heap_insert(reldesc, tuple);
|
heap_insert(reldesc, tuple);
|
||||||
pfree(tuple);
|
pfree(tuple);
|
||||||
if (DebugMode)
|
if (DebugMode)
|
||||||
@ -830,7 +830,7 @@ gettype(char *type)
|
|||||||
app = Typ;
|
app = Typ;
|
||||||
while (HeapTupleIsValid(tup = heap_getnext(scan, 0)))
|
while (HeapTupleIsValid(tup = heap_getnext(scan, 0)))
|
||||||
{
|
{
|
||||||
(*app)->am_oid = tup->t_oid;
|
(*app)->am_oid = tup->t_data->t_oid;
|
||||||
memmove((char *) &(*app++)->am_typ,
|
memmove((char *) &(*app++)->am_typ,
|
||||||
(char *) GETSTRUCT(tup),
|
(char *) GETSTRUCT(tup),
|
||||||
sizeof((*app)->am_typ));
|
sizeof((*app)->am_typ));
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.16 1998/09/01 04:27:27 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/aclchk.c,v 1.17 1998/11/27 19:51:46 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* See acl.h.
|
* See acl.h.
|
||||||
@ -162,7 +162,7 @@ ChangeAcl(char *relname,
|
|||||||
tuple = heap_modifytuple(tuple, relation, values, nulls, replaces);
|
tuple = heap_modifytuple(tuple, relation, values, nulls, replaces);
|
||||||
/* XXX handle index on pg_class? */
|
/* XXX handle index on pg_class? */
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(relation, &tuple->t_ctid, tuple);
|
heap_replace(relation, &tuple->t_self, tuple);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
|
|
||||||
/* keep the catalog indices up to date */
|
/* keep the catalog indices up to date */
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.66 1998/11/17 14:26:39 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/heap.c,v 1.67 1998/11/27 19:51:48 vadim Exp $
|
||||||
*
|
*
|
||||||
* INTERFACE ROUTINES
|
* INTERFACE ROUTINES
|
||||||
* heap_create() - Create an uncataloged heap relation
|
* heap_create() - Create an uncataloged heap relation
|
||||||
@ -663,7 +663,7 @@ AddPgRelationTuple(Relation pg_class_desc,
|
|||||||
tup = heap_addheader(Natts_pg_class_fixed,
|
tup = heap_addheader(Natts_pg_class_fixed,
|
||||||
CLASS_TUPLE_SIZE,
|
CLASS_TUPLE_SIZE,
|
||||||
(char *) new_rel_reltup);
|
(char *) new_rel_reltup);
|
||||||
tup->t_oid = new_rel_oid;
|
tup->t_data->t_oid = new_rel_oid;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* finally insert the new tuple and free it.
|
* finally insert the new tuple and free it.
|
||||||
@ -929,7 +929,7 @@ RelationRemoveInheritance(Relation relation)
|
|||||||
|
|
||||||
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
||||||
{
|
{
|
||||||
heap_delete(catalogRelation, &tuple->t_ctid);
|
heap_delete(catalogRelation, &tuple->t_self);
|
||||||
found = true;
|
found = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,7 +951,7 @@ RelationRemoveInheritance(Relation relation)
|
|||||||
&entry);
|
&entry);
|
||||||
|
|
||||||
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
|
||||||
heap_delete(catalogRelation, &tuple->t_ctid);
|
heap_delete(catalogRelation, &tuple->t_self);
|
||||||
|
|
||||||
heap_endscan(scan);
|
heap_endscan(scan);
|
||||||
heap_close(catalogRelation);
|
heap_close(catalogRelation);
|
||||||
@ -1020,7 +1020,7 @@ DeletePgRelationTuple(Relation rel)
|
|||||||
* delete the relation tuple from pg_class, and finish up.
|
* delete the relation tuple from pg_class, and finish up.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
heap_delete(pg_class_desc, &tup->t_ctid);
|
heap_delete(pg_class_desc, &tup->t_self);
|
||||||
pfree(tup);
|
pfree(tup);
|
||||||
|
|
||||||
heap_close(pg_class_desc);
|
heap_close(pg_class_desc);
|
||||||
@ -1059,7 +1059,7 @@ DeletePgAttributeTuples(Relation rel)
|
|||||||
Int16GetDatum(attnum),
|
Int16GetDatum(attnum),
|
||||||
0, 0)))
|
0, 0)))
|
||||||
{
|
{
|
||||||
heap_delete(pg_attribute_desc, &tup->t_ctid);
|
heap_delete(pg_attribute_desc, &tup->t_self);
|
||||||
pfree(tup);
|
pfree(tup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1138,7 +1138,7 @@ DeletePgTypeTuple(Relation rel)
|
|||||||
* stonebraker about this. -cim 6/19/90
|
* stonebraker about this. -cim 6/19/90
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
typoid = tup->t_oid;
|
typoid = tup->t_data->t_oid;
|
||||||
|
|
||||||
pg_attribute_desc = heap_openr(AttributeRelationName);
|
pg_attribute_desc = heap_openr(AttributeRelationName);
|
||||||
|
|
||||||
@ -1183,7 +1183,7 @@ DeletePgTypeTuple(Relation rel)
|
|||||||
* we release the read lock on pg_type. -mer 13 Aug 1991
|
* we release the read lock on pg_type. -mer 13 Aug 1991
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
heap_delete(pg_type_desc, &tup->t_ctid);
|
heap_delete(pg_type_desc, &tup->t_self);
|
||||||
|
|
||||||
heap_endscan(pg_type_scan);
|
heap_endscan(pg_type_scan);
|
||||||
heap_close(pg_type_desc);
|
heap_close(pg_type_desc);
|
||||||
@ -1604,7 +1604,7 @@ RemoveAttrDefault(Relation rel)
|
|||||||
adscan = heap_beginscan(adrel, 0, SnapshotNow, 1, &key);
|
adscan = heap_beginscan(adrel, 0, SnapshotNow, 1, &key);
|
||||||
|
|
||||||
while (HeapTupleIsValid(tup = heap_getnext(adscan, 0)))
|
while (HeapTupleIsValid(tup = heap_getnext(adscan, 0)))
|
||||||
heap_delete(adrel, &tup->t_ctid);
|
heap_delete(adrel, &tup->t_self);
|
||||||
|
|
||||||
heap_endscan(adscan);
|
heap_endscan(adscan);
|
||||||
|
|
||||||
@ -1631,7 +1631,7 @@ RemoveRelCheck(Relation rel)
|
|||||||
rcscan = heap_beginscan(rcrel, 0, SnapshotNow, 1, &key);
|
rcscan = heap_beginscan(rcrel, 0, SnapshotNow, 1, &key);
|
||||||
|
|
||||||
while (HeapTupleIsValid(tup = heap_getnext(rcscan, 0)))
|
while (HeapTupleIsValid(tup = heap_getnext(rcscan, 0)))
|
||||||
heap_delete(rcrel, &tup->t_ctid);
|
heap_delete(rcrel, &tup->t_self);
|
||||||
|
|
||||||
heap_endscan(rcscan);
|
heap_endscan(rcscan);
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.63 1998/09/10 15:32:16 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/index.c,v 1.64 1998/11/27 19:51:49 vadim Exp $
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* INTERFACE ROUTINES
|
* INTERFACE ROUTINES
|
||||||
@ -150,7 +150,7 @@ RelationNameGetObjectId(char *relationName,
|
|||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
|
|
||||||
if (HeapTupleIsValid(tuple))
|
if (HeapTupleIsValid(tuple))
|
||||||
return tuple->t_oid;
|
return tuple->t_data->t_oid;
|
||||||
else
|
else
|
||||||
return InvalidOid;
|
return InvalidOid;
|
||||||
}
|
}
|
||||||
@ -176,7 +176,7 @@ RelationNameGetObjectId(char *relationName,
|
|||||||
if (!HeapTupleIsValid(pg_class_tuple))
|
if (!HeapTupleIsValid(pg_class_tuple))
|
||||||
relationObjectId = InvalidOid;
|
relationObjectId = InvalidOid;
|
||||||
else
|
else
|
||||||
relationObjectId = pg_class_tuple->t_oid;
|
relationObjectId = pg_class_tuple->t_data->t_oid;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* cleanup and return results
|
* cleanup and return results
|
||||||
@ -412,7 +412,7 @@ ConstructTupleDescriptor(Oid heapoid,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
elog(ERROR, "create index: type '%s' undefined",
|
elog(ERROR, "create index: type '%s' undefined",
|
||||||
IndexKeyType->name);
|
IndexKeyType->name);
|
||||||
((Form_pg_attribute) to)->atttypid = tup->t_oid;
|
((Form_pg_attribute) to)->atttypid = tup->t_data->t_oid;
|
||||||
((Form_pg_attribute) to)->attbyval =
|
((Form_pg_attribute) to)->attbyval =
|
||||||
((Form_pg_type) GETSTRUCT(tup))->typbyval;
|
((Form_pg_type) GETSTRUCT(tup))->typbyval;
|
||||||
((Form_pg_attribute) to)->attlen =
|
((Form_pg_attribute) to)->attlen =
|
||||||
@ -558,7 +558,7 @@ UpdateRelationRelation(Relation indexRelation)
|
|||||||
* company.
|
* company.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
tuple->t_oid = RelationGetRelid(indexRelation);
|
tuple->t_data->t_oid = RelationGetRelid(indexRelation);
|
||||||
heap_insert(pg_class, tuple);
|
heap_insert(pg_class, tuple);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -575,7 +575,7 @@ UpdateRelationRelation(Relation indexRelation)
|
|||||||
CatalogCloseIndices(Num_pg_class_indices, idescs);
|
CatalogCloseIndices(Num_pg_class_indices, idescs);
|
||||||
}
|
}
|
||||||
|
|
||||||
tupleOid = tuple->t_oid;
|
tupleOid = tuple->t_data->t_oid;
|
||||||
pfree(tuple);
|
pfree(tuple);
|
||||||
heap_close(pg_class);
|
heap_close(pg_class);
|
||||||
|
|
||||||
@ -913,7 +913,7 @@ UpdateIndexPredicate(Oid indexoid, Node *oldPred, Node *predicate)
|
|||||||
|
|
||||||
newtup = heap_modifytuple(tuple, pg_index, values, nulls, replace);
|
newtup = heap_modifytuple(tuple, pg_index, values, nulls, replace);
|
||||||
|
|
||||||
heap_replace(pg_index, &newtup->t_ctid, newtup);
|
heap_replace(pg_index, &newtup->t_self, newtup);
|
||||||
|
|
||||||
pfree(newtup);
|
pfree(newtup);
|
||||||
heap_close(pg_index);
|
heap_close(pg_index);
|
||||||
@ -1104,7 +1104,7 @@ index_create(char *heapRelationName,
|
|||||||
func_error("index_create", FIgetname(funcInfo),
|
func_error("index_create", FIgetname(funcInfo),
|
||||||
FIgetnArgs(funcInfo), FIgetArglist(funcInfo), NULL);
|
FIgetnArgs(funcInfo), FIgetArglist(funcInfo), NULL);
|
||||||
}
|
}
|
||||||
FIgetProcOid(funcInfo) = proc_tup->t_oid;
|
FIgetProcOid(funcInfo) = proc_tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -1195,7 +1195,7 @@ index_destroy(Oid indexId)
|
|||||||
|
|
||||||
AssertState(HeapTupleIsValid(tuple));
|
AssertState(HeapTupleIsValid(tuple));
|
||||||
|
|
||||||
heap_delete(relationRelation, &tuple->t_ctid);
|
heap_delete(relationRelation, &tuple->t_self);
|
||||||
pfree(tuple);
|
pfree(tuple);
|
||||||
heap_close(relationRelation);
|
heap_close(relationRelation);
|
||||||
|
|
||||||
@ -1212,7 +1212,7 @@ index_destroy(Oid indexId)
|
|||||||
Int16GetDatum(attnum),
|
Int16GetDatum(attnum),
|
||||||
0, 0)))
|
0, 0)))
|
||||||
{
|
{
|
||||||
heap_delete(attributeRelation, &tuple->t_ctid);
|
heap_delete(attributeRelation, &tuple->t_self);
|
||||||
pfree(tuple);
|
pfree(tuple);
|
||||||
attnum++;
|
attnum++;
|
||||||
}
|
}
|
||||||
@ -1232,7 +1232,7 @@ index_destroy(Oid indexId)
|
|||||||
|
|
||||||
indexRelation = heap_openr(IndexRelationName);
|
indexRelation = heap_openr(IndexRelationName);
|
||||||
|
|
||||||
heap_delete(indexRelation, &tuple->t_ctid);
|
heap_delete(indexRelation, &tuple->t_self);
|
||||||
pfree(tuple);
|
pfree(tuple);
|
||||||
heap_close(indexRelation);
|
heap_close(indexRelation);
|
||||||
|
|
||||||
@ -1424,7 +1424,7 @@ UpdateStats(Oid relid, long reltuples, bool hasindex)
|
|||||||
values[Anum_pg_class_relhasindex - 1] = CharGetDatum(hasindex);
|
values[Anum_pg_class_relhasindex - 1] = CharGetDatum(hasindex);
|
||||||
|
|
||||||
newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace);
|
newtup = heap_modifytuple(tuple, pg_class, values, nulls, replace);
|
||||||
heap_replace(pg_class, &tuple->t_ctid, newtup);
|
heap_replace(pg_class, &tuple->t_self, newtup);
|
||||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
|
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
|
||||||
CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup);
|
CatalogIndexInsert(idescs, Num_pg_class_indices, pg_class, newtup);
|
||||||
CatalogCloseIndices(Num_pg_class_indices, idescs);
|
CatalogCloseIndices(Num_pg_class_indices, idescs);
|
||||||
@ -1626,10 +1626,10 @@ DefaultBuild(Relation heapRelation,
|
|||||||
datum,
|
datum,
|
||||||
nullv);
|
nullv);
|
||||||
|
|
||||||
indexTuple->t_tid = heapTuple->t_ctid;
|
indexTuple->t_tid = heapTuple->t_self;
|
||||||
|
|
||||||
insertResult = index_insert(indexRelation, datum, nullv,
|
insertResult = index_insert(indexRelation, datum, nullv,
|
||||||
&(heapTuple->t_ctid), heapRelation);
|
&(heapTuple->t_self), heapRelation);
|
||||||
|
|
||||||
if (insertResult)
|
if (insertResult)
|
||||||
pfree(insertResult);
|
pfree(insertResult);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.33 1998/10/02 05:10:10 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/indexing.c,v 1.34 1998/11/27 19:51:50 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -161,7 +161,7 @@ CatalogIndexInsert(Relation *idescs,
|
|||||||
finfoP);
|
finfoP);
|
||||||
|
|
||||||
indexRes = index_insert(idescs[i], datum, nulls,
|
indexRes = index_insert(idescs[i], datum, nulls,
|
||||||
&heapTuple->t_ctid, heapRelation);
|
&heapTuple->t_self, heapRelation);
|
||||||
if (indexRes)
|
if (indexRes)
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
|
|
||||||
@ -230,28 +230,30 @@ CatalogIndexFetchTuple(Relation heapRelation,
|
|||||||
{
|
{
|
||||||
IndexScanDesc sd;
|
IndexScanDesc sd;
|
||||||
RetrieveIndexResult indexRes;
|
RetrieveIndexResult indexRes;
|
||||||
HeapTuple tuple = NULL;
|
HeapTupleData tuple;
|
||||||
|
HeapTuple result = NULL;
|
||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
|
|
||||||
sd = index_beginscan(idesc, false, num_keys, skey);
|
sd = index_beginscan(idesc, false, num_keys, skey);
|
||||||
|
tuple.t_data = NULL;
|
||||||
while ((indexRes = index_getnext(sd, ForwardScanDirection)))
|
while ((indexRes = index_getnext(sd, ForwardScanDirection)))
|
||||||
{
|
{
|
||||||
tuple = heap_fetch(heapRelation, SnapshotNow, &indexRes->heap_iptr,
|
tuple.t_self = indexRes->heap_iptr;
|
||||||
&buffer);
|
heap_fetch(heapRelation, SnapshotNow, &tuple, &buffer);
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
if (HeapTupleIsValid(tuple))
|
if (tuple.t_data != NULL)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HeapTupleIsValid(tuple))
|
if (tuple.t_data != NULL)
|
||||||
{
|
{
|
||||||
tuple = heap_copytuple(tuple);
|
result = heap_copytuple(&tuple);
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
index_endscan(sd);
|
index_endscan(sd);
|
||||||
pfree(sd);
|
pfree(sd);
|
||||||
return tuple;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.17 1998/09/01 04:27:34 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_aggregate.c,v 1.18 1998/11/27 19:51:50 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -95,7 +95,7 @@ AggregateCreate(char *aggName,
|
|||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
elog(ERROR, "AggregateCreate: Type '%s' undefined", aggbasetypeName);
|
elog(ERROR, "AggregateCreate: Type '%s' undefined", aggbasetypeName);
|
||||||
xbase = tup->t_oid;
|
xbase = tup->t_data->t_oid;
|
||||||
|
|
||||||
if (aggtransfn1Name)
|
if (aggtransfn1Name)
|
||||||
{
|
{
|
||||||
@ -105,7 +105,7 @@ AggregateCreate(char *aggName,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
elog(ERROR, "AggregateCreate: Type '%s' undefined",
|
elog(ERROR, "AggregateCreate: Type '%s' undefined",
|
||||||
aggtransfn1typeName);
|
aggtransfn1typeName);
|
||||||
xret1 = tup->t_oid;
|
xret1 = tup->t_data->t_oid;
|
||||||
|
|
||||||
fnArgs[0] = xret1;
|
fnArgs[0] = xret1;
|
||||||
fnArgs[1] = xbase;
|
fnArgs[1] = xbase;
|
||||||
@ -121,7 +121,7 @@ AggregateCreate(char *aggName,
|
|||||||
elog(ERROR, "AggregateCreate: return type of '%s' is not '%s'",
|
elog(ERROR, "AggregateCreate: return type of '%s' is not '%s'",
|
||||||
aggtransfn1Name,
|
aggtransfn1Name,
|
||||||
aggtransfn1typeName);
|
aggtransfn1typeName);
|
||||||
xfn1 = tup->t_oid;
|
xfn1 = tup->t_data->t_oid;
|
||||||
if (!OidIsValid(xfn1) || !OidIsValid(xret1) ||
|
if (!OidIsValid(xfn1) || !OidIsValid(xret1) ||
|
||||||
!OidIsValid(xbase))
|
!OidIsValid(xbase))
|
||||||
elog(ERROR, "AggregateCreate: bogus function '%s'", aggfinalfnName);
|
elog(ERROR, "AggregateCreate: bogus function '%s'", aggfinalfnName);
|
||||||
@ -135,7 +135,7 @@ AggregateCreate(char *aggName,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
elog(ERROR, "AggregateCreate: Type '%s' undefined",
|
elog(ERROR, "AggregateCreate: Type '%s' undefined",
|
||||||
aggtransfn2typeName);
|
aggtransfn2typeName);
|
||||||
xret2 = tup->t_oid;
|
xret2 = tup->t_data->t_oid;
|
||||||
|
|
||||||
fnArgs[0] = xret2;
|
fnArgs[0] = xret2;
|
||||||
fnArgs[1] = 0;
|
fnArgs[1] = 0;
|
||||||
@ -150,7 +150,7 @@ AggregateCreate(char *aggName,
|
|||||||
if (((Form_pg_proc) GETSTRUCT(tup))->prorettype != xret2)
|
if (((Form_pg_proc) GETSTRUCT(tup))->prorettype != xret2)
|
||||||
elog(ERROR, "AggregateCreate: return type of '%s' is not '%s'",
|
elog(ERROR, "AggregateCreate: return type of '%s' is not '%s'",
|
||||||
aggtransfn2Name, aggtransfn2typeName);
|
aggtransfn2Name, aggtransfn2typeName);
|
||||||
xfn2 = tup->t_oid;
|
xfn2 = tup->t_data->t_oid;
|
||||||
if (!OidIsValid(xfn2) || !OidIsValid(xret2))
|
if (!OidIsValid(xfn2) || !OidIsValid(xret2))
|
||||||
elog(ERROR, "AggregateCreate: bogus function '%s'", aggfinalfnName);
|
elog(ERROR, "AggregateCreate: bogus function '%s'", aggfinalfnName);
|
||||||
}
|
}
|
||||||
@ -183,7 +183,7 @@ AggregateCreate(char *aggName,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
elog(ERROR, "AggregateCreate: '%s'('%s','%s') does not exist",
|
elog(ERROR, "AggregateCreate: '%s'('%s','%s') does not exist",
|
||||||
aggfinalfnName, aggtransfn1typeName, aggtransfn2typeName);
|
aggfinalfnName, aggtransfn1typeName, aggtransfn2typeName);
|
||||||
ffn = tup->t_oid;
|
ffn = tup->t_data->t_oid;
|
||||||
proc = (Form_pg_proc) GETSTRUCT(tup);
|
proc = (Form_pg_proc) GETSTRUCT(tup);
|
||||||
fret = proc->prorettype;
|
fret = proc->prorettype;
|
||||||
if (!OidIsValid(ffn) || !OidIsValid(fret))
|
if (!OidIsValid(ffn) || !OidIsValid(fret))
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.29 1998/09/01 04:27:36 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_operator.c,v 1.30 1998/11/27 19:51:50 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* these routines moved here from commands/define.c and somewhat cleaned up.
|
* these routines moved here from commands/define.c and somewhat cleaned up.
|
||||||
@ -125,7 +125,7 @@ OperatorGetWithOpenRelation(Relation pg_operator_desc,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
tup = heap_getnext(pg_operator_scan, 0);
|
tup = heap_getnext(pg_operator_scan, 0);
|
||||||
operatorObjectId = HeapTupleIsValid(tup) ? tup->t_oid : InvalidOid;
|
operatorObjectId = HeapTupleIsValid(tup) ? tup->t_data->t_oid : InvalidOid;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* close the scan and return the oid.
|
* close the scan and return the oid.
|
||||||
@ -279,7 +279,7 @@ OperatorShellMakeWithOpenRelation(Relation pg_operator_desc,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
heap_insert(pg_operator_desc, tup);
|
heap_insert(pg_operator_desc, tup);
|
||||||
operatorObjectId = tup->t_oid;
|
operatorObjectId = tup->t_data->t_oid;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* free the tuple and return the operator oid
|
* free the tuple and return the operator oid
|
||||||
@ -413,7 +413,7 @@ OperatorShellMake(char *operatorName,
|
|||||||
* if the operator shell is being filled in
|
* if the operator shell is being filled in
|
||||||
* access the catalog in order to get a valid buffer
|
* access the catalog in order to get a valid buffer
|
||||||
* create a tuple using ModifyHeapTuple
|
* create a tuple using ModifyHeapTuple
|
||||||
* get the t_ctid from the modified tuple and call RelationReplaceHeapTuple
|
* get the t_self from the modified tuple and call RelationReplaceHeapTuple
|
||||||
* else if a new operator is being created
|
* else if a new operator is being created
|
||||||
* create a tuple using heap_formtuple
|
* create a tuple using heap_formtuple
|
||||||
* call heap_insert
|
* call heap_insert
|
||||||
@ -544,7 +544,7 @@ OperatorDef(char *operatorName,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
func_error("OperatorDef", procedureName, nargs, typeId, NULL);
|
func_error("OperatorDef", procedureName, nargs, typeId, NULL);
|
||||||
|
|
||||||
values[Anum_pg_operator_oprcode - 1] = ObjectIdGetDatum(tup->t_oid);
|
values[Anum_pg_operator_oprcode - 1] = ObjectIdGetDatum(tup->t_data->t_oid);
|
||||||
values[Anum_pg_operator_oprresult - 1] =
|
values[Anum_pg_operator_oprresult - 1] =
|
||||||
ObjectIdGetDatum(((Form_pg_proc)
|
ObjectIdGetDatum(((Form_pg_proc)
|
||||||
GETSTRUCT(tup))->prorettype);
|
GETSTRUCT(tup))->prorettype);
|
||||||
@ -569,7 +569,7 @@ OperatorDef(char *operatorName,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
func_error("OperatorDef", restrictionName, 5, typeId, NULL);
|
func_error("OperatorDef", restrictionName, 5, typeId, NULL);
|
||||||
|
|
||||||
values[Anum_pg_operator_oprrest - 1] = ObjectIdGetDatum(tup->t_oid);
|
values[Anum_pg_operator_oprrest - 1] = ObjectIdGetDatum(tup->t_data->t_oid);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
values[Anum_pg_operator_oprrest - 1] = ObjectIdGetDatum(InvalidOid);
|
values[Anum_pg_operator_oprrest - 1] = ObjectIdGetDatum(InvalidOid);
|
||||||
@ -595,7 +595,7 @@ OperatorDef(char *operatorName,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
func_error("OperatorDef", joinName, 5, typeId, NULL);
|
func_error("OperatorDef", joinName, 5, typeId, NULL);
|
||||||
|
|
||||||
values[Anum_pg_operator_oprjoin - 1] = ObjectIdGetDatum(tup->t_oid);
|
values[Anum_pg_operator_oprjoin - 1] = ObjectIdGetDatum(tup->t_data->t_oid);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
values[Anum_pg_operator_oprjoin - 1] = ObjectIdGetDatum(InvalidOid);
|
values[Anum_pg_operator_oprjoin - 1] = ObjectIdGetDatum(InvalidOid);
|
||||||
@ -685,7 +685,7 @@ OperatorDef(char *operatorName,
|
|||||||
/* last three fields were filled in first */
|
/* last three fields were filled in first */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we are adding to an operator shell, get its t_ctid
|
* If we are adding to an operator shell, get its t_self
|
||||||
*/
|
*/
|
||||||
pg_operator_desc = heap_openr(OperatorRelationName);
|
pg_operator_desc = heap_openr(OperatorRelationName);
|
||||||
|
|
||||||
@ -711,7 +711,7 @@ OperatorDef(char *operatorName,
|
|||||||
replaces);
|
replaces);
|
||||||
|
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(pg_operator_desc, &tup->t_ctid, tup);
|
heap_replace(pg_operator_desc, &tup->t_self, tup);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -725,7 +725,7 @@ OperatorDef(char *operatorName,
|
|||||||
tup = heap_formtuple(tupDesc, values, nulls);
|
tup = heap_formtuple(tupDesc, values, nulls);
|
||||||
|
|
||||||
heap_insert(pg_operator_desc, tup);
|
heap_insert(pg_operator_desc, tup);
|
||||||
operatorObjectId = tup->t_oid;
|
operatorObjectId = tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
heap_close(pg_operator_desc);
|
heap_close(pg_operator_desc);
|
||||||
@ -830,7 +830,7 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
|
|||||||
replaces);
|
replaces);
|
||||||
|
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(pg_operator_desc, &tup->t_ctid, tup);
|
heap_replace(pg_operator_desc, &tup->t_self, tup);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -855,7 +855,7 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
|
|||||||
replaces);
|
replaces);
|
||||||
|
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(pg_operator_desc, &tup->t_ctid, tup);
|
heap_replace(pg_operator_desc, &tup->t_self, tup);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
|
|
||||||
values[Anum_pg_operator_oprcom - 1] = (Datum) NULL;
|
values[Anum_pg_operator_oprcom - 1] = (Datum) NULL;
|
||||||
@ -884,7 +884,7 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId)
|
|||||||
replaces);
|
replaces);
|
||||||
|
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(pg_operator_desc, &tup->t_ctid, tup);
|
heap_replace(pg_operator_desc, &tup->t_self, tup);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.23 1998/09/01 04:27:37 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_proc.c,v 1.24 1998/11/27 19:51:51 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -144,7 +144,7 @@ ProcedureCreate(char *procedureName,
|
|||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
pfree(prosrctext);
|
pfree(prosrctext);
|
||||||
if (HeapTupleIsValid(tup))
|
if (HeapTupleIsValid(tup))
|
||||||
return tup->t_oid;
|
return tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,7 +155,7 @@ ProcedureCreate(char *procedureName,
|
|||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
elog(ERROR, "ProcedureCreate: no such language %s", languageName);
|
elog(ERROR, "ProcedureCreate: no such language %s", languageName);
|
||||||
|
|
||||||
languageObjectId = tup->t_oid;
|
languageObjectId = tup->t_data->t_oid;
|
||||||
|
|
||||||
if (strcmp(returnTypeName, "opaque") == 0)
|
if (strcmp(returnTypeName, "opaque") == 0)
|
||||||
{
|
{
|
||||||
@ -276,5 +276,5 @@ ProcedureCreate(char *procedureName,
|
|||||||
CatalogCloseIndices(Num_pg_proc_indices, idescs);
|
CatalogCloseIndices(Num_pg_proc_indices, idescs);
|
||||||
}
|
}
|
||||||
heap_close(rel);
|
heap_close(rel);
|
||||||
return tup->t_oid;
|
return tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.30 1998/09/01 04:27:39 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/catalog/pg_type.c,v 1.31 1998/11/27 19:51:51 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -99,7 +99,7 @@ TypeGetWithOpenRelation(Relation pg_type_desc,
|
|||||||
heap_endscan(scan);
|
heap_endscan(scan);
|
||||||
*defined = (bool) ((Form_pg_type) GETSTRUCT(tup))->typisdefined;
|
*defined = (bool) ((Form_pg_type) GETSTRUCT(tup))->typisdefined;
|
||||||
|
|
||||||
return tup->t_oid;
|
return tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
@ -212,7 +212,7 @@ TypeShellMakeWithOpenRelation(Relation pg_type_desc, char *typeName)
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
heap_insert(pg_type_desc, tup);
|
heap_insert(pg_type_desc, tup);
|
||||||
typoid = tup->t_oid;
|
typoid = tup->t_data->t_oid;
|
||||||
|
|
||||||
if (RelationGetForm(pg_type_desc)->relhasindex)
|
if (RelationGetForm(pg_type_desc)->relhasindex)
|
||||||
{
|
{
|
||||||
@ -430,7 +430,7 @@ TypeCreate(char *typeName,
|
|||||||
func_error("TypeCreate", procname, 1, argList, NULL);
|
func_error("TypeCreate", procname, 1, argList, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
values[i++] = (Datum) tup->t_oid; /* 11 - 14 */
|
values[i++] = (Datum) tup->t_data->t_oid; /* 11 - 14 */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -484,10 +484,10 @@ TypeCreate(char *typeName,
|
|||||||
replaces);
|
replaces);
|
||||||
|
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(pg_type_desc, &tup->t_ctid, tup);
|
heap_replace(pg_type_desc, &tup->t_self, tup);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
|
|
||||||
typeObjectId = tup->t_oid;
|
typeObjectId = tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -499,7 +499,7 @@ TypeCreate(char *typeName,
|
|||||||
|
|
||||||
heap_insert(pg_type_desc, tup);
|
heap_insert(pg_type_desc, tup);
|
||||||
|
|
||||||
typeObjectId = tup->t_oid;
|
typeObjectId = tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -561,7 +561,7 @@ TypeRename(char *oldTypeName, char *newTypeName)
|
|||||||
namestrcpy(&(((Form_pg_type) GETSTRUCT(oldtup))->typname), newTypeName);
|
namestrcpy(&(((Form_pg_type) GETSTRUCT(oldtup))->typname), newTypeName);
|
||||||
|
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(pg_type_desc, &oldtup->t_ctid, oldtup);
|
heap_replace(pg_type_desc, &oldtup->t_self, oldtup);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
|
|
||||||
/* update the system catalog indices */
|
/* update the system catalog indices */
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* Copyright (c) 1994, Regents of the University of California
|
* Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.41 1998/10/06 02:39:59 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/async.c,v 1.42 1998/11/27 19:51:53 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -321,7 +321,7 @@ Async_Unlisten(char *relname, int pid)
|
|||||||
{
|
{
|
||||||
lRel = heap_openr(ListenerRelationName);
|
lRel = heap_openr(ListenerRelationName);
|
||||||
RelationSetLockForWrite(lRel);
|
RelationSetLockForWrite(lRel);
|
||||||
heap_delete(lRel, &lTuple->t_ctid);
|
heap_delete(lRel, &lTuple->t_self);
|
||||||
RelationUnsetLockForWrite(lRel);
|
RelationUnsetLockForWrite(lRel);
|
||||||
heap_close(lRel);
|
heap_close(lRel);
|
||||||
}
|
}
|
||||||
@ -369,7 +369,7 @@ Async_UnlistenAll()
|
|||||||
sRel = heap_beginscan(lRel, 0, SnapshotNow, 1, key);
|
sRel = heap_beginscan(lRel, 0, SnapshotNow, 1, key);
|
||||||
|
|
||||||
while (HeapTupleIsValid(lTuple = heap_getnext(sRel, 0)))
|
while (HeapTupleIsValid(lTuple = heap_getnext(sRel, 0)))
|
||||||
heap_delete(lRel, &lTuple->t_ctid);
|
heap_delete(lRel, &lTuple->t_self);
|
||||||
|
|
||||||
heap_endscan(sRel);
|
heap_endscan(sRel);
|
||||||
RelationUnsetLockForWrite(lRel);
|
RelationUnsetLockForWrite(lRel);
|
||||||
@ -516,7 +516,7 @@ AtCommit_Notify()
|
|||||||
* but as far as I can see we should just do it for any
|
* but as far as I can see we should just do it for any
|
||||||
* failure (certainly at least for EPERM too...)
|
* failure (certainly at least for EPERM too...)
|
||||||
*/
|
*/
|
||||||
heap_delete(lRel, &lTuple->t_ctid);
|
heap_delete(lRel, &lTuple->t_self);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -527,7 +527,7 @@ AtCommit_Notify()
|
|||||||
{
|
{
|
||||||
rTuple = heap_modifytuple(lTuple, lRel,
|
rTuple = heap_modifytuple(lTuple, lRel,
|
||||||
value, nulls, repl);
|
value, nulls, repl);
|
||||||
heap_replace(lRel, &lTuple->t_ctid, rTuple);
|
heap_replace(lRel, &lTuple->t_self, rTuple);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -772,7 +772,7 @@ ProcessIncomingNotify(void)
|
|||||||
NotifyMyFrontEnd(relname, sourcePID);
|
NotifyMyFrontEnd(relname, sourcePID);
|
||||||
/* Rewrite the tuple with 0 in notification column */
|
/* Rewrite the tuple with 0 in notification column */
|
||||||
rTuple = heap_modifytuple(lTuple, lRel, value, nulls, repl);
|
rTuple = heap_modifytuple(lTuple, lRel, value, nulls, repl);
|
||||||
heap_replace(lRel, &lTuple->t_ctid, rTuple);
|
heap_replace(lRel, &lTuple->t_self, rTuple);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
heap_endscan(sRel);
|
heap_endscan(sRel);
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.32 1998/09/23 04:22:01 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/cluster.c,v 1.33 1998/11/27 19:51:54 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -335,8 +335,7 @@ rebuildheap(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex)
|
|||||||
LocalOldIndex;
|
LocalOldIndex;
|
||||||
IndexScanDesc ScanDesc;
|
IndexScanDesc ScanDesc;
|
||||||
RetrieveIndexResult ScanResult;
|
RetrieveIndexResult ScanResult;
|
||||||
ItemPointer HeapTid;
|
HeapTupleData LocalHeapTuple;
|
||||||
HeapTuple LocalHeapTuple;
|
|
||||||
Buffer LocalBuffer;
|
Buffer LocalBuffer;
|
||||||
Oid OIDNewHeapInsert;
|
Oid OIDNewHeapInsert;
|
||||||
|
|
||||||
@ -353,10 +352,10 @@ rebuildheap(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex)
|
|||||||
while ((ScanResult = index_getnext(ScanDesc, ForwardScanDirection)) != NULL)
|
while ((ScanResult = index_getnext(ScanDesc, ForwardScanDirection)) != NULL)
|
||||||
{
|
{
|
||||||
|
|
||||||
HeapTid = &ScanResult->heap_iptr;
|
LocalHeapTuple.t_self = ScanResult->heap_iptr;
|
||||||
LocalHeapTuple = heap_fetch(LocalOldHeap, SnapshotNow, HeapTid, &LocalBuffer);
|
heap_fetch(LocalOldHeap, SnapshotNow, &LocalHeapTuple, &LocalBuffer);
|
||||||
OIDNewHeapInsert =
|
OIDNewHeapInsert =
|
||||||
heap_insert(LocalNewHeap, LocalHeapTuple);
|
heap_insert(LocalNewHeap, &LocalHeapTuple);
|
||||||
pfree(ScanResult);
|
pfree(ScanResult);
|
||||||
ReleaseBuffer(LocalBuffer);
|
ReleaseBuffer(LocalBuffer);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.32 1998/09/01 04:27:46 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.33 1998/11/27 19:51:54 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* The PortalExecutorHeapMemory crap needs to be eliminated
|
* The PortalExecutorHeapMemory crap needs to be eliminated
|
||||||
@ -405,7 +405,7 @@ PerformAddAttribute(char *relationName,
|
|||||||
if (hasindex)
|
if (hasindex)
|
||||||
CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
|
CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, idescs);
|
||||||
|
|
||||||
attributeD.attrelid = reltup->t_oid;
|
attributeD.attrelid = reltup->t_data->t_oid;
|
||||||
|
|
||||||
attributeTuple = heap_addheader(Natts_pg_attribute,
|
attributeTuple = heap_addheader(Natts_pg_attribute,
|
||||||
sizeof attributeD,
|
sizeof attributeD,
|
||||||
@ -422,7 +422,7 @@ PerformAddAttribute(char *relationName,
|
|||||||
int attnelems;
|
int attnelems;
|
||||||
|
|
||||||
tup = SearchSysCacheTuple(ATTNAME,
|
tup = SearchSysCacheTuple(ATTNAME,
|
||||||
ObjectIdGetDatum(reltup->t_oid),
|
ObjectIdGetDatum(reltup->t_data->t_oid),
|
||||||
PointerGetDatum(colDef->colname),
|
PointerGetDatum(colDef->colname),
|
||||||
0, 0);
|
0, 0);
|
||||||
|
|
||||||
@ -456,7 +456,7 @@ PerformAddAttribute(char *relationName,
|
|||||||
if (!HeapTupleIsValid(typeTuple))
|
if (!HeapTupleIsValid(typeTuple))
|
||||||
elog(ERROR, "Add: type \"%s\" nonexistent", typename);
|
elog(ERROR, "Add: type \"%s\" nonexistent", typename);
|
||||||
namestrcpy(&(attribute->attname), colDef->colname);
|
namestrcpy(&(attribute->attname), colDef->colname);
|
||||||
attribute->atttypid = typeTuple->t_oid;
|
attribute->atttypid = typeTuple->t_data->t_oid;
|
||||||
attribute->attlen = form->typlen;
|
attribute->attlen = form->typlen;
|
||||||
attributeD.attdisbursion = 0;
|
attributeD.attdisbursion = 0;
|
||||||
attribute->attcacheoff = -1;
|
attribute->attcacheoff = -1;
|
||||||
@ -482,7 +482,7 @@ PerformAddAttribute(char *relationName,
|
|||||||
heap_close(attrdesc);
|
heap_close(attrdesc);
|
||||||
|
|
||||||
((Form_pg_class) GETSTRUCT(reltup))->relnatts = maxatts;
|
((Form_pg_class) GETSTRUCT(reltup))->relnatts = maxatts;
|
||||||
heap_replace(rel, &reltup->t_ctid, reltup);
|
heap_replace(rel, &reltup->t_self, reltup);
|
||||||
|
|
||||||
/* keep catalog indices current */
|
/* keep catalog indices current */
|
||||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
|
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.63 1998/10/26 00:59:21 tgl Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.64 1998/11/27 19:51:54 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -277,7 +277,7 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
|
|||||||
|
|
||||||
if (oids && !binary)
|
if (oids && !binary)
|
||||||
{
|
{
|
||||||
fputs(oidout(tuple->t_oid), fp);
|
fputs(oidout(tuple->t_data->t_oid), fp);
|
||||||
fputc(delim[0], fp);
|
fputc(delim[0], fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,10 +331,10 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
|
|||||||
null_ct++;
|
null_ct++;
|
||||||
}
|
}
|
||||||
|
|
||||||
length = tuple->t_len - tuple->t_hoff;
|
length = tuple->t_len - tuple->t_data->t_hoff;
|
||||||
fwrite(&length, sizeof(int32), 1, fp);
|
fwrite(&length, sizeof(int32), 1, fp);
|
||||||
if (oids)
|
if (oids)
|
||||||
fwrite((char *) &tuple->t_oid, sizeof(int32), 1, fp);
|
fwrite((char *) &tuple->t_data->t_oid, sizeof(int32), 1, fp);
|
||||||
|
|
||||||
fwrite(&null_ct, sizeof(int32), 1, fp);
|
fwrite(&null_ct, sizeof(int32), 1, fp);
|
||||||
if (null_ct > 0)
|
if (null_ct > 0)
|
||||||
@ -348,7 +348,8 @@ CopyTo(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fwrite((char *) tuple + tuple->t_hoff, length, 1, fp);
|
fwrite((char *) tuple->t_data + tuple->t_data->t_hoff,
|
||||||
|
length, 1, fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -678,7 +679,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
|
|||||||
*/
|
*/
|
||||||
tuple = heap_formtuple(tupDesc, values, nulls);
|
tuple = heap_formtuple(tupDesc, values, nulls);
|
||||||
if (oids)
|
if (oids)
|
||||||
tuple->t_oid = loaded_oid;
|
tuple->t_data->t_oid = loaded_oid;
|
||||||
|
|
||||||
skip_tuple = false;
|
skip_tuple = false;
|
||||||
/* BEFORE ROW INSERT Triggers */
|
/* BEFORE ROW INSERT Triggers */
|
||||||
@ -706,17 +707,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
if (rel->rd_att->constr)
|
if (rel->rd_att->constr)
|
||||||
{
|
ExecConstraints("CopyFrom", rel, tuple);
|
||||||
HeapTuple newtuple;
|
|
||||||
|
|
||||||
newtuple = ExecConstraints("CopyFrom", rel, tuple);
|
|
||||||
|
|
||||||
if (newtuple != tuple)
|
|
||||||
{
|
|
||||||
pfree(tuple);
|
|
||||||
tuple = newtuple;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
heap_insert(rel, tuple);
|
heap_insert(rel, tuple);
|
||||||
|
|
||||||
@ -746,7 +737,7 @@ CopyFrom(Relation rel, bool binary, bool oids, FILE *fp, char *delim)
|
|||||||
index_nulls,
|
index_nulls,
|
||||||
finfoP[i]);
|
finfoP[i]);
|
||||||
indexRes = index_insert(index_rels[i], idatum, index_nulls,
|
indexRes = index_insert(index_rels[i], idatum, index_nulls,
|
||||||
&(tuple->t_ctid), rel);
|
&(tuple->t_self), rel);
|
||||||
if (indexRes)
|
if (indexRes)
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.35 1998/10/01 22:45:29 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/creatinh.c,v 1.36 1998/11/27 19:51:55 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -409,10 +409,10 @@ StoreCatalogInheritance(Oid relationId, List *supers)
|
|||||||
/*
|
/*
|
||||||
* build idList for use below
|
* build idList for use below
|
||||||
*/
|
*/
|
||||||
idList = lappendi(idList, tuple->t_oid);
|
idList = lappendi(idList, tuple->t_data->t_oid);
|
||||||
|
|
||||||
datum[0] = ObjectIdGetDatum(relationId); /* inhrel */
|
datum[0] = ObjectIdGetDatum(relationId); /* inhrel */
|
||||||
datum[1] = ObjectIdGetDatum(tuple->t_oid); /* inhparent */
|
datum[1] = ObjectIdGetDatum(tuple->t_data->t_oid); /* inhparent */
|
||||||
datum[2] = Int16GetDatum(seqNumber); /* inhseqno */
|
datum[2] = Int16GetDatum(seqNumber); /* inhseqno */
|
||||||
|
|
||||||
nullarr[0] = ' ';
|
nullarr[0] = ' ';
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.25 1998/10/05 02:49:36 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.26 1998/11/27 19:51:56 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -251,7 +251,7 @@ check_permissions(char *command,
|
|||||||
Anum_pg_database_datdba,
|
Anum_pg_database_datdba,
|
||||||
RelationGetDescr(dbrel),
|
RelationGetDescr(dbrel),
|
||||||
(char *) NULL);
|
(char *) NULL);
|
||||||
*dbIdP = dbtup->t_oid;
|
*dbIdP = dbtup->t_data->t_oid;
|
||||||
dbtext = (text *) heap_getattr(dbtup,
|
dbtext = (text *) heap_getattr(dbtup,
|
||||||
Anum_pg_database_datpath,
|
Anum_pg_database_datpath,
|
||||||
RelationGetDescr(dbrel),
|
RelationGetDescr(dbrel),
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.27 1998/09/23 04:22:03 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/defind.c,v 1.28 1998/11/27 19:51:56 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -105,7 +105,7 @@ DefineIndex(char *heapRelationName,
|
|||||||
elog(ERROR, "DefineIndex: %s relation not found",
|
elog(ERROR, "DefineIndex: %s relation not found",
|
||||||
heapRelationName);
|
heapRelationName);
|
||||||
}
|
}
|
||||||
relationId = tuple->t_oid;
|
relationId = tuple->t_data->t_oid;
|
||||||
|
|
||||||
if (unique && strcmp(accessMethodName, "btree") != 0)
|
if (unique && strcmp(accessMethodName, "btree") != 0)
|
||||||
elog(ERROR, "DefineIndex: unique indices are only available with the btree access method");
|
elog(ERROR, "DefineIndex: unique indices are only available with the btree access method");
|
||||||
@ -124,7 +124,7 @@ DefineIndex(char *heapRelationName,
|
|||||||
elog(ERROR, "DefineIndex: %s access method not found",
|
elog(ERROR, "DefineIndex: %s access method not found",
|
||||||
accessMethodName);
|
accessMethodName);
|
||||||
}
|
}
|
||||||
accessMethodId = tuple->t_oid;
|
accessMethodId = tuple->t_data->t_oid;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -250,7 +250,7 @@ ExtendIndex(char *indexRelationName, Expr *predicate, List *rangetable)
|
|||||||
elog(ERROR, "ExtendIndex: %s index not found",
|
elog(ERROR, "ExtendIndex: %s index not found",
|
||||||
indexRelationName);
|
indexRelationName);
|
||||||
}
|
}
|
||||||
indexId = tuple->t_oid;
|
indexId = tuple->t_data->t_oid;
|
||||||
accessMethodId = ((Form_pg_class) GETSTRUCT(tuple))->relam;
|
accessMethodId = ((Form_pg_class) GETSTRUCT(tuple))->relam;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -336,7 +336,7 @@ ExtendIndex(char *indexRelationName, Expr *predicate, List *rangetable)
|
|||||||
namecpy(&(funcInfo->funcName),
|
namecpy(&(funcInfo->funcName),
|
||||||
&(((Form_pg_proc) GETSTRUCT(tuple))->proname));
|
&(((Form_pg_proc) GETSTRUCT(tuple))->proname));
|
||||||
|
|
||||||
FIsetProcOid(funcInfo, tuple->t_oid);
|
FIsetProcOid(funcInfo, tuple->t_data->t_oid);
|
||||||
}
|
}
|
||||||
|
|
||||||
heapRelation = heap_open(relationId);
|
heapRelation = heap_open(relationId);
|
||||||
@ -429,7 +429,7 @@ FuncIndexArgs(IndexElem *funcIndex,
|
|||||||
elog(ERROR, "DefineIndex: %s class not found",
|
elog(ERROR, "DefineIndex: %s class not found",
|
||||||
funcIndex->class);
|
funcIndex->class);
|
||||||
}
|
}
|
||||||
*opOidP = tuple->t_oid;
|
*opOidP = tuple->t_data->t_oid;
|
||||||
|
|
||||||
MemSet(argTypes, 0, 8 * sizeof(Oid));
|
MemSet(argTypes, 0, 8 * sizeof(Oid));
|
||||||
|
|
||||||
@ -531,7 +531,7 @@ NormIndexAttrs(List *attList, /* list of IndexElem's */
|
|||||||
elog(ERROR, "DefineIndex: %s class not found",
|
elog(ERROR, "DefineIndex: %s class not found",
|
||||||
attribute->class);
|
attribute->class);
|
||||||
}
|
}
|
||||||
*classOidP++ = tuple->t_oid;
|
*classOidP++ = tuple->t_data->t_oid;
|
||||||
pfree(atttuple);
|
pfree(atttuple);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -578,5 +578,5 @@ RemoveIndex(char *name)
|
|||||||
((Form_pg_class) GETSTRUCT(tuple))->relkind);
|
((Form_pg_class) GETSTRUCT(tuple))->relkind);
|
||||||
}
|
}
|
||||||
|
|
||||||
index_destroy(tuple->t_oid);
|
index_destroy(tuple->t_data->t_oid);
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ CreateProceduralLanguage(CreatePLangStmt *stmt)
|
|||||||
values[i++] = PointerGetDatum(languageName);
|
values[i++] = PointerGetDatum(languageName);
|
||||||
values[i++] = Int8GetDatum((bool) 1);
|
values[i++] = Int8GetDatum((bool) 1);
|
||||||
values[i++] = Int8GetDatum(stmt->pltrusted);
|
values[i++] = Int8GetDatum(stmt->pltrusted);
|
||||||
values[i++] = ObjectIdGetDatum(procTup->t_oid);
|
values[i++] = ObjectIdGetDatum(procTup->t_data->t_oid);
|
||||||
values[i++] = (Datum) fmgr(F_TEXTIN, stmt->plcompiler);
|
values[i++] = (Datum) fmgr(F_TEXTIN, stmt->plcompiler);
|
||||||
|
|
||||||
rel = heap_openr(LanguageRelationName);
|
rel = heap_openr(LanguageRelationName);
|
||||||
@ -174,7 +174,7 @@ DropProceduralLanguage(DropPLangStmt *stmt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rel = heap_openr(LanguageRelationName);
|
rel = heap_openr(LanguageRelationName);
|
||||||
heap_delete(rel, &langTup->t_ctid);
|
heap_delete(rel, &langTup->t_self);
|
||||||
|
|
||||||
pfree(langTup);
|
pfree(langTup);
|
||||||
heap_close(rel);
|
heap_close(rel);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.29 1998/09/01 04:27:57 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/remove.c,v 1.30 1998/11/27 19:51:57 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -97,12 +97,12 @@ RemoveOperator(char *operatorName, /* operator name */
|
|||||||
#ifndef NO_SECURITY
|
#ifndef NO_SECURITY
|
||||||
userName = GetPgUserName();
|
userName = GetPgUserName();
|
||||||
if (!pg_ownercheck(userName,
|
if (!pg_ownercheck(userName,
|
||||||
(char *) ObjectIdGetDatum(tup->t_oid),
|
(char *) ObjectIdGetDatum(tup->t_data->t_oid),
|
||||||
OPROID))
|
OPROID))
|
||||||
elog(ERROR, "RemoveOperator: operator '%s': permission denied",
|
elog(ERROR, "RemoveOperator: operator '%s': permission denied",
|
||||||
operatorName);
|
operatorName);
|
||||||
#endif
|
#endif
|
||||||
heap_delete(relation, &tup->t_ctid);
|
heap_delete(relation, &tup->t_self);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -157,7 +157,7 @@ SingleOpOperatorRemove(Oid typeOid)
|
|||||||
key[0].sk_attno = attnums[i];
|
key[0].sk_attno = attnums[i];
|
||||||
scan = heap_beginscan(rel, 0, SnapshotNow, 1, key);
|
scan = heap_beginscan(rel, 0, SnapshotNow, 1, key);
|
||||||
while (HeapTupleIsValid(tup = heap_getnext(scan, 0)))
|
while (HeapTupleIsValid(tup = heap_getnext(scan, 0)))
|
||||||
heap_delete(rel, &tup->t_ctid);
|
heap_delete(rel, &tup->t_self);
|
||||||
heap_endscan(scan);
|
heap_endscan(scan);
|
||||||
}
|
}
|
||||||
heap_close(rel);
|
heap_close(rel);
|
||||||
@ -267,8 +267,8 @@ RemoveType(char *typeName) /* type name to be removed */
|
|||||||
}
|
}
|
||||||
|
|
||||||
relation = heap_openr(TypeRelationName);
|
relation = heap_openr(TypeRelationName);
|
||||||
typeOid = tup->t_oid;
|
typeOid = tup->t_data->t_oid;
|
||||||
heap_delete(relation, &tup->t_ctid);
|
heap_delete(relation, &tup->t_self);
|
||||||
|
|
||||||
/* Now, Delete the "array of" that type */
|
/* Now, Delete the "array of" that type */
|
||||||
shadow_type = makeArrayTypeName(typeName);
|
shadow_type = makeArrayTypeName(typeName);
|
||||||
@ -281,8 +281,8 @@ RemoveType(char *typeName) /* type name to be removed */
|
|||||||
elog(ERROR, "RemoveType: type '%s' does not exist", typeName);
|
elog(ERROR, "RemoveType: type '%s' does not exist", typeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
typeOid = tup->t_oid;
|
typeOid = tup->t_data->t_oid;
|
||||||
heap_delete(relation, &tup->t_ctid);
|
heap_delete(relation, &tup->t_self);
|
||||||
|
|
||||||
heap_close(relation);
|
heap_close(relation);
|
||||||
}
|
}
|
||||||
@ -325,7 +325,7 @@ RemoveFunction(char *functionName, /* function name to be removed */
|
|||||||
|
|
||||||
if (!HeapTupleIsValid(tup))
|
if (!HeapTupleIsValid(tup))
|
||||||
elog(ERROR, "RemoveFunction: type '%s' not found", typename);
|
elog(ERROR, "RemoveFunction: type '%s' not found", typename);
|
||||||
argList[i] = tup->t_oid;
|
argList[i] = tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,7 +357,7 @@ RemoveFunction(char *functionName, /* function name to be removed */
|
|||||||
elog(ERROR, "RemoveFunction: function \"%s\" is built-in", functionName);
|
elog(ERROR, "RemoveFunction: function \"%s\" is built-in", functionName);
|
||||||
}
|
}
|
||||||
|
|
||||||
heap_delete(relation, &tup->t_ctid);
|
heap_delete(relation, &tup->t_self);
|
||||||
|
|
||||||
heap_close(relation);
|
heap_close(relation);
|
||||||
}
|
}
|
||||||
@ -428,7 +428,7 @@ RemoveAggregate(char *aggName, char *aggType)
|
|||||||
aggName);
|
aggName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
heap_delete(relation, &tup->t_ctid);
|
heap_delete(relation, &tup->t_self);
|
||||||
|
|
||||||
heap_close(relation);
|
heap_close(relation);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.17 1998/09/01 04:27:59 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/rename.c,v 1.18 1998/11/27 19:51:57 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -113,7 +113,7 @@ renameatt(char *relname,
|
|||||||
if (!HeapTupleIsValid(reltup))
|
if (!HeapTupleIsValid(reltup))
|
||||||
elog(ERROR, "renameatt: unknown relation: \"%s\"", relname);
|
elog(ERROR, "renameatt: unknown relation: \"%s\"", relname);
|
||||||
|
|
||||||
myrelid = reltup->t_oid;
|
myrelid = reltup->t_data->t_oid;
|
||||||
|
|
||||||
/* this routine is actually in the planner */
|
/* this routine is actually in the planner */
|
||||||
children = find_all_inheritors(lconsi(myrelid, NIL), NIL);
|
children = find_all_inheritors(lconsi(myrelid, NIL), NIL);
|
||||||
@ -153,7 +153,7 @@ renameatt(char *relname,
|
|||||||
if (!HeapTupleIsValid(reltup))
|
if (!HeapTupleIsValid(reltup))
|
||||||
elog(ERROR, "renameatt: relation \"%s\" nonexistent", relname);
|
elog(ERROR, "renameatt: relation \"%s\" nonexistent", relname);
|
||||||
|
|
||||||
relid = reltup->t_oid;
|
relid = reltup->t_data->t_oid;
|
||||||
|
|
||||||
oldatttup = SearchSysCacheTupleCopy(ATTNAME,
|
oldatttup = SearchSysCacheTupleCopy(ATTNAME,
|
||||||
ObjectIdGetDatum(relid),
|
ObjectIdGetDatum(relid),
|
||||||
@ -180,7 +180,7 @@ renameatt(char *relname,
|
|||||||
newattname, NAMEDATALEN);
|
newattname, NAMEDATALEN);
|
||||||
|
|
||||||
attrelation = heap_openr(AttributeRelationName);
|
attrelation = heap_openr(AttributeRelationName);
|
||||||
heap_replace(attrelation, &oldatttup->t_ctid, oldatttup);
|
heap_replace(attrelation, &oldatttup->t_self, oldatttup);
|
||||||
|
|
||||||
/* keep system catalog indices current */
|
/* keep system catalog indices current */
|
||||||
CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations);
|
CatalogOpenIndices(Num_pg_attr_indices, Name_pg_attr_indices, irelations);
|
||||||
@ -248,7 +248,7 @@ renamerel(char *oldrelname, char *newrelname)
|
|||||||
|
|
||||||
/* insert fixed rel tuple */
|
/* insert fixed rel tuple */
|
||||||
relrelation = heap_openr(RelationRelationName);
|
relrelation = heap_openr(RelationRelationName);
|
||||||
heap_replace(relrelation, &oldreltup->t_ctid, oldreltup);
|
heap_replace(relrelation, &oldreltup->t_self, oldreltup);
|
||||||
|
|
||||||
/* keep the system catalog indices current */
|
/* keep the system catalog indices current */
|
||||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, irelations);
|
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, irelations);
|
||||||
|
@ -368,7 +368,7 @@ read_info(char *caller, SeqTable elm, Buffer *buf)
|
|||||||
ItemPointerData iptr;
|
ItemPointerData iptr;
|
||||||
PageHeader page;
|
PageHeader page;
|
||||||
ItemId lp;
|
ItemId lp;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
sequence_magic *sm;
|
sequence_magic *sm;
|
||||||
Form_pg_sequence seq;
|
Form_pg_sequence seq;
|
||||||
|
|
||||||
@ -391,9 +391,9 @@ read_info(char *caller, SeqTable elm, Buffer *buf)
|
|||||||
|
|
||||||
lp = PageGetItemId(page, FirstOffsetNumber);
|
lp = PageGetItemId(page, FirstOffsetNumber);
|
||||||
Assert(ItemIdIsUsed(lp));
|
Assert(ItemIdIsUsed(lp));
|
||||||
tuple = (HeapTuple) PageGetItem((Page) page, lp);
|
tuple.t_data = (HeapTupleHeader) PageGetItem((Page) page, lp);
|
||||||
|
|
||||||
seq = (Form_pg_sequence) GETSTRUCT(tuple);
|
seq = (Form_pg_sequence) GETSTRUCT(&tuple);
|
||||||
|
|
||||||
elm->increment = seq->increment_by;
|
elm->increment = seq->increment_by;
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ CreateTrigger(CreateTrigStmt *stmt)
|
|||||||
|
|
||||||
values[Anum_pg_trigger_tgrelid - 1] = ObjectIdGetDatum(RelationGetRelid(rel));
|
values[Anum_pg_trigger_tgrelid - 1] = ObjectIdGetDatum(RelationGetRelid(rel));
|
||||||
values[Anum_pg_trigger_tgname - 1] = NameGetDatum(namein(stmt->trigname));
|
values[Anum_pg_trigger_tgname - 1] = NameGetDatum(namein(stmt->trigname));
|
||||||
values[Anum_pg_trigger_tgfoid - 1] = ObjectIdGetDatum(tuple->t_oid);
|
values[Anum_pg_trigger_tgfoid - 1] = ObjectIdGetDatum(tuple->t_data->t_oid);
|
||||||
values[Anum_pg_trigger_tgtype - 1] = Int16GetDatum(tgtype);
|
values[Anum_pg_trigger_tgtype - 1] = Int16GetDatum(tgtype);
|
||||||
if (stmt->args)
|
if (stmt->args)
|
||||||
{
|
{
|
||||||
@ -227,7 +227,7 @@ CreateTrigger(CreateTrigStmt *stmt)
|
|||||||
pgrel = heap_openr(RelationRelationName);
|
pgrel = heap_openr(RelationRelationName);
|
||||||
((Form_pg_class) GETSTRUCT(tuple))->reltriggers = found + 1;
|
((Form_pg_class) GETSTRUCT(tuple))->reltriggers = found + 1;
|
||||||
RelationInvalidateHeapTuple(pgrel, tuple);
|
RelationInvalidateHeapTuple(pgrel, tuple);
|
||||||
heap_replace(pgrel, &tuple->t_ctid, tuple);
|
heap_replace(pgrel, &tuple->t_self, tuple);
|
||||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
|
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
|
||||||
CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);
|
CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);
|
||||||
CatalogCloseIndices(Num_pg_class_indices, ridescs);
|
CatalogCloseIndices(Num_pg_class_indices, ridescs);
|
||||||
@ -280,7 +280,7 @@ DropTrigger(DropTrigStmt *stmt)
|
|||||||
|
|
||||||
if (namestrcmp(&(pg_trigger->tgname), stmt->trigname) == 0)
|
if (namestrcmp(&(pg_trigger->tgname), stmt->trigname) == 0)
|
||||||
{
|
{
|
||||||
heap_delete(tgrel, &tuple->t_ctid);
|
heap_delete(tgrel, &tuple->t_self);
|
||||||
tgfound++;
|
tgfound++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -306,7 +306,7 @@ DropTrigger(DropTrigStmt *stmt)
|
|||||||
pgrel = heap_openr(RelationRelationName);
|
pgrel = heap_openr(RelationRelationName);
|
||||||
((Form_pg_class) GETSTRUCT(tuple))->reltriggers = found;
|
((Form_pg_class) GETSTRUCT(tuple))->reltriggers = found;
|
||||||
RelationInvalidateHeapTuple(pgrel, tuple);
|
RelationInvalidateHeapTuple(pgrel, tuple);
|
||||||
heap_replace(pgrel, &tuple->t_ctid, tuple);
|
heap_replace(pgrel, &tuple->t_self, tuple);
|
||||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
|
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, ridescs);
|
||||||
CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);
|
CatalogIndexInsert(ridescs, Num_pg_class_indices, pgrel, tuple);
|
||||||
CatalogCloseIndices(Num_pg_class_indices, ridescs);
|
CatalogCloseIndices(Num_pg_class_indices, ridescs);
|
||||||
@ -340,7 +340,7 @@ RelationRemoveTriggers(Relation rel)
|
|||||||
tgscan = heap_beginscan(tgrel, 0, SnapshotNow, 1, &key);
|
tgscan = heap_beginscan(tgrel, 0, SnapshotNow, 1, &key);
|
||||||
|
|
||||||
while (HeapTupleIsValid(tup = heap_getnext(tgscan, 0)))
|
while (HeapTupleIsValid(tup = heap_getnext(tgscan, 0)))
|
||||||
heap_delete(tgrel, &tup->t_ctid);
|
heap_delete(tgrel, &tup->t_self);
|
||||||
|
|
||||||
heap_endscan(tgscan);
|
heap_endscan(tgscan);
|
||||||
RelationUnsetLockForWrite(tgrel);
|
RelationUnsetLockForWrite(tgrel);
|
||||||
@ -359,11 +359,10 @@ RelationBuildTriggers(Relation relation)
|
|||||||
Form_pg_trigger pg_trigger;
|
Form_pg_trigger pg_trigger;
|
||||||
Relation irel;
|
Relation irel;
|
||||||
ScanKeyData skey;
|
ScanKeyData skey;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
IndexScanDesc sd;
|
IndexScanDesc sd;
|
||||||
RetrieveIndexResult indexRes;
|
RetrieveIndexResult indexRes;
|
||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
ItemPointer iptr;
|
|
||||||
struct varlena *val;
|
struct varlena *val;
|
||||||
bool isnull;
|
bool isnull;
|
||||||
int found;
|
int found;
|
||||||
@ -387,16 +386,16 @@ RelationBuildTriggers(Relation relation)
|
|||||||
if (!indexRes)
|
if (!indexRes)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
iptr = &indexRes->heap_iptr;
|
tuple.t_self = indexRes->heap_iptr;
|
||||||
tuple = heap_fetch(tgrel, SnapshotNow, iptr, &buffer);
|
heap_fetch(tgrel, SnapshotNow, &tuple, &buffer);
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
if (!HeapTupleIsValid(tuple))
|
if (!tuple.t_data)
|
||||||
continue;
|
continue;
|
||||||
if (found == ntrigs)
|
if (found == ntrigs)
|
||||||
elog(ERROR, "RelationBuildTriggers: unexpected record found for rel %.*s",
|
elog(ERROR, "RelationBuildTriggers: unexpected record found for rel %.*s",
|
||||||
NAMEDATALEN, relation->rd_rel->relname.data);
|
NAMEDATALEN, relation->rd_rel->relname.data);
|
||||||
|
|
||||||
pg_trigger = (Form_pg_trigger) GETSTRUCT(tuple);
|
pg_trigger = (Form_pg_trigger) GETSTRUCT(&tuple);
|
||||||
|
|
||||||
if (triggers == NULL)
|
if (triggers == NULL)
|
||||||
triggers = (Trigger *) palloc(sizeof(Trigger));
|
triggers = (Trigger *) palloc(sizeof(Trigger));
|
||||||
@ -410,7 +409,7 @@ RelationBuildTriggers(Relation relation)
|
|||||||
build->tgtype = pg_trigger->tgtype;
|
build->tgtype = pg_trigger->tgtype;
|
||||||
build->tgnargs = pg_trigger->tgnargs;
|
build->tgnargs = pg_trigger->tgnargs;
|
||||||
memcpy(build->tgattr, &(pg_trigger->tgattr), 8 * sizeof(int16));
|
memcpy(build->tgattr, &(pg_trigger->tgattr), 8 * sizeof(int16));
|
||||||
val = (struct varlena *) fastgetattr(tuple,
|
val = (struct varlena *) fastgetattr(&tuple,
|
||||||
Anum_pg_trigger_tgargs,
|
Anum_pg_trigger_tgargs,
|
||||||
tgrel->rd_att, &isnull);
|
tgrel->rd_att, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
@ -421,7 +420,7 @@ RelationBuildTriggers(Relation relation)
|
|||||||
char *p;
|
char *p;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
val = (struct varlena *) fastgetattr(tuple,
|
val = (struct varlena *) fastgetattr(&tuple,
|
||||||
Anum_pg_trigger_tgargs,
|
Anum_pg_trigger_tgargs,
|
||||||
tgrel->rd_att, &isnull);
|
tgrel->rd_att, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
@ -793,7 +792,8 @@ static HeapTuple
|
|||||||
GetTupleForTrigger(Relation relation, ItemPointer tid, bool before)
|
GetTupleForTrigger(Relation relation, ItemPointer tid, bool before)
|
||||||
{
|
{
|
||||||
ItemId lp;
|
ItemId lp;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
|
HeapTuple result;
|
||||||
PageHeader dp;
|
PageHeader dp;
|
||||||
Buffer b;
|
Buffer b;
|
||||||
|
|
||||||
@ -807,28 +807,30 @@ GetTupleForTrigger(Relation relation, ItemPointer tid, bool before)
|
|||||||
|
|
||||||
Assert(ItemIdIsUsed(lp));
|
Assert(ItemIdIsUsed(lp));
|
||||||
|
|
||||||
tuple = (HeapTuple) PageGetItem((Page) dp, lp);
|
tuple.t_data = (HeapTupleHeader) PageGetItem((Page) dp, lp);
|
||||||
|
tuple.t_len = ItemIdGetLength(lp);
|
||||||
|
tuple.t_self = *tid;
|
||||||
|
|
||||||
if (before)
|
if (before)
|
||||||
{
|
{
|
||||||
if (TupleUpdatedByCurXactAndCmd(tuple))
|
if (TupleUpdatedByCurXactAndCmd(&tuple))
|
||||||
{
|
{
|
||||||
elog(NOTICE, "GetTupleForTrigger: Non-functional delete/update");
|
elog(NOTICE, "GetTupleForTrigger: Non-functional delete/update");
|
||||||
ReleaseBuffer(b);
|
ReleaseBuffer(b);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HeapTupleSatisfies(lp, relation, b, dp,
|
HeapTupleSatisfies(&tuple, relation, b, dp,
|
||||||
false, 0, (ScanKey) NULL, tuple);
|
false, 0, (ScanKey) NULL);
|
||||||
if (!tuple)
|
if (!tuple.t_data)
|
||||||
{
|
{
|
||||||
ReleaseBuffer(b);
|
ReleaseBuffer(b);
|
||||||
elog(ERROR, "GetTupleForTrigger: (am)invalid tid");
|
elog(ERROR, "GetTupleForTrigger: (am)invalid tid");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tuple = heap_copytuple(tuple);
|
result = heap_copytuple(&tuple);
|
||||||
ReleaseBuffer(b);
|
ReleaseBuffer(b);
|
||||||
|
|
||||||
return tuple;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.90 1998/10/23 16:49:24 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.91 1998/11/27 19:51:58 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -327,7 +327,7 @@ vc_getrels(NameData *VacRelP)
|
|||||||
}
|
}
|
||||||
MemoryContextSwitchTo(old);
|
MemoryContextSwitchTo(old);
|
||||||
|
|
||||||
cur->vrl_relid = tuple->t_oid;
|
cur->vrl_relid = tuple->t_data->t_oid;
|
||||||
cur->vrl_next = (VRelList) NULL;
|
cur->vrl_next = (VRelList) NULL;
|
||||||
}
|
}
|
||||||
if (found == false)
|
if (found == false)
|
||||||
@ -577,9 +577,8 @@ vc_scanheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
int nblocks,
|
int nblocks,
|
||||||
blkno;
|
blkno;
|
||||||
ItemId itemid;
|
ItemId itemid;
|
||||||
ItemPointer itemptr;
|
|
||||||
Buffer buf;
|
Buffer buf;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
Page page,
|
Page page,
|
||||||
tempPage = NULL;
|
tempPage = NULL;
|
||||||
OffsetNumber offnum,
|
OffsetNumber offnum,
|
||||||
@ -675,23 +674,25 @@ vc_scanheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
tuple = (HeapTuple) PageGetItem(page, itemid);
|
tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
|
||||||
|
tuple.t_len = ItemIdGetLength(itemid);
|
||||||
|
ItemPointerSet(&(tuple.t_self), blkno, offnum);
|
||||||
tupgone = false;
|
tupgone = false;
|
||||||
|
|
||||||
if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED))
|
if (!(tuple.t_data->t_infomask & HEAP_XMIN_COMMITTED))
|
||||||
{
|
{
|
||||||
if (tuple->t_infomask & HEAP_XMIN_INVALID)
|
if (tuple.t_data->t_infomask & HEAP_XMIN_INVALID)
|
||||||
tupgone = true;
|
tupgone = true;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (TransactionIdDidAbort(tuple->t_xmin))
|
if (TransactionIdDidAbort(tuple.t_data->t_xmin))
|
||||||
tupgone = true;
|
tupgone = true;
|
||||||
else if (TransactionIdDidCommit(tuple->t_xmin))
|
else if (TransactionIdDidCommit(tuple.t_data->t_xmin))
|
||||||
{
|
{
|
||||||
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
|
tuple.t_data->t_infomask |= HEAP_XMIN_COMMITTED;
|
||||||
pgchanged = true;
|
pgchanged = true;
|
||||||
}
|
}
|
||||||
else if (!TransactionIdIsInProgress(tuple->t_xmin))
|
else if (!TransactionIdIsInProgress(tuple.t_data->t_xmin))
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -704,7 +705,7 @@ vc_scanheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
elog(NOTICE, "Rel %s: TID %u/%u: InsertTransactionInProgress %u - can't shrink relation",
|
elog(NOTICE, "Rel %s: TID %u/%u: InsertTransactionInProgress %u - can't shrink relation",
|
||||||
relname, blkno, offnum, tuple->t_xmin);
|
relname, blkno, offnum, tuple.t_data->t_xmin);
|
||||||
do_shrinking = false;
|
do_shrinking = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -714,60 +715,40 @@ vc_scanheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
* here we are concerned about tuples with xmin committed and
|
* here we are concerned about tuples with xmin committed and
|
||||||
* xmax unknown or committed
|
* xmax unknown or committed
|
||||||
*/
|
*/
|
||||||
if (tuple->t_infomask & HEAP_XMIN_COMMITTED &&
|
if (tuple.t_data->t_infomask & HEAP_XMIN_COMMITTED &&
|
||||||
!(tuple->t_infomask & HEAP_XMAX_INVALID))
|
!(tuple.t_data->t_infomask & HEAP_XMAX_INVALID))
|
||||||
{
|
{
|
||||||
if (tuple->t_infomask & HEAP_XMAX_COMMITTED)
|
if (tuple.t_data->t_infomask & HEAP_XMAX_COMMITTED)
|
||||||
tupgone = true;
|
tupgone = true;
|
||||||
else if (TransactionIdDidAbort(tuple->t_xmax))
|
else if (TransactionIdDidAbort(tuple.t_data->t_xmax))
|
||||||
{
|
{
|
||||||
tuple->t_infomask |= HEAP_XMAX_INVALID;
|
tuple.t_data->t_infomask |= HEAP_XMAX_INVALID;
|
||||||
pgchanged = true;
|
pgchanged = true;
|
||||||
}
|
}
|
||||||
else if (TransactionIdDidCommit(tuple->t_xmax))
|
else if (TransactionIdDidCommit(tuple.t_data->t_xmax))
|
||||||
tupgone = true;
|
tupgone = true;
|
||||||
else if (!TransactionIdIsInProgress(tuple->t_xmax))
|
else if (!TransactionIdIsInProgress(tuple.t_data->t_xmax))
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not Aborted, Not Committed, Not in Progress - so it
|
* Not Aborted, Not Committed, Not in Progress - so it
|
||||||
* from crashed process. - vadim 06/02/97
|
* from crashed process. - vadim 06/02/97
|
||||||
*/
|
*/
|
||||||
tuple->t_infomask |= HEAP_XMAX_INVALID;;
|
tuple.t_data->t_infomask |= HEAP_XMAX_INVALID;;
|
||||||
pgchanged = true;
|
pgchanged = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elog(NOTICE, "Rel %s: TID %u/%u: DeleteTransactionInProgress %u - can't shrink relation",
|
elog(NOTICE, "Rel %s: TID %u/%u: DeleteTransactionInProgress %u - can't shrink relation",
|
||||||
relname, blkno, offnum, tuple->t_xmax);
|
relname, blkno, offnum, tuple.t_data->t_xmax);
|
||||||
do_shrinking = false;
|
do_shrinking = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* It's possibly! But from where it comes ? And should we fix
|
|
||||||
* it ? - vadim 11/28/96
|
|
||||||
*/
|
|
||||||
itemptr = &(tuple->t_ctid);
|
|
||||||
if (!ItemPointerIsValid(itemptr) ||
|
|
||||||
BlockIdGetBlockNumber(&(itemptr->ip_blkid)) != blkno)
|
|
||||||
{
|
|
||||||
elog(NOTICE, "Rel %s: TID %u/%u: TID IN TUPLEHEADER %u/%u IS NOT THE SAME. TUPGONE %d.",
|
|
||||||
relname, blkno, offnum,
|
|
||||||
BlockIdGetBlockNumber(&(itemptr->ip_blkid)),
|
|
||||||
itemptr->ip_posid, tupgone);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Other checks...
|
* Other checks...
|
||||||
*/
|
*/
|
||||||
if (tuple->t_len != itemid->lp_len)
|
if (!OidIsValid(tuple.t_data->t_oid))
|
||||||
{
|
|
||||||
elog(NOTICE, "Rel %s: TID %u/%u: TUPLE_LEN IN PAGEHEADER %u IS NOT THE SAME AS IN TUPLEHEADER %u. TUPGONE %d.",
|
|
||||||
relname, blkno, offnum,
|
|
||||||
itemid->lp_len, tuple->t_len, tupgone);
|
|
||||||
}
|
|
||||||
if (!OidIsValid(tuple->t_oid))
|
|
||||||
{
|
{
|
||||||
elog(NOTICE, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
|
elog(NOTICE, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
|
||||||
relname, blkno, offnum, tupgone);
|
relname, blkno, offnum, tupgone);
|
||||||
@ -799,11 +780,11 @@ vc_scanheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
{
|
{
|
||||||
num_tuples++;
|
num_tuples++;
|
||||||
notup = false;
|
notup = false;
|
||||||
if (tuple->t_len < min_tlen)
|
if (tuple.t_len < min_tlen)
|
||||||
min_tlen = tuple->t_len;
|
min_tlen = tuple.t_len;
|
||||||
if (tuple->t_len > max_tlen)
|
if (tuple.t_len > max_tlen)
|
||||||
max_tlen = tuple->t_len;
|
max_tlen = tuple.t_len;
|
||||||
vc_attrstats(onerel, vacrelstats, tuple);
|
vc_attrstats(onerel, vacrelstats, &tuple);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -916,7 +897,7 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
max_offset;
|
max_offset;
|
||||||
ItemId itemid,
|
ItemId itemid,
|
||||||
newitemid;
|
newitemid;
|
||||||
HeapTuple tuple,
|
HeapTupleData tuple,
|
||||||
newtup;
|
newtup;
|
||||||
TupleDesc tupdesc = NULL;
|
TupleDesc tupdesc = NULL;
|
||||||
Datum *idatum = NULL;
|
Datum *idatum = NULL;
|
||||||
@ -1034,8 +1015,9 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
if (!ItemIdIsUsed(itemid))
|
if (!ItemIdIsUsed(itemid))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
tuple = (HeapTuple) PageGetItem(page, itemid);
|
tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
|
||||||
tuple_len = tuple->t_len;
|
tuple_len = tuple.t_len = ItemIdGetLength(itemid);
|
||||||
|
ItemPointerSet(&(tuple.t_self), blkno, offnum);
|
||||||
|
|
||||||
/* try to find new page for this tuple */
|
/* try to find new page for this tuple */
|
||||||
if (cur_buffer == InvalidBuffer ||
|
if (cur_buffer == InvalidBuffer ||
|
||||||
@ -1081,21 +1063,20 @@ vc_rpfheap(VRelStats *vacrelstats, Relation onerel,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* copy tuple */
|
/* copy tuple */
|
||||||
newtup = (HeapTuple) palloc(tuple_len);
|
heap_copytuple_with_tuple(&tuple, &newtup);
|
||||||
memmove((char *) newtup, (char *) tuple, tuple_len);
|
|
||||||
|
|
||||||
RelationInvalidateHeapTuple(onerel, tuple);
|
RelationInvalidateHeapTuple(onerel, &tuple);
|
||||||
|
|
||||||
/* store transaction information */
|
/* store transaction information */
|
||||||
TransactionIdStore(myXID, &(newtup->t_xmin));
|
TransactionIdStore(myXID, &(newtup.t_data->t_xmin));
|
||||||
newtup->t_cmin = myCID;
|
newtup.t_data->t_cmin = myCID;
|
||||||
StoreInvalidTransactionId(&(newtup->t_xmax));
|
StoreInvalidTransactionId(&(newtup.t_data->t_xmax));
|
||||||
/* set xmin to unknown and xmax to invalid */
|
/* set xmin to unknown and xmax to invalid */
|
||||||
newtup->t_infomask &= ~(HEAP_XACT_MASK);
|
newtup.t_data->t_infomask &= ~(HEAP_XACT_MASK);
|
||||||
newtup->t_infomask |= HEAP_XMAX_INVALID;
|
newtup.t_data->t_infomask |= HEAP_XMAX_INVALID;
|
||||||
|
|
||||||
/* add tuple to the page */
|
/* add tuple to the page */
|
||||||
newoff = PageAddItem(ToPage, (Item) newtup, tuple_len,
|
newoff = PageAddItem(ToPage, (Item) newtup.t_data, tuple_len,
|
||||||
InvalidOffsetNumber, LP_USED);
|
InvalidOffsetNumber, LP_USED);
|
||||||
if (newoff == InvalidOffsetNumber)
|
if (newoff == InvalidOffsetNumber)
|
||||||
{
|
{
|
||||||
@ -1105,15 +1086,16 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)",
|
|||||||
cur_page->vpd_offsets_used, cur_page->vpd_offsets_free);
|
cur_page->vpd_offsets_used, cur_page->vpd_offsets_free);
|
||||||
}
|
}
|
||||||
newitemid = PageGetItemId(ToPage, newoff);
|
newitemid = PageGetItemId(ToPage, newoff);
|
||||||
pfree(newtup);
|
pfree(newtup.t_data);
|
||||||
newtup = (HeapTuple) PageGetItem(ToPage, newitemid);
|
newtup.t_data = (HeapTupleHeader) PageGetItem(ToPage, newitemid);
|
||||||
ItemPointerSet(&(newtup->t_ctid), cur_page->vpd_blkno, newoff);
|
ItemPointerSet(&(newtup.t_data->t_ctid), cur_page->vpd_blkno, newoff);
|
||||||
|
newtup.t_self = newtup.t_data->t_ctid;
|
||||||
|
|
||||||
/* now logically delete end-tuple */
|
/* now logically delete end-tuple */
|
||||||
TransactionIdStore(myXID, &(tuple->t_xmax));
|
TransactionIdStore(myXID, &(tuple.t_data->t_xmax));
|
||||||
tuple->t_cmax = myCID;
|
tuple.t_data->t_cmax = myCID;
|
||||||
/* set xmax to unknown */
|
/* set xmax to unknown */
|
||||||
tuple->t_infomask &= ~(HEAP_XMAX_INVALID | HEAP_XMAX_COMMITTED);
|
tuple.t_data->t_infomask &= ~(HEAP_XMAX_INVALID | HEAP_XMAX_COMMITTED);
|
||||||
|
|
||||||
cur_page->vpd_offsets_used++;
|
cur_page->vpd_offsets_used++;
|
||||||
num_moved++;
|
num_moved++;
|
||||||
@ -1127,7 +1109,7 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)",
|
|||||||
{
|
{
|
||||||
FormIndexDatum(idcur->natts,
|
FormIndexDatum(idcur->natts,
|
||||||
(AttrNumber *) &(idcur->tform->indkey[0]),
|
(AttrNumber *) &(idcur->tform->indkey[0]),
|
||||||
newtup,
|
&newtup,
|
||||||
tupdesc,
|
tupdesc,
|
||||||
idatum,
|
idatum,
|
||||||
inulls,
|
inulls,
|
||||||
@ -1135,7 +1117,7 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)",
|
|||||||
iresult = index_insert(Irel[i],
|
iresult = index_insert(Irel[i],
|
||||||
idatum,
|
idatum,
|
||||||
inulls,
|
inulls,
|
||||||
&newtup->t_ctid,
|
&newtup.t_self,
|
||||||
onerel);
|
onerel);
|
||||||
if (iresult)
|
if (iresult)
|
||||||
pfree(iresult);
|
pfree(iresult);
|
||||||
@ -1213,10 +1195,10 @@ failed to add item with len = %u to page %u (free space %u, nusd %u, noff %u)",
|
|||||||
itemid = PageGetItemId(page, newoff);
|
itemid = PageGetItemId(page, newoff);
|
||||||
if (!ItemIdIsUsed(itemid))
|
if (!ItemIdIsUsed(itemid))
|
||||||
continue;
|
continue;
|
||||||
tuple = (HeapTuple) PageGetItem(page, itemid);
|
tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
|
||||||
if (TransactionIdEquals((TransactionId) tuple->t_xmin, myXID))
|
if (TransactionIdEquals((TransactionId) tuple.t_data->t_xmin, myXID))
|
||||||
{
|
{
|
||||||
tuple->t_infomask |= HEAP_XMIN_COMMITTED;
|
tuple.t_data->t_infomask |= HEAP_XMIN_COMMITTED;
|
||||||
num_tuples++;
|
num_tuples++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1276,8 +1258,8 @@ Elapsed %u/%u sec.",
|
|||||||
itemid = PageGetItemId(page, offnum);
|
itemid = PageGetItemId(page, offnum);
|
||||||
if (!ItemIdIsUsed(itemid))
|
if (!ItemIdIsUsed(itemid))
|
||||||
continue;
|
continue;
|
||||||
tuple = (HeapTuple) PageGetItem(page, itemid);
|
tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid);
|
||||||
Assert(TransactionIdEquals((TransactionId) tuple->t_xmax, myXID));
|
Assert(TransactionIdEquals((TransactionId) tuple.t_data->t_xmax, myXID));
|
||||||
itemid->lp_flags &= ~LP_USED;
|
itemid->lp_flags &= ~LP_USED;
|
||||||
num_tuples++;
|
num_tuples++;
|
||||||
}
|
}
|
||||||
@ -1722,8 +1704,8 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
|
|||||||
ad,
|
ad,
|
||||||
sd;
|
sd;
|
||||||
HeapScanDesc scan;
|
HeapScanDesc scan;
|
||||||
HeapTuple rtup,
|
HeapTupleData rtup;
|
||||||
ctup,
|
HeapTuple ctup,
|
||||||
atup,
|
atup,
|
||||||
stup;
|
stup;
|
||||||
Form_pg_class pgcform;
|
Form_pg_class pgcform;
|
||||||
@ -1744,12 +1726,13 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
|
|||||||
rd = heap_openr(RelationRelationName);
|
rd = heap_openr(RelationRelationName);
|
||||||
|
|
||||||
/* get the buffer cache tuple */
|
/* get the buffer cache tuple */
|
||||||
rtup = heap_fetch(rd, SnapshotNow, &ctup->t_ctid, &buffer);
|
rtup.t_self = ctup->t_self;
|
||||||
|
heap_fetch(rd, SnapshotNow, &rtup, &buffer);
|
||||||
pfree(ctup);
|
pfree(ctup);
|
||||||
|
|
||||||
/* overwrite the existing statistics in the tuple */
|
/* overwrite the existing statistics in the tuple */
|
||||||
vc_setpagelock(rd, ItemPointerGetBlockNumber(&rtup->t_ctid));
|
vc_setpagelock(rd, ItemPointerGetBlockNumber(&(rtup.t_self)));
|
||||||
pgcform = (Form_pg_class) GETSTRUCT(rtup);
|
pgcform = (Form_pg_class) GETSTRUCT(&rtup);
|
||||||
pgcform->reltuples = num_tuples;
|
pgcform->reltuples = num_tuples;
|
||||||
pgcform->relpages = num_pages;
|
pgcform->relpages = num_pages;
|
||||||
pgcform->relhasindex = hasindex;
|
pgcform->relhasindex = hasindex;
|
||||||
@ -1792,15 +1775,9 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
|
|||||||
/* overwrite the existing statistics in the tuple */
|
/* overwrite the existing statistics in the tuple */
|
||||||
if (VacAttrStatsEqValid(stats))
|
if (VacAttrStatsEqValid(stats))
|
||||||
{
|
{
|
||||||
Buffer abuffer;
|
Buffer abuffer = scan->rs_cbuf;
|
||||||
|
|
||||||
/*
|
vc_setpagelock(ad, ItemPointerGetBlockNumber(&atup->t_self));
|
||||||
* We manipulate the heap tuple in the
|
|
||||||
* buffer, so we fetch it to get the
|
|
||||||
* buffer number
|
|
||||||
*/
|
|
||||||
atup = heap_fetch(ad, SnapshotNow, &atup->t_ctid, &abuffer);
|
|
||||||
vc_setpagelock(ad, ItemPointerGetBlockNumber(&atup->t_ctid));
|
|
||||||
attp = (Form_pg_attribute) GETSTRUCT(atup);
|
attp = (Form_pg_attribute) GETSTRUCT(atup);
|
||||||
|
|
||||||
if (stats->nonnull_cnt + stats->null_cnt == 0 ||
|
if (stats->nonnull_cnt + stats->null_cnt == 0 ||
|
||||||
@ -1837,7 +1814,6 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
|
|||||||
*/
|
*/
|
||||||
RelationInvalidateHeapTuple(ad, atup);
|
RelationInvalidateHeapTuple(ad, atup);
|
||||||
WriteNoReleaseBuffer(abuffer);
|
WriteNoReleaseBuffer(abuffer);
|
||||||
ReleaseBuffer(abuffer);
|
|
||||||
|
|
||||||
/* DO PG_STATISTIC INSERTS */
|
/* DO PG_STATISTIC INSERTS */
|
||||||
|
|
||||||
@ -1894,7 +1870,7 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
|
|||||||
* Invalidate the cached pg_class tuple and
|
* Invalidate the cached pg_class tuple and
|
||||||
* write the buffer
|
* write the buffer
|
||||||
*/
|
*/
|
||||||
RelationInvalidateHeapTuple(rd, rtup);
|
RelationInvalidateHeapTuple(rd, &rtup);
|
||||||
|
|
||||||
WriteNoReleaseBuffer(buffer);
|
WriteNoReleaseBuffer(buffer);
|
||||||
|
|
||||||
@ -1942,7 +1918,7 @@ vc_delhilowstats(Oid relid, int attcnt, int *attnums)
|
|||||||
if (i >= attcnt)
|
if (i >= attcnt)
|
||||||
continue; /* don't delete it */
|
continue; /* don't delete it */
|
||||||
}
|
}
|
||||||
heap_delete(pgstatistic, &tuple->t_ctid);
|
heap_delete(pgstatistic, &tuple->t_self);
|
||||||
}
|
}
|
||||||
|
|
||||||
heap_endscan(scan);
|
heap_endscan(scan);
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.58 1998/10/14 05:10:00 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/execMain.c,v 1.59 1998/11/27 19:51:59 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -963,16 +963,7 @@ ExecAppend(TupleTableSlot *slot,
|
|||||||
|
|
||||||
if (resultRelationDesc->rd_att->constr)
|
if (resultRelationDesc->rd_att->constr)
|
||||||
{
|
{
|
||||||
HeapTuple newtuple;
|
ExecConstraints("ExecAppend", resultRelationDesc, tuple);
|
||||||
|
|
||||||
newtuple = ExecConstraints("ExecAppend", resultRelationDesc, tuple);
|
|
||||||
|
|
||||||
if (newtuple != tuple) /* modified by DEFAULT */
|
|
||||||
{
|
|
||||||
Assert(slot->ttc_shouldFree);
|
|
||||||
pfree(tuple);
|
|
||||||
slot->val = tuple = newtuple;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************
|
/******************
|
||||||
@ -993,7 +984,7 @@ ExecAppend(TupleTableSlot *slot,
|
|||||||
*/
|
*/
|
||||||
numIndices = resultRelationInfo->ri_NumIndices;
|
numIndices = resultRelationInfo->ri_NumIndices;
|
||||||
if (numIndices > 0)
|
if (numIndices > 0)
|
||||||
ExecInsertIndexTuples(slot, &(tuple->t_ctid), estate, false);
|
ExecInsertIndexTuples(slot, &(tuple->t_self), estate, false);
|
||||||
(estate->es_processed)++;
|
(estate->es_processed)++;
|
||||||
estate->es_lastoid = newId;
|
estate->es_lastoid = newId;
|
||||||
|
|
||||||
@ -1146,16 +1137,7 @@ ExecReplace(TupleTableSlot *slot,
|
|||||||
|
|
||||||
if (resultRelationDesc->rd_att->constr)
|
if (resultRelationDesc->rd_att->constr)
|
||||||
{
|
{
|
||||||
HeapTuple newtuple;
|
ExecConstraints("ExecReplace", resultRelationDesc, tuple);
|
||||||
|
|
||||||
newtuple = ExecConstraints("ExecReplace", resultRelationDesc, tuple);
|
|
||||||
|
|
||||||
if (newtuple != tuple) /* modified by DEFAULT */
|
|
||||||
{
|
|
||||||
Assert(slot->ttc_shouldFree);
|
|
||||||
pfree(tuple);
|
|
||||||
slot->val = tuple = newtuple;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************
|
/******************
|
||||||
@ -1200,7 +1182,7 @@ ExecReplace(TupleTableSlot *slot,
|
|||||||
|
|
||||||
numIndices = resultRelationInfo->ri_NumIndices;
|
numIndices = resultRelationInfo->ri_NumIndices;
|
||||||
if (numIndices > 0)
|
if (numIndices > 0)
|
||||||
ExecInsertIndexTuples(slot, &(tuple->t_ctid), estate, true);
|
ExecInsertIndexTuples(slot, &(tuple->t_self), estate, true);
|
||||||
|
|
||||||
/* AFTER ROW UPDATE Triggers */
|
/* AFTER ROW UPDATE Triggers */
|
||||||
if (resultRelationDesc->trigdesc &&
|
if (resultRelationDesc->trigdesc &&
|
||||||
@ -1334,18 +1316,12 @@ ExecRelCheck(Relation rel, HeapTuple tuple)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HeapTuple
|
void
|
||||||
ExecConstraints(char *caller, Relation rel, HeapTuple tuple)
|
ExecConstraints(char *caller, Relation rel, HeapTuple tuple)
|
||||||
{
|
{
|
||||||
HeapTuple newtuple = tuple;
|
|
||||||
|
|
||||||
Assert(rel->rd_att->constr);
|
Assert(rel->rd_att->constr);
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (rel->rd_att->constr->num_defval > 0)
|
|
||||||
newtuple = tuple = ExecAttrDefault(rel, tuple);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rel->rd_att->constr->has_not_null)
|
if (rel->rd_att->constr->has_not_null)
|
||||||
{
|
{
|
||||||
int attrChk;
|
int attrChk;
|
||||||
@ -1366,5 +1342,5 @@ ExecConstraints(char *caller, Relation rel, HeapTuple tuple)
|
|||||||
elog(ERROR, "%s: rejected due to CHECK constraint %s", caller, failed);
|
elog(ERROR, "%s: rejected due to CHECK constraint %s", caller, failed);
|
||||||
}
|
}
|
||||||
|
|
||||||
return newtuple;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.37 1998/09/25 13:38:31 thomas Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/execQual.c,v 1.38 1998/11/27 19:52:00 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -287,7 +287,7 @@ ExecEvalVar(Var *variable, ExprContext *econtext, bool *isNull)
|
|||||||
tempSlot->ttc_buffer = InvalidBuffer;
|
tempSlot->ttc_buffer = InvalidBuffer;
|
||||||
tempSlot->ttc_whichplan = -1;
|
tempSlot->ttc_whichplan = -1;
|
||||||
|
|
||||||
tup = heap_copytuple(slot->val);
|
tup = heap_copytuple(heapTuple);
|
||||||
td = CreateTupleDescCopy(slot->ttc_tupleDescriptor);
|
td = CreateTupleDescCopy(slot->ttc_tupleDescriptor);
|
||||||
|
|
||||||
ExecSetSlotDescriptor(tempSlot, td);
|
ExecSetSlotDescriptor(tempSlot, td);
|
||||||
@ -549,7 +549,6 @@ GetAttributeByName(TupleTableSlot *slot, char *attname, bool *isNull)
|
|||||||
{
|
{
|
||||||
AttrNumber attrno;
|
AttrNumber attrno;
|
||||||
TupleDesc tupdesc;
|
TupleDesc tupdesc;
|
||||||
HeapTuple tuple;
|
|
||||||
Datum retval;
|
Datum retval;
|
||||||
int natts;
|
int natts;
|
||||||
int i;
|
int i;
|
||||||
@ -567,9 +566,7 @@ GetAttributeByName(TupleTableSlot *slot, char *attname, bool *isNull)
|
|||||||
}
|
}
|
||||||
|
|
||||||
tupdesc = slot->ttc_tupleDescriptor;
|
tupdesc = slot->ttc_tupleDescriptor;
|
||||||
tuple = slot->val;
|
natts = slot->val->t_data->t_natts;
|
||||||
|
|
||||||
natts = tuple->t_natts;
|
|
||||||
|
|
||||||
attrno = InvalidAttrNumber;
|
attrno = InvalidAttrNumber;
|
||||||
for (i = 0; i < tupdesc->natts; i++)
|
for (i = 0; i < tupdesc->natts; i++)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.39 1998/09/23 04:22:06 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/execUtils.c,v 1.40 1998/11/27 19:52:01 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -1138,7 +1138,7 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
|
|||||||
result = index_insert(relationDescs[i], /* index relation */
|
result = index_insert(relationDescs[i], /* index relation */
|
||||||
datum, /* array of heaptuple Datums */
|
datum, /* array of heaptuple Datums */
|
||||||
nulls, /* info on nulls */
|
nulls, /* info on nulls */
|
||||||
&(heapTuple->t_ctid), /* oid of heap tuple */
|
&(heapTuple->t_self), /* tid of heap tuple */
|
||||||
heapRelation);
|
heapRelation);
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.20 1998/09/01 04:28:23 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/functions.c,v 1.21 1998/11/27 19:52:01 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -270,7 +270,7 @@ copy_function_result(FunctionCachePtr fcache,
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
TupleDesc funcTd = funcSlot->ttc_tupleDescriptor;
|
TupleDesc funcTd = funcSlot->ttc_tupleDescriptor;
|
||||||
|
|
||||||
while (i < oldTuple->t_natts)
|
while (i < oldTuple->t_data->t_natts)
|
||||||
{
|
{
|
||||||
funcTd->attrs[i] =
|
funcTd->attrs[i] =
|
||||||
(Form_pg_attribute) palloc(ATTRIBUTE_TUPLE_SIZE);
|
(Form_pg_attribute) palloc(ATTRIBUTE_TUPLE_SIZE);
|
||||||
@ -341,13 +341,11 @@ postquel_execute(execution_state *es,
|
|||||||
resSlot = copy_function_result(fcache, slot);
|
resSlot = copy_function_result(fcache, slot);
|
||||||
if (fTlist != NIL)
|
if (fTlist != NIL)
|
||||||
{
|
{
|
||||||
HeapTuple tup;
|
|
||||||
TargetEntry *tle = lfirst(fTlist);
|
TargetEntry *tle = lfirst(fTlist);
|
||||||
|
|
||||||
tup = resSlot->val;
|
|
||||||
value = ProjectAttribute(resSlot->ttc_tupleDescriptor,
|
value = ProjectAttribute(resSlot->ttc_tupleDescriptor,
|
||||||
tle,
|
tle,
|
||||||
tup,
|
resSlot->val,
|
||||||
isNull);
|
isNull);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -248,16 +248,12 @@ ExecAgg(Agg *node)
|
|||||||
*/
|
*/
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
HeapTuple outerTuple = NULL;
|
|
||||||
TupleTableSlot *outerslot;
|
TupleTableSlot *outerslot;
|
||||||
|
|
||||||
isNull = isNull1 = isNull2 = 0;
|
isNull = isNull1 = isNull2 = 0;
|
||||||
outerslot = ExecProcNode(outerPlan, (Plan *) node);
|
outerslot = ExecProcNode(outerPlan, (Plan *) node);
|
||||||
if (outerslot)
|
if (TupIsNull(outerslot))
|
||||||
outerTuple = outerslot->val;
|
|
||||||
if (!HeapTupleIsValid(outerTuple))
|
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* when the outerplan doesn't return a single tuple,
|
* when the outerplan doesn't return a single tuple,
|
||||||
* create a dummy heaptuple anyway because we still need
|
* create a dummy heaptuple anyway because we still need
|
||||||
@ -666,7 +662,7 @@ aggGetAttr(TupleTableSlot *slot,
|
|||||||
tempSlot->ttc_buffer = InvalidBuffer;
|
tempSlot->ttc_buffer = InvalidBuffer;
|
||||||
tempSlot->ttc_whichplan = -1;
|
tempSlot->ttc_whichplan = -1;
|
||||||
|
|
||||||
tup = heap_copytuple(slot->val);
|
tup = heap_copytuple(heapTuple);
|
||||||
td = CreateTupleDescCopy(slot->ttc_tupleDescriptor);
|
td = CreateTupleDescCopy(slot->ttc_tupleDescriptor);
|
||||||
|
|
||||||
ExecSetSlotDescriptor(tempSlot, td);
|
ExecSetSlotDescriptor(tempSlot, td);
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
* columns. (ie. tuples from the same group are consecutive)
|
* columns. (ie. tuples from the same group are consecutive)
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.22 1998/09/01 04:28:28 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/nodeGroup.c,v 1.23 1998/11/27 19:52:01 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -102,13 +102,12 @@ ExecGroupEveryTuple(Group *node)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
outerslot = ExecProcNode(outerPlan(node), (Plan *) node);
|
outerslot = ExecProcNode(outerPlan(node), (Plan *) node);
|
||||||
if (outerslot)
|
if (TupIsNull(outerslot))
|
||||||
outerTuple = outerslot->val;
|
|
||||||
if (!HeapTupleIsValid(outerTuple))
|
|
||||||
{
|
{
|
||||||
grpstate->grp_done = TRUE;
|
grpstate->grp_done = TRUE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
outerTuple = outerslot->val;
|
||||||
|
|
||||||
firsttuple = grpstate->grp_firstTuple;
|
firsttuple = grpstate->grp_firstTuple;
|
||||||
/* this should occur on the first call only */
|
/* this should occur on the first call only */
|
||||||
@ -121,7 +120,7 @@ ExecGroupEveryTuple(Group *node)
|
|||||||
* Compare with first tuple and see if this tuple is of the
|
* Compare with first tuple and see if this tuple is of the
|
||||||
* same group.
|
* same group.
|
||||||
*/
|
*/
|
||||||
if (!sameGroup(firsttuple, outerslot->val,
|
if (!sameGroup(firsttuple, outerTuple,
|
||||||
node->numCols, node->grpColIdx,
|
node->numCols, node->grpColIdx,
|
||||||
ExecGetScanType(&grpstate->csstate)))
|
ExecGetScanType(&grpstate->csstate)))
|
||||||
{
|
{
|
||||||
@ -189,14 +188,13 @@ ExecGroupOneTuple(Group *node)
|
|||||||
if (firsttuple == NULL)
|
if (firsttuple == NULL)
|
||||||
{
|
{
|
||||||
outerslot = ExecProcNode(outerPlan(node), (Plan *) node);
|
outerslot = ExecProcNode(outerPlan(node), (Plan *) node);
|
||||||
if (outerslot)
|
if (TupIsNull(outerslot))
|
||||||
outerTuple = outerslot->val;
|
|
||||||
if (!HeapTupleIsValid(outerTuple))
|
|
||||||
{
|
{
|
||||||
grpstate->grp_done = TRUE;
|
grpstate->grp_done = TRUE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
grpstate->grp_firstTuple = firsttuple = heap_copytuple(outerTuple);
|
grpstate->grp_firstTuple = firsttuple =
|
||||||
|
heap_copytuple(outerslot->val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -205,19 +203,20 @@ ExecGroupOneTuple(Group *node)
|
|||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
outerslot = ExecProcNode(outerPlan(node), (Plan *) node);
|
outerslot = ExecProcNode(outerPlan(node), (Plan *) node);
|
||||||
outerTuple = (outerslot) ? outerslot->val : NULL;
|
if (TupIsNull(outerslot))
|
||||||
if (!HeapTupleIsValid(outerTuple))
|
|
||||||
{
|
{
|
||||||
grpstate->grp_done = TRUE;
|
grpstate->grp_done = TRUE;
|
||||||
|
outerTuple = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
outerTuple = outerslot->val;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* Compare with first tuple and see if this tuple is of
|
* Compare with first tuple and see if this tuple is of
|
||||||
* the same group.
|
* the same group.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if ((!sameGroup(firsttuple, outerslot->val,
|
if ((!sameGroup(firsttuple, outerTuple,
|
||||||
node->numCols, node->grpColIdx,
|
node->numCols, node->grpColIdx,
|
||||||
ExecGetScanType(&grpstate->csstate))))
|
ExecGetScanType(&grpstate->csstate))))
|
||||||
break;
|
break;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.23 1998/09/01 04:28:29 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/nodeHash.c,v 1.24 1998/11/27 19:52:02 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -489,16 +489,19 @@ ExecHashTableInsert(HashJoinTable hashtable,
|
|||||||
*/
|
*/
|
||||||
bucket = (HashBucket)
|
bucket = (HashBucket)
|
||||||
(ABSADDR(hashtable->top) + bucketno * hashtable->bucketsize);
|
(ABSADDR(hashtable->top) + bucketno * hashtable->bucketsize);
|
||||||
if ((char *) LONGALIGN(ABSADDR(bucket->bottom))
|
if ((char *) LONGALIGN(ABSADDR(bucket->bottom)) - (char *) bucket
|
||||||
- (char *) bucket + heapTuple->t_len > hashtable->bucketsize)
|
+ heapTuple->t_len + HEAPTUPLESIZE > hashtable->bucketsize)
|
||||||
ExecHashOverflowInsert(hashtable, bucket, heapTuple);
|
ExecHashOverflowInsert(hashtable, bucket, heapTuple);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memmove((char *) LONGALIGN(ABSADDR(bucket->bottom)),
|
memmove((char *) LONGALIGN(ABSADDR(bucket->bottom)),
|
||||||
heapTuple,
|
heapTuple,
|
||||||
|
HEAPTUPLESIZE);
|
||||||
|
memmove((char *) LONGALIGN(ABSADDR(bucket->bottom)) + HEAPTUPLESIZE,
|
||||||
|
heapTuple->t_data,
|
||||||
heapTuple->t_len);
|
heapTuple->t_len);
|
||||||
bucket->bottom =
|
bucket->bottom = ((RelativeAddr) LONGALIGN(bucket->bottom) +
|
||||||
((RelativeAddr) LONGALIGN(bucket->bottom) + heapTuple->t_len);
|
heapTuple->t_len + HEAPTUPLESIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -611,7 +614,7 @@ ExecHashOverflowInsert(HashJoinTable hashtable,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
newend = (RelativeAddr) LONGALIGN(hashtable->overflownext + sizeof(*otuple)
|
newend = (RelativeAddr) LONGALIGN(hashtable->overflownext + sizeof(*otuple)
|
||||||
+ heapTuple->t_len);
|
+ heapTuple->t_len + HEAPTUPLESIZE);
|
||||||
if (newend > hashtable->bottom)
|
if (newend > hashtable->bottom)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
@ -664,6 +667,9 @@ ExecHashOverflowInsert(HashJoinTable hashtable,
|
|||||||
otuple->tuple = RELADDR(LONGALIGN(((char *) otuple + sizeof(*otuple))));
|
otuple->tuple = RELADDR(LONGALIGN(((char *) otuple + sizeof(*otuple))));
|
||||||
memmove(ABSADDR(otuple->tuple),
|
memmove(ABSADDR(otuple->tuple),
|
||||||
heapTuple,
|
heapTuple,
|
||||||
|
HEAPTUPLESIZE);
|
||||||
|
memmove(ABSADDR(otuple->tuple) + HEAPTUPLESIZE,
|
||||||
|
heapTuple->t_data,
|
||||||
heapTuple->t_len);
|
heapTuple->t_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -704,7 +710,10 @@ ExecScanHashBucket(HashJoinState *hjstate,
|
|||||||
LONGALIGN(ABSADDR(bucket->top));
|
LONGALIGN(ABSADDR(bucket->top));
|
||||||
else
|
else
|
||||||
heapTuple = (HeapTuple)
|
heapTuple = (HeapTuple)
|
||||||
LONGALIGN(((char *) curtuple + curtuple->t_len));
|
LONGALIGN(((char *) curtuple + curtuple->t_len + HEAPTUPLESIZE));
|
||||||
|
|
||||||
|
heapTuple->t_data = (HeapTupleHeader)
|
||||||
|
((char *) heapTuple + HEAPTUPLESIZE);
|
||||||
|
|
||||||
while (heapTuple < (HeapTuple) ABSADDR(bucket->bottom))
|
while (heapTuple < (HeapTuple) ABSADDR(bucket->bottom))
|
||||||
{
|
{
|
||||||
@ -721,7 +730,9 @@ ExecScanHashBucket(HashJoinState *hjstate,
|
|||||||
return heapTuple;
|
return heapTuple;
|
||||||
|
|
||||||
heapTuple = (HeapTuple)
|
heapTuple = (HeapTuple)
|
||||||
LONGALIGN(((char *) heapTuple + heapTuple->t_len));
|
LONGALIGN(((char *) heapTuple + heapTuple->t_len + HEAPTUPLESIZE));
|
||||||
|
heapTuple->t_data = (HeapTupleHeader)
|
||||||
|
((char *) heapTuple + HEAPTUPLESIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstotuple == NULL)
|
if (firstotuple == NULL)
|
||||||
@ -742,6 +753,8 @@ ExecScanHashBucket(HashJoinState *hjstate,
|
|||||||
while (otuple != NULL)
|
while (otuple != NULL)
|
||||||
{
|
{
|
||||||
heapTuple = (HeapTuple) ABSADDR(otuple->tuple);
|
heapTuple = (HeapTuple) ABSADDR(otuple->tuple);
|
||||||
|
heapTuple->t_data = (HeapTupleHeader)
|
||||||
|
((char *) heapTuple + HEAPTUPLESIZE);
|
||||||
|
|
||||||
inntuple = ExecStoreTuple(heapTuple, /* tuple to store */
|
inntuple = ExecStoreTuple(heapTuple, /* tuple to store */
|
||||||
hjstate->hj_HashTupleSlot, /* slot */
|
hjstate->hj_HashTupleSlot, /* slot */
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.13 1998/09/01 04:28:31 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/nodeHashjoin.c,v 1.14 1998/11/27 19:52:02 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -646,7 +646,10 @@ ExecHashJoinGetSavedTuple(HashJoinState *hjstate,
|
|||||||
(*position) = bufstart;
|
(*position) = bufstart;
|
||||||
}
|
}
|
||||||
heapTuple = (HeapTuple) (*position);
|
heapTuple = (HeapTuple) (*position);
|
||||||
(*position) = (char *) LONGALIGN(*position + heapTuple->t_len);
|
heapTuple->t_data = (HeapTupleHeader)
|
||||||
|
((char *) heapTuple + HEAPTUPLESIZE);
|
||||||
|
(*position) = (char *) LONGALIGN(*position +
|
||||||
|
heapTuple->t_len + HEAPTUPLESIZE);
|
||||||
|
|
||||||
return ExecStoreTuple(heapTuple, tupleSlot, InvalidBuffer, false);
|
return ExecStoreTuple(heapTuple, tupleSlot, InvalidBuffer, false);
|
||||||
}
|
}
|
||||||
@ -824,7 +827,7 @@ ExecHashJoinSaveTuple(HeapTuple heapTuple,
|
|||||||
if (position == NULL)
|
if (position == NULL)
|
||||||
position = pagestart;
|
position = pagestart;
|
||||||
|
|
||||||
if (position + heapTuple->t_len >= pagebound)
|
if (position + heapTuple->t_len + HEAPTUPLESIZE >= pagebound)
|
||||||
{
|
{
|
||||||
cc = FileSeek(file, 0L, SEEK_END);
|
cc = FileSeek(file, 0L, SEEK_END);
|
||||||
if (cc < 0)
|
if (cc < 0)
|
||||||
@ -836,8 +839,9 @@ ExecHashJoinSaveTuple(HeapTuple heapTuple,
|
|||||||
position = pagestart;
|
position = pagestart;
|
||||||
*pageend = 0;
|
*pageend = 0;
|
||||||
}
|
}
|
||||||
memmove(position, heapTuple, heapTuple->t_len);
|
memmove(position, heapTuple, HEAPTUPLESIZE);
|
||||||
position = (char *) LONGALIGN(position + heapTuple->t_len);
|
memmove(position + HEAPTUPLESIZE, heapTuple->t_data, heapTuple->t_len);
|
||||||
|
position = (char *) LONGALIGN(position + heapTuple->t_len + HEAPTUPLESIZE);
|
||||||
*pageend = position - buffer;
|
*pageend = position - buffer;
|
||||||
|
|
||||||
return position;
|
return position;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.28 1998/11/22 10:48:36 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/nodeIndexscan.c,v 1.29 1998/11/27 19:52:03 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -109,6 +109,7 @@ IndexNext(IndexScan *node)
|
|||||||
heapRelation = scanstate->css_currentRelation;
|
heapRelation = scanstate->css_currentRelation;
|
||||||
numIndices = indexstate->iss_NumIndices;
|
numIndices = indexstate->iss_NumIndices;
|
||||||
slot = scanstate->css_ScanTupleSlot;
|
slot = scanstate->css_ScanTupleSlot;
|
||||||
|
tuple = &(indexstate->iss_htup);
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* ok, now that we have what we need, fetch an index tuple.
|
* ok, now that we have what we need, fetch an index tuple.
|
||||||
@ -121,11 +122,11 @@ IndexNext(IndexScan *node)
|
|||||||
scandesc = scanDescs[indexstate->iss_IndexPtr];
|
scandesc = scanDescs[indexstate->iss_IndexPtr];
|
||||||
while ((result = index_getnext(scandesc, direction)) != NULL)
|
while ((result = index_getnext(scandesc, direction)) != NULL)
|
||||||
{
|
{
|
||||||
tuple = heap_fetch(heapRelation, snapshot,
|
tuple->t_self = result->heap_iptr;
|
||||||
&result->heap_iptr, &buffer);
|
heap_fetch(heapRelation, snapshot, tuple, &buffer);
|
||||||
pfree(result);
|
pfree(result);
|
||||||
|
|
||||||
if (tuple != NULL)
|
if (tuple->t_data != NULL)
|
||||||
{
|
{
|
||||||
bool prev_matches = false;
|
bool prev_matches = false;
|
||||||
int prev_index;
|
int prev_index;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeMaterial.c,v 1.17 1998/09/01 04:28:34 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/nodeMaterial.c,v 1.18 1998/11/27 19:52:03 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -114,12 +114,21 @@ ExecMaterial(Material *node)
|
|||||||
{
|
{
|
||||||
slot = ExecProcNode(outerNode, (Plan *) node);
|
slot = ExecProcNode(outerNode, (Plan *) node);
|
||||||
|
|
||||||
heapTuple = slot->val;
|
if (TupIsNull(slot))
|
||||||
if (heapTuple == NULL)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
heap_insert(tempRelation, /* relation desc */
|
/*
|
||||||
heapTuple); /* heap tuple to insert */
|
* heap_insert changes something...
|
||||||
|
*/
|
||||||
|
if (slot->ttc_buffer != InvalidBuffer)
|
||||||
|
heapTuple = heap_copytuple(slot->val);
|
||||||
|
else
|
||||||
|
heapTuple = slot->val;
|
||||||
|
|
||||||
|
heap_insert(tempRelation, heapTuple);
|
||||||
|
|
||||||
|
if (slot->ttc_buffer != InvalidBuffer)
|
||||||
|
pfree(heapTuple);
|
||||||
|
|
||||||
ExecClearTuple(slot);
|
ExecClearTuple(slot);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* ExecEndTee
|
* ExecEndTee
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.24 1998/10/08 18:29:27 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/Attic/nodeTee.c,v 1.25 1998/11/27 19:52:03 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -342,11 +342,20 @@ ExecTee(Tee *node, Plan *parent)
|
|||||||
slot = ExecProcNode(childNode, (Plan *) node);
|
slot = ExecProcNode(childNode, (Plan *) node);
|
||||||
if (!TupIsNull(slot))
|
if (!TupIsNull(slot))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* heap_insert changes something...
|
||||||
|
*/
|
||||||
|
if (slot->ttc_buffer != InvalidBuffer)
|
||||||
|
heapTuple = heap_copytuple(slot->val);
|
||||||
|
else
|
||||||
heapTuple = slot->val;
|
heapTuple = slot->val;
|
||||||
|
|
||||||
/* insert into temporary relation */
|
/* insert into temporary relation */
|
||||||
heap_insert(bufferRel, heapTuple);
|
heap_insert(bufferRel, heapTuple);
|
||||||
|
|
||||||
|
if (slot->ttc_buffer != InvalidBuffer)
|
||||||
|
pfree(heapTuple);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* once there is data in the temporary relation, ensure that
|
* once there is data in the temporary relation, ensure that
|
||||||
* the left and right scandescs are initialized
|
* the left and right scandescs are initialized
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v 1.17 1998/02/26 04:31:34 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/executor/nodeUnique.c,v 1.18 1998/11/27 19:52:03 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -76,7 +76,7 @@ ExecIdenticalTuples(TupleTableSlot *t1, TupleTableSlot *t2)
|
|||||||
* THE t_len FIELDS CAN BE THE SAME IN THIS CASE!!
|
* THE t_len FIELDS CAN BE THE SAME IN THIS CASE!!
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if (h1->t_hoff != h2->t_hoff)
|
if (h1->t_data->t_hoff != h2->t_data->t_hoff)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -86,7 +86,7 @@ ExecIdenticalTuples(TupleTableSlot *t1, TupleTableSlot *t2)
|
|||||||
*/
|
*/
|
||||||
d1 = (char *) GETSTRUCT(h1);
|
d1 = (char *) GETSTRUCT(h1);
|
||||||
d2 = (char *) GETSTRUCT(h2);
|
d2 = (char *) GETSTRUCT(h2);
|
||||||
len = (int) h1->t_len - (int) h1->t_hoff;
|
len = (int) h1->t_len - (int) h1->t_data->t_hoff;
|
||||||
|
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* byte compare the data areas and return the result.
|
* byte compare the data areas and return the result.
|
||||||
|
@ -356,11 +356,12 @@ SPI_modifytuple(Relation rel, HeapTuple tuple, int natts, int *attnum,
|
|||||||
if (i == natts) /* no errors in *attnum */
|
if (i == natts) /* no errors in *attnum */
|
||||||
{
|
{
|
||||||
mtuple = heap_formtuple(rel->rd_att, v, n);
|
mtuple = heap_formtuple(rel->rd_att, v, n);
|
||||||
infomask = mtuple->t_infomask;
|
infomask = mtuple->t_data->t_infomask;
|
||||||
memmove(&(mtuple->t_ctid), &(tuple->t_ctid),
|
memmove(&(mtuple->t_data->t_oid), &(tuple->t_data->t_oid),
|
||||||
((char *) &(tuple->t_hoff) - (char *) &(tuple->t_ctid)));
|
((char *) &(tuple->t_data->t_hoff) -
|
||||||
mtuple->t_infomask = infomask;
|
(char *) &(tuple->t_data->t_oid)));
|
||||||
mtuple->t_natts = numberOfAttributes;
|
mtuple->t_data->t_infomask = infomask;
|
||||||
|
mtuple->t_data->t_natts = numberOfAttributes;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -413,7 +414,7 @@ SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber)
|
|||||||
Oid foutoid;
|
Oid foutoid;
|
||||||
|
|
||||||
SPI_result = 0;
|
SPI_result = 0;
|
||||||
if (tuple->t_natts < fnumber || fnumber <= 0)
|
if (tuple->t_data->t_natts < fnumber || fnumber <= 0)
|
||||||
{
|
{
|
||||||
SPI_result = SPI_ERROR_NOATTRIBUTE;
|
SPI_result = SPI_ERROR_NOATTRIBUTE;
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -441,7 +442,7 @@ SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull)
|
|||||||
|
|
||||||
*isnull = true;
|
*isnull = true;
|
||||||
SPI_result = 0;
|
SPI_result = 0;
|
||||||
if (tuple->t_natts < fnumber || fnumber <= 0)
|
if (tuple->t_data->t_natts < fnumber || fnumber <= 0)
|
||||||
{
|
{
|
||||||
SPI_result = SPI_ERROR_NOATTRIBUTE;
|
SPI_result = SPI_ERROR_NOATTRIBUTE;
|
||||||
return (Datum) NULL;
|
return (Datum) NULL;
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/libpq/Attic/be-dumpdata.c,v 1.17 1998/09/01 03:22:43 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/libpq/Attic/be-dumpdata.c,v 1.18 1998/11/27 19:52:05 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -276,8 +276,8 @@ be_printtup(HeapTuple tuple, TupleDesc typeinfo)
|
|||||||
* Allocate space for a tuple.
|
* Allocate space for a tuple.
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
tuples->values[tuples->tuple_index] = pbuf_addTuple(tuple->t_natts);
|
tuples->values[tuples->tuple_index] = pbuf_addTuple(tuple->t_data->t_natts);
|
||||||
tuples->lengths[tuples->tuple_index] = pbuf_addTupleValueLengths(tuple->t_natts);
|
tuples->lengths[tuples->tuple_index] = pbuf_addTupleValueLengths(tuple->t_data->t_natts);
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* copy printable representations of the tuple's attributes
|
* copy printable representations of the tuple's attributes
|
||||||
* to the portal.
|
* to the portal.
|
||||||
@ -297,7 +297,7 @@ be_printtup(HeapTuple tuple, TupleDesc typeinfo)
|
|||||||
values = tuples->values[tuples->tuple_index];
|
values = tuples->values[tuples->tuple_index];
|
||||||
lengths = tuples->lengths[tuples->tuple_index];
|
lengths = tuples->lengths[tuples->tuple_index];
|
||||||
|
|
||||||
for (i = 0; i < tuple->t_natts; i++)
|
for (i = 0; i < tuple->t_data->t_natts; i++)
|
||||||
{
|
{
|
||||||
attr = heap_getattr(tuple, i + 1, typeinfo, &isnull);
|
attr = heap_getattr(tuple, i + 1, typeinfo, &isnull);
|
||||||
typoutput = typtoout((Oid) typeinfo->attrs[i]->atttypid);
|
typoutput = typtoout((Oid) typeinfo->attrs[i]->atttypid);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.24 1998/09/01 04:30:02 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.25 1998/11/27 19:52:07 vadim Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
@ -773,7 +773,7 @@ CommuteClause(Node *clause)
|
|||||||
|
|
||||||
commuTup = (Form_pg_operator) GETSTRUCT(heapTup);
|
commuTup = (Form_pg_operator) GETSTRUCT(heapTup);
|
||||||
|
|
||||||
commu = makeOper(heapTup->t_oid,
|
commu = makeOper(heapTup->t_data->t_oid,
|
||||||
InvalidOid,
|
InvalidOid,
|
||||||
commuTup->oprresult,
|
commuTup->oprresult,
|
||||||
((Oper *) ((Expr *) clause)->oper)->opsize,
|
((Oper *) ((Expr *) clause)->oper)->opsize,
|
||||||
|
@ -229,7 +229,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.49 1998/11/22 10:48:45 vadim Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/Attic/gram.c,v 2.50 1998/11/27 19:52:09 vadim Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* AUTHOR DATE MAJOR EVENT
|
* AUTHOR DATE MAJOR EVENT
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.30 1998/10/08 18:29:45 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.31 1998/11/27 19:52:13 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -516,7 +516,7 @@ func_get_candidates(char *funcname, int nargs)
|
|||||||
Relation heapRelation;
|
Relation heapRelation;
|
||||||
Relation idesc;
|
Relation idesc;
|
||||||
ScanKeyData skey;
|
ScanKeyData skey;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
IndexScanDesc sd;
|
IndexScanDesc sd;
|
||||||
RetrieveIndexResult indexRes;
|
RetrieveIndexResult indexRes;
|
||||||
Form_pg_proc pgProcP;
|
Form_pg_proc pgProcP;
|
||||||
@ -537,20 +537,17 @@ func_get_candidates(char *funcname, int nargs)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
tuple = (HeapTuple) NULL;
|
|
||||||
|
|
||||||
indexRes = index_getnext(sd, ForwardScanDirection);
|
indexRes = index_getnext(sd, ForwardScanDirection);
|
||||||
if (indexRes)
|
if (indexRes)
|
||||||
{
|
{
|
||||||
ItemPointer iptr;
|
|
||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
|
|
||||||
iptr = &indexRes->heap_iptr;
|
tuple.t_self = indexRes->heap_iptr;
|
||||||
tuple = heap_fetch(heapRelation, SnapshotNow, iptr, &buffer);
|
heap_fetch(heapRelation, SnapshotNow, &tuple, &buffer);
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
if (HeapTupleIsValid(tuple))
|
if (tuple.t_data != NULL)
|
||||||
{
|
{
|
||||||
pgProcP = (Form_pg_proc) GETSTRUCT(tuple);
|
pgProcP = (Form_pg_proc) GETSTRUCT(&tuple);
|
||||||
if (pgProcP->pronargs == nargs)
|
if (pgProcP->pronargs == nargs)
|
||||||
{
|
{
|
||||||
current_candidate = (CandidateList)
|
current_candidate = (CandidateList)
|
||||||
@ -884,7 +881,7 @@ func_get_detail(char *funcname,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
pform = (Form_pg_proc) GETSTRUCT(ftup);
|
pform = (Form_pg_proc) GETSTRUCT(ftup);
|
||||||
*funcid = ftup->t_oid;
|
*funcid = ftup->t_data->t_oid;
|
||||||
*rettype = pform->prorettype;
|
*rettype = pform->prorettype;
|
||||||
*retset = pform->proretset;
|
*retset = pform->proretset;
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/parse_oper.c,v 1.20 1998/10/08 18:29:46 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/parse_oper.c,v 1.21 1998/11/27 19:52:14 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -61,7 +61,7 @@ any_ordering_op(int restype)
|
|||||||
Oid
|
Oid
|
||||||
oprid(Operator op)
|
oprid(Operator op)
|
||||||
{
|
{
|
||||||
return op->t_oid;
|
return op->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -426,7 +426,7 @@ oper_exact(char *op, Oid arg1, Oid arg2, Node **ltree, Node **rtree, bool noWarn
|
|||||||
Form_pg_operator opform;
|
Form_pg_operator opform;
|
||||||
|
|
||||||
opform = (Form_pg_operator) GETSTRUCT(tup);
|
opform = (Form_pg_operator) GETSTRUCT(tup);
|
||||||
if (opform->oprcom == tup->t_oid)
|
if (opform->oprcom == tup->t_data->t_oid)
|
||||||
{
|
{
|
||||||
if ((ltree != NULL) && (rtree != NULL))
|
if ((ltree != NULL) && (rtree != NULL))
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.17 1998/10/08 18:29:48 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.18 1998/11/27 19:52:14 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -96,7 +96,7 @@ typeTypeId(Type tp)
|
|||||||
{
|
{
|
||||||
if (tp == NULL)
|
if (tp == NULL)
|
||||||
elog(ERROR, "typeTypeId() called with NULL type struct");
|
elog(ERROR, "typeTypeId() called with NULL type struct");
|
||||||
return tp->t_oid;
|
return tp->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* given type (as type struct), return the length of type */
|
/* given type (as type struct), return the length of type */
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.18 1998/09/01 04:31:36 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteRemove.c,v 1.19 1998/11/27 19:52:17 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -101,7 +101,7 @@ RemoveRewriteRule(char *ruleName)
|
|||||||
* Store the OID of the rule (i.e. the tuple's OID) and the event
|
* Store the OID of the rule (i.e. the tuple's OID) and the event
|
||||||
* relation's OID
|
* relation's OID
|
||||||
*/
|
*/
|
||||||
ruleId = tuple->t_oid;
|
ruleId = tuple->t_data->t_oid;
|
||||||
eventRelationOidDatum = heap_getattr(tuple,
|
eventRelationOidDatum = heap_getattr(tuple,
|
||||||
Anum_pg_rewrite_ev_class,
|
Anum_pg_rewrite_ev_class,
|
||||||
RelationGetDescr(RewriteRelation),
|
RelationGetDescr(RewriteRelation),
|
||||||
@ -125,7 +125,7 @@ RemoveRewriteRule(char *ruleName)
|
|||||||
/*
|
/*
|
||||||
* Now delete the tuple...
|
* Now delete the tuple...
|
||||||
*/
|
*/
|
||||||
heap_delete(RewriteRelation, &tuple->t_ctid);
|
heap_delete(RewriteRelation, &tuple->t_self);
|
||||||
|
|
||||||
pfree(tuple);
|
pfree(tuple);
|
||||||
heap_close(RewriteRelation);
|
heap_close(RewriteRelation);
|
||||||
@ -162,7 +162,7 @@ RelationRemoveRules(Oid relid)
|
|||||||
0, SnapshotNow, 1, &scanKeyData);
|
0, SnapshotNow, 1, &scanKeyData);
|
||||||
|
|
||||||
while (HeapTupleIsValid(tuple = heap_getnext(scanDesc, 0)))
|
while (HeapTupleIsValid(tuple = heap_getnext(scanDesc, 0)))
|
||||||
heap_delete(RewriteRelation, &tuple->t_ctid);
|
heap_delete(RewriteRelation, &tuple->t_self);
|
||||||
|
|
||||||
heap_endscan(scanDesc);
|
heap_endscan(scanDesc);
|
||||||
heap_close(RewriteRelation);
|
heap_close(RewriteRelation);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.28 1998/09/01 04:31:37 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteSupport.c,v 1.29 1998/11/27 19:52:18 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -128,7 +128,7 @@ setRelhasrulesInRelation(Oid relationId, bool relhasrules)
|
|||||||
|
|
||||||
relationRelation = heap_openr(RelationRelationName);
|
relationRelation = heap_openr(RelationRelationName);
|
||||||
((Form_pg_class) GETSTRUCT(tuple))->relhasrules = relhasrules;
|
((Form_pg_class) GETSTRUCT(tuple))->relhasrules = relhasrules;
|
||||||
heap_replace(relationRelation, &tuple->t_ctid, tuple);
|
heap_replace(relationRelation, &tuple->t_self, tuple);
|
||||||
|
|
||||||
/* keep the catalog indices up to date */
|
/* keep the catalog indices up to date */
|
||||||
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
|
CatalogOpenIndices(Num_pg_class_indices, Name_pg_class_indices, idescs);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.41 1998/10/06 03:55:43 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.42 1998/11/27 19:52:19 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -80,7 +80,7 @@
|
|||||||
/* non-export function prototypes */
|
/* non-export function prototypes */
|
||||||
static HeapTuple inv_newtuple(LargeObjectDesc *obj_desc, Buffer buffer,
|
static HeapTuple inv_newtuple(LargeObjectDesc *obj_desc, Buffer buffer,
|
||||||
Page page, char *dbuf, int nwrite);
|
Page page, char *dbuf, int nwrite);
|
||||||
static HeapTuple inv_fetchtup(LargeObjectDesc *obj_desc, Buffer *buffer);
|
static void inv_fetchtup(LargeObjectDesc *obj_desc, HeapTuple tuple, Buffer *buffer);
|
||||||
static int inv_wrnew(LargeObjectDesc *obj_desc, char *buf, int nbytes);
|
static int inv_wrnew(LargeObjectDesc *obj_desc, char *buf, int nbytes);
|
||||||
static int inv_wrold(LargeObjectDesc *obj_desc, char *dbuf, int nbytes,
|
static int inv_wrold(LargeObjectDesc *obj_desc, char *dbuf, int nbytes,
|
||||||
HeapTuple tuple, Buffer buffer);
|
HeapTuple tuple, Buffer buffer);
|
||||||
@ -440,7 +440,7 @@ inv_tell(LargeObjectDesc *obj_desc)
|
|||||||
int
|
int
|
||||||
inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
||||||
{
|
{
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
int nread;
|
int nread;
|
||||||
int off;
|
int off;
|
||||||
int ncopy;
|
int ncopy;
|
||||||
@ -470,16 +470,16 @@ inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
|||||||
Buffer buffer;
|
Buffer buffer;
|
||||||
|
|
||||||
/* fetch an inversion file system block */
|
/* fetch an inversion file system block */
|
||||||
tuple = inv_fetchtup(obj_desc, &buffer);
|
inv_fetchtup(obj_desc, &tuple, &buffer);
|
||||||
|
|
||||||
if (!HeapTupleIsValid(tuple))
|
if (tuple.t_data == NULL)
|
||||||
{
|
{
|
||||||
obj_desc->flags |= IFS_ATEOF;
|
obj_desc->flags |= IFS_ATEOF;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy the data from this block into the buffer */
|
/* copy the data from this block into the buffer */
|
||||||
d = heap_getattr(tuple, 2, obj_desc->hdesc, &isNull);
|
d = heap_getattr(&tuple, 2, obj_desc->hdesc, &isNull);
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
|
|
||||||
fsblock = (struct varlena *) DatumGetPointer(d);
|
fsblock = (struct varlena *) DatumGetPointer(d);
|
||||||
@ -502,7 +502,7 @@ inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
|||||||
int
|
int
|
||||||
inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
||||||
{
|
{
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
int nwritten;
|
int nwritten;
|
||||||
int tuplen;
|
int tuplen;
|
||||||
|
|
||||||
@ -536,19 +536,19 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
|||||||
|
|
||||||
if ((obj_desc->flags & IFS_ATEOF)
|
if ((obj_desc->flags & IFS_ATEOF)
|
||||||
|| obj_desc->heap_r->rd_nblocks == 0)
|
|| obj_desc->heap_r->rd_nblocks == 0)
|
||||||
tuple = (HeapTuple) NULL;
|
tuple.t_data = NULL;
|
||||||
else
|
else
|
||||||
tuple = inv_fetchtup(obj_desc, &buffer);
|
inv_fetchtup(obj_desc, &tuple, &buffer);
|
||||||
|
|
||||||
/* either append or replace a block, as required */
|
/* either append or replace a block, as required */
|
||||||
if (!HeapTupleIsValid(tuple))
|
if (tuple.t_data == NULL)
|
||||||
tuplen = inv_wrnew(obj_desc, buf, nbytes - nwritten);
|
tuplen = inv_wrnew(obj_desc, buf, nbytes - nwritten);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (obj_desc->offset > obj_desc->highbyte)
|
if (obj_desc->offset > obj_desc->highbyte)
|
||||||
tuplen = inv_wrnew(obj_desc, buf, nbytes - nwritten);
|
tuplen = inv_wrnew(obj_desc, buf, nbytes - nwritten);
|
||||||
else
|
else
|
||||||
tuplen = inv_wrold(obj_desc, buf, nbytes - nwritten, tuple, buffer);
|
tuplen = inv_wrold(obj_desc, buf, nbytes - nwritten, &tuple, buffer);
|
||||||
}
|
}
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
|
|
||||||
@ -602,10 +602,9 @@ inv_cleanindex(LargeObjectDesc *obj_desc)
|
|||||||
* A heap tuple containing the desired block, or NULL if no
|
* A heap tuple containing the desired block, or NULL if no
|
||||||
* such tuple exists.
|
* such tuple exists.
|
||||||
*/
|
*/
|
||||||
static HeapTuple
|
static void
|
||||||
inv_fetchtup(LargeObjectDesc *obj_desc, Buffer *buffer)
|
inv_fetchtup(LargeObjectDesc *obj_desc, HeapTuple tuple, Buffer *buffer)
|
||||||
{
|
{
|
||||||
HeapTuple tuple;
|
|
||||||
RetrieveIndexResult res;
|
RetrieveIndexResult res;
|
||||||
Datum d;
|
Datum d;
|
||||||
int firstbyte,
|
int firstbyte,
|
||||||
@ -650,7 +649,8 @@ inv_fetchtup(LargeObjectDesc *obj_desc, Buffer *buffer)
|
|||||||
if (res == (RetrieveIndexResult) NULL)
|
if (res == (RetrieveIndexResult) NULL)
|
||||||
{
|
{
|
||||||
ItemPointerSetInvalid(&(obj_desc->htid));
|
ItemPointerSetInvalid(&(obj_desc->htid));
|
||||||
return (HeapTuple) NULL;
|
tuple->t_data = NULL;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -662,19 +662,18 @@ inv_fetchtup(LargeObjectDesc *obj_desc, Buffer *buffer)
|
|||||||
* way... - vadim 07/28/98
|
* way... - vadim 07/28/98
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
tuple->t_self = res->heap_iptr;
|
||||||
tuple = heap_fetch(obj_desc->heap_r, SnapshotNow,
|
heap_fetch(obj_desc->heap_r, SnapshotNow, tuple, buffer);
|
||||||
&res->heap_iptr, buffer);
|
|
||||||
pfree(res);
|
pfree(res);
|
||||||
} while (tuple == (HeapTuple) NULL);
|
} while (tuple->t_data == NULL);
|
||||||
|
|
||||||
/* remember this tid -- we may need it for later reads/writes */
|
/* remember this tid -- we may need it for later reads/writes */
|
||||||
ItemPointerCopy(&tuple->t_ctid, &obj_desc->htid);
|
ItemPointerCopy(&(tuple->t_self), &obj_desc->htid);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tuple = heap_fetch(obj_desc->heap_r, SnapshotNow,
|
tuple->t_self = obj_desc->htid;
|
||||||
&(obj_desc->htid), buffer);
|
heap_fetch(obj_desc->heap_r, SnapshotNow, tuple, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -697,7 +696,7 @@ inv_fetchtup(LargeObjectDesc *obj_desc, Buffer *buffer)
|
|||||||
obj_desc->lowbyte = firstbyte;
|
obj_desc->lowbyte = firstbyte;
|
||||||
obj_desc->highbyte = lastbyte;
|
obj_desc->highbyte = lastbyte;
|
||||||
|
|
||||||
return tuple;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -786,6 +785,7 @@ inv_wrnew(LargeObjectDesc *obj_desc, char *buf, int nbytes)
|
|||||||
|
|
||||||
ntup = inv_newtuple(obj_desc, buffer, page, buf, nwritten);
|
ntup = inv_newtuple(obj_desc, buffer, page, buf, nwritten);
|
||||||
inv_indextup(obj_desc, ntup);
|
inv_indextup(obj_desc, ntup);
|
||||||
|
pfree (ntup);
|
||||||
|
|
||||||
/* new tuple is inserted */
|
/* new tuple is inserted */
|
||||||
WriteBuffer(buffer);
|
WriteBuffer(buffer);
|
||||||
@ -822,9 +822,9 @@ inv_wrold(LargeObjectDesc *obj_desc,
|
|||||||
* abstraction.
|
* abstraction.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
TransactionIdStore(GetCurrentTransactionId(), &(tuple->t_xmax));
|
TransactionIdStore(GetCurrentTransactionId(), &(tuple->t_data->t_xmax));
|
||||||
tuple->t_cmax = GetCurrentCommandId();
|
tuple->t_data->t_cmax = GetCurrentCommandId();
|
||||||
tuple->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
|
tuple->t_data->t_infomask &= ~(HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we're overwriting the entire block, we're lucky. All we need to
|
* If we're overwriting the entire block, we're lucky. All we need to
|
||||||
@ -953,6 +953,7 @@ inv_wrold(LargeObjectDesc *obj_desc,
|
|||||||
|
|
||||||
/* index the new tuple */
|
/* index the new tuple */
|
||||||
inv_indextup(obj_desc, ntup);
|
inv_indextup(obj_desc, ntup);
|
||||||
|
pfree (ntup);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* move the scandesc forward so we don't reread the newly inserted
|
* move the scandesc forward so we don't reread the newly inserted
|
||||||
@ -985,7 +986,7 @@ inv_newtuple(LargeObjectDesc *obj_desc,
|
|||||||
char *dbuf,
|
char *dbuf,
|
||||||
int nwrite)
|
int nwrite)
|
||||||
{
|
{
|
||||||
HeapTuple ntup;
|
HeapTuple ntup = (HeapTuple) palloc (sizeof(HeapTupleData));
|
||||||
PageHeader ph;
|
PageHeader ph;
|
||||||
int tupsize;
|
int tupsize;
|
||||||
int hoff;
|
int hoff;
|
||||||
@ -997,7 +998,7 @@ inv_newtuple(LargeObjectDesc *obj_desc,
|
|||||||
char *attptr;
|
char *attptr;
|
||||||
|
|
||||||
/* compute tuple size -- no nulls */
|
/* compute tuple size -- no nulls */
|
||||||
hoff = offsetof(HeapTupleData, t_bits);
|
hoff = offsetof(HeapTupleHeaderData, t_bits);
|
||||||
|
|
||||||
/* add in olastbyte, varlena.vl_len, varlena.vl_dat */
|
/* add in olastbyte, varlena.vl_len, varlena.vl_dat */
|
||||||
tupsize = hoff + (2 * sizeof(int32)) + nwrite;
|
tupsize = hoff + (2 * sizeof(int32)) + nwrite;
|
||||||
@ -1036,7 +1037,7 @@ inv_newtuple(LargeObjectDesc *obj_desc,
|
|||||||
ph->pd_lower = lower;
|
ph->pd_lower = lower;
|
||||||
ph->pd_upper = upper;
|
ph->pd_upper = upper;
|
||||||
|
|
||||||
ntup = (HeapTuple) ((char *) page + upper);
|
ntup->t_data = (HeapTupleHeader) ((char *) page + upper);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Tuple is now allocated on the page. Next, fill in the tuple
|
* Tuple is now allocated on the page. Next, fill in the tuple
|
||||||
@ -1044,15 +1045,15 @@ inv_newtuple(LargeObjectDesc *obj_desc,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
ntup->t_len = tupsize;
|
ntup->t_len = tupsize;
|
||||||
ItemPointerSet(&ntup->t_ctid, BufferGetBlockNumber(buffer), off);
|
ItemPointerSet(&ntup->t_self, BufferGetBlockNumber(buffer), off);
|
||||||
LastOidProcessed = ntup->t_oid = newoid();
|
LastOidProcessed = ntup->t_data->t_oid = newoid();
|
||||||
TransactionIdStore(GetCurrentTransactionId(), &(ntup->t_xmin));
|
TransactionIdStore(GetCurrentTransactionId(), &(ntup->t_data->t_xmin));
|
||||||
ntup->t_cmin = GetCurrentCommandId();
|
ntup->t_data->t_cmin = GetCurrentCommandId();
|
||||||
StoreInvalidTransactionId(&(ntup->t_xmax));
|
StoreInvalidTransactionId(&(ntup->t_data->t_xmax));
|
||||||
ntup->t_cmax = 0;
|
ntup->t_data->t_cmax = 0;
|
||||||
ntup->t_infomask = HEAP_XMAX_INVALID;
|
ntup->t_data->t_infomask = HEAP_XMAX_INVALID;
|
||||||
ntup->t_natts = 2;
|
ntup->t_data->t_natts = 2;
|
||||||
ntup->t_hoff = hoff;
|
ntup->t_data->t_hoff = hoff;
|
||||||
|
|
||||||
/* if a NULL is passed in, avoid the calculations below */
|
/* if a NULL is passed in, avoid the calculations below */
|
||||||
if (dbuf == NULL)
|
if (dbuf == NULL)
|
||||||
@ -1063,7 +1064,7 @@ inv_newtuple(LargeObjectDesc *obj_desc,
|
|||||||
* the tuple and class abstractions.
|
* the tuple and class abstractions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
attptr = ((char *) ntup) + hoff;
|
attptr = ((char *) ntup->t_data) + hoff;
|
||||||
*((int32 *) attptr) = obj_desc->offset + nwrite - 1;
|
*((int32 *) attptr) = obj_desc->offset + nwrite - 1;
|
||||||
attptr += sizeof(int32);
|
attptr += sizeof(int32);
|
||||||
|
|
||||||
@ -1106,7 +1107,7 @@ inv_indextup(LargeObjectDesc *obj_desc, HeapTuple tuple)
|
|||||||
n[0] = ' ';
|
n[0] = ' ';
|
||||||
v[0] = Int32GetDatum(obj_desc->highbyte);
|
v[0] = Int32GetDatum(obj_desc->highbyte);
|
||||||
res = index_insert(obj_desc->index_r, &v[0], &n[0],
|
res = index_insert(obj_desc->index_r, &v[0], &n[0],
|
||||||
&(tuple->t_ctid), obj_desc->heap_r);
|
&(tuple->t_self), obj_desc->heap_r);
|
||||||
|
|
||||||
if (res)
|
if (res)
|
||||||
pfree(res);
|
pfree(res);
|
||||||
@ -1209,7 +1210,7 @@ _inv_getsize(Relation hreln, TupleDesc hdesc, Relation ireln)
|
|||||||
{
|
{
|
||||||
IndexScanDesc iscan;
|
IndexScanDesc iscan;
|
||||||
RetrieveIndexResult res;
|
RetrieveIndexResult res;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
Datum d;
|
Datum d;
|
||||||
long size;
|
long size;
|
||||||
bool isNull;
|
bool isNull;
|
||||||
@ -1239,16 +1240,17 @@ _inv_getsize(Relation hreln, TupleDesc hdesc, Relation ireln)
|
|||||||
* rather that NowTimeQual. We currently have no way to pass a
|
* rather that NowTimeQual. We currently have no way to pass a
|
||||||
* time qual in.
|
* time qual in.
|
||||||
*/
|
*/
|
||||||
tuple = heap_fetch(hreln, SnapshotNow, &res->heap_iptr, &buffer);
|
tuple.t_self = res->heap_iptr;
|
||||||
|
heap_fetch(hreln, SnapshotNow, &tuple, &buffer);
|
||||||
pfree(res);
|
pfree(res);
|
||||||
} while (!HeapTupleIsValid(tuple));
|
} while (tuple.t_data == NULL);
|
||||||
|
|
||||||
/* don't need the index scan anymore */
|
/* don't need the index scan anymore */
|
||||||
index_endscan(iscan);
|
index_endscan(iscan);
|
||||||
pfree(iscan);
|
pfree(iscan);
|
||||||
|
|
||||||
/* get olastbyte attribute */
|
/* get olastbyte attribute */
|
||||||
d = heap_getattr(tuple, 1, hdesc, &isNull);
|
d = heap_getattr(&tuple, 1, hdesc, &isNull);
|
||||||
size = DatumGetInt32(d) + 1;
|
size = DatumGetInt32(d) + 1;
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.32 1998/10/02 05:31:28 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/regproc.c,v 1.33 1998/11/27 19:52:22 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -42,6 +42,7 @@ int32
|
|||||||
regprocin(char *pro_name_or_oid)
|
regprocin(char *pro_name_or_oid)
|
||||||
{
|
{
|
||||||
HeapTuple proctup = NULL;
|
HeapTuple proctup = NULL;
|
||||||
|
HeapTupleData tuple;
|
||||||
RegProcedure result = InvalidOid;
|
RegProcedure result = InvalidOid;
|
||||||
|
|
||||||
if (pro_name_or_oid == NULL)
|
if (pro_name_or_oid == NULL)
|
||||||
@ -60,7 +61,7 @@ regprocin(char *pro_name_or_oid)
|
|||||||
ObjectIdGetDatum(oidin(pro_name_or_oid)),
|
ObjectIdGetDatum(oidin(pro_name_or_oid)),
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
if (HeapTupleIsValid(proctup))
|
if (HeapTupleIsValid(proctup))
|
||||||
result = (RegProcedure) proctup->t_oid;
|
result = (RegProcedure) proctup->t_data->t_oid;
|
||||||
else
|
else
|
||||||
elog(ERROR, "No procedure with oid %s", pro_name_or_oid);
|
elog(ERROR, "No procedure with oid %s", pro_name_or_oid);
|
||||||
}
|
}
|
||||||
@ -86,13 +87,14 @@ regprocin(char *pro_name_or_oid)
|
|||||||
sd = index_beginscan(idesc, false, 1, skey);
|
sd = index_beginscan(idesc, false, 1, skey);
|
||||||
while ((indexRes = index_getnext(sd, ForwardScanDirection)))
|
while ((indexRes = index_getnext(sd, ForwardScanDirection)))
|
||||||
{
|
{
|
||||||
proctup = heap_fetch(hdesc, SnapshotNow,
|
tuple.t_self = indexRes->heap_iptr;
|
||||||
&indexRes->heap_iptr,
|
heap_fetch(hdesc, SnapshotNow,
|
||||||
|
&tuple,
|
||||||
&buffer);
|
&buffer);
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
if (HeapTupleIsValid(proctup))
|
if (tuple.t_data != NULL)
|
||||||
{
|
{
|
||||||
result = (RegProcedure) proctup->t_oid;
|
result = (RegProcedure) tuple.t_data->t_oid;
|
||||||
ReleaseBuffer(buffer);
|
ReleaseBuffer(buffer);
|
||||||
|
|
||||||
if (++matches > 1)
|
if (++matches > 1)
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.18 1998/09/01 04:32:51 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/adt/Attic/sets.c,v 1.19 1998/11/27 19:52:23 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -123,10 +123,10 @@ SetDefine(char *querystr, char *typename)
|
|||||||
repl);
|
repl);
|
||||||
|
|
||||||
setheapoverride(true);
|
setheapoverride(true);
|
||||||
heap_replace(procrel, &tup->t_ctid, newtup);
|
heap_replace(procrel, &tup->t_self, newtup);
|
||||||
setheapoverride(false);
|
setheapoverride(false);
|
||||||
|
|
||||||
setoid = newtup->t_oid;
|
setoid = newtup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
elog(ERROR, "setin: could not find new set oid tuple");
|
elog(ERROR, "setin: could not find new set oid tuple");
|
||||||
|
14
src/backend/utils/cache/catcache.c
vendored
14
src/backend/utils/cache/catcache.c
vendored
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.35 1998/10/12 00:53:33 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.36 1998/11/27 19:52:26 vadim Exp $
|
||||||
*
|
*
|
||||||
* Notes:
|
* Notes:
|
||||||
* XXX This needs to use exception.h to handle recovery when
|
* XXX This needs to use exception.h to handle recovery when
|
||||||
@ -386,7 +386,7 @@ CatalogCacheComputeTupleHashIndex(struct catcache * cacheInOutP,
|
|||||||
case 4:
|
case 4:
|
||||||
cacheInOutP->cc_skey[3].sk_argument =
|
cacheInOutP->cc_skey[3].sk_argument =
|
||||||
(cacheInOutP->cc_key[3] == ObjectIdAttributeNumber)
|
(cacheInOutP->cc_key[3] == ObjectIdAttributeNumber)
|
||||||
? (Datum) tuple->t_oid
|
? (Datum) tuple->t_data->t_oid
|
||||||
: fastgetattr(tuple,
|
: fastgetattr(tuple,
|
||||||
cacheInOutP->cc_key[3],
|
cacheInOutP->cc_key[3],
|
||||||
RelationGetDescr(relation),
|
RelationGetDescr(relation),
|
||||||
@ -396,7 +396,7 @@ CatalogCacheComputeTupleHashIndex(struct catcache * cacheInOutP,
|
|||||||
case 3:
|
case 3:
|
||||||
cacheInOutP->cc_skey[2].sk_argument =
|
cacheInOutP->cc_skey[2].sk_argument =
|
||||||
(cacheInOutP->cc_key[2] == ObjectIdAttributeNumber)
|
(cacheInOutP->cc_key[2] == ObjectIdAttributeNumber)
|
||||||
? (Datum) tuple->t_oid
|
? (Datum) tuple->t_data->t_oid
|
||||||
: fastgetattr(tuple,
|
: fastgetattr(tuple,
|
||||||
cacheInOutP->cc_key[2],
|
cacheInOutP->cc_key[2],
|
||||||
RelationGetDescr(relation),
|
RelationGetDescr(relation),
|
||||||
@ -406,7 +406,7 @@ CatalogCacheComputeTupleHashIndex(struct catcache * cacheInOutP,
|
|||||||
case 2:
|
case 2:
|
||||||
cacheInOutP->cc_skey[1].sk_argument =
|
cacheInOutP->cc_skey[1].sk_argument =
|
||||||
(cacheInOutP->cc_key[1] == ObjectIdAttributeNumber)
|
(cacheInOutP->cc_key[1] == ObjectIdAttributeNumber)
|
||||||
? (Datum) tuple->t_oid
|
? (Datum) tuple->t_data->t_oid
|
||||||
: fastgetattr(tuple,
|
: fastgetattr(tuple,
|
||||||
cacheInOutP->cc_key[1],
|
cacheInOutP->cc_key[1],
|
||||||
RelationGetDescr(relation),
|
RelationGetDescr(relation),
|
||||||
@ -416,7 +416,7 @@ CatalogCacheComputeTupleHashIndex(struct catcache * cacheInOutP,
|
|||||||
case 1:
|
case 1:
|
||||||
cacheInOutP->cc_skey[0].sk_argument =
|
cacheInOutP->cc_skey[0].sk_argument =
|
||||||
(cacheInOutP->cc_key[0] == ObjectIdAttributeNumber)
|
(cacheInOutP->cc_key[0] == ObjectIdAttributeNumber)
|
||||||
? (Datum) tuple->t_oid
|
? (Datum) tuple->t_data->t_oid
|
||||||
: fastgetattr(tuple,
|
: fastgetattr(tuple,
|
||||||
cacheInOutP->cc_key[0],
|
cacheInOutP->cc_key[0],
|
||||||
RelationGetDescr(relation),
|
RelationGetDescr(relation),
|
||||||
@ -513,7 +513,7 @@ CatalogCacheIdInvalidate(int cacheId, /* XXX */
|
|||||||
elt = DLGetSucc(elt))
|
elt = DLGetSucc(elt))
|
||||||
{
|
{
|
||||||
ct = (CatCTup *) DLE_VAL(elt);
|
ct = (CatCTup *) DLE_VAL(elt);
|
||||||
if (ItemPointerEquals(pointer, &ct->ct_tup->t_ctid))
|
if (ItemPointerEquals(pointer, &ct->ct_tup->t_self))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1141,7 +1141,7 @@ RelationInvalidateCatalogCacheTuple(Relation relation,
|
|||||||
|
|
||||||
(*function) (ccp->id,
|
(*function) (ccp->id,
|
||||||
CatalogCacheComputeTupleHashIndex(ccp, relation, tuple),
|
CatalogCacheComputeTupleHashIndex(ccp, relation, tuple),
|
||||||
&tuple->t_ctid);
|
&tuple->t_self);
|
||||||
|
|
||||||
heap_close(relation);
|
heap_close(relation);
|
||||||
}
|
}
|
||||||
|
4
src/backend/utils/cache/fcache.c
vendored
4
src/backend/utils/cache/fcache.c
vendored
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.18 1998/09/01 04:32:58 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/cache/Attic/fcache.c,v 1.19 1998/11/27 19:52:27 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -74,7 +74,7 @@ GetDynamicFuncArgType(Var *arg, ExprContext *econtext)
|
|||||||
elog(ERROR, "Lookup failed on type tuple for class %s",
|
elog(ERROR, "Lookup failed on type tuple for class %s",
|
||||||
relname);
|
relname);
|
||||||
|
|
||||||
return tup->t_oid;
|
return tup->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FunctionCachePtr
|
static FunctionCachePtr
|
||||||
|
14
src/backend/utils/cache/inval.c
vendored
14
src/backend/utils/cache/inval.c
vendored
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.17 1998/10/12 00:53:34 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.18 1998/11/27 19:52:28 vadim Exp $
|
||||||
*
|
*
|
||||||
* Note - this code is real crufty...
|
* Note - this code is real crufty...
|
||||||
*
|
*
|
||||||
@ -250,25 +250,25 @@ getmyrelids()
|
|||||||
PointerGetDatum(RelationRelationName),
|
PointerGetDatum(RelationRelationName),
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
Assert(HeapTupleIsValid(tuple));
|
Assert(HeapTupleIsValid(tuple));
|
||||||
MyRelationRelationId = tuple->t_oid;
|
MyRelationRelationId = tuple->t_data->t_oid;
|
||||||
|
|
||||||
tuple = SearchSysCacheTuple(RELNAME,
|
tuple = SearchSysCacheTuple(RELNAME,
|
||||||
PointerGetDatum(AttributeRelationName),
|
PointerGetDatum(AttributeRelationName),
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
Assert(HeapTupleIsValid(tuple));
|
Assert(HeapTupleIsValid(tuple));
|
||||||
MyAttributeRelationId = tuple->t_oid;
|
MyAttributeRelationId = tuple->t_data->t_oid;
|
||||||
|
|
||||||
tuple = SearchSysCacheTuple(RELNAME,
|
tuple = SearchSysCacheTuple(RELNAME,
|
||||||
PointerGetDatum(AccessMethodRelationName),
|
PointerGetDatum(AccessMethodRelationName),
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
Assert(HeapTupleIsValid(tuple));
|
Assert(HeapTupleIsValid(tuple));
|
||||||
MyAMRelationId = tuple->t_oid;
|
MyAMRelationId = tuple->t_data->t_oid;
|
||||||
|
|
||||||
tuple = SearchSysCacheTuple(RELNAME,
|
tuple = SearchSysCacheTuple(RELNAME,
|
||||||
PointerGetDatum(AccessMethodOperatorRelationName),
|
PointerGetDatum(AccessMethodOperatorRelationName),
|
||||||
0, 0, 0);
|
0, 0, 0);
|
||||||
Assert(HeapTupleIsValid(tuple));
|
Assert(HeapTupleIsValid(tuple));
|
||||||
MyAMOPRelationId = tuple->t_oid;
|
MyAMOPRelationId = tuple->t_data->t_oid;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------
|
/* --------------------------------
|
||||||
@ -481,11 +481,11 @@ RelationInvalidateRelationCache(Relation relation,
|
|||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
if (relationId == MyRelationRelationId)
|
if (relationId == MyRelationRelationId)
|
||||||
objectId = tuple->t_oid;
|
objectId = tuple->t_data->t_oid;
|
||||||
else if (relationId == MyAttributeRelationId)
|
else if (relationId == MyAttributeRelationId)
|
||||||
objectId = ((Form_pg_attribute) GETSTRUCT(tuple))->attrelid;
|
objectId = ((Form_pg_attribute) GETSTRUCT(tuple))->attrelid;
|
||||||
else if (relationId == MyAMRelationId)
|
else if (relationId == MyAMRelationId)
|
||||||
objectId = tuple->t_oid;
|
objectId = tuple->t_data->t_oid;
|
||||||
else if (relationId == MyAMOPRelationId)
|
else if (relationId == MyAMOPRelationId)
|
||||||
{
|
{
|
||||||
; /* objectId is unused */
|
; /* objectId is unused */
|
||||||
|
45
src/backend/utils/cache/relcache.c
vendored
45
src/backend/utils/cache/relcache.c
vendored
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.50 1998/09/01 04:33:02 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.51 1998/11/27 19:52:28 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -383,10 +383,7 @@ scan_pg_rel_seq(RelationBuildDescInfo buildinfo)
|
|||||||
* this bug is discovered and killed by wei on 9/27/91.
|
* this bug is discovered and killed by wei on 9/27/91.
|
||||||
* -------------------
|
* -------------------
|
||||||
*/
|
*/
|
||||||
return_tuple = (HeapTuple) palloc((Size) pg_class_tuple->t_len);
|
return_tuple = heap_copytuple(pg_class_tuple);
|
||||||
memmove((char *) return_tuple,
|
|
||||||
(char *) pg_class_tuple,
|
|
||||||
(int) pg_class_tuple->t_len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* all done */
|
/* all done */
|
||||||
@ -718,7 +715,7 @@ RelationBuildRuleLock(Relation relation)
|
|||||||
|
|
||||||
rule = (RewriteRule *) palloc(sizeof(RewriteRule));
|
rule = (RewriteRule *) palloc(sizeof(RewriteRule));
|
||||||
|
|
||||||
rule->ruleId = pg_rewrite_tuple->t_oid;
|
rule->ruleId = pg_rewrite_tuple->t_data->t_oid;
|
||||||
|
|
||||||
rule->event =
|
rule->event =
|
||||||
(int) heap_getattr(pg_rewrite_tuple,
|
(int) heap_getattr(pg_rewrite_tuple,
|
||||||
@ -838,7 +835,7 @@ RelationBuildDesc(RelationBuildDescInfo buildinfo)
|
|||||||
* get information from the pg_class_tuple
|
* get information from the pg_class_tuple
|
||||||
* ----------------
|
* ----------------
|
||||||
*/
|
*/
|
||||||
relid = pg_class_tuple->t_oid;
|
relid = pg_class_tuple->t_data->t_oid;
|
||||||
relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
|
relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
|
||||||
natts = relp->relnatts;
|
natts = relp->relnatts;
|
||||||
|
|
||||||
@ -1661,11 +1658,10 @@ AttrDefaultFetch(Relation relation)
|
|||||||
Relation adrel;
|
Relation adrel;
|
||||||
Relation irel;
|
Relation irel;
|
||||||
ScanKeyData skey;
|
ScanKeyData skey;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
Form_pg_attrdef adform;
|
Form_pg_attrdef adform;
|
||||||
IndexScanDesc sd;
|
IndexScanDesc sd;
|
||||||
RetrieveIndexResult indexRes;
|
RetrieveIndexResult indexRes;
|
||||||
ItemPointer iptr;
|
|
||||||
struct varlena *val;
|
struct varlena *val;
|
||||||
bool isnull;
|
bool isnull;
|
||||||
int found;
|
int found;
|
||||||
@ -1680,7 +1676,7 @@ AttrDefaultFetch(Relation relation)
|
|||||||
adrel = heap_openr(AttrDefaultRelationName);
|
adrel = heap_openr(AttrDefaultRelationName);
|
||||||
irel = index_openr(AttrDefaultIndex);
|
irel = index_openr(AttrDefaultIndex);
|
||||||
sd = index_beginscan(irel, false, 1, &skey);
|
sd = index_beginscan(irel, false, 1, &skey);
|
||||||
tuple = (HeapTuple) NULL;
|
tuple.t_data = NULL;
|
||||||
|
|
||||||
for (found = 0;;)
|
for (found = 0;;)
|
||||||
{
|
{
|
||||||
@ -1690,13 +1686,13 @@ AttrDefaultFetch(Relation relation)
|
|||||||
if (!indexRes)
|
if (!indexRes)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
iptr = &indexRes->heap_iptr;
|
tuple.t_self = indexRes->heap_iptr;
|
||||||
tuple = heap_fetch(adrel, SnapshotNow, iptr, &buffer);
|
heap_fetch(adrel, SnapshotNow, &tuple, &buffer);
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
if (!HeapTupleIsValid(tuple))
|
if (tuple.t_data == NULL)
|
||||||
continue;
|
continue;
|
||||||
found++;
|
found++;
|
||||||
adform = (Form_pg_attrdef) GETSTRUCT(tuple);
|
adform = (Form_pg_attrdef) GETSTRUCT(&tuple);
|
||||||
for (i = 0; i < ndef; i++)
|
for (i = 0; i < ndef; i++)
|
||||||
{
|
{
|
||||||
if (adform->adnum != attrdef[i].adnum)
|
if (adform->adnum != attrdef[i].adnum)
|
||||||
@ -1706,7 +1702,7 @@ AttrDefaultFetch(Relation relation)
|
|||||||
relation->rd_att->attrs[adform->adnum - 1]->attname.data,
|
relation->rd_att->attrs[adform->adnum - 1]->attname.data,
|
||||||
relation->rd_rel->relname.data);
|
relation->rd_rel->relname.data);
|
||||||
|
|
||||||
val = (struct varlena *) fastgetattr(tuple,
|
val = (struct varlena *) fastgetattr(&tuple,
|
||||||
Anum_pg_attrdef_adbin,
|
Anum_pg_attrdef_adbin,
|
||||||
adrel->rd_att, &isnull);
|
adrel->rd_att, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
@ -1714,7 +1710,7 @@ AttrDefaultFetch(Relation relation)
|
|||||||
relation->rd_att->attrs[adform->adnum - 1]->attname.data,
|
relation->rd_att->attrs[adform->adnum - 1]->attname.data,
|
||||||
relation->rd_rel->relname.data);
|
relation->rd_rel->relname.data);
|
||||||
attrdef[i].adbin = textout(val);
|
attrdef[i].adbin = textout(val);
|
||||||
val = (struct varlena *) fastgetattr(tuple,
|
val = (struct varlena *) fastgetattr(&tuple,
|
||||||
Anum_pg_attrdef_adsrc,
|
Anum_pg_attrdef_adsrc,
|
||||||
adrel->rd_att, &isnull);
|
adrel->rd_att, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
@ -1750,10 +1746,9 @@ RelCheckFetch(Relation relation)
|
|||||||
Relation rcrel;
|
Relation rcrel;
|
||||||
Relation irel;
|
Relation irel;
|
||||||
ScanKeyData skey;
|
ScanKeyData skey;
|
||||||
HeapTuple tuple;
|
HeapTupleData tuple;
|
||||||
IndexScanDesc sd;
|
IndexScanDesc sd;
|
||||||
RetrieveIndexResult indexRes;
|
RetrieveIndexResult indexRes;
|
||||||
ItemPointer iptr;
|
|
||||||
Name rcname;
|
Name rcname;
|
||||||
struct varlena *val;
|
struct varlena *val;
|
||||||
bool isnull;
|
bool isnull;
|
||||||
@ -1768,7 +1763,7 @@ RelCheckFetch(Relation relation)
|
|||||||
rcrel = heap_openr(RelCheckRelationName);
|
rcrel = heap_openr(RelCheckRelationName);
|
||||||
irel = index_openr(RelCheckIndex);
|
irel = index_openr(RelCheckIndex);
|
||||||
sd = index_beginscan(irel, false, 1, &skey);
|
sd = index_beginscan(irel, false, 1, &skey);
|
||||||
tuple = (HeapTuple) NULL;
|
tuple.t_data = NULL;
|
||||||
|
|
||||||
for (found = 0;;)
|
for (found = 0;;)
|
||||||
{
|
{
|
||||||
@ -1778,30 +1773,30 @@ RelCheckFetch(Relation relation)
|
|||||||
if (!indexRes)
|
if (!indexRes)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
iptr = &indexRes->heap_iptr;
|
tuple.t_self = indexRes->heap_iptr;
|
||||||
tuple = heap_fetch(rcrel, SnapshotNow, iptr, &buffer);
|
heap_fetch(rcrel, SnapshotNow, &tuple, &buffer);
|
||||||
pfree(indexRes);
|
pfree(indexRes);
|
||||||
if (!HeapTupleIsValid(tuple))
|
if (tuple.t_data == NULL)
|
||||||
continue;
|
continue;
|
||||||
if (found == ncheck)
|
if (found == ncheck)
|
||||||
elog(ERROR, "RelCheckFetch: unexpected record found for rel %s",
|
elog(ERROR, "RelCheckFetch: unexpected record found for rel %s",
|
||||||
relation->rd_rel->relname.data);
|
relation->rd_rel->relname.data);
|
||||||
|
|
||||||
rcname = (Name) fastgetattr(tuple,
|
rcname = (Name) fastgetattr(&tuple,
|
||||||
Anum_pg_relcheck_rcname,
|
Anum_pg_relcheck_rcname,
|
||||||
rcrel->rd_att, &isnull);
|
rcrel->rd_att, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
elog(ERROR, "RelCheckFetch: rcname IS NULL for rel %s",
|
elog(ERROR, "RelCheckFetch: rcname IS NULL for rel %s",
|
||||||
relation->rd_rel->relname.data);
|
relation->rd_rel->relname.data);
|
||||||
check[found].ccname = nameout(rcname);
|
check[found].ccname = nameout(rcname);
|
||||||
val = (struct varlena *) fastgetattr(tuple,
|
val = (struct varlena *) fastgetattr(&tuple,
|
||||||
Anum_pg_relcheck_rcbin,
|
Anum_pg_relcheck_rcbin,
|
||||||
rcrel->rd_att, &isnull);
|
rcrel->rd_att, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
elog(ERROR, "RelCheckFetch: rcbin IS NULL for rel %s",
|
elog(ERROR, "RelCheckFetch: rcbin IS NULL for rel %s",
|
||||||
relation->rd_rel->relname.data);
|
relation->rd_rel->relname.data);
|
||||||
check[found].ccbin = textout(val);
|
check[found].ccbin = textout(val);
|
||||||
val = (struct varlena *) fastgetattr(tuple,
|
val = (struct varlena *) fastgetattr(&tuple,
|
||||||
Anum_pg_relcheck_rcsrc,
|
Anum_pg_relcheck_rcsrc,
|
||||||
rcrel->rd_att, &isnull);
|
rcrel->rd_att, &isnull);
|
||||||
if (isnull)
|
if (isnull)
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/misc/Attic/database.c,v 1.20 1998/09/03 02:32:41 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/misc/Attic/database.c,v 1.21 1998/11/27 19:52:29 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -188,7 +188,7 @@ GetRawDatabaseInfo(char *name, int4 *owner, Oid *db_id, char *path, int *encodin
|
|||||||
int nbytes;
|
int nbytes;
|
||||||
int max,
|
int max,
|
||||||
i;
|
i;
|
||||||
HeapTuple tup;
|
HeapTupleData tup;
|
||||||
Page pg;
|
Page pg;
|
||||||
PageHeader ph;
|
PageHeader ph;
|
||||||
char *dbfname;
|
char *dbfname;
|
||||||
@ -238,7 +238,7 @@ GetRawDatabaseInfo(char *name, int4 *owner, Oid *db_id, char *path, int *encodin
|
|||||||
|
|
||||||
/* get a pointer to the tuple itself */
|
/* get a pointer to the tuple itself */
|
||||||
offset = (int) ph->pd_linp[i].lp_off;
|
offset = (int) ph->pd_linp[i].lp_off;
|
||||||
tup = (HeapTuple) (((char *) pg) + offset);
|
tup.t_data = (HeapTupleHeader) (((char *) pg) + offset);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if the tuple has been deleted (the database was destroyed),
|
* if the tuple has been deleted (the database was destroyed),
|
||||||
@ -253,7 +253,7 @@ GetRawDatabaseInfo(char *name, int4 *owner, Oid *db_id, char *path, int *encodin
|
|||||||
* if data is ever moved and no longer the first field this
|
* if data is ever moved and no longer the first field this
|
||||||
* will be broken!! -mer 11 Nov 1991.
|
* will be broken!! -mer 11 Nov 1991.
|
||||||
*/
|
*/
|
||||||
if (TransactionIdIsValid((TransactionId) tup->t_xmax))
|
if (TransactionIdIsValid((TransactionId) tup.t_data->t_xmax))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -267,7 +267,7 @@ GetRawDatabaseInfo(char *name, int4 *owner, Oid *db_id, char *path, int *encodin
|
|||||||
* you exactly how big the header actually is. use the PC
|
* you exactly how big the header actually is. use the PC
|
||||||
* means of getting at sys cat attrs.
|
* means of getting at sys cat attrs.
|
||||||
*/
|
*/
|
||||||
tup_db = (Form_pg_database) GETSTRUCT(tup);
|
tup_db = (Form_pg_database) GETSTRUCT(&tup);
|
||||||
#ifdef MULTIBYTE
|
#ifdef MULTIBYTE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -279,7 +279,7 @@ GetRawDatabaseInfo(char *name, int4 *owner, Oid *db_id, char *path, int *encodin
|
|||||||
#endif
|
#endif
|
||||||
if (strcmp(name, tup_db->datname.data) == 0)
|
if (strcmp(name, tup_db->datname.data) == 0)
|
||||||
{
|
{
|
||||||
*db_id = tup->t_oid;
|
*db_id = tup.t_data->t_oid;
|
||||||
strncpy(path, VARDATA(&(tup_db->datpath)),
|
strncpy(path, VARDATA(&(tup_db->datpath)),
|
||||||
(VARSIZE(&(tup_db->datpath)) - VARHDRSZ));
|
(VARSIZE(&(tup_db->datpath)) - VARHDRSZ));
|
||||||
*(path + VARSIZE(&(tup_db->datpath)) - VARHDRSZ) = '\0';
|
*(path + VARSIZE(&(tup_db->datpath)) - VARHDRSZ) = '\0';
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.42 1998/09/01 03:27:13 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/sort/Attic/psort.c,v 1.43 1998/11/27 19:52:32 vadim Exp $
|
||||||
*
|
*
|
||||||
* NOTES
|
* NOTES
|
||||||
* Sorts the first relation into the second relation.
|
* Sorts the first relation into the second relation.
|
||||||
@ -66,7 +66,6 @@ static void initialrun(Sort *node);
|
|||||||
static void inittapes(Sort *node);
|
static void inittapes(Sort *node);
|
||||||
static void merge(Sort *node, struct tape * dest);
|
static void merge(Sort *node, struct tape * dest);
|
||||||
static FILE *mergeruns(Sort *node);
|
static FILE *mergeruns(Sort *node);
|
||||||
static HeapTuple tuplecopy(HeapTuple tup);
|
|
||||||
static int _psort_cmp(HeapTuple *ltup, HeapTuple *rtup);
|
static int _psort_cmp(HeapTuple *ltup, HeapTuple *rtup);
|
||||||
|
|
||||||
|
|
||||||
@ -224,9 +223,11 @@ inittapes(Sort *node)
|
|||||||
|
|
||||||
#define PUTTUP(NODE, TUP, FP) \
|
#define PUTTUP(NODE, TUP, FP) \
|
||||||
( \
|
( \
|
||||||
|
(TUP)->t_len += HEAPTUPLESIZE, \
|
||||||
((Psortstate *)NODE->psortstate)->BytesWritten += (TUP)->t_len, \
|
((Psortstate *)NODE->psortstate)->BytesWritten += (TUP)->t_len, \
|
||||||
fwrite((char *)TUP, (TUP)->t_len, 1, FP), \
|
fwrite((char *)TUP, (TUP)->t_len, 1, FP), \
|
||||||
fwrite((char *)&((TUP)->t_len), sizeof (tlendummy), 1, FP) \
|
fwrite((char *)&((TUP)->t_len), sizeof (tlendummy), 1, FP), \
|
||||||
|
(TUP)->t_len -= HEAPTUPLESIZE \
|
||||||
)
|
)
|
||||||
|
|
||||||
#define ENDRUN(FP) fwrite((char *)&tlenzero, sizeof (tlenzero), 1, FP)
|
#define ENDRUN(FP) fwrite((char *)&tlenzero, sizeof (tlenzero), 1, FP)
|
||||||
@ -237,10 +238,11 @@ inittapes(Sort *node)
|
|||||||
IncrProcessed(), \
|
IncrProcessed(), \
|
||||||
((Psortstate *)NODE->psortstate)->BytesRead += (LEN) - sizeof (tlenzero), \
|
((Psortstate *)NODE->psortstate)->BytesRead += (LEN) - sizeof (tlenzero), \
|
||||||
fread((char *)(TUP) + sizeof (tlenzero), (LEN) - sizeof (tlenzero), 1, FP), \
|
fread((char *)(TUP) + sizeof (tlenzero), (LEN) - sizeof (tlenzero), 1, FP), \
|
||||||
|
(TUP)->t_data = (HeapTupleHeader) ((char *)(TUP) + HEAPTUPLESIZE), \
|
||||||
fread((char *)&tlendummy, sizeof (tlendummy), 1, FP) \
|
fread((char *)&tlendummy, sizeof (tlendummy), 1, FP) \
|
||||||
)
|
)
|
||||||
|
|
||||||
#define SETTUPLEN(TUP, LEN) (TUP)->t_len = LEN
|
#define SETTUPLEN(TUP, LEN) (TUP)->t_len = LEN - HEAPTUPLESIZE
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* USEMEM - record use of memory FREEMEM - record
|
* USEMEM - record use of memory FREEMEM - record
|
||||||
@ -407,7 +409,7 @@ createfirstrun(Sort *node)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
tup = tuplecopy(cr_slot->val);
|
tup = heap_copytuple(cr_slot->val);
|
||||||
ExecClearTuple(cr_slot);
|
ExecClearTuple(cr_slot);
|
||||||
|
|
||||||
IncrProcessed();
|
IncrProcessed();
|
||||||
@ -524,7 +526,7 @@ createrun(Sort *node, FILE *file)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tup = tuplecopy(cr_slot->val);
|
tup = heap_copytuple(cr_slot->val);
|
||||||
ExecClearTuple(cr_slot);
|
ExecClearTuple(cr_slot);
|
||||||
PS(node)->tupcount++;
|
PS(node)->tupcount++;
|
||||||
}
|
}
|
||||||
@ -577,26 +579,6 @@ createrun(Sort *node, FILE *file)
|
|||||||
return !foundeor;
|
return !foundeor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* tuplecopy - see also tuple.c:palloctup()
|
|
||||||
*
|
|
||||||
* This should eventually go there under that name? And this will
|
|
||||||
* then use palloc directly (see version -r1.2).
|
|
||||||
*/
|
|
||||||
static HeapTuple
|
|
||||||
tuplecopy(HeapTuple tup)
|
|
||||||
{
|
|
||||||
HeapTuple rettup;
|
|
||||||
|
|
||||||
if (!HeapTupleIsValid(tup))
|
|
||||||
{
|
|
||||||
return NULL; /* just in case */
|
|
||||||
}
|
|
||||||
rettup = (HeapTuple) palloc(tup->t_len);
|
|
||||||
memmove((char *) rettup, (char *) tup, tup->t_len); /* XXX */
|
|
||||||
return rettup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* mergeruns - merges all runs from input tapes
|
* mergeruns - merges all runs from input tapes
|
||||||
* (polyphase merge Alg.D(D6)--Knuth, Vol.3, p271)
|
* (polyphase merge Alg.D(D6)--Knuth, Vol.3, p271)
|
||||||
@ -792,7 +774,7 @@ psort_grabtuple(Sort *node, bool *should_free)
|
|||||||
return NULL;
|
return NULL;
|
||||||
if (GETLEN(tuplen, PS(node)->psort_grab_file) && tuplen != 0)
|
if (GETLEN(tuplen, PS(node)->psort_grab_file) && tuplen != 0)
|
||||||
{
|
{
|
||||||
tup = (HeapTuple) palloc((unsigned) tuplen);
|
tup = ALLOCTUP(tuplen);
|
||||||
SETTUPLEN(tup, tuplen);
|
SETTUPLEN(tup, tuplen);
|
||||||
GETTUP(node, tup, tuplen, PS(node)->psort_grab_file);
|
GETTUP(node, tup, tuplen, PS(node)->psort_grab_file);
|
||||||
|
|
||||||
@ -864,7 +846,7 @@ psort_grabtuple(Sort *node, bool *should_free)
|
|||||||
*/
|
*/
|
||||||
fseek(PS(node)->psort_grab_file,
|
fseek(PS(node)->psort_grab_file,
|
||||||
PS(node)->psort_current - tuplen, SEEK_SET);
|
PS(node)->psort_current - tuplen, SEEK_SET);
|
||||||
tup = (HeapTuple) palloc((unsigned) tuplen);
|
tup = ALLOCTUP(tuplen);
|
||||||
SETTUPLEN(tup, tuplen);
|
SETTUPLEN(tup, tuplen);
|
||||||
GETTUP(node, tup, tuplen, PS(node)->psort_grab_file);
|
GETTUP(node, tup, tuplen, PS(node)->psort_grab_file);
|
||||||
return tup; /* file position is equal to psort_current */
|
return tup; /* file position is equal to psort_current */
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.19 1998/09/01 04:33:41 momjian Exp $
|
* $Header: /cvsroot/pgsql/src/backend/utils/time/tqual.c,v 1.20 1998/11/27 19:52:36 vadim Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -75,7 +75,7 @@ setheapoverride(bool on)
|
|||||||
* Xmax is not committed))) that has not been committed
|
* Xmax is not committed))) that has not been committed
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
HeapTupleSatisfiesItself(HeapTuple tuple)
|
HeapTupleSatisfiesItself(HeapTupleHeader tuple)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED))
|
if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED))
|
||||||
@ -171,7 +171,7 @@ HeapTupleSatisfiesItself(HeapTuple tuple)
|
|||||||
* that do catalog accesses. this is unfortunate, but not critical.
|
* that do catalog accesses. this is unfortunate, but not critical.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
HeapTupleSatisfiesNow(HeapTuple tuple)
|
HeapTupleSatisfiesNow(HeapTupleHeader tuple)
|
||||||
{
|
{
|
||||||
if (AMI_OVERRIDE)
|
if (AMI_OVERRIDE)
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user