summaryrefslogtreecommitdiff
path: root/src/backend/access
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access')
-rw-r--r--src/backend/access/common/heaptuple.c27
-rw-r--r--src/backend/access/common/tupdesc.c16
-rw-r--r--src/backend/access/heap/heapam.c88
-rw-r--r--src/backend/access/heap/tuptoaster.c4
4 files changed, 94 insertions, 41 deletions
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index adad245c64..19e02dee67 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.77 2002/06/20 20:29:24 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.78 2002/07/20 05:16:56 momjian Exp $
*
* NOTES
* The old interface functions have been converted to macros
@@ -436,7 +436,7 @@ heap_getsysattr(HeapTuple tup, int attnum, bool *isnull)
result = PointerGetDatum(&(tup->t_self));
break;
case ObjectIdAttributeNumber:
- result = ObjectIdGetDatum(tup->t_data->t_oid);
+ result = ObjectIdGetDatum(HeapTupleGetOid(tup));
break;
case MinTransactionIdAttributeNumber:
result = TransactionIdGetDatum(HeapTupleHeaderGetXmin(tup->t_data));
@@ -581,6 +581,8 @@ heap_formtuple(TupleDesc tupleDescriptor,
elog(ERROR, "heap_formtuple: numberOfAttributes %d exceeds limit %d",
numberOfAttributes, MaxTupleAttributeNumber);
+ AssertTupleDescHasOidIsValid(tupleDescriptor);
+
for (i = 0; i < numberOfAttributes; i++)
{
if (nulls[i] != ' ')
@@ -595,6 +597,9 @@ heap_formtuple(TupleDesc tupleDescriptor,
if (hasnull)
len += BITMAPLEN(numberOfAttributes);
+ if (tupleDescriptor->tdhasoid == WITHOID)
+ len += sizeof(Oid);
+
hoff = len = MAXALIGN(len); /* align user data safely */
len += ComputeDataSize(tupleDescriptor, value, nulls);
@@ -698,14 +703,18 @@ heap_modifytuple(HeapTuple tuple,
* t_infomask
*/
infomask = newTuple->t_data->t_infomask;
- memmove((char *) &newTuple->t_data->t_oid, /* XXX */
- (char *) &tuple->t_data->t_oid,
- ((char *) &tuple->t_data->t_hoff -
- (char *) &tuple->t_data->t_oid)); /* XXX */
+ /*
+ * copy t_xmin, t_cid, t_xmax, t_ctid, t_natts, t_infomask
+ */
+ memmove((char *) newTuple->t_data, /* XXX */
+ (char *) tuple->t_data,
+ offsetof(HeapTupleHeaderData, t_hoff)); /* XXX */
newTuple->t_data->t_infomask = infomask;
newTuple->t_data->t_natts = numberOfAttributes;
newTuple->t_self = tuple->t_self;
newTuple->t_tableOid = tuple->t_tableOid;
+ if (relation->rd_rel->relhasoids)
+ HeapTupleSetOid(newTuple, HeapTupleGetOid(tuple));
return newTuple;
}
@@ -738,6 +747,7 @@ heap_freetuple(HeapTuple htup)
*/
HeapTuple
heap_addheader(int natts, /* max domain index */
+ bool withoid, /* reserve space for oid */
Size structlen, /* its length */
void *structure) /* pointer to the struct */
{
@@ -749,7 +759,10 @@ heap_addheader(int natts, /* max domain index */
AssertArg(natts > 0);
/* header needs no null bitmap */
- hoff = MAXALIGN(offsetof(HeapTupleHeaderData, t_bits));
+ hoff = offsetof(HeapTupleHeaderData, t_bits);
+ if (withoid)
+ hoff += sizeof(Oid);
+ hoff = MAXALIGN(hoff);
len = hoff + structlen;
tuple = (HeapTuple) palloc(HEAPTUPLESIZE + len);
diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c
index af73941369..24f33fac4b 100644
--- a/src/backend/access/common/tupdesc.c
+++ b/src/backend/access/common/tupdesc.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.80 2002/06/20 20:29:24 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/common/tupdesc.c,v 1.81 2002/07/20 05:16:56 momjian Exp $
*
* NOTES
* some of the executor utility code such as "ExecTypeFromTL" should be
@@ -36,7 +36,7 @@
* ----------------------------------------------------------------
*/
TupleDesc
-CreateTemplateTupleDesc(int natts)
+CreateTemplateTupleDesc(int natts, hasoid_t withoid)
{
uint32 size;
TupleDesc desc;
@@ -58,6 +58,7 @@ CreateTemplateTupleDesc(int natts)
MemSet(desc->attrs, 0, size);
desc->natts = natts;
+ desc->tdhasoid = withoid;
return desc;
}
@@ -82,6 +83,7 @@ CreateTupleDesc(int natts, Form_pg_attribute *attrs)
desc->attrs = attrs;
desc->natts = natts;
desc->constr = NULL;
+ desc->tdhasoid = UNDEFOID;
return desc;
}
@@ -116,6 +118,7 @@ CreateTupleDescCopy(TupleDesc tupdesc)
desc->attrs[i]->atthasdef = false;
}
desc->constr = NULL;
+ desc->tdhasoid = tupdesc->tdhasoid;
return desc;
}
@@ -182,6 +185,7 @@ CreateTupleDescCopyConstr(TupleDesc tupdesc)
else
desc->constr = NULL;
+ desc->tdhasoid = tupdesc->tdhasoid;
return desc;
}
@@ -235,6 +239,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2)
if (tupdesc1->natts != tupdesc2->natts)
return false;
+ if (tupdesc1->tdhasoid != tupdesc2->tdhasoid)
+ return false;
for (i = 0; i < tupdesc1->natts; i++)
{
Form_pg_attribute attr1 = tupdesc1->attrs[i];
@@ -392,7 +398,7 @@ TupleDescInitEntry(TupleDesc desc,
*/
typeForm = (Form_pg_type) GETSTRUCT(tuple);
- att->atttypid = tuple->t_data->t_oid;
+ att->atttypid = HeapTupleGetOid(tuple);
/*
* There are a couple of cases where we must override the information
@@ -479,7 +485,7 @@ BuildDescForRelation(List *schema)
* allocate a new tuple descriptor
*/
natts = length(schema);
- desc = CreateTemplateTupleDesc(natts);
+ desc = CreateTemplateTupleDesc(natts, UNDEFOID);
constr->has_not_null = false;
attnum = 0;
@@ -646,7 +652,7 @@ TypeGetTupleDesc(Oid typeoid, List *colaliases)
/* OK, get the column alias */
attname = strVal(lfirst(colaliases));
- tupdesc = CreateTemplateTupleDesc(1);
+ tupdesc = CreateTemplateTupleDesc(1, WITHOUTOID);
TupleDescInitEntry(tupdesc,
(AttrNumber) 1,
attname,
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 9a6a0b0740..3524918813 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.141 2002/07/02 05:48:44 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/heap/heapam.c,v 1.142 2002/07/20 05:16:56 momjian Exp $
*
*
* INTERFACE ROUTINES
@@ -1116,10 +1116,11 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid)
* to support a persistent object store (objects need to contain
* pointers to one another).
*/
- if (!OidIsValid(tup->t_data->t_oid))
- tup->t_data->t_oid = newoid();
+ AssertTupleDescHasOid(relation->rd_att);
+ if (!OidIsValid(HeapTupleGetOid(tup)))
+ HeapTupleSetOid(tup, newoid());
else
- CheckMaxObjectId(tup->t_data->t_oid);
+ CheckMaxObjectId(HeapTupleGetOid(tup));
}
HeapTupleHeaderSetXmin(tup->t_data, GetCurrentTransactionId());
@@ -1166,7 +1167,13 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid)
rdata[0].len = SizeOfHeapInsert;
rdata[0].next = &(rdata[1]);
- xlhdr.t_oid = tup->t_data->t_oid;
+ if (relation->rd_rel->relhasoids)
+ {
+ AssertTupleDescHasOid(relation->rd_att);
+ xlhdr.t_oid = HeapTupleGetOid(tup);
+ }
+ else
+ xlhdr.t_oid = InvalidOid;
xlhdr.t_natts = tup->t_data->t_natts;
xlhdr.t_hoff = tup->t_data->t_hoff;
xlhdr.mask = tup->t_data->t_infomask;
@@ -1176,6 +1183,7 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid)
rdata[1].next = &(rdata[2]);
rdata[2].buffer = buffer;
+ /* PG73FORMAT: write bitmap [+ padding] [+ oid] + data */
rdata[2].data = (char *) tup->t_data + offsetof(HeapTupleHeaderData, t_bits);
rdata[2].len = tup->t_len - offsetof(HeapTupleHeaderData, t_bits);
rdata[2].next = NULL;
@@ -1206,7 +1214,11 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid)
*/
CacheInvalidateHeapTuple(relation, tup);
- return tup->t_data->t_oid;
+ if (!relation->rd_rel->relhasoids)
+ return InvalidOid;
+
+ AssertTupleDescHasOid(relation->rd_att);
+ return HeapTupleGetOid(tup);
}
/*
@@ -1499,7 +1511,11 @@ l2:
}
/* Fill in OID and transaction status data for newtup */
- newtup->t_data->t_oid = oldtup.t_data->t_oid;
+ if (relation->rd_rel->relhasoids)
+ {
+ AssertTupleDescHasOid(relation->rd_att);
+ HeapTupleSetOid(newtup, HeapTupleGetOid(&oldtup));
+ }
newtup->t_data->t_infomask &= ~(HEAP_XACT_MASK);
newtup->t_data->t_infomask |= (HEAP_XMAX_INVALID | HEAP_UPDATED);
HeapTupleHeaderSetXmin(newtup->t_data, GetCurrentTransactionId());
@@ -1972,24 +1988,28 @@ log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from,
rdata[1].len = 0;
rdata[1].next = &(rdata[2]);
- xlhdr.hdr.t_oid = newtup->t_data->t_oid;
+ if (reln->rd_rel->relhasoids)
+ {
+ AssertTupleDescHasOid(reln->rd_att);
+ xlhdr.hdr.t_oid = HeapTupleGetOid(newtup);
+ }
+ else
+ xlhdr.hdr.t_oid = InvalidOid;
xlhdr.hdr.t_natts = newtup->t_data->t_natts;
xlhdr.hdr.t_hoff = newtup->t_data->t_hoff;
xlhdr.hdr.mask = newtup->t_data->t_infomask;
if (move) /* remember xmin & xmax */
{
- TransactionId xmax;
- TransactionId xmin;
+ TransactionId xid[2]; /* xmax, xmin */
- if (newtup->t_data->t_infomask & HEAP_XMAX_INVALID ||
- newtup->t_data->t_infomask & HEAP_MARKED_FOR_UPDATE)
- xmax = InvalidTransactionId;
+ if (newtup->t_data->t_infomask & (HEAP_XMAX_INVALID |
+ HEAP_MARKED_FOR_UPDATE))
+ xid[0] = InvalidTransactionId;
else
- xmax = HeapTupleHeaderGetXmax(newtup->t_data);
- xmin = HeapTupleHeaderGetXmin(newtup->t_data);
- memcpy((char *) &xlhdr + hsize, &xmax, sizeof(TransactionId));
- memcpy((char *) &xlhdr + hsize + sizeof(TransactionId),
- &xmin, sizeof(TransactionId));
+ xid[0] = HeapTupleHeaderGetXmax(newtup->t_data);
+ xid[1] = HeapTupleHeaderGetXmin(newtup->t_data);
+ memcpy((char *) &xlhdr + hsize,
+ (char *) xid, 2 * sizeof(TransactionId));
hsize += 2 * sizeof(TransactionId);
}
rdata[2].buffer = newbuf;
@@ -1998,6 +2018,7 @@ log_heap_update(Relation reln, Buffer oldbuf, ItemPointerData from,
rdata[2].next = &(rdata[3]);
rdata[3].buffer = newbuf;
+ /* PG73FORMAT: write bitmap [+ padding] [+ oid] + data */
rdata[3].data = (char *) newtup->t_data + offsetof(HeapTupleHeaderData, t_bits);
rdata[3].len = newtup->t_len - offsetof(HeapTupleHeaderData, t_bits);
rdata[3].next = NULL;
@@ -2193,12 +2214,13 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
memcpy((char *) &xlhdr,
(char *) xlrec + SizeOfHeapInsert,
SizeOfHeapHeader);
+ htup = &tbuf.hdr;
+ MemSet((char *) htup, 0, sizeof(HeapTupleHeaderData));
+ /* PG73FORMAT: get bitmap [+ padding] [+ oid] + data */
memcpy((char *) &tbuf + offsetof(HeapTupleHeaderData, t_bits),
(char *) xlrec + SizeOfHeapInsert + SizeOfHeapHeader,
newlen);
newlen += offsetof(HeapTupleHeaderData, t_bits);
- htup = &tbuf.hdr;
- htup->t_oid = xlhdr.t_oid;
htup->t_natts = xlhdr.t_natts;
htup->t_hoff = xlhdr.t_hoff;
htup->t_infomask = HEAP_XMAX_INVALID | xlhdr.mask;
@@ -2206,6 +2228,11 @@ heap_xlog_insert(bool redo, XLogRecPtr lsn, XLogRecord *record)
HeapTupleHeaderSetCmin(htup, FirstCommandId);
HeapTupleHeaderSetXmaxInvalid(htup);
HeapTupleHeaderSetCmax(htup, FirstCommandId);
+ if (reln->rd_rel->relhasoids)
+ {
+ AssertTupleDescHasOid(reln->rd_att);
+ HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
+ }
offnum = PageAddItem(page, (Item) htup, newlen, offnum,
LP_USED | OverwritePageMode);
@@ -2362,28 +2389,33 @@ newsame:;
memcpy((char *) &xlhdr,
(char *) xlrec + SizeOfHeapUpdate,
SizeOfHeapHeader);
+ htup = &tbuf.hdr;
+ MemSet((char *) htup, 0, sizeof(HeapTupleHeaderData));
+ /* PG73FORMAT: get bitmap [+ padding] [+ oid] + data */
memcpy((char *) &tbuf + offsetof(HeapTupleHeaderData, t_bits),
(char *) xlrec + hsize,
newlen);
newlen += offsetof(HeapTupleHeaderData, t_bits);
- htup = &tbuf.hdr;
- htup->t_oid = xlhdr.t_oid;
htup->t_natts = xlhdr.t_natts;
htup->t_hoff = xlhdr.t_hoff;
+ if (reln->rd_rel->relhasoids)
+ {
+ AssertTupleDescHasOid(reln->rd_att);
+ HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
+ }
if (move)
{
- TransactionId xmax;
- TransactionId xmin;
+ TransactionId xid[2]; /* xmax, xmin */
hsize = SizeOfHeapUpdate + SizeOfHeapHeader;
- memcpy(&xmax, (char *) xlrec + hsize, sizeof(TransactionId));
- memcpy(&xmin, (char *) xlrec + hsize + sizeof(TransactionId), sizeof(TransactionId));
+ memcpy((char *) xid,
+ (char *) xlrec + hsize, 2 * sizeof(TransactionId));
htup->t_infomask = xlhdr.mask;
htup->t_infomask &= ~(HEAP_XMIN_COMMITTED |
HEAP_XMIN_INVALID | HEAP_MOVED_OFF);
htup->t_infomask |= HEAP_MOVED_IN;
- HeapTupleHeaderSetXmin(htup, xmin);
- HeapTupleHeaderSetXmax(htup, xmax);
+ HeapTupleHeaderSetXmin(htup, xid[1]);
+ HeapTupleHeaderSetXmax(htup, xid[0]);
HeapTupleHeaderSetXvac(htup, record->xl_xid);
}
else
diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c
index 3c66aed1db..2945cf3458 100644
--- a/src/backend/access/heap/tuptoaster.c
+++ b/src/backend/access/heap/tuptoaster.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/heap/tuptoaster.c,v 1.32 2002/05/27 19:53:33 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/heap/tuptoaster.c,v 1.33 2002/07/20 05:16:56 momjian Exp $
*
*
* INTERFACE ROUTINES
@@ -726,6 +726,8 @@ toast_insert_or_update(Relation rel, HeapTuple newtup, HeapTuple oldtup)
new_len = offsetof(HeapTupleHeaderData, t_bits);
if (has_nulls)
new_len += BITMAPLEN(numAttrs);
+ if (rel->rd_rel->relhasoids)
+ new_len += sizeof(Oid);
new_len = MAXALIGN(new_len);
Assert(new_len == olddata->t_hoff);
new_len += ComputeDataSize(tupleDesc, toast_values, toast_nulls);