mirror of
https://github.com/postgres/postgres.git
synced 2025-07-18 17:42:25 +03:00
oid is needed, it is added at the end of the struct (after the null
bitmap, if present). Per Tom Lane's suggestion the information whether a tuple has an oid or not is carried in the tuple descriptor. For debugging reasons tdhasoid is of type char, not bool. There are predefined values for WITHOID, WITHOUTOID and UNDEFOID. This patch has been generated against a cvs snapshot from last week and I don't expect it to apply cleanly to current sources. While I post it here for public review, I'm working on a new version against a current snapshot. (There's been heavy activity recently; hope to catch up some day ...) This is a long patch; if it is too hard to swallow, I can provide it in smaller pieces: Part 1: Accessor macros Part 2: tdhasoid in TupDesc Part 3: Regression test Part 4: Parameter withoid to heap_addheader Part 5: Eliminate t_oid from HeapTupleHeader Part 2 is the most hairy part because of changes in the executor and even in the parser; the other parts are straightforward. Up to part 4 the patched postmaster stays binary compatible to databases created with an unpatched version. Part 5 is small (100 lines) and finally breaks compatibility. Manfred Koizar
This commit is contained in:
@ -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);
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user