Wrap access to Oid II

Started by Manfred Koizarabout 24 years ago8 messagespatches
Jump to latest
#1Manfred Koizar
mkoi-pg@aon.at

Revised version of the first in a series of patches leading to
heap tuple headers withoid oid for tables created WITHOUT OIDS.

Servus
Manfred

diff -ru ../base/src/backend/access/common/heaptuple.c src/backend/access/common/heaptuple.c
--- ../base/src/backend/access/common/heaptuple.c	2002-06-21 02:12:13.000000000 +0200
+++ src/backend/access/common/heaptuple.c	2002-07-04 16:23:04.000000000 +0200
@@ -436,7 +436,7 @@
 			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));
@@ -698,14 +698,18 @@
 	 * 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;
 }
diff -ru ../base/src/backend/access/common/tupdesc.c src/backend/access/common/tupdesc.c
--- ../base/src/backend/access/common/tupdesc.c	2002-06-21 02:12:13.000000000 +0200
+++ src/backend/access/common/tupdesc.c	2002-07-04 00:26:37.000000000 +0200
@@ -392,7 +392,7 @@
 	 */
 	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
diff -ru ../base/src/backend/access/heap/heapam.c src/backend/access/heap/heapam.c
--- ../base/src/backend/access/heap/heapam.c	2002-07-03 12:27:39.000000000 +0200
+++ src/backend/access/heap/heapam.c	2002-07-04 00:26:37.000000000 +0200
@@ -1116,10 +1116,10 @@
 		 * 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();
+		if (!OidIsValid(HeapTupleGetOid(tup)))
+			HeapTupleSetOid(tup, newoid());
 		else
-			CheckMaxObjectId(tup->t_data->t_oid);
+			CheckMaxObjectId(HeapTupleGetOid(tup));
 	}

HeapTupleHeaderSetXmin(tup->t_data, GetCurrentTransactionId());
@@ -1166,7 +1166,10 @@
rdata[0].len = SizeOfHeapInsert;
rdata[0].next = &(rdata[1]);

-		xlhdr.t_oid = tup->t_data->t_oid;
+		if (relation->rd_rel->relhasoids)
+			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;
@@ -1206,7 +1209,10 @@
 	 */
 	CacheInvalidateHeapTuple(relation, tup);
-	return tup->t_data->t_oid;
+	if (!relation->rd_rel->relhasoids)
+		return InvalidOid;
+		
+	return HeapTupleGetOid(tup);
 }

/*
@@ -1499,7 +1505,8 @@
}

 	/* Fill in OID and transaction status data for newtup */
-	newtup->t_data->t_oid = oldtup.t_data->t_oid;
+	if (relation->rd_rel->relhasoids)
+		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,7 +1979,10 @@
 	rdata[1].len = 0;
 	rdata[1].next = &(rdata[2]);
-	xlhdr.hdr.t_oid = newtup->t_data->t_oid;
+	if (reln->rd_rel->relhasoids)
+		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;
@@ -2198,7 +2208,6 @@
 			   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 +2215,8 @@
 		HeapTupleHeaderSetCmin(htup, FirstCommandId);
 		HeapTupleHeaderSetXmaxInvalid(htup);
 		HeapTupleHeaderSetCmax(htup, FirstCommandId);
+		if (reln->rd_rel->relhasoids)
+			HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
 		offnum = PageAddItem(page, (Item) htup, newlen, offnum,
 							 LP_USED | OverwritePageMode);
@@ -2367,9 +2378,10 @@
 			   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)
+			HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
 		if (move)
 		{
 			TransactionId xmax;
diff -ru ../base/src/backend/bootstrap/bootstrap.c src/backend/bootstrap/bootstrap.c
--- ../base/src/backend/bootstrap/bootstrap.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/bootstrap/bootstrap.c	2002-07-04 00:26:37.000000000 +0200
@@ -495,7 +495,8 @@
 		app = Typ;
 		while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
 		{
-			(*app)->am_oid = tup->t_data->t_oid;
+			AssertRelationHasOids(rel);
+			(*app)->am_oid = HeapTupleGetOid(tup);
 			memcpy((char *) &(*app)->am_typ,
 				   (char *) GETSTRUCT(tup),
 				   sizeof((*app)->am_typ));
@@ -679,7 +680,10 @@
 	pfree(tupDesc);				/* just free's tupDesc, not the attrtypes */
 	if (objectid != (Oid) 0)
-		tuple->t_data->t_oid = objectid;
+	{
+		AssertRelationHasOids(boot_reldesc);
+		HeapTupleSetOid(tuple, objectid);
+	}
 	simple_heap_insert(boot_reldesc, tuple);
 	heap_freetuple(tuple);
 	elog(DEBUG3, "row inserted");
@@ -871,7 +875,8 @@
 		app = Typ;
 		while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
 		{
-			(*app)->am_oid = tup->t_data->t_oid;
+			AssertRelationHasOids(rel);
+			(*app)->am_oid = HeapTupleGetOid(tup);
 			memmove((char *) &(*app++)->am_typ,
 					(char *) GETSTRUCT(tup),
 					sizeof((*app)->am_typ));
diff -ru ../base/src/backend/catalog/aclchk.c src/backend/catalog/aclchk.c
--- ../base/src/backend/catalog/aclchk.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/aclchk.c	2002-07-04 00:26:37.000000000 +0200
@@ -591,7 +591,8 @@
 			elog(ERROR, "namespace \"%s\" not found", nspname);
 		pg_namespace_tuple = (Form_pg_namespace) GETSTRUCT(tuple);
-		if (!pg_namespace_ownercheck(tuple->t_data->t_oid, GetUserId()))
+		AssertRelationHasOids(relation);
+		if (!pg_namespace_ownercheck(HeapTupleGetOid(tuple), GetUserId()))
 			aclcheck_error(ACLCHECK_NOT_OWNER, nspname);
 		/*
diff -ru ../base/src/backend/catalog/heap.c src/backend/catalog/heap.c
--- ../base/src/backend/catalog/heap.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/heap.c	2002-07-04 00:26:37.000000000 +0200
@@ -583,7 +583,7 @@
 						 (void *) new_rel_reltup);
 	/* force tuple to have the desired OID */
-	tup->t_data->t_oid = new_rel_oid;
+	HeapTupleSetOid(tup, new_rel_oid);

/*
* finally insert the new tuple and free it.
@@ -1109,7 +1109,8 @@
* the type of the relation we are deleteing then we have to disallow
* the deletion. should talk to stonebraker about this. -cim 6/19/90
*/
- typoid = tup->t_data->t_oid;
+ AssertRelationHasOids(pg_type_desc);
+ typoid = HeapTupleGetOid(tup);

pg_attribute_desc = heap_openr(AttributeRelationName, RowExclusiveLock);

diff -ru ../base/src/backend/catalog/index.c src/backend/catalog/index.c
--- ../base/src/backend/catalog/index.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/index.c	2002-07-04 00:26:37.000000000 +0200
@@ -326,7 +326,7 @@
 	 * the new tuple must have the oid already chosen for the index.
 	 * sure would be embarrassing to do this sort of thing in polite company.
 	 */
-	tuple->t_data->t_oid = RelationGetRelid(indexRelation);
+	HeapTupleSetOid(tuple, RelationGetRelid(indexRelation));
 	simple_heap_insert(pg_class, tuple);
 	/*
diff -ru ../base/src/backend/catalog/namespace.c src/backend/catalog/namespace.c
--- ../base/src/backend/catalog/namespace.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/namespace.c	2002-07-04 00:26:38.000000000 +0200
@@ -584,7 +584,7 @@
 						continue; /* keep previous result */
 					/* replace previous result */
 					prevResult->pathpos = pathpos;
-					prevResult->oid = proctup->t_data->t_oid;
+					prevResult->oid = HeapTupleGetOid(proctup);
 					continue;	/* args are same, of course */
 				}
 			}
@@ -597,7 +597,7 @@
 			palloc(sizeof(struct _FuncCandidateList) - sizeof(Oid)
 				   + nargs * sizeof(Oid));
 		newResult->pathpos = pathpos;
-		newResult->oid = proctup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(proctup);
 		newResult->nargs = nargs;
 		memcpy(newResult->args, procform->proargtypes, nargs * sizeof(Oid));
@@ -831,7 +831,7 @@
 						continue; /* keep previous result */
 					/* replace previous result */
 					prevResult->pathpos = pathpos;
-					prevResult->oid = opertup->t_data->t_oid;
+					prevResult->oid = HeapTupleGetOid(opertup);
 					continue;	/* args are same, of course */
 				}
 			}
@@ -843,7 +843,7 @@
 		newResult = (FuncCandidateList)
 			palloc(sizeof(struct _FuncCandidateList) + sizeof(Oid));
 		newResult->pathpos = pathpos;
-		newResult->oid = opertup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(opertup);
 		newResult->nargs = 2;
 		newResult->args[0] = operform->oprleft;
 		newResult->args[1] = operform->oprright;
@@ -1007,7 +1007,7 @@
 				/* replace previous result */
 				prevResult->opcname_tmp = NameStr(opcform->opcname);
 				prevResult->pathpos = pathpos;
-				prevResult->oid = opctup->t_data->t_oid;
+				prevResult->oid = HeapTupleGetOid(opctup);
 				prevResult->opcintype = opcform->opcintype;
 				prevResult->opcdefault = opcform->opcdefault;
 				prevResult->opckeytype = opcform->opckeytype;
@@ -1022,7 +1022,7 @@
 			palloc(sizeof(struct _OpclassCandidateList));
 		newResult->opcname_tmp = NameStr(opcform->opcname);
 		newResult->pathpos = pathpos;
-		newResult->oid = opctup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(opctup);
 		newResult->opcintype = opcform->opcintype;
 		newResult->opcdefault = opcform->opcdefault;
 		newResult->opckeytype = opcform->opckeytype;
@@ -1597,7 +1597,7 @@
 			case RELKIND_RELATION:
 			case RELKIND_SEQUENCE:
 			case RELKIND_VIEW:
-				tempRelList = lconsi(tuple->t_data->t_oid, tempRelList);
+				tempRelList = lconsi(HeapTupleGetOid(tuple), tempRelList);
 				break;
 			default:
 				break;
diff -ru ../base/src/backend/catalog/pg_operator.c src/backend/catalog/pg_operator.c
--- ../base/src/backend/catalog/pg_operator.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_operator.c	2002-07-04 00:26:38.000000000 +0200
@@ -141,7 +141,7 @@
 	{
 		RegProcedure oprcode = ((Form_pg_operator) GETSTRUCT(tup))->oprcode;
-		operatorObjectId = tup->t_data->t_oid;
+		operatorObjectId = HeapTupleGetOid(tup);
 		*defined = RegProcedureIsValid(oprcode);
 		ReleaseSysCache(tup);
 	}
diff -ru ../base/src/backend/catalog/pg_proc.c src/backend/catalog/pg_proc.c
--- ../base/src/backend/catalog/pg_proc.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_proc.c	2002-07-04 00:26:38.000000000 +0200
@@ -249,7 +249,8 @@
 		CatalogCloseIndices(Num_pg_proc_indices, idescs);
 	}
-	retval = tup->t_data->t_oid;
+	AssertRelationHasOids(rel);
+	retval = HeapTupleGetOid(tup);
 	heap_freetuple(tup);
 	heap_close(rel, RowExclusiveLock);
diff -ru ../base/src/backend/catalog/pg_type.c src/backend/catalog/pg_type.c
--- ../base/src/backend/catalog/pg_type.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_type.c	2002-07-04 00:26:38.000000000 +0200
@@ -272,7 +272,8 @@

simple_heap_update(pg_type_desc, &tup->t_self, tup);

-		typeObjectId = tup->t_data->t_oid;
+		AssertRelationHasOids(pg_type_desc);
+		typeObjectId = HeapTupleGetOid(tup);
 	}
 	else
 	{
@@ -283,7 +284,8 @@
 							 nulls);
 		/* preassign tuple Oid, if one was given */
-		tup->t_data->t_oid = assignedTypeOid;
+		AssertRelationHasOids(pg_type_desc);
+		HeapTupleSetOid(tup, assignedTypeOid);
 		typeObjectId = simple_heap_insert(pg_type_desc, tup);
 	}
diff -ru ../base/src/backend/commands/comment.c src/backend/commands/comment.c
--- ../base/src/backend/commands/comment.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/comment.c	2002-07-04 00:26:38.000000000 +0200
@@ -424,7 +424,8 @@
 	if (!HeapTupleIsValid(dbtuple))
 		elog(ERROR, "database \"%s\" does not exist", database);
-	oid = dbtuple->t_data->t_oid;
+	AssertRelationHasOids(pg_database);
+	oid = HeapTupleGetOid(dbtuple);

/* Allow if the user matches the database dba or is a superuser */

@@ -470,7 +471,8 @@
elog(ERROR, "CommentSchema: Schema \"%s\" could not be found",
namespace);

-	oid = tp->t_data->t_oid;
+	/* no Relation here to Assert(...->relhasoids); */
+	oid = HeapTupleGetOid(tp);
 	/* Check object security */
 	if (!pg_namespace_ownercheck(oid, GetUserId()))
@@ -541,7 +543,8 @@
 		if (HeapTupleIsValid(tuple))
 		{
 			reloid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
-			ruleoid = tuple->t_data->t_oid;
+			AssertRelationHasOids(RewriteRelation);
+			ruleoid = HeapTupleGetOid(tuple);
 		}
 		else
 		{
@@ -581,7 +584,8 @@
 		if (!HeapTupleIsValid(tuple))
 			elog(ERROR, "rule \"%s\" does not exist", rulename);
 		Assert(reloid == ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class);
-		ruleoid = tuple->t_data->t_oid;
+		AssertRelationHasOids(relation);
+		ruleoid = HeapTupleGetOid(tuple);
 		ReleaseSysCache(tuple);
 	}

@@ -794,7 +798,8 @@
elog(ERROR, "trigger \"%s\" for relation \"%s\" does not exist",
trigname, RelationGetRelationName(relation));

-	oid = triggertuple->t_data->t_oid;
+	AssertRelationHasOids(pg_trigger);
+	oid = HeapTupleGetOid(triggertuple);

systable_endscan(scan);

diff -ru ../base/src/backend/commands/copy.c src/backend/commands/copy.c
--- ../base/src/backend/commands/copy.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/copy.c	2002-07-04 00:26:38.000000000 +0200
@@ -575,9 +575,13 @@
 			/* Send OID if wanted --- note fld_count doesn't include it */
 			if (oids)
 			{
+				Oid oid;
+				
+				AssertRelationHasOids(rel);
+				oid = HeapTupleGetOid(tuple);
 				fld_size = sizeof(Oid);
 				CopySendData(&fld_size, sizeof(int16), fp);
-				CopySendData(&tuple->t_data->t_oid, sizeof(Oid), fp);
+				CopySendData(&oid, sizeof(Oid), fp);
 			}
 		}
 		else
@@ -585,8 +589,9 @@
 			/* Text format has no per-tuple header, but send OID if wanted */
 			if (oids)
 			{
+				AssertRelationHasOids(rel);
 				string = DatumGetCString(DirectFunctionCall1(oidout,
-								ObjectIdGetDatum(tuple->t_data->t_oid)));
+								ObjectIdGetDatum(HeapTupleGetOid(tuple))));
 				CopySendString(string, fp);
 				pfree(string);
 				need_delim = true;
@@ -977,7 +982,7 @@
 		tuple = heap_formtuple(tupDesc, values, nulls);
 		if (oids && file_has_oids)
-			tuple->t_data->t_oid = loaded_oid;
+			HeapTupleSetOid(tuple, loaded_oid);

skip_tuple = false;

diff -ru ../base/src/backend/commands/dbcommands.c src/backend/commands/dbcommands.c
--- ../base/src/backend/commands/dbcommands.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/dbcommands.c	2002-07-04 00:26:38.000000000 +0200
@@ -341,7 +341,8 @@

tuple = heap_formtuple(pg_database_dsc, new_record, new_record_nulls);

-	tuple->t_data->t_oid = dboid;		/* override heap_insert's OID
+	AssertRelationHasOids(pg_database_rel);
+	HeapTupleSetOid(tuple, dboid);		/* override heap_insert's OID
 										 * selection */

simple_heap_insert(pg_database_rel, tuple);
@@ -611,7 +612,10 @@

 		/* oid of the database */
 		if (dbIdP)
-			*dbIdP = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(relation);
+			*dbIdP = HeapTupleGetOid(tuple);
+		}
 		/* sysid of the owner */
 		if (ownerIdP)
 			*ownerIdP = dbform->datdba;
diff -ru ../base/src/backend/commands/functioncmds.c src/backend/commands/functioncmds.c
--- ../base/src/backend/commands/functioncmds.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/functioncmds.c	2002-07-04 00:26:38.000000000 +0200
@@ -439,7 +439,8 @@
 	if (!HeapTupleIsValid(languageTuple))
 		elog(ERROR, "language \"%s\" does not exist", languageName);
-	languageOid = languageTuple->t_data->t_oid;
+	/* no Relation here to Assert(...->relhasoids) */
+	languageOid = HeapTupleGetOid(languageTuple);
 	languageStruct = (Form_pg_language) GETSTRUCT(languageTuple);
 	if (languageStruct->lanpltrusted)
diff -ru ../base/src/backend/commands/indexcmds.c src/backend/commands/indexcmds.c
--- ../base/src/backend/commands/indexcmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/indexcmds.c	2002-07-04 00:26:38.000000000 +0200
@@ -139,7 +139,8 @@
 	if (!HeapTupleIsValid(tuple))
 		elog(ERROR, "DefineIndex: access method \"%s\" not found",
 			 accessMethodName);
-	accessMethodId = tuple->t_data->t_oid;
+	/* AssertRelationHasOids(rel);  rel is already closed */
+	accessMethodId = HeapTupleGetOid(tuple);
 	accessMethodForm = (Form_pg_am) GETSTRUCT(tuple);
 	if (unique && !accessMethodForm->amcanunique)
@@ -494,7 +495,8 @@
 	 * Verify that the index operator class accepts this
 	 * datatype.  Note we will accept binary compatibility.
 	 */
-	opClassId = tuple->t_data->t_oid;
+	/* no Relation here to AssertRelationHasOids(relation); */
+	opClassId = HeapTupleGetOid(tuple);
 	opInputType = ((Form_pg_opclass) GETSTRUCT(tuple))->opcintype;
 	if (!IsBinaryCompatible(attrType, opInputType))
@@ -754,7 +756,8 @@
 				relids = repalloc(relids, sizeof(Oid) * relalc);
 			}
 			MemoryContextSwitchTo(old);
-			relids[relcnt] = tuple->t_data->t_oid;
+			AssertRelationHasOids(relationRelation);
+			relids[relcnt] = HeapTupleGetOid(tuple);
 			relcnt++;
 		}
 	}
diff -ru ../base/src/backend/commands/tablecmds.c src/backend/commands/tablecmds.c
--- ../base/src/backend/commands/tablecmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/tablecmds.c	2002-07-04 00:26:39.000000000 +0200
@@ -1655,7 +1655,7 @@
 	attribute->attrelid = myrelid;
 	namestrcpy(&(attribute->attname), colDef->colname);
-	attribute->atttypid = typeTuple->t_data->t_oid;
+	attribute->atttypid = HeapTupleGetOid(typeTuple);
 	attribute->attstattarget = DEFAULT_ATTSTATTARGET;
 	attribute->attlen = tform->typlen;
 	attribute->attcacheoff = -1;
diff -ru ../base/src/backend/commands/trigger.c src/backend/commands/trigger.c
--- ../base/src/backend/commands/trigger.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/trigger.c	2002-07-04 00:26:39.000000000 +0200
@@ -364,7 +364,8 @@
 		if (namestrcmp(&(pg_trigger->tgname), trigname) == 0)
 		{
 			/* Delete any comments associated with this trigger */
-			DeleteComments(tuple->t_data->t_oid, RelationGetRelid(tgrel));
+			AssertRelationHasOids(tgrel);
+			DeleteComments(HeapTupleGetOid(tuple), RelationGetRelid(tgrel));
 			simple_heap_delete(tgrel, &tuple->t_self);
 			found++;
@@ -430,7 +431,8 @@
 	while (HeapTupleIsValid(tup = systable_getnext(tgscan)))
 	{
 		/* Delete any comments associated with this trigger */
-		DeleteComments(tup->t_data->t_oid, RelationGetRelid(tgrel));
+		AssertRelationHasOids(tgrel);
+		DeleteComments(HeapTupleGetOid(tup), RelationGetRelid(tgrel));

simple_heap_delete(tgrel, &tup->t_self);

@@ -667,7 +669,8 @@
RelationGetRelationName(relation));
build = &(triggers[found]);

- build->tgoid = htup->t_data->t_oid;
+ AssertRelationHasOids(tgrel);
+ build->tgoid = HeapTupleGetOid(htup);
build->tgname = MemoryContextStrdup(CacheMemoryContext,
DatumGetCString(DirectFunctionCall1(nameout,
NameGetDatum(&pg_trigger->tgname))));
@@ -1928,7 +1931,8 @@
elog(ERROR, "Constraint '%s' is not deferrable",
cname);

-			constr_oid = htup->t_data->t_oid;
+			AssertRelationHasOids(tgrel);
+			constr_oid = HeapTupleGetOid(htup);
 			loid = lappendi(loid, constr_oid);
 			found = true;
 		}
diff -ru ../base/src/backend/commands/typecmds.c src/backend/commands/typecmds.c
--- ../base/src/backend/commands/typecmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/typecmds.c	2002-07-04 00:26:39.000000000 +0200
@@ -474,7 +474,7 @@
 				 * Note: Name is strictly for error message
 				 */
 				expr = cookDefault(pstate, colDef->raw_expr,
-								   typeTup->t_data->t_oid,
+								   HeapTupleGetOid(typeTup),
 								   stmt->typename->typmod,
 								   domainName);
 				/*
@@ -551,7 +551,7 @@
 			   receiveProcedure,	/* receive procedure */
 			   sendProcedure,		/* send procedure */
 			   basetypelem,			/* element type ID */
-			   typeTup->t_data->t_oid,	/* base type ID */
+			   HeapTupleGetOid(typeTup),	/* base type ID */
 			   defaultValue,		/* default type value (text) */
 			   defaultValueBin,		/* default type value (binary) */
 			   byValue,				/* passed by value */
diff -ru ../base/src/backend/commands/vacuum.c src/backend/commands/vacuum.c
--- ../base/src/backend/commands/vacuum.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/vacuum.c	2002-07-04 00:26:39.000000000 +0200
@@ -392,7 +392,8 @@
 		{
 			/* Make a relation list entry for this guy */
 			oldcontext = MemoryContextSwitchTo(vac_context);
-			vrl = lappendi(vrl, tuple->t_data->t_oid);
+			AssertRelationHasOids(pgclass);
+			vrl = lappendi(vrl, HeapTupleGetOid(tuple));
 			MemoryContextSwitchTo(oldcontext);
 		}
@@ -1172,8 +1173,8 @@
 			/*
 			 * Other checks...
 			 */
-			if (!OidIsValid(tuple.t_data->t_oid) &&
-				onerel->rd_rel->relhasoids)
+			if (onerel->rd_rel->relhasoids &&
+				!OidIsValid(HeapTupleGetOid(&tuple)))
 				elog(WARNING, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
 					 relname, blkno, offnum, (int) tupgone);
diff -ru ../base/src/backend/commands/vacuumlazy.c src/backend/commands/vacuumlazy.c
--- ../base/src/backend/commands/vacuumlazy.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/vacuumlazy.c	2002-07-04 00:26:39.000000000 +0200
@@ -368,8 +368,8 @@
 			/*
 			 * Other checks...
 			 */
-			if (!OidIsValid(tuple.t_data->t_oid) &&
-				onerel->rd_rel->relhasoids)
+			if (onerel->rd_rel->relhasoids &&
+				!OidIsValid(HeapTupleGetOid(&tuple)))
 				elog(WARNING, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
 					 relname, blkno, offnum, (int) tupgone);
diff -ru ../base/src/backend/executor/spi.c src/backend/executor/spi.c
--- ../base/src/backend/executor/spi.c	2002-06-21 02:12:16.000000000 +0200
+++ src/backend/executor/spi.c	2002-07-04 16:24:24.000000000 +0200
@@ -435,11 +435,15 @@
 	{
 		mtuple = heap_formtuple(rel->rd_att, v, n);
 		infomask = mtuple->t_data->t_infomask;
-		memmove(&(mtuple->t_data->t_oid), &(tuple->t_data->t_oid),
-				((char *) &(tuple->t_data->t_hoff) -
-				 (char *) &(tuple->t_data->t_oid)));
+		/*
+		 * copy t_xmin, t_cid, t_xmax, t_ctid, t_natts, t_infomask
+		 */
+		memmove((char *)mtuple->t_data, (char *)tuple->t_data,
+				offsetof(HeapTupleHeaderData, t_hoff));
 		mtuple->t_data->t_infomask = infomask;
 		mtuple->t_data->t_natts = numberOfAttributes;
+		if (rel->rd_rel->relhasoids)
+			HeapTupleSetOid(mtuple, HeapTupleGetOid(tuple));
 	}
 	else
 	{
diff -ru ../base/src/backend/optimizer/util/clauses.c src/backend/optimizer/util/clauses.c
--- ../base/src/backend/optimizer/util/clauses.c	2002-06-21 02:12:18.000000000 +0200
+++ src/backend/optimizer/util/clauses.c	2002-07-04 00:26:39.000000000 +0200
@@ -1066,7 +1066,7 @@

commuTup = (Form_pg_operator) GETSTRUCT(optup);

-	commu = makeOper(optup->t_data->t_oid,
+	commu = makeOper(HeapTupleGetOid(optup),
 					 commuTup->oprcode,
 					 commuTup->oprresult,
 					 ((Oper *) clause->oper)->opretset);
diff -ru ../base/src/backend/parser/parse_coerce.c src/backend/parser/parse_coerce.c
--- ../base/src/backend/parser/parse_coerce.c	2002-06-21 02:12:18.000000000 +0200
+++ src/backend/parser/parse_coerce.c	2002-07-04 00:26:39.000000000 +0200
@@ -770,7 +770,8 @@
 			if (isExplicit || pform->proimplicit)
 			{
 				/* Okay to use it */
-				funcid = ftup->t_data->t_oid;
+				/* Assert(ftup has oid) */
+				funcid = HeapTupleGetOid(ftup);
 			}
 		}
 		ReleaseSysCache(ftup);
diff -ru ../base/src/backend/parser/parse_oper.c src/backend/parser/parse_oper.c
--- ../base/src/backend/parser/parse_oper.c	2002-06-21 02:12:19.000000000 +0200
+++ src/backend/parser/parse_oper.c	2002-07-04 00:26:39.000000000 +0200
@@ -150,7 +150,8 @@
 Oid
 oprid(Operator op)
 {
-	return op->t_data->t_oid;
+	/* Assert(op has oid) */
+	return HeapTupleGetOid(op);
 }
 /* given operator tuple, return the underlying function's OID */
diff -ru ../base/src/backend/parser/parse_type.c src/backend/parser/parse_type.c
--- ../base/src/backend/parser/parse_type.c	2002-06-21 02:12:19.000000000 +0200
+++ src/backend/parser/parse_type.c	2002-07-04 00:26:39.000000000 +0200
@@ -283,7 +283,8 @@
 {
 	if (tp == NULL)
 		elog(ERROR, "typeTypeId() called with NULL type struct");
-	return tp->t_data->t_oid;
+	/* Assert(tp has oid); */
+	return HeapTupleGetOid(tp);
 }
 /* given type (as type struct), return the length of type */
diff -ru ../base/src/backend/postmaster/pgstat.c src/backend/postmaster/pgstat.c
--- ../base/src/backend/postmaster/pgstat.c	2002-05-21 11:54:17.000000000 +0200
+++ src/backend/postmaster/pgstat.c	2002-07-04 00:26:39.000000000 +0200
@@ -628,7 +628,8 @@
 			dbidlist = (Oid *) repalloc((char *) dbidlist,
 										sizeof(Oid) * dbidalloc);
 		}
-		dbidlist[dbidused++] = dbtup->t_data->t_oid;
+		AssertRelationHasOids(dbrel);
+		dbidlist[dbidused++] = HeapTupleGetOid(dbtup);
 	}
 	heap_endscan(dbscan);
 	heap_close(dbrel, AccessShareLock);
diff -ru ../base/src/backend/rewrite/rewriteRemove.c src/backend/rewrite/rewriteRemove.c
--- ../base/src/backend/rewrite/rewriteRemove.c	2002-06-21 02:12:20.000000000 +0200
+++ src/backend/rewrite/rewriteRemove.c	2002-07-04 00:26:39.000000000 +0200
@@ -67,7 +67,8 @@
 	 * Save the OID of the rule (i.e. the tuple's OID) and the event
 	 * relation's OID
 	 */
-	ruleId = tuple->t_data->t_oid;
+	AssertRelationHasOids(RewriteRelation);
+	ruleId = HeapTupleGetOid(tuple);
 	eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
 	Assert(eventRelationOid == owningRel);
@@ -157,7 +158,8 @@
 	while (HeapTupleIsValid(tuple = systable_getnext(scanDesc)))
 	{
 		/* Delete any comments associated with this rule */
-		DeleteComments(tuple->t_data->t_oid, RelationGetRelid(RewriteRelation));
+		AssertRelationHasOids(RewriteRelation);
+		DeleteComments(HeapTupleGetOid(tuple), RelationGetRelid(RewriteRelation));
 		simple_heap_delete(RewriteRelation, &tuple->t_self);
 	}
diff -ru ../base/src/backend/utils/adt/regproc.c src/backend/utils/adt/regproc.c
--- ../base/src/backend/utils/adt/regproc.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/adt/regproc.c	2002-07-04 00:26:39.000000000 +0200
@@ -110,7 +110,8 @@
 		while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
 		{
-			result = (RegProcedure) tuple->t_data->t_oid;
+			AssertRelationHasOids(hdesc);
+			result = (RegProcedure) HeapTupleGetOid(tuple);
 			if (++matches > 1)
 				break;
 		}
@@ -414,7 +415,8 @@

while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
{
- result = tuple->t_data->t_oid;
+ AssertRelationHasOids(hdesc);
+ result = HeapTupleGetOid(tuple);
if (++matches > 1)
break;
}
@@ -731,7 +733,10 @@
SnapshotNow, 1, skey);

 		if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-			result = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(hdesc);
+			result = HeapTupleGetOid(tuple);
+		}
 		else
 			elog(ERROR, "No class with name %s", class_name_or_oid);

@@ -884,7 +889,10 @@
SnapshotNow, 1, skey);

 		if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-			result = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(hdesc);
+			result = HeapTupleGetOid(tuple);
+		}
 		else
 			elog(ERROR, "No type with name %s", typ_name_or_oid);
diff -ru ../base/src/backend/utils/adt/sets.c src/backend/utils/adt/sets.c
--- ../base/src/backend/utils/adt/sets.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/adt/sets.c	2002-07-04 00:26:39.000000000 +0200
@@ -120,7 +120,8 @@

simple_heap_update(procrel, &newtup->t_self, newtup);

-		setoid = newtup->t_data->t_oid;
+		AssertRelationHasOids(procrel);
+		setoid = HeapTupleGetOid(newtup);
 		if (RelationGetForm(procrel)->relhasindex)
 		{
diff -ru ../base/src/backend/utils/cache/catcache.c src/backend/utils/cache/catcache.c
--- ../base/src/backend/utils/cache/catcache.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/cache/catcache.c	2002-07-04 00:26:39.000000000 +0200
@@ -218,7 +218,7 @@
 		case 4:
 			cur_skey[3].sk_argument =
 				(cache->cc_key[3] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
 				: fastgetattr(tuple,
 							  cache->cc_key[3],
 							  cache->cc_tupdesc,
@@ -228,7 +228,7 @@
 		case 3:
 			cur_skey[2].sk_argument =
 				(cache->cc_key[2] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
 				: fastgetattr(tuple,
 							  cache->cc_key[2],
 							  cache->cc_tupdesc,
@@ -238,7 +238,7 @@
 		case 2:
 			cur_skey[1].sk_argument =
 				(cache->cc_key[1] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
 				: fastgetattr(tuple,
 							  cache->cc_key[1],
 							  cache->cc_tupdesc,
@@ -248,7 +248,7 @@
 		case 1:
 			cur_skey[0].sk_argument =
 				(cache->cc_key[0] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
 				: fastgetattr(tuple,
 							  cache->cc_key[0],
 							  cache->cc_tupdesc,
@@ -572,7 +572,7 @@
 			if (isCommit)
 				elog(WARNING, "Cache reference leak: cache %s (%d), tuple %u has count %d",
 					 ct->my_cache->cc_relname, ct->my_cache->id,
-					 ct->tuple.t_data->t_oid,
+					 HeapTupleGetOid(&ct->tuple),
 					 ct->refcount);
 			ct->refcount = 0;
 		}
@@ -717,7 +717,7 @@
 					continue;
 				if (cache->cc_reloidattr == ObjectIdAttributeNumber)
-					tupRelid = ct->tuple.t_data->t_oid;
+					tupRelid = HeapTupleGetOid(&ct->tuple);
 				else
 				{
 					bool		isNull;
@@ -1685,7 +1685,7 @@
 	}
 	ntp = heap_formtuple(tupDesc, values, nulls);
-	ntp->t_data->t_oid = tupOid;
+	HeapTupleSetOid(ntp, tupOid);
 	pfree(values);
 	pfree(nulls);
diff -ru ../base/src/backend/utils/cache/inval.c src/backend/utils/cache/inval.c
--- ../base/src/backend/utils/cache/inval.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/cache/inval.c	2002-07-04 00:26:39.000000000 +0200
@@ -525,7 +525,10 @@
 	tupleRelId = RelationGetRelid(relation);
 	if (tupleRelId == RelOid_pg_class)
-		relationId = tuple->t_data->t_oid;
+	{
+		AssertRelationHasOids(relation);
+		relationId = HeapTupleGetOid(tuple);
+	}
 	else if (tupleRelId == RelOid_pg_attribute)
 		relationId = ((Form_pg_attribute) GETSTRUCT(tuple))->attrelid;
 	else
diff -ru ../base/src/backend/utils/cache/relcache.c src/backend/utils/cache/relcache.c
--- ../base/src/backend/utils/cache/relcache.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/cache/relcache.c	2002-07-04 00:26:39.000000000 +0200
@@ -701,7 +701,8 @@
 		rule = (RewriteRule *) MemoryContextAlloc(rulescxt,
 												  sizeof(RewriteRule));
-		rule->ruleId = rewrite_tuple->t_data->t_oid;
+		AssertRelationHasOids(rewrite_desc);
+		rule->ruleId = HeapTupleGetOid(rewrite_tuple);
 		rule->event = rewrite_form->ev_type - '0';
 		rule->attrno = rewrite_form->ev_attr;
@@ -839,7 +840,8 @@
 	/*
 	 * get information from the pg_class_tuple
 	 */
-	relid = pg_class_tuple->t_data->t_oid;
+	/* Assert(pg_class_tuple has oid); */
+	relid = HeapTupleGetOid(pg_class_tuple);
 	relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
 	/*
diff -ru ../base/src/backend/utils/cache/syscache.c src/backend/utils/cache/syscache.c
--- ../base/src/backend/utils/cache/syscache.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/cache/syscache.c	2002-07-04 00:26:39.000000000 +0200
@@ -574,7 +574,8 @@
 	tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
 	if (!HeapTupleIsValid(tuple))
 		return InvalidOid;
-	result = tuple->t_data->t_oid;
+	/* Assert(tuple has oid); */
+	result = HeapTupleGetOid(tuple);
 	ReleaseSysCache(tuple);
 	return result;
 }
diff -ru ../base/src/backend/utils/init/postinit.c src/backend/utils/init/postinit.c
--- ../base/src/backend/utils/init/postinit.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/init/postinit.c	2002-07-04 00:26:40.000000000 +0200
@@ -98,8 +98,9 @@
 	pgdbscan = heap_beginscan(pgdbrel, SnapshotNow, 1, &key);
 	tup = heap_getnext(pgdbscan, ForwardScanDirection);
+	AssertRelationHasOids(pgdbrel);
 	if (!HeapTupleIsValid(tup) ||
-		tup->t_data->t_oid != MyDatabaseId)
+		HeapTupleGetOid(tup) != MyDatabaseId)
 	{
 		/* OOPS */
 		heap_close(pgdbrel, AccessShareLock);
diff -ru ../base/src/backend/utils/misc/database.c src/backend/utils/misc/database.c
--- ../base/src/backend/utils/misc/database.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/misc/database.c	2002-07-04 00:26:40.000000000 +0200
@@ -220,7 +220,8 @@
 			if (strcmp(name, NameStr(tup_db->datname)) == 0)
 			{
 				/* Found it; extract the OID and the database path. */
-				*db_id = tup.t_data->t_oid;
+				/* Assert(&tup has oid); */
+				*db_id = HeapTupleGetOid(&tup);
 				pathlen = VARSIZE(&(tup_db->datpath)) - VARHDRSZ;
 				if (pathlen < 0)
 					pathlen = 0;				/* pure paranoia */
diff -ru ../base/src/include/access/htup.h src/include/access/htup.h
--- ../base/src/include/access/htup.h	2002-07-03 12:27:42.000000000 +0200
+++ src/include/access/htup.h	2002-07-04 18:05:04.000000000 +0200
@@ -123,10 +123,41 @@

#define HEAP_XACT_MASK 0xFFF0 /* visibility-related bits */

+/* paranoid checking */
+
+#ifdef DEBUG_TUPLE_ACCESS
+
+#define HeapTupleHeaderExpectedLen(tup) \
+	MAXALIGN(offsetof(HeapTupleHeaderData, t_bits) + \
+	         (((tup)->t_infomask & HEAP_HASNULL) \
+	          ? BITMAPLEN((tup)->t_natts) : 0) \
+	        ) 
+
+#define AssertHeapTupleHeaderHoffIsValid(tup) \
+	AssertMacro((tup)->t_hoff == HeapTupleHeaderExpectedLen(tup))
+
+#else
+
+#define AssertHeapTupleHeaderHoffIsValid(tup) ((void)true)
+
+#endif  /* DEBUG_TUPLE_ACCESS */

/* HeapTupleHeader accessor macros */

+#define HeapTupleHeaderGetOid(tup) \
+( \
+	AssertHeapTupleHeaderHoffIsValid(tup), \
+	(tup)->t_oid \
+)
+
+#define HeapTupleHeaderSetOid(tup, oid) \
+( \
+	AssertHeapTupleHeaderHoffIsValid(tup), \
+	(tup)->t_oid = (oid) \
+)
+		
+
 #define HeapTupleHeaderGetXmin(tup) \
 ( \
 	(tup)->t_xmin \
@@ -406,4 +437,10 @@
 #define HeapTupleHasExtended(tuple) \
 		((((HeapTuple)(tuple))->t_data->t_infomask & HEAP_HASEXTENDED) != 0)
+#define HeapTupleGetOid(tuple) \
+		HeapTupleHeaderGetOid(((HeapTuple)(tuple))->t_data)
+
+#define HeapTupleSetOid(tuple, oid) \
+		HeapTupleHeaderSetOid(((HeapTuple)(tuple))->t_data, (oid))
+
 #endif   /* HTUP_H */
diff -ru ../base/src/include/pg_config.h.in src/include/pg_config.h.in
--- ../base/src/include/pg_config.h.in	2002-05-05 02:03:29.000000000 +0200
+++ src/include/pg_config.h.in	2002-07-04 16:53:52.000000000 +0200
@@ -311,6 +311,12 @@
 /* #define ACLDEBUG */
 /* #define RTDEBUG */
 /* #define GISTDEBUG */
+/*
+ * DEBUG_TUPLE_ACCESS enables paranoid assertions during
+ * elimination of oids from the fixed sized part of HeapTupleHeader.
+ * This is expected to be undef'd after v7.3 release at the latest.
+ */
+#define DEBUG_TUPLE_ACCESS
 /*
  * defining unsafe floats will make float4 and float8 ops faster
diff -ru ../base/src/include/utils/rel.h src/include/utils/rel.h
--- ../base/src/include/utils/rel.h	2002-06-21 02:12:31.000000000 +0200
+++ src/include/utils/rel.h	2002-07-04 16:29:59.000000000 +0200
@@ -258,4 +258,10 @@
 #define RelationGetNamespace(relation) \
 	((relation)->rd_rel->relnamespace)
+/*
+ * AssertRelationHasOids
+ *    to be used before ...GetOid() and ...SetOid()
+ */
+#define AssertRelationHasOids(rel) Assert(rel->rd_rel->relhasoids)
+
 #endif   /* REL_H */
diff -ru ../base/src/pl/plpython/plpython.c src/pl/plpython/plpython.c
--- ../base/src/pl/plpython/plpython.c	2002-06-17 10:11:34.000000000 +0200
+++ src/pl/plpython/plpython.c	2002-07-04 00:26:40.000000000 +0200
@@ -2091,7 +2091,7 @@
 				Py_DECREF(optr);
 				optr = NULL;	/* this is important */
-				plan->types[i] = typeTup->t_data->t_oid;
+				plan->types[i] = HeapTupleGetOid(typeTup);
 				typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
 				if (typeStruct->typrelid == InvalidOid)
 					PLy_output_datum_func(&plan->args[i], typeStruct);
diff -ru ../base/src/pl/tcl/pltcl.c src/pl/tcl/pltcl.c
--- ../base/src/pl/tcl/pltcl.c	2002-06-17 10:11:34.000000000 +0200
+++ src/pl/tcl/pltcl.c	2002-07-04 00:26:40.000000000 +0200
@@ -1755,7 +1755,7 @@
 	{
 		/* XXX should extend this to allow qualified type names */
 		typeTup = typenameType(makeTypeName(args[i]));
-		qdesc->argtypes[i] = typeTup->t_data->t_oid;
+		qdesc->argtypes[i] = HeapTupleGetOid(typeTup);
 		perm_fmgr_info(((Form_pg_type) GETSTRUCT(typeTup))->typinput,
 					   &(qdesc->arginfuncs[i]));
 		qdesc->argtypelems[i] = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
diff -ru ../base/contrib/dbsize/dbsize.c contrib/dbsize/dbsize.c
--- ../base/contrib/dbsize/dbsize.c	2002-05-21 11:54:08.000000000 +0200
+++ contrib/dbsize/dbsize.c	2002-07-04 00:26:40.000000000 +0200
@@ -65,7 +65,8 @@
 	if (!HeapTupleIsValid(tuple))
 		elog(ERROR, "database %s does not exist", NameStr(*dbname));
-	dbid = tuple->t_data->t_oid;
+	AssertRelationHasOids(relation);
+	dbid = HeapTupleGetOid(tuple);
 	if (dbid == InvalidOid)
 		elog(ERROR, "invalid database id");
diff -ru ../base/contrib/fulltextindex/fti.c contrib/fulltextindex/fti.c
--- ../base/contrib/fulltextindex/fti.c	2001-11-05 19:46:23.000000000 +0100
+++ contrib/fulltextindex/fti.c	2002-07-04 00:26:40.000000000 +0200
@@ -190,7 +190,7 @@
 	tupdesc = rel->rd_att;		/* what the tuple looks like (?) */
 	/* get oid of current tuple, needed by all, so place here */
-	oid = rettuple->t_data->t_oid;
+	oid = rel->rd_rel->relhasoids ? HeapTupleGetOid(rettuple) : InvalidOid;
 	if (!OidIsValid(oid))
 		elog(ERROR, "Full Text Indexing: Oid of current tuple is invalid");
diff -ru ../base/contrib/rserv/rserv.c contrib/rserv/rserv.c
--- ../base/contrib/rserv/rserv.c	2002-03-06 08:09:11.000000000 +0100
+++ contrib/rserv/rserv.c	2002-07-04 00:26:40.000000000 +0200
@@ -102,7 +102,9 @@
 	if (keynum == ObjectIdAttributeNumber)
 	{
-		sprintf(oidbuf, "%u", tuple->t_data->t_oid);
+		sprintf(oidbuf, "%u", rel->rd_rel->relhasoids
+		                      ? HeapTupleGetOid(tuple)
+		                      : InvalidOid);
 		key = oidbuf;
 	}
 	else

Servus
Manfred

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Manfred Koizar (#1)
Re: Wrap access to Oid II

Manfred Koizar <mkoi-pg@aon.at> writes:

Revised version of the first in a series of patches leading to
heap tuple headers withoid oid for tables created WITHOUT OIDS.

My objection to this remains the same as before: heap_getsysattr
now has a core-dump condition built into it, because it can't tell
whether it's safe to do HeapTupleGetOid().

You really need to propagate relhasoids into tuple descriptors,
which is what heap_getsysattr could be passed from heap_getattr.
Having done that, most if not all of the AssertRelationHasOids()
things should be replaced by tests on tuple descriptors; you
might also find a few more places where it's possible to make
the assertion test, rather than having to write

+ /* no Relation here to AssertRelationHasOids(relation); */

regards, tom lane

#3Manfred Koizar
mkoi-pg@aon.at
In reply to: Tom Lane (#2)
Re: Wrap access to Oid II

On Sat, 06 Jul 2002 17:48:11 -0400, Tom Lane <tgl@sss.pgh.pa.us>
wrote:

My objection to this remains the same as before: heap_getsysattr
now has a core-dump condition built into it, because it can't tell
whether it's safe to do HeapTupleGetOid().

HeapTupleHeader format is still unchanged. The change in the struct
has been proposed, not yet done.

You really need to propagate relhasoids into tuple descriptors,

This is addressed in a patch I'm currently working on. It is harder
than I have thought (hoped), because tuple descriptors are manipulated
in many places in the executor and that's an area, where I have never
been before. I don't trust my changes enough to post the patch now,
I'm still testing...

rather than having to write

+ /* no Relation here to AssertRelationHasOids(relation); */

Yeah, in my working copy of the code (e.g. in GetSysCacheOid) I now
have
/* no tuple descriptor here to Assert(...->hasoid); */ :-)
You're right, these places are much less frequent than those where we
don't have a relation handy.

Servus
Manfred

#4Bruce Momjian
bruce@momjian.us
In reply to: Manfred Koizar (#1)
Re: Wrap access to Oid II

Your patch has been added to the PostgreSQL unapplied patches list at:

http://candle.pha.pa.us/cgi-bin/pgpatches

I will try to apply it within the next 48 hours.

---------------------------------------------------------------------------

Manfred Koizar wrote:

Revised version of the first in a series of patches leading to
heap tuple headers withoid oid for tables created WITHOUT OIDS.

Servus
Manfred

diff -ru ../base/src/backend/access/common/heaptuple.c src/backend/access/common/heaptuple.c
--- ../base/src/backend/access/common/heaptuple.c	2002-06-21 02:12:13.000000000 +0200
+++ src/backend/access/common/heaptuple.c	2002-07-04 16:23:04.000000000 +0200
@@ -436,7 +436,7 @@
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));
@@ -698,14 +698,18 @@
* 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;
}
diff -ru ../base/src/backend/access/common/tupdesc.c src/backend/access/common/tupdesc.c
--- ../base/src/backend/access/common/tupdesc.c	2002-06-21 02:12:13.000000000 +0200
+++ src/backend/access/common/tupdesc.c	2002-07-04 00:26:37.000000000 +0200
@@ -392,7 +392,7 @@
*/
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
diff -ru ../base/src/backend/access/heap/heapam.c src/backend/access/heap/heapam.c
--- ../base/src/backend/access/heap/heapam.c	2002-07-03 12:27:39.000000000 +0200
+++ src/backend/access/heap/heapam.c	2002-07-04 00:26:37.000000000 +0200
@@ -1116,10 +1116,10 @@
* 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();
+		if (!OidIsValid(HeapTupleGetOid(tup)))
+			HeapTupleSetOid(tup, newoid());
else
-			CheckMaxObjectId(tup->t_data->t_oid);
+			CheckMaxObjectId(HeapTupleGetOid(tup));
}

HeapTupleHeaderSetXmin(tup->t_data, GetCurrentTransactionId());
@@ -1166,7 +1166,10 @@
rdata[0].len = SizeOfHeapInsert;
rdata[0].next = &(rdata[1]);

-		xlhdr.t_oid = tup->t_data->t_oid;
+		if (relation->rd_rel->relhasoids)
+			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;
@@ -1206,7 +1209,10 @@
*/
CacheInvalidateHeapTuple(relation, tup);
-	return tup->t_data->t_oid;
+	if (!relation->rd_rel->relhasoids)
+		return InvalidOid;
+		
+	return HeapTupleGetOid(tup);
}

/*
@@ -1499,7 +1505,8 @@
}

/* Fill in OID and transaction status data for newtup */
-	newtup->t_data->t_oid = oldtup.t_data->t_oid;
+	if (relation->rd_rel->relhasoids)
+		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,7 +1979,10 @@
rdata[1].len = 0;
rdata[1].next = &(rdata[2]);
-	xlhdr.hdr.t_oid = newtup->t_data->t_oid;
+	if (reln->rd_rel->relhasoids)
+		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;
@@ -2198,7 +2208,6 @@
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 +2215,8 @@
HeapTupleHeaderSetCmin(htup, FirstCommandId);
HeapTupleHeaderSetXmaxInvalid(htup);
HeapTupleHeaderSetCmax(htup, FirstCommandId);
+		if (reln->rd_rel->relhasoids)
+			HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
offnum = PageAddItem(page, (Item) htup, newlen, offnum,
LP_USED | OverwritePageMode);
@@ -2367,9 +2378,10 @@
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)
+			HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
if (move)
{
TransactionId xmax;
diff -ru ../base/src/backend/bootstrap/bootstrap.c src/backend/bootstrap/bootstrap.c
--- ../base/src/backend/bootstrap/bootstrap.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/bootstrap/bootstrap.c	2002-07-04 00:26:37.000000000 +0200
@@ -495,7 +495,8 @@
app = Typ;
while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
{
-			(*app)->am_oid = tup->t_data->t_oid;
+			AssertRelationHasOids(rel);
+			(*app)->am_oid = HeapTupleGetOid(tup);
memcpy((char *) &(*app)->am_typ,
(char *) GETSTRUCT(tup),
sizeof((*app)->am_typ));
@@ -679,7 +680,10 @@
pfree(tupDesc);				/* just free's tupDesc, not the attrtypes */
if (objectid != (Oid) 0)
-		tuple->t_data->t_oid = objectid;
+	{
+		AssertRelationHasOids(boot_reldesc);
+		HeapTupleSetOid(tuple, objectid);
+	}
simple_heap_insert(boot_reldesc, tuple);
heap_freetuple(tuple);
elog(DEBUG3, "row inserted");
@@ -871,7 +875,8 @@
app = Typ;
while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
{
-			(*app)->am_oid = tup->t_data->t_oid;
+			AssertRelationHasOids(rel);
+			(*app)->am_oid = HeapTupleGetOid(tup);
memmove((char *) &(*app++)->am_typ,
(char *) GETSTRUCT(tup),
sizeof((*app)->am_typ));
diff -ru ../base/src/backend/catalog/aclchk.c src/backend/catalog/aclchk.c
--- ../base/src/backend/catalog/aclchk.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/aclchk.c	2002-07-04 00:26:37.000000000 +0200
@@ -591,7 +591,8 @@
elog(ERROR, "namespace \"%s\" not found", nspname);
pg_namespace_tuple = (Form_pg_namespace) GETSTRUCT(tuple);
-		if (!pg_namespace_ownercheck(tuple->t_data->t_oid, GetUserId()))
+		AssertRelationHasOids(relation);
+		if (!pg_namespace_ownercheck(HeapTupleGetOid(tuple), GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, nspname);
/*
diff -ru ../base/src/backend/catalog/heap.c src/backend/catalog/heap.c
--- ../base/src/backend/catalog/heap.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/heap.c	2002-07-04 00:26:37.000000000 +0200
@@ -583,7 +583,7 @@
(void *) new_rel_reltup);
/* force tuple to have the desired OID */
-	tup->t_data->t_oid = new_rel_oid;
+	HeapTupleSetOid(tup, new_rel_oid);

/*
* finally insert the new tuple and free it.
@@ -1109,7 +1109,8 @@
* the type of the relation we are deleteing then we have to disallow
* the deletion. should talk to stonebraker about this. -cim 6/19/90
*/
- typoid = tup->t_data->t_oid;
+ AssertRelationHasOids(pg_type_desc);
+ typoid = HeapTupleGetOid(tup);

pg_attribute_desc = heap_openr(AttributeRelationName, RowExclusiveLock);

diff -ru ../base/src/backend/catalog/index.c src/backend/catalog/index.c
--- ../base/src/backend/catalog/index.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/index.c	2002-07-04 00:26:37.000000000 +0200
@@ -326,7 +326,7 @@
* the new tuple must have the oid already chosen for the index.
* sure would be embarrassing to do this sort of thing in polite company.
*/
-	tuple->t_data->t_oid = RelationGetRelid(indexRelation);
+	HeapTupleSetOid(tuple, RelationGetRelid(indexRelation));
simple_heap_insert(pg_class, tuple);
/*
diff -ru ../base/src/backend/catalog/namespace.c src/backend/catalog/namespace.c
--- ../base/src/backend/catalog/namespace.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/namespace.c	2002-07-04 00:26:38.000000000 +0200
@@ -584,7 +584,7 @@
continue; /* keep previous result */
/* replace previous result */
prevResult->pathpos = pathpos;
-					prevResult->oid = proctup->t_data->t_oid;
+					prevResult->oid = HeapTupleGetOid(proctup);
continue;	/* args are same, of course */
}
}
@@ -597,7 +597,7 @@
palloc(sizeof(struct _FuncCandidateList) - sizeof(Oid)
+ nargs * sizeof(Oid));
newResult->pathpos = pathpos;
-		newResult->oid = proctup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(proctup);
newResult->nargs = nargs;
memcpy(newResult->args, procform->proargtypes, nargs * sizeof(Oid));
@@ -831,7 +831,7 @@
continue; /* keep previous result */
/* replace previous result */
prevResult->pathpos = pathpos;
-					prevResult->oid = opertup->t_data->t_oid;
+					prevResult->oid = HeapTupleGetOid(opertup);
continue;	/* args are same, of course */
}
}
@@ -843,7 +843,7 @@
newResult = (FuncCandidateList)
palloc(sizeof(struct _FuncCandidateList) + sizeof(Oid));
newResult->pathpos = pathpos;
-		newResult->oid = opertup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(opertup);
newResult->nargs = 2;
newResult->args[0] = operform->oprleft;
newResult->args[1] = operform->oprright;
@@ -1007,7 +1007,7 @@
/* replace previous result */
prevResult->opcname_tmp = NameStr(opcform->opcname);
prevResult->pathpos = pathpos;
-				prevResult->oid = opctup->t_data->t_oid;
+				prevResult->oid = HeapTupleGetOid(opctup);
prevResult->opcintype = opcform->opcintype;
prevResult->opcdefault = opcform->opcdefault;
prevResult->opckeytype = opcform->opckeytype;
@@ -1022,7 +1022,7 @@
palloc(sizeof(struct _OpclassCandidateList));
newResult->opcname_tmp = NameStr(opcform->opcname);
newResult->pathpos = pathpos;
-		newResult->oid = opctup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(opctup);
newResult->opcintype = opcform->opcintype;
newResult->opcdefault = opcform->opcdefault;
newResult->opckeytype = opcform->opckeytype;
@@ -1597,7 +1597,7 @@
case RELKIND_RELATION:
case RELKIND_SEQUENCE:
case RELKIND_VIEW:
-				tempRelList = lconsi(tuple->t_data->t_oid, tempRelList);
+				tempRelList = lconsi(HeapTupleGetOid(tuple), tempRelList);
break;
default:
break;
diff -ru ../base/src/backend/catalog/pg_operator.c src/backend/catalog/pg_operator.c
--- ../base/src/backend/catalog/pg_operator.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_operator.c	2002-07-04 00:26:38.000000000 +0200
@@ -141,7 +141,7 @@
{
RegProcedure oprcode = ((Form_pg_operator) GETSTRUCT(tup))->oprcode;
-		operatorObjectId = tup->t_data->t_oid;
+		operatorObjectId = HeapTupleGetOid(tup);
*defined = RegProcedureIsValid(oprcode);
ReleaseSysCache(tup);
}
diff -ru ../base/src/backend/catalog/pg_proc.c src/backend/catalog/pg_proc.c
--- ../base/src/backend/catalog/pg_proc.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_proc.c	2002-07-04 00:26:38.000000000 +0200
@@ -249,7 +249,8 @@
CatalogCloseIndices(Num_pg_proc_indices, idescs);
}
-	retval = tup->t_data->t_oid;
+	AssertRelationHasOids(rel);
+	retval = HeapTupleGetOid(tup);
heap_freetuple(tup);
heap_close(rel, RowExclusiveLock);
diff -ru ../base/src/backend/catalog/pg_type.c src/backend/catalog/pg_type.c
--- ../base/src/backend/catalog/pg_type.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_type.c	2002-07-04 00:26:38.000000000 +0200
@@ -272,7 +272,8 @@

simple_heap_update(pg_type_desc, &tup->t_self, tup);

-		typeObjectId = tup->t_data->t_oid;
+		AssertRelationHasOids(pg_type_desc);
+		typeObjectId = HeapTupleGetOid(tup);
}
else
{
@@ -283,7 +284,8 @@
nulls);
/* preassign tuple Oid, if one was given */
-		tup->t_data->t_oid = assignedTypeOid;
+		AssertRelationHasOids(pg_type_desc);
+		HeapTupleSetOid(tup, assignedTypeOid);
typeObjectId = simple_heap_insert(pg_type_desc, tup);
}
diff -ru ../base/src/backend/commands/comment.c src/backend/commands/comment.c
--- ../base/src/backend/commands/comment.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/comment.c	2002-07-04 00:26:38.000000000 +0200
@@ -424,7 +424,8 @@
if (!HeapTupleIsValid(dbtuple))
elog(ERROR, "database \"%s\" does not exist", database);
-	oid = dbtuple->t_data->t_oid;
+	AssertRelationHasOids(pg_database);
+	oid = HeapTupleGetOid(dbtuple);

/* Allow if the user matches the database dba or is a superuser */

@@ -470,7 +471,8 @@
elog(ERROR, "CommentSchema: Schema \"%s\" could not be found",
namespace);

-	oid = tp->t_data->t_oid;
+	/* no Relation here to Assert(...->relhasoids); */
+	oid = HeapTupleGetOid(tp);
/* Check object security */
if (!pg_namespace_ownercheck(oid, GetUserId()))
@@ -541,7 +543,8 @@
if (HeapTupleIsValid(tuple))
{
reloid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
-			ruleoid = tuple->t_data->t_oid;
+			AssertRelationHasOids(RewriteRelation);
+			ruleoid = HeapTupleGetOid(tuple);
}
else
{
@@ -581,7 +584,8 @@
if (!HeapTupleIsValid(tuple))
elog(ERROR, "rule \"%s\" does not exist", rulename);
Assert(reloid == ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class);
-		ruleoid = tuple->t_data->t_oid;
+		AssertRelationHasOids(relation);
+		ruleoid = HeapTupleGetOid(tuple);
ReleaseSysCache(tuple);
}

@@ -794,7 +798,8 @@
elog(ERROR, "trigger \"%s\" for relation \"%s\" does not exist",
trigname, RelationGetRelationName(relation));

-	oid = triggertuple->t_data->t_oid;
+	AssertRelationHasOids(pg_trigger);
+	oid = HeapTupleGetOid(triggertuple);

systable_endscan(scan);

diff -ru ../base/src/backend/commands/copy.c src/backend/commands/copy.c
--- ../base/src/backend/commands/copy.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/copy.c	2002-07-04 00:26:38.000000000 +0200
@@ -575,9 +575,13 @@
/* Send OID if wanted --- note fld_count doesn't include it */
if (oids)
{
+				Oid oid;
+				
+				AssertRelationHasOids(rel);
+				oid = HeapTupleGetOid(tuple);
fld_size = sizeof(Oid);
CopySendData(&fld_size, sizeof(int16), fp);
-				CopySendData(&tuple->t_data->t_oid, sizeof(Oid), fp);
+				CopySendData(&oid, sizeof(Oid), fp);
}
}
else
@@ -585,8 +589,9 @@
/* Text format has no per-tuple header, but send OID if wanted */
if (oids)
{
+				AssertRelationHasOids(rel);
string = DatumGetCString(DirectFunctionCall1(oidout,
-								ObjectIdGetDatum(tuple->t_data->t_oid)));
+								ObjectIdGetDatum(HeapTupleGetOid(tuple))));
CopySendString(string, fp);
pfree(string);
need_delim = true;
@@ -977,7 +982,7 @@
tuple = heap_formtuple(tupDesc, values, nulls);
if (oids && file_has_oids)
-			tuple->t_data->t_oid = loaded_oid;
+			HeapTupleSetOid(tuple, loaded_oid);

skip_tuple = false;

diff -ru ../base/src/backend/commands/dbcommands.c src/backend/commands/dbcommands.c
--- ../base/src/backend/commands/dbcommands.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/dbcommands.c	2002-07-04 00:26:38.000000000 +0200
@@ -341,7 +341,8 @@

tuple = heap_formtuple(pg_database_dsc, new_record, new_record_nulls);

-	tuple->t_data->t_oid = dboid;		/* override heap_insert's OID
+	AssertRelationHasOids(pg_database_rel);
+	HeapTupleSetOid(tuple, dboid);		/* override heap_insert's OID
* selection */

simple_heap_insert(pg_database_rel, tuple);
@@ -611,7 +612,10 @@

/* oid of the database */
if (dbIdP)
-			*dbIdP = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(relation);
+			*dbIdP = HeapTupleGetOid(tuple);
+		}
/* sysid of the owner */
if (ownerIdP)
*ownerIdP = dbform->datdba;
diff -ru ../base/src/backend/commands/functioncmds.c src/backend/commands/functioncmds.c
--- ../base/src/backend/commands/functioncmds.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/functioncmds.c	2002-07-04 00:26:38.000000000 +0200
@@ -439,7 +439,8 @@
if (!HeapTupleIsValid(languageTuple))
elog(ERROR, "language \"%s\" does not exist", languageName);
-	languageOid = languageTuple->t_data->t_oid;
+	/* no Relation here to Assert(...->relhasoids) */
+	languageOid = HeapTupleGetOid(languageTuple);
languageStruct = (Form_pg_language) GETSTRUCT(languageTuple);
if (languageStruct->lanpltrusted)
diff -ru ../base/src/backend/commands/indexcmds.c src/backend/commands/indexcmds.c
--- ../base/src/backend/commands/indexcmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/indexcmds.c	2002-07-04 00:26:38.000000000 +0200
@@ -139,7 +139,8 @@
if (!HeapTupleIsValid(tuple))
elog(ERROR, "DefineIndex: access method \"%s\" not found",
accessMethodName);
-	accessMethodId = tuple->t_data->t_oid;
+	/* AssertRelationHasOids(rel);  rel is already closed */
+	accessMethodId = HeapTupleGetOid(tuple);
accessMethodForm = (Form_pg_am) GETSTRUCT(tuple);
if (unique && !accessMethodForm->amcanunique)
@@ -494,7 +495,8 @@
* Verify that the index operator class accepts this
* datatype.  Note we will accept binary compatibility.
*/
-	opClassId = tuple->t_data->t_oid;
+	/* no Relation here to AssertRelationHasOids(relation); */
+	opClassId = HeapTupleGetOid(tuple);
opInputType = ((Form_pg_opclass) GETSTRUCT(tuple))->opcintype;
if (!IsBinaryCompatible(attrType, opInputType))
@@ -754,7 +756,8 @@
relids = repalloc(relids, sizeof(Oid) * relalc);
}
MemoryContextSwitchTo(old);
-			relids[relcnt] = tuple->t_data->t_oid;
+			AssertRelationHasOids(relationRelation);
+			relids[relcnt] = HeapTupleGetOid(tuple);
relcnt++;
}
}
diff -ru ../base/src/backend/commands/tablecmds.c src/backend/commands/tablecmds.c
--- ../base/src/backend/commands/tablecmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/tablecmds.c	2002-07-04 00:26:39.000000000 +0200
@@ -1655,7 +1655,7 @@
attribute->attrelid = myrelid;
namestrcpy(&(attribute->attname), colDef->colname);
-	attribute->atttypid = typeTuple->t_data->t_oid;
+	attribute->atttypid = HeapTupleGetOid(typeTuple);
attribute->attstattarget = DEFAULT_ATTSTATTARGET;
attribute->attlen = tform->typlen;
attribute->attcacheoff = -1;
diff -ru ../base/src/backend/commands/trigger.c src/backend/commands/trigger.c
--- ../base/src/backend/commands/trigger.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/trigger.c	2002-07-04 00:26:39.000000000 +0200
@@ -364,7 +364,8 @@
if (namestrcmp(&(pg_trigger->tgname), trigname) == 0)
{
/* Delete any comments associated with this trigger */
-			DeleteComments(tuple->t_data->t_oid, RelationGetRelid(tgrel));
+			AssertRelationHasOids(tgrel);
+			DeleteComments(HeapTupleGetOid(tuple), RelationGetRelid(tgrel));
simple_heap_delete(tgrel, &tuple->t_self);
found++;
@@ -430,7 +431,8 @@
while (HeapTupleIsValid(tup = systable_getnext(tgscan)))
{
/* Delete any comments associated with this trigger */
-		DeleteComments(tup->t_data->t_oid, RelationGetRelid(tgrel));
+		AssertRelationHasOids(tgrel);
+		DeleteComments(HeapTupleGetOid(tup), RelationGetRelid(tgrel));

simple_heap_delete(tgrel, &tup->t_self);

@@ -667,7 +669,8 @@
RelationGetRelationName(relation));
build = &(triggers[found]);

- build->tgoid = htup->t_data->t_oid;
+ AssertRelationHasOids(tgrel);
+ build->tgoid = HeapTupleGetOid(htup);
build->tgname = MemoryContextStrdup(CacheMemoryContext,
DatumGetCString(DirectFunctionCall1(nameout,
NameGetDatum(&pg_trigger->tgname))));
@@ -1928,7 +1931,8 @@
elog(ERROR, "Constraint '%s' is not deferrable",
cname);

-			constr_oid = htup->t_data->t_oid;
+			AssertRelationHasOids(tgrel);
+			constr_oid = HeapTupleGetOid(htup);
loid = lappendi(loid, constr_oid);
found = true;
}
diff -ru ../base/src/backend/commands/typecmds.c src/backend/commands/typecmds.c
--- ../base/src/backend/commands/typecmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/typecmds.c	2002-07-04 00:26:39.000000000 +0200
@@ -474,7 +474,7 @@
* Note: Name is strictly for error message
*/
expr = cookDefault(pstate, colDef->raw_expr,
-								   typeTup->t_data->t_oid,
+								   HeapTupleGetOid(typeTup),
stmt->typename->typmod,
domainName);
/*
@@ -551,7 +551,7 @@
receiveProcedure,	/* receive procedure */
sendProcedure,		/* send procedure */
basetypelem,			/* element type ID */
-			   typeTup->t_data->t_oid,	/* base type ID */
+			   HeapTupleGetOid(typeTup),	/* base type ID */
defaultValue,		/* default type value (text) */
defaultValueBin,		/* default type value (binary) */
byValue,				/* passed by value */
diff -ru ../base/src/backend/commands/vacuum.c src/backend/commands/vacuum.c
--- ../base/src/backend/commands/vacuum.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/vacuum.c	2002-07-04 00:26:39.000000000 +0200
@@ -392,7 +392,8 @@
{
/* Make a relation list entry for this guy */
oldcontext = MemoryContextSwitchTo(vac_context);
-			vrl = lappendi(vrl, tuple->t_data->t_oid);
+			AssertRelationHasOids(pgclass);
+			vrl = lappendi(vrl, HeapTupleGetOid(tuple));
MemoryContextSwitchTo(oldcontext);
}
@@ -1172,8 +1173,8 @@
/*
* Other checks...
*/
-			if (!OidIsValid(tuple.t_data->t_oid) &&
-				onerel->rd_rel->relhasoids)
+			if (onerel->rd_rel->relhasoids &&
+				!OidIsValid(HeapTupleGetOid(&tuple)))
elog(WARNING, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
relname, blkno, offnum, (int) tupgone);
diff -ru ../base/src/backend/commands/vacuumlazy.c src/backend/commands/vacuumlazy.c
--- ../base/src/backend/commands/vacuumlazy.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/vacuumlazy.c	2002-07-04 00:26:39.000000000 +0200
@@ -368,8 +368,8 @@
/*
* Other checks...
*/
-			if (!OidIsValid(tuple.t_data->t_oid) &&
-				onerel->rd_rel->relhasoids)
+			if (onerel->rd_rel->relhasoids &&
+				!OidIsValid(HeapTupleGetOid(&tuple)))
elog(WARNING, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
relname, blkno, offnum, (int) tupgone);
diff -ru ../base/src/backend/executor/spi.c src/backend/executor/spi.c
--- ../base/src/backend/executor/spi.c	2002-06-21 02:12:16.000000000 +0200
+++ src/backend/executor/spi.c	2002-07-04 16:24:24.000000000 +0200
@@ -435,11 +435,15 @@
{
mtuple = heap_formtuple(rel->rd_att, v, n);
infomask = mtuple->t_data->t_infomask;
-		memmove(&(mtuple->t_data->t_oid), &(tuple->t_data->t_oid),
-				((char *) &(tuple->t_data->t_hoff) -
-				 (char *) &(tuple->t_data->t_oid)));
+		/*
+		 * copy t_xmin, t_cid, t_xmax, t_ctid, t_natts, t_infomask
+		 */
+		memmove((char *)mtuple->t_data, (char *)tuple->t_data,
+				offsetof(HeapTupleHeaderData, t_hoff));
mtuple->t_data->t_infomask = infomask;
mtuple->t_data->t_natts = numberOfAttributes;
+		if (rel->rd_rel->relhasoids)
+			HeapTupleSetOid(mtuple, HeapTupleGetOid(tuple));
}
else
{
diff -ru ../base/src/backend/optimizer/util/clauses.c src/backend/optimizer/util/clauses.c
--- ../base/src/backend/optimizer/util/clauses.c	2002-06-21 02:12:18.000000000 +0200
+++ src/backend/optimizer/util/clauses.c	2002-07-04 00:26:39.000000000 +0200
@@ -1066,7 +1066,7 @@

commuTup = (Form_pg_operator) GETSTRUCT(optup);

-	commu = makeOper(optup->t_data->t_oid,
+	commu = makeOper(HeapTupleGetOid(optup),
commuTup->oprcode,
commuTup->oprresult,
((Oper *) clause->oper)->opretset);
diff -ru ../base/src/backend/parser/parse_coerce.c src/backend/parser/parse_coerce.c
--- ../base/src/backend/parser/parse_coerce.c	2002-06-21 02:12:18.000000000 +0200
+++ src/backend/parser/parse_coerce.c	2002-07-04 00:26:39.000000000 +0200
@@ -770,7 +770,8 @@
if (isExplicit || pform->proimplicit)
{
/* Okay to use it */
-				funcid = ftup->t_data->t_oid;
+				/* Assert(ftup has oid) */
+				funcid = HeapTupleGetOid(ftup);
}
}
ReleaseSysCache(ftup);
diff -ru ../base/src/backend/parser/parse_oper.c src/backend/parser/parse_oper.c
--- ../base/src/backend/parser/parse_oper.c	2002-06-21 02:12:19.000000000 +0200
+++ src/backend/parser/parse_oper.c	2002-07-04 00:26:39.000000000 +0200
@@ -150,7 +150,8 @@
Oid
oprid(Operator op)
{
-	return op->t_data->t_oid;
+	/* Assert(op has oid) */
+	return HeapTupleGetOid(op);
}
/* given operator tuple, return the underlying function's OID */
diff -ru ../base/src/backend/parser/parse_type.c src/backend/parser/parse_type.c
--- ../base/src/backend/parser/parse_type.c	2002-06-21 02:12:19.000000000 +0200
+++ src/backend/parser/parse_type.c	2002-07-04 00:26:39.000000000 +0200
@@ -283,7 +283,8 @@
{
if (tp == NULL)
elog(ERROR, "typeTypeId() called with NULL type struct");
-	return tp->t_data->t_oid;
+	/* Assert(tp has oid); */
+	return HeapTupleGetOid(tp);
}
/* given type (as type struct), return the length of type */
diff -ru ../base/src/backend/postmaster/pgstat.c src/backend/postmaster/pgstat.c
--- ../base/src/backend/postmaster/pgstat.c	2002-05-21 11:54:17.000000000 +0200
+++ src/backend/postmaster/pgstat.c	2002-07-04 00:26:39.000000000 +0200
@@ -628,7 +628,8 @@
dbidlist = (Oid *) repalloc((char *) dbidlist,
sizeof(Oid) * dbidalloc);
}
-		dbidlist[dbidused++] = dbtup->t_data->t_oid;
+		AssertRelationHasOids(dbrel);
+		dbidlist[dbidused++] = HeapTupleGetOid(dbtup);
}
heap_endscan(dbscan);
heap_close(dbrel, AccessShareLock);
diff -ru ../base/src/backend/rewrite/rewriteRemove.c src/backend/rewrite/rewriteRemove.c
--- ../base/src/backend/rewrite/rewriteRemove.c	2002-06-21 02:12:20.000000000 +0200
+++ src/backend/rewrite/rewriteRemove.c	2002-07-04 00:26:39.000000000 +0200
@@ -67,7 +67,8 @@
* Save the OID of the rule (i.e. the tuple's OID) and the event
* relation's OID
*/
-	ruleId = tuple->t_data->t_oid;
+	AssertRelationHasOids(RewriteRelation);
+	ruleId = HeapTupleGetOid(tuple);
eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
Assert(eventRelationOid == owningRel);
@@ -157,7 +158,8 @@
while (HeapTupleIsValid(tuple = systable_getnext(scanDesc)))
{
/* Delete any comments associated with this rule */
-		DeleteComments(tuple->t_data->t_oid, RelationGetRelid(RewriteRelation));
+		AssertRelationHasOids(RewriteRelation);
+		DeleteComments(HeapTupleGetOid(tuple), RelationGetRelid(RewriteRelation));
simple_heap_delete(RewriteRelation, &tuple->t_self);
}
diff -ru ../base/src/backend/utils/adt/regproc.c src/backend/utils/adt/regproc.c
--- ../base/src/backend/utils/adt/regproc.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/adt/regproc.c	2002-07-04 00:26:39.000000000 +0200
@@ -110,7 +110,8 @@
while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
{
-			result = (RegProcedure) tuple->t_data->t_oid;
+			AssertRelationHasOids(hdesc);
+			result = (RegProcedure) HeapTupleGetOid(tuple);
if (++matches > 1)
break;
}
@@ -414,7 +415,8 @@

while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
{
- result = tuple->t_data->t_oid;
+ AssertRelationHasOids(hdesc);
+ result = HeapTupleGetOid(tuple);
if (++matches > 1)
break;
}
@@ -731,7 +733,10 @@
SnapshotNow, 1, skey);

if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-			result = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(hdesc);
+			result = HeapTupleGetOid(tuple);
+		}
else
elog(ERROR, "No class with name %s", class_name_or_oid);

@@ -884,7 +889,10 @@
SnapshotNow, 1, skey);

if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-			result = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(hdesc);
+			result = HeapTupleGetOid(tuple);
+		}
else
elog(ERROR, "No type with name %s", typ_name_or_oid);
diff -ru ../base/src/backend/utils/adt/sets.c src/backend/utils/adt/sets.c
--- ../base/src/backend/utils/adt/sets.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/adt/sets.c	2002-07-04 00:26:39.000000000 +0200
@@ -120,7 +120,8 @@

simple_heap_update(procrel, &newtup->t_self, newtup);

-		setoid = newtup->t_data->t_oid;
+		AssertRelationHasOids(procrel);
+		setoid = HeapTupleGetOid(newtup);
if (RelationGetForm(procrel)->relhasindex)
{
diff -ru ../base/src/backend/utils/cache/catcache.c src/backend/utils/cache/catcache.c
--- ../base/src/backend/utils/cache/catcache.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/cache/catcache.c	2002-07-04 00:26:39.000000000 +0200
@@ -218,7 +218,7 @@
case 4:
cur_skey[3].sk_argument =
(cache->cc_key[3] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[3],
cache->cc_tupdesc,
@@ -228,7 +228,7 @@
case 3:
cur_skey[2].sk_argument =
(cache->cc_key[2] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[2],
cache->cc_tupdesc,
@@ -238,7 +238,7 @@
case 2:
cur_skey[1].sk_argument =
(cache->cc_key[1] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[1],
cache->cc_tupdesc,
@@ -248,7 +248,7 @@
case 1:
cur_skey[0].sk_argument =
(cache->cc_key[0] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[0],
cache->cc_tupdesc,
@@ -572,7 +572,7 @@
if (isCommit)
elog(WARNING, "Cache reference leak: cache %s (%d), tuple %u has count %d",
ct->my_cache->cc_relname, ct->my_cache->id,
-					 ct->tuple.t_data->t_oid,
+					 HeapTupleGetOid(&ct->tuple),
ct->refcount);
ct->refcount = 0;
}
@@ -717,7 +717,7 @@
continue;
if (cache->cc_reloidattr == ObjectIdAttributeNumber)
-					tupRelid = ct->tuple.t_data->t_oid;
+					tupRelid = HeapTupleGetOid(&ct->tuple);
else
{
bool		isNull;
@@ -1685,7 +1685,7 @@
}
ntp = heap_formtuple(tupDesc, values, nulls);
-	ntp->t_data->t_oid = tupOid;
+	HeapTupleSetOid(ntp, tupOid);
pfree(values);
pfree(nulls);
diff -ru ../base/src/backend/utils/cache/inval.c src/backend/utils/cache/inval.c
--- ../base/src/backend/utils/cache/inval.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/cache/inval.c	2002-07-04 00:26:39.000000000 +0200
@@ -525,7 +525,10 @@
tupleRelId = RelationGetRelid(relation);
if (tupleRelId == RelOid_pg_class)
-		relationId = tuple->t_data->t_oid;
+	{
+		AssertRelationHasOids(relation);
+		relationId = HeapTupleGetOid(tuple);
+	}
else if (tupleRelId == RelOid_pg_attribute)
relationId = ((Form_pg_attribute) GETSTRUCT(tuple))->attrelid;
else
diff -ru ../base/src/backend/utils/cache/relcache.c src/backend/utils/cache/relcache.c
--- ../base/src/backend/utils/cache/relcache.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/cache/relcache.c	2002-07-04 00:26:39.000000000 +0200
@@ -701,7 +701,8 @@
rule = (RewriteRule *) MemoryContextAlloc(rulescxt,
sizeof(RewriteRule));
-		rule->ruleId = rewrite_tuple->t_data->t_oid;
+		AssertRelationHasOids(rewrite_desc);
+		rule->ruleId = HeapTupleGetOid(rewrite_tuple);
rule->event = rewrite_form->ev_type - '0';
rule->attrno = rewrite_form->ev_attr;
@@ -839,7 +840,8 @@
/*
* get information from the pg_class_tuple
*/
-	relid = pg_class_tuple->t_data->t_oid;
+	/* Assert(pg_class_tuple has oid); */
+	relid = HeapTupleGetOid(pg_class_tuple);
relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
/*
diff -ru ../base/src/backend/utils/cache/syscache.c src/backend/utils/cache/syscache.c
--- ../base/src/backend/utils/cache/syscache.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/cache/syscache.c	2002-07-04 00:26:39.000000000 +0200
@@ -574,7 +574,8 @@
tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
if (!HeapTupleIsValid(tuple))
return InvalidOid;
-	result = tuple->t_data->t_oid;
+	/* Assert(tuple has oid); */
+	result = HeapTupleGetOid(tuple);
ReleaseSysCache(tuple);
return result;
}
diff -ru ../base/src/backend/utils/init/postinit.c src/backend/utils/init/postinit.c
--- ../base/src/backend/utils/init/postinit.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/init/postinit.c	2002-07-04 00:26:40.000000000 +0200
@@ -98,8 +98,9 @@
pgdbscan = heap_beginscan(pgdbrel, SnapshotNow, 1, &key);
tup = heap_getnext(pgdbscan, ForwardScanDirection);
+	AssertRelationHasOids(pgdbrel);
if (!HeapTupleIsValid(tup) ||
-		tup->t_data->t_oid != MyDatabaseId)
+		HeapTupleGetOid(tup) != MyDatabaseId)
{
/* OOPS */
heap_close(pgdbrel, AccessShareLock);
diff -ru ../base/src/backend/utils/misc/database.c src/backend/utils/misc/database.c
--- ../base/src/backend/utils/misc/database.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/misc/database.c	2002-07-04 00:26:40.000000000 +0200
@@ -220,7 +220,8 @@
if (strcmp(name, NameStr(tup_db->datname)) == 0)
{
/* Found it; extract the OID and the database path. */
-				*db_id = tup.t_data->t_oid;
+				/* Assert(&tup has oid); */
+				*db_id = HeapTupleGetOid(&tup);
pathlen = VARSIZE(&(tup_db->datpath)) - VARHDRSZ;
if (pathlen < 0)
pathlen = 0;				/* pure paranoia */
diff -ru ../base/src/include/access/htup.h src/include/access/htup.h
--- ../base/src/include/access/htup.h	2002-07-03 12:27:42.000000000 +0200
+++ src/include/access/htup.h	2002-07-04 18:05:04.000000000 +0200
@@ -123,10 +123,41 @@

#define HEAP_XACT_MASK 0xFFF0 /* visibility-related bits */

+/* paranoid checking */
+
+#ifdef DEBUG_TUPLE_ACCESS
+
+#define HeapTupleHeaderExpectedLen(tup) \
+	MAXALIGN(offsetof(HeapTupleHeaderData, t_bits) + \
+	         (((tup)->t_infomask & HEAP_HASNULL) \
+	          ? BITMAPLEN((tup)->t_natts) : 0) \
+	        ) 
+
+#define AssertHeapTupleHeaderHoffIsValid(tup) \
+	AssertMacro((tup)->t_hoff == HeapTupleHeaderExpectedLen(tup))
+
+#else
+
+#define AssertHeapTupleHeaderHoffIsValid(tup) ((void)true)
+
+#endif  /* DEBUG_TUPLE_ACCESS */

/* HeapTupleHeader accessor macros */

+#define HeapTupleHeaderGetOid(tup) \
+( \
+	AssertHeapTupleHeaderHoffIsValid(tup), \
+	(tup)->t_oid \
+)
+
+#define HeapTupleHeaderSetOid(tup, oid) \
+( \
+	AssertHeapTupleHeaderHoffIsValid(tup), \
+	(tup)->t_oid = (oid) \
+)
+		
+
#define HeapTupleHeaderGetXmin(tup) \
( \
(tup)->t_xmin \
@@ -406,4 +437,10 @@
#define HeapTupleHasExtended(tuple) \
((((HeapTuple)(tuple))->t_data->t_infomask & HEAP_HASEXTENDED) != 0)
+#define HeapTupleGetOid(tuple) \
+		HeapTupleHeaderGetOid(((HeapTuple)(tuple))->t_data)
+
+#define HeapTupleSetOid(tuple, oid) \
+		HeapTupleHeaderSetOid(((HeapTuple)(tuple))->t_data, (oid))
+
#endif   /* HTUP_H */
diff -ru ../base/src/include/pg_config.h.in src/include/pg_config.h.in
--- ../base/src/include/pg_config.h.in	2002-05-05 02:03:29.000000000 +0200
+++ src/include/pg_config.h.in	2002-07-04 16:53:52.000000000 +0200
@@ -311,6 +311,12 @@
/* #define ACLDEBUG */
/* #define RTDEBUG */
/* #define GISTDEBUG */
+/*
+ * DEBUG_TUPLE_ACCESS enables paranoid assertions during
+ * elimination of oids from the fixed sized part of HeapTupleHeader.
+ * This is expected to be undef'd after v7.3 release at the latest.
+ */
+#define DEBUG_TUPLE_ACCESS
/*
* defining unsafe floats will make float4 and float8 ops faster
diff -ru ../base/src/include/utils/rel.h src/include/utils/rel.h
--- ../base/src/include/utils/rel.h	2002-06-21 02:12:31.000000000 +0200
+++ src/include/utils/rel.h	2002-07-04 16:29:59.000000000 +0200
@@ -258,4 +258,10 @@
#define RelationGetNamespace(relation) \
((relation)->rd_rel->relnamespace)
+/*
+ * AssertRelationHasOids
+ *    to be used before ...GetOid() and ...SetOid()
+ */
+#define AssertRelationHasOids(rel) Assert(rel->rd_rel->relhasoids)
+
#endif   /* REL_H */
diff -ru ../base/src/pl/plpython/plpython.c src/pl/plpython/plpython.c
--- ../base/src/pl/plpython/plpython.c	2002-06-17 10:11:34.000000000 +0200
+++ src/pl/plpython/plpython.c	2002-07-04 00:26:40.000000000 +0200
@@ -2091,7 +2091,7 @@
Py_DECREF(optr);
optr = NULL;	/* this is important */
-				plan->types[i] = typeTup->t_data->t_oid;
+				plan->types[i] = HeapTupleGetOid(typeTup);
typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
if (typeStruct->typrelid == InvalidOid)
PLy_output_datum_func(&plan->args[i], typeStruct);
diff -ru ../base/src/pl/tcl/pltcl.c src/pl/tcl/pltcl.c
--- ../base/src/pl/tcl/pltcl.c	2002-06-17 10:11:34.000000000 +0200
+++ src/pl/tcl/pltcl.c	2002-07-04 00:26:40.000000000 +0200
@@ -1755,7 +1755,7 @@
{
/* XXX should extend this to allow qualified type names */
typeTup = typenameType(makeTypeName(args[i]));
-		qdesc->argtypes[i] = typeTup->t_data->t_oid;
+		qdesc->argtypes[i] = HeapTupleGetOid(typeTup);
perm_fmgr_info(((Form_pg_type) GETSTRUCT(typeTup))->typinput,
&(qdesc->arginfuncs[i]));
qdesc->argtypelems[i] = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
diff -ru ../base/contrib/dbsize/dbsize.c contrib/dbsize/dbsize.c
--- ../base/contrib/dbsize/dbsize.c	2002-05-21 11:54:08.000000000 +0200
+++ contrib/dbsize/dbsize.c	2002-07-04 00:26:40.000000000 +0200
@@ -65,7 +65,8 @@
if (!HeapTupleIsValid(tuple))
elog(ERROR, "database %s does not exist", NameStr(*dbname));
-	dbid = tuple->t_data->t_oid;
+	AssertRelationHasOids(relation);
+	dbid = HeapTupleGetOid(tuple);
if (dbid == InvalidOid)
elog(ERROR, "invalid database id");
diff -ru ../base/contrib/fulltextindex/fti.c contrib/fulltextindex/fti.c
--- ../base/contrib/fulltextindex/fti.c	2001-11-05 19:46:23.000000000 +0100
+++ contrib/fulltextindex/fti.c	2002-07-04 00:26:40.000000000 +0200
@@ -190,7 +190,7 @@
tupdesc = rel->rd_att;		/* what the tuple looks like (?) */
/* get oid of current tuple, needed by all, so place here */
-	oid = rettuple->t_data->t_oid;
+	oid = rel->rd_rel->relhasoids ? HeapTupleGetOid(rettuple) : InvalidOid;
if (!OidIsValid(oid))
elog(ERROR, "Full Text Indexing: Oid of current tuple is invalid");
diff -ru ../base/contrib/rserv/rserv.c contrib/rserv/rserv.c
--- ../base/contrib/rserv/rserv.c	2002-03-06 08:09:11.000000000 +0100
+++ contrib/rserv/rserv.c	2002-07-04 00:26:40.000000000 +0200
@@ -102,7 +102,9 @@
if (keynum == ObjectIdAttributeNumber)
{
-		sprintf(oidbuf, "%u", tuple->t_data->t_oid);
+		sprintf(oidbuf, "%u", rel->rd_rel->relhasoids
+		                      ? HeapTupleGetOid(tuple)
+		                      : InvalidOid);
key = oidbuf;
}
else

Servus
Manfred

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#5Bruce Momjian
bruce@momjian.us
In reply to: Manfred Koizar (#3)
Re: Wrap access to Oid II

I assume Tom is OK with this patch because there are more patches coming
to deal with his issues.

---------------------------------------------------------------------------

Manfred Koizar wrote:

On Sat, 06 Jul 2002 17:48:11 -0400, Tom Lane <tgl@sss.pgh.pa.us>
wrote:

My objection to this remains the same as before: heap_getsysattr
now has a core-dump condition built into it, because it can't tell
whether it's safe to do HeapTupleGetOid().

HeapTupleHeader format is still unchanged. The change in the struct
has been proposed, not yet done.

You really need to propagate relhasoids into tuple descriptors,

This is addressed in a patch I'm currently working on. It is harder
than I have thought (hoped), because tuple descriptors are manipulated
in many places in the executor and that's an area, where I have never
been before. I don't trust my changes enough to post the patch now,
I'm still testing...

rather than having to write

+ /* no Relation here to AssertRelationHasOids(relation); */

Yeah, in my working copy of the code (e.g. in GetSysCacheOid) I now
have
/* no tuple descriptor here to Assert(...->hasoid); */ :-)
You're right, these places are much less frequent than those where we
don't have a relation handy.

Servus
Manfred

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#6Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#5)
Re: Wrap access to Oid II

Bruce Momjian <pgman@candle.pha.pa.us> writes:

I assume Tom is OK with this patch

Did I fail to make it sufficiently clear that I'm not?

I think the patch needs enough modifications that there's little point
in applying it as-is.

regards, tom lane

#7Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#6)
Re: Wrap access to Oid II

Tom Lane wrote:

Bruce Momjian <pgman@candle.pha.pa.us> writes:

I assume Tom is OK with this patch

Did I fail to make it sufficiently clear that I'm not?

You were clear. It was Manfred's response to you that I wasn't sure
about. It wasn't clear to me how he was addressing your concerns, and
hence the email question.

I think the patch needs enough modifications that there's little point
in applying it as-is.

OK, sent back for rework.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#8Bruce Momjian
bruce@momjian.us
In reply to: Manfred Koizar (#1)
Re: Wrap access to Oid II

Manfred, would you make any appropriate adjustments to this patch as
discussed with Tom and resubmit? Thanks.

---------------------------------------------------------------------------

Manfred Koizar wrote:

Revised version of the first in a series of patches leading to
heap tuple headers withoid oid for tables created WITHOUT OIDS.

Servus
Manfred

diff -ru ../base/src/backend/access/common/heaptuple.c src/backend/access/common/heaptuple.c
--- ../base/src/backend/access/common/heaptuple.c	2002-06-21 02:12:13.000000000 +0200
+++ src/backend/access/common/heaptuple.c	2002-07-04 16:23:04.000000000 +0200
@@ -436,7 +436,7 @@
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));
@@ -698,14 +698,18 @@
* 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;
}
diff -ru ../base/src/backend/access/common/tupdesc.c src/backend/access/common/tupdesc.c
--- ../base/src/backend/access/common/tupdesc.c	2002-06-21 02:12:13.000000000 +0200
+++ src/backend/access/common/tupdesc.c	2002-07-04 00:26:37.000000000 +0200
@@ -392,7 +392,7 @@
*/
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
diff -ru ../base/src/backend/access/heap/heapam.c src/backend/access/heap/heapam.c
--- ../base/src/backend/access/heap/heapam.c	2002-07-03 12:27:39.000000000 +0200
+++ src/backend/access/heap/heapam.c	2002-07-04 00:26:37.000000000 +0200
@@ -1116,10 +1116,10 @@
* 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();
+		if (!OidIsValid(HeapTupleGetOid(tup)))
+			HeapTupleSetOid(tup, newoid());
else
-			CheckMaxObjectId(tup->t_data->t_oid);
+			CheckMaxObjectId(HeapTupleGetOid(tup));
}

HeapTupleHeaderSetXmin(tup->t_data, GetCurrentTransactionId());
@@ -1166,7 +1166,10 @@
rdata[0].len = SizeOfHeapInsert;
rdata[0].next = &(rdata[1]);

-		xlhdr.t_oid = tup->t_data->t_oid;
+		if (relation->rd_rel->relhasoids)
+			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;
@@ -1206,7 +1209,10 @@
*/
CacheInvalidateHeapTuple(relation, tup);
-	return tup->t_data->t_oid;
+	if (!relation->rd_rel->relhasoids)
+		return InvalidOid;
+		
+	return HeapTupleGetOid(tup);
}

/*
@@ -1499,7 +1505,8 @@
}

/* Fill in OID and transaction status data for newtup */
-	newtup->t_data->t_oid = oldtup.t_data->t_oid;
+	if (relation->rd_rel->relhasoids)
+		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,7 +1979,10 @@
rdata[1].len = 0;
rdata[1].next = &(rdata[2]);
-	xlhdr.hdr.t_oid = newtup->t_data->t_oid;
+	if (reln->rd_rel->relhasoids)
+		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;
@@ -2198,7 +2208,6 @@
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 +2215,8 @@
HeapTupleHeaderSetCmin(htup, FirstCommandId);
HeapTupleHeaderSetXmaxInvalid(htup);
HeapTupleHeaderSetCmax(htup, FirstCommandId);
+		if (reln->rd_rel->relhasoids)
+			HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
offnum = PageAddItem(page, (Item) htup, newlen, offnum,
LP_USED | OverwritePageMode);
@@ -2367,9 +2378,10 @@
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)
+			HeapTupleHeaderSetOid(htup, xlhdr.t_oid);
if (move)
{
TransactionId xmax;
diff -ru ../base/src/backend/bootstrap/bootstrap.c src/backend/bootstrap/bootstrap.c
--- ../base/src/backend/bootstrap/bootstrap.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/bootstrap/bootstrap.c	2002-07-04 00:26:37.000000000 +0200
@@ -495,7 +495,8 @@
app = Typ;
while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
{
-			(*app)->am_oid = tup->t_data->t_oid;
+			AssertRelationHasOids(rel);
+			(*app)->am_oid = HeapTupleGetOid(tup);
memcpy((char *) &(*app)->am_typ,
(char *) GETSTRUCT(tup),
sizeof((*app)->am_typ));
@@ -679,7 +680,10 @@
pfree(tupDesc);				/* just free's tupDesc, not the attrtypes */
if (objectid != (Oid) 0)
-		tuple->t_data->t_oid = objectid;
+	{
+		AssertRelationHasOids(boot_reldesc);
+		HeapTupleSetOid(tuple, objectid);
+	}
simple_heap_insert(boot_reldesc, tuple);
heap_freetuple(tuple);
elog(DEBUG3, "row inserted");
@@ -871,7 +875,8 @@
app = Typ;
while ((tup = heap_getnext(scan, ForwardScanDirection)) != NULL)
{
-			(*app)->am_oid = tup->t_data->t_oid;
+			AssertRelationHasOids(rel);
+			(*app)->am_oid = HeapTupleGetOid(tup);
memmove((char *) &(*app++)->am_typ,
(char *) GETSTRUCT(tup),
sizeof((*app)->am_typ));
diff -ru ../base/src/backend/catalog/aclchk.c src/backend/catalog/aclchk.c
--- ../base/src/backend/catalog/aclchk.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/aclchk.c	2002-07-04 00:26:37.000000000 +0200
@@ -591,7 +591,8 @@
elog(ERROR, "namespace \"%s\" not found", nspname);
pg_namespace_tuple = (Form_pg_namespace) GETSTRUCT(tuple);
-		if (!pg_namespace_ownercheck(tuple->t_data->t_oid, GetUserId()))
+		AssertRelationHasOids(relation);
+		if (!pg_namespace_ownercheck(HeapTupleGetOid(tuple), GetUserId()))
aclcheck_error(ACLCHECK_NOT_OWNER, nspname);
/*
diff -ru ../base/src/backend/catalog/heap.c src/backend/catalog/heap.c
--- ../base/src/backend/catalog/heap.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/heap.c	2002-07-04 00:26:37.000000000 +0200
@@ -583,7 +583,7 @@
(void *) new_rel_reltup);
/* force tuple to have the desired OID */
-	tup->t_data->t_oid = new_rel_oid;
+	HeapTupleSetOid(tup, new_rel_oid);

/*
* finally insert the new tuple and free it.
@@ -1109,7 +1109,8 @@
* the type of the relation we are deleteing then we have to disallow
* the deletion. should talk to stonebraker about this. -cim 6/19/90
*/
- typoid = tup->t_data->t_oid;
+ AssertRelationHasOids(pg_type_desc);
+ typoid = HeapTupleGetOid(tup);

pg_attribute_desc = heap_openr(AttributeRelationName, RowExclusiveLock);

diff -ru ../base/src/backend/catalog/index.c src/backend/catalog/index.c
--- ../base/src/backend/catalog/index.c	2002-06-21 02:12:14.000000000 +0200
+++ src/backend/catalog/index.c	2002-07-04 00:26:37.000000000 +0200
@@ -326,7 +326,7 @@
* the new tuple must have the oid already chosen for the index.
* sure would be embarrassing to do this sort of thing in polite company.
*/
-	tuple->t_data->t_oid = RelationGetRelid(indexRelation);
+	HeapTupleSetOid(tuple, RelationGetRelid(indexRelation));
simple_heap_insert(pg_class, tuple);
/*
diff -ru ../base/src/backend/catalog/namespace.c src/backend/catalog/namespace.c
--- ../base/src/backend/catalog/namespace.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/namespace.c	2002-07-04 00:26:38.000000000 +0200
@@ -584,7 +584,7 @@
continue; /* keep previous result */
/* replace previous result */
prevResult->pathpos = pathpos;
-					prevResult->oid = proctup->t_data->t_oid;
+					prevResult->oid = HeapTupleGetOid(proctup);
continue;	/* args are same, of course */
}
}
@@ -597,7 +597,7 @@
palloc(sizeof(struct _FuncCandidateList) - sizeof(Oid)
+ nargs * sizeof(Oid));
newResult->pathpos = pathpos;
-		newResult->oid = proctup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(proctup);
newResult->nargs = nargs;
memcpy(newResult->args, procform->proargtypes, nargs * sizeof(Oid));
@@ -831,7 +831,7 @@
continue; /* keep previous result */
/* replace previous result */
prevResult->pathpos = pathpos;
-					prevResult->oid = opertup->t_data->t_oid;
+					prevResult->oid = HeapTupleGetOid(opertup);
continue;	/* args are same, of course */
}
}
@@ -843,7 +843,7 @@
newResult = (FuncCandidateList)
palloc(sizeof(struct _FuncCandidateList) + sizeof(Oid));
newResult->pathpos = pathpos;
-		newResult->oid = opertup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(opertup);
newResult->nargs = 2;
newResult->args[0] = operform->oprleft;
newResult->args[1] = operform->oprright;
@@ -1007,7 +1007,7 @@
/* replace previous result */
prevResult->opcname_tmp = NameStr(opcform->opcname);
prevResult->pathpos = pathpos;
-				prevResult->oid = opctup->t_data->t_oid;
+				prevResult->oid = HeapTupleGetOid(opctup);
prevResult->opcintype = opcform->opcintype;
prevResult->opcdefault = opcform->opcdefault;
prevResult->opckeytype = opcform->opckeytype;
@@ -1022,7 +1022,7 @@
palloc(sizeof(struct _OpclassCandidateList));
newResult->opcname_tmp = NameStr(opcform->opcname);
newResult->pathpos = pathpos;
-		newResult->oid = opctup->t_data->t_oid;
+		newResult->oid = HeapTupleGetOid(opctup);
newResult->opcintype = opcform->opcintype;
newResult->opcdefault = opcform->opcdefault;
newResult->opckeytype = opcform->opckeytype;
@@ -1597,7 +1597,7 @@
case RELKIND_RELATION:
case RELKIND_SEQUENCE:
case RELKIND_VIEW:
-				tempRelList = lconsi(tuple->t_data->t_oid, tempRelList);
+				tempRelList = lconsi(HeapTupleGetOid(tuple), tempRelList);
break;
default:
break;
diff -ru ../base/src/backend/catalog/pg_operator.c src/backend/catalog/pg_operator.c
--- ../base/src/backend/catalog/pg_operator.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_operator.c	2002-07-04 00:26:38.000000000 +0200
@@ -141,7 +141,7 @@
{
RegProcedure oprcode = ((Form_pg_operator) GETSTRUCT(tup))->oprcode;
-		operatorObjectId = tup->t_data->t_oid;
+		operatorObjectId = HeapTupleGetOid(tup);
*defined = RegProcedureIsValid(oprcode);
ReleaseSysCache(tup);
}
diff -ru ../base/src/backend/catalog/pg_proc.c src/backend/catalog/pg_proc.c
--- ../base/src/backend/catalog/pg_proc.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_proc.c	2002-07-04 00:26:38.000000000 +0200
@@ -249,7 +249,8 @@
CatalogCloseIndices(Num_pg_proc_indices, idescs);
}
-	retval = tup->t_data->t_oid;
+	AssertRelationHasOids(rel);
+	retval = HeapTupleGetOid(tup);
heap_freetuple(tup);
heap_close(rel, RowExclusiveLock);
diff -ru ../base/src/backend/catalog/pg_type.c src/backend/catalog/pg_type.c
--- ../base/src/backend/catalog/pg_type.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/catalog/pg_type.c	2002-07-04 00:26:38.000000000 +0200
@@ -272,7 +272,8 @@

simple_heap_update(pg_type_desc, &tup->t_self, tup);

-		typeObjectId = tup->t_data->t_oid;
+		AssertRelationHasOids(pg_type_desc);
+		typeObjectId = HeapTupleGetOid(tup);
}
else
{
@@ -283,7 +284,8 @@
nulls);
/* preassign tuple Oid, if one was given */
-		tup->t_data->t_oid = assignedTypeOid;
+		AssertRelationHasOids(pg_type_desc);
+		HeapTupleSetOid(tup, assignedTypeOid);
typeObjectId = simple_heap_insert(pg_type_desc, tup);
}
diff -ru ../base/src/backend/commands/comment.c src/backend/commands/comment.c
--- ../base/src/backend/commands/comment.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/comment.c	2002-07-04 00:26:38.000000000 +0200
@@ -424,7 +424,8 @@
if (!HeapTupleIsValid(dbtuple))
elog(ERROR, "database \"%s\" does not exist", database);
-	oid = dbtuple->t_data->t_oid;
+	AssertRelationHasOids(pg_database);
+	oid = HeapTupleGetOid(dbtuple);

/* Allow if the user matches the database dba or is a superuser */

@@ -470,7 +471,8 @@
elog(ERROR, "CommentSchema: Schema \"%s\" could not be found",
namespace);

-	oid = tp->t_data->t_oid;
+	/* no Relation here to Assert(...->relhasoids); */
+	oid = HeapTupleGetOid(tp);
/* Check object security */
if (!pg_namespace_ownercheck(oid, GetUserId()))
@@ -541,7 +543,8 @@
if (HeapTupleIsValid(tuple))
{
reloid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
-			ruleoid = tuple->t_data->t_oid;
+			AssertRelationHasOids(RewriteRelation);
+			ruleoid = HeapTupleGetOid(tuple);
}
else
{
@@ -581,7 +584,8 @@
if (!HeapTupleIsValid(tuple))
elog(ERROR, "rule \"%s\" does not exist", rulename);
Assert(reloid == ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class);
-		ruleoid = tuple->t_data->t_oid;
+		AssertRelationHasOids(relation);
+		ruleoid = HeapTupleGetOid(tuple);
ReleaseSysCache(tuple);
}

@@ -794,7 +798,8 @@
elog(ERROR, "trigger \"%s\" for relation \"%s\" does not exist",
trigname, RelationGetRelationName(relation));

-	oid = triggertuple->t_data->t_oid;
+	AssertRelationHasOids(pg_trigger);
+	oid = HeapTupleGetOid(triggertuple);

systable_endscan(scan);

diff -ru ../base/src/backend/commands/copy.c src/backend/commands/copy.c
--- ../base/src/backend/commands/copy.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/copy.c	2002-07-04 00:26:38.000000000 +0200
@@ -575,9 +575,13 @@
/* Send OID if wanted --- note fld_count doesn't include it */
if (oids)
{
+				Oid oid;
+				
+				AssertRelationHasOids(rel);
+				oid = HeapTupleGetOid(tuple);
fld_size = sizeof(Oid);
CopySendData(&fld_size, sizeof(int16), fp);
-				CopySendData(&tuple->t_data->t_oid, sizeof(Oid), fp);
+				CopySendData(&oid, sizeof(Oid), fp);
}
}
else
@@ -585,8 +589,9 @@
/* Text format has no per-tuple header, but send OID if wanted */
if (oids)
{
+				AssertRelationHasOids(rel);
string = DatumGetCString(DirectFunctionCall1(oidout,
-								ObjectIdGetDatum(tuple->t_data->t_oid)));
+								ObjectIdGetDatum(HeapTupleGetOid(tuple))));
CopySendString(string, fp);
pfree(string);
need_delim = true;
@@ -977,7 +982,7 @@
tuple = heap_formtuple(tupDesc, values, nulls);
if (oids && file_has_oids)
-			tuple->t_data->t_oid = loaded_oid;
+			HeapTupleSetOid(tuple, loaded_oid);

skip_tuple = false;

diff -ru ../base/src/backend/commands/dbcommands.c src/backend/commands/dbcommands.c
--- ../base/src/backend/commands/dbcommands.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/dbcommands.c	2002-07-04 00:26:38.000000000 +0200
@@ -341,7 +341,8 @@

tuple = heap_formtuple(pg_database_dsc, new_record, new_record_nulls);

-	tuple->t_data->t_oid = dboid;		/* override heap_insert's OID
+	AssertRelationHasOids(pg_database_rel);
+	HeapTupleSetOid(tuple, dboid);		/* override heap_insert's OID
* selection */

simple_heap_insert(pg_database_rel, tuple);
@@ -611,7 +612,10 @@

/* oid of the database */
if (dbIdP)
-			*dbIdP = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(relation);
+			*dbIdP = HeapTupleGetOid(tuple);
+		}
/* sysid of the owner */
if (ownerIdP)
*ownerIdP = dbform->datdba;
diff -ru ../base/src/backend/commands/functioncmds.c src/backend/commands/functioncmds.c
--- ../base/src/backend/commands/functioncmds.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/functioncmds.c	2002-07-04 00:26:38.000000000 +0200
@@ -439,7 +439,8 @@
if (!HeapTupleIsValid(languageTuple))
elog(ERROR, "language \"%s\" does not exist", languageName);
-	languageOid = languageTuple->t_data->t_oid;
+	/* no Relation here to Assert(...->relhasoids) */
+	languageOid = HeapTupleGetOid(languageTuple);
languageStruct = (Form_pg_language) GETSTRUCT(languageTuple);
if (languageStruct->lanpltrusted)
diff -ru ../base/src/backend/commands/indexcmds.c src/backend/commands/indexcmds.c
--- ../base/src/backend/commands/indexcmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/indexcmds.c	2002-07-04 00:26:38.000000000 +0200
@@ -139,7 +139,8 @@
if (!HeapTupleIsValid(tuple))
elog(ERROR, "DefineIndex: access method \"%s\" not found",
accessMethodName);
-	accessMethodId = tuple->t_data->t_oid;
+	/* AssertRelationHasOids(rel);  rel is already closed */
+	accessMethodId = HeapTupleGetOid(tuple);
accessMethodForm = (Form_pg_am) GETSTRUCT(tuple);
if (unique && !accessMethodForm->amcanunique)
@@ -494,7 +495,8 @@
* Verify that the index operator class accepts this
* datatype.  Note we will accept binary compatibility.
*/
-	opClassId = tuple->t_data->t_oid;
+	/* no Relation here to AssertRelationHasOids(relation); */
+	opClassId = HeapTupleGetOid(tuple);
opInputType = ((Form_pg_opclass) GETSTRUCT(tuple))->opcintype;
if (!IsBinaryCompatible(attrType, opInputType))
@@ -754,7 +756,8 @@
relids = repalloc(relids, sizeof(Oid) * relalc);
}
MemoryContextSwitchTo(old);
-			relids[relcnt] = tuple->t_data->t_oid;
+			AssertRelationHasOids(relationRelation);
+			relids[relcnt] = HeapTupleGetOid(tuple);
relcnt++;
}
}
diff -ru ../base/src/backend/commands/tablecmds.c src/backend/commands/tablecmds.c
--- ../base/src/backend/commands/tablecmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/tablecmds.c	2002-07-04 00:26:39.000000000 +0200
@@ -1655,7 +1655,7 @@
attribute->attrelid = myrelid;
namestrcpy(&(attribute->attname), colDef->colname);
-	attribute->atttypid = typeTuple->t_data->t_oid;
+	attribute->atttypid = HeapTupleGetOid(typeTuple);
attribute->attstattarget = DEFAULT_ATTSTATTARGET;
attribute->attlen = tform->typlen;
attribute->attcacheoff = -1;
diff -ru ../base/src/backend/commands/trigger.c src/backend/commands/trigger.c
--- ../base/src/backend/commands/trigger.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/trigger.c	2002-07-04 00:26:39.000000000 +0200
@@ -364,7 +364,8 @@
if (namestrcmp(&(pg_trigger->tgname), trigname) == 0)
{
/* Delete any comments associated with this trigger */
-			DeleteComments(tuple->t_data->t_oid, RelationGetRelid(tgrel));
+			AssertRelationHasOids(tgrel);
+			DeleteComments(HeapTupleGetOid(tuple), RelationGetRelid(tgrel));
simple_heap_delete(tgrel, &tuple->t_self);
found++;
@@ -430,7 +431,8 @@
while (HeapTupleIsValid(tup = systable_getnext(tgscan)))
{
/* Delete any comments associated with this trigger */
-		DeleteComments(tup->t_data->t_oid, RelationGetRelid(tgrel));
+		AssertRelationHasOids(tgrel);
+		DeleteComments(HeapTupleGetOid(tup), RelationGetRelid(tgrel));

simple_heap_delete(tgrel, &tup->t_self);

@@ -667,7 +669,8 @@
RelationGetRelationName(relation));
build = &(triggers[found]);

- build->tgoid = htup->t_data->t_oid;
+ AssertRelationHasOids(tgrel);
+ build->tgoid = HeapTupleGetOid(htup);
build->tgname = MemoryContextStrdup(CacheMemoryContext,
DatumGetCString(DirectFunctionCall1(nameout,
NameGetDatum(&pg_trigger->tgname))));
@@ -1928,7 +1931,8 @@
elog(ERROR, "Constraint '%s' is not deferrable",
cname);

-			constr_oid = htup->t_data->t_oid;
+			AssertRelationHasOids(tgrel);
+			constr_oid = HeapTupleGetOid(htup);
loid = lappendi(loid, constr_oid);
found = true;
}
diff -ru ../base/src/backend/commands/typecmds.c src/backend/commands/typecmds.c
--- ../base/src/backend/commands/typecmds.c	2002-07-01 19:50:36.000000000 +0200
+++ src/backend/commands/typecmds.c	2002-07-04 00:26:39.000000000 +0200
@@ -474,7 +474,7 @@
* Note: Name is strictly for error message
*/
expr = cookDefault(pstate, colDef->raw_expr,
-								   typeTup->t_data->t_oid,
+								   HeapTupleGetOid(typeTup),
stmt->typename->typmod,
domainName);
/*
@@ -551,7 +551,7 @@
receiveProcedure,	/* receive procedure */
sendProcedure,		/* send procedure */
basetypelem,			/* element type ID */
-			   typeTup->t_data->t_oid,	/* base type ID */
+			   HeapTupleGetOid(typeTup),	/* base type ID */
defaultValue,		/* default type value (text) */
defaultValueBin,		/* default type value (binary) */
byValue,				/* passed by value */
diff -ru ../base/src/backend/commands/vacuum.c src/backend/commands/vacuum.c
--- ../base/src/backend/commands/vacuum.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/vacuum.c	2002-07-04 00:26:39.000000000 +0200
@@ -392,7 +392,8 @@
{
/* Make a relation list entry for this guy */
oldcontext = MemoryContextSwitchTo(vac_context);
-			vrl = lappendi(vrl, tuple->t_data->t_oid);
+			AssertRelationHasOids(pgclass);
+			vrl = lappendi(vrl, HeapTupleGetOid(tuple));
MemoryContextSwitchTo(oldcontext);
}
@@ -1172,8 +1173,8 @@
/*
* Other checks...
*/
-			if (!OidIsValid(tuple.t_data->t_oid) &&
-				onerel->rd_rel->relhasoids)
+			if (onerel->rd_rel->relhasoids &&
+				!OidIsValid(HeapTupleGetOid(&tuple)))
elog(WARNING, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
relname, blkno, offnum, (int) tupgone);
diff -ru ../base/src/backend/commands/vacuumlazy.c src/backend/commands/vacuumlazy.c
--- ../base/src/backend/commands/vacuumlazy.c	2002-06-21 02:12:15.000000000 +0200
+++ src/backend/commands/vacuumlazy.c	2002-07-04 00:26:39.000000000 +0200
@@ -368,8 +368,8 @@
/*
* Other checks...
*/
-			if (!OidIsValid(tuple.t_data->t_oid) &&
-				onerel->rd_rel->relhasoids)
+			if (onerel->rd_rel->relhasoids &&
+				!OidIsValid(HeapTupleGetOid(&tuple)))
elog(WARNING, "Rel %s: TID %u/%u: OID IS INVALID. TUPGONE %d.",
relname, blkno, offnum, (int) tupgone);
diff -ru ../base/src/backend/executor/spi.c src/backend/executor/spi.c
--- ../base/src/backend/executor/spi.c	2002-06-21 02:12:16.000000000 +0200
+++ src/backend/executor/spi.c	2002-07-04 16:24:24.000000000 +0200
@@ -435,11 +435,15 @@
{
mtuple = heap_formtuple(rel->rd_att, v, n);
infomask = mtuple->t_data->t_infomask;
-		memmove(&(mtuple->t_data->t_oid), &(tuple->t_data->t_oid),
-				((char *) &(tuple->t_data->t_hoff) -
-				 (char *) &(tuple->t_data->t_oid)));
+		/*
+		 * copy t_xmin, t_cid, t_xmax, t_ctid, t_natts, t_infomask
+		 */
+		memmove((char *)mtuple->t_data, (char *)tuple->t_data,
+				offsetof(HeapTupleHeaderData, t_hoff));
mtuple->t_data->t_infomask = infomask;
mtuple->t_data->t_natts = numberOfAttributes;
+		if (rel->rd_rel->relhasoids)
+			HeapTupleSetOid(mtuple, HeapTupleGetOid(tuple));
}
else
{
diff -ru ../base/src/backend/optimizer/util/clauses.c src/backend/optimizer/util/clauses.c
--- ../base/src/backend/optimizer/util/clauses.c	2002-06-21 02:12:18.000000000 +0200
+++ src/backend/optimizer/util/clauses.c	2002-07-04 00:26:39.000000000 +0200
@@ -1066,7 +1066,7 @@

commuTup = (Form_pg_operator) GETSTRUCT(optup);

-	commu = makeOper(optup->t_data->t_oid,
+	commu = makeOper(HeapTupleGetOid(optup),
commuTup->oprcode,
commuTup->oprresult,
((Oper *) clause->oper)->opretset);
diff -ru ../base/src/backend/parser/parse_coerce.c src/backend/parser/parse_coerce.c
--- ../base/src/backend/parser/parse_coerce.c	2002-06-21 02:12:18.000000000 +0200
+++ src/backend/parser/parse_coerce.c	2002-07-04 00:26:39.000000000 +0200
@@ -770,7 +770,8 @@
if (isExplicit || pform->proimplicit)
{
/* Okay to use it */
-				funcid = ftup->t_data->t_oid;
+				/* Assert(ftup has oid) */
+				funcid = HeapTupleGetOid(ftup);
}
}
ReleaseSysCache(ftup);
diff -ru ../base/src/backend/parser/parse_oper.c src/backend/parser/parse_oper.c
--- ../base/src/backend/parser/parse_oper.c	2002-06-21 02:12:19.000000000 +0200
+++ src/backend/parser/parse_oper.c	2002-07-04 00:26:39.000000000 +0200
@@ -150,7 +150,8 @@
Oid
oprid(Operator op)
{
-	return op->t_data->t_oid;
+	/* Assert(op has oid) */
+	return HeapTupleGetOid(op);
}
/* given operator tuple, return the underlying function's OID */
diff -ru ../base/src/backend/parser/parse_type.c src/backend/parser/parse_type.c
--- ../base/src/backend/parser/parse_type.c	2002-06-21 02:12:19.000000000 +0200
+++ src/backend/parser/parse_type.c	2002-07-04 00:26:39.000000000 +0200
@@ -283,7 +283,8 @@
{
if (tp == NULL)
elog(ERROR, "typeTypeId() called with NULL type struct");
-	return tp->t_data->t_oid;
+	/* Assert(tp has oid); */
+	return HeapTupleGetOid(tp);
}
/* given type (as type struct), return the length of type */
diff -ru ../base/src/backend/postmaster/pgstat.c src/backend/postmaster/pgstat.c
--- ../base/src/backend/postmaster/pgstat.c	2002-05-21 11:54:17.000000000 +0200
+++ src/backend/postmaster/pgstat.c	2002-07-04 00:26:39.000000000 +0200
@@ -628,7 +628,8 @@
dbidlist = (Oid *) repalloc((char *) dbidlist,
sizeof(Oid) * dbidalloc);
}
-		dbidlist[dbidused++] = dbtup->t_data->t_oid;
+		AssertRelationHasOids(dbrel);
+		dbidlist[dbidused++] = HeapTupleGetOid(dbtup);
}
heap_endscan(dbscan);
heap_close(dbrel, AccessShareLock);
diff -ru ../base/src/backend/rewrite/rewriteRemove.c src/backend/rewrite/rewriteRemove.c
--- ../base/src/backend/rewrite/rewriteRemove.c	2002-06-21 02:12:20.000000000 +0200
+++ src/backend/rewrite/rewriteRemove.c	2002-07-04 00:26:39.000000000 +0200
@@ -67,7 +67,8 @@
* Save the OID of the rule (i.e. the tuple's OID) and the event
* relation's OID
*/
-	ruleId = tuple->t_data->t_oid;
+	AssertRelationHasOids(RewriteRelation);
+	ruleId = HeapTupleGetOid(tuple);
eventRelationOid = ((Form_pg_rewrite) GETSTRUCT(tuple))->ev_class;
Assert(eventRelationOid == owningRel);
@@ -157,7 +158,8 @@
while (HeapTupleIsValid(tuple = systable_getnext(scanDesc)))
{
/* Delete any comments associated with this rule */
-		DeleteComments(tuple->t_data->t_oid, RelationGetRelid(RewriteRelation));
+		AssertRelationHasOids(RewriteRelation);
+		DeleteComments(HeapTupleGetOid(tuple), RelationGetRelid(RewriteRelation));
simple_heap_delete(RewriteRelation, &tuple->t_self);
}
diff -ru ../base/src/backend/utils/adt/regproc.c src/backend/utils/adt/regproc.c
--- ../base/src/backend/utils/adt/regproc.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/adt/regproc.c	2002-07-04 00:26:39.000000000 +0200
@@ -110,7 +110,8 @@
while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
{
-			result = (RegProcedure) tuple->t_data->t_oid;
+			AssertRelationHasOids(hdesc);
+			result = (RegProcedure) HeapTupleGetOid(tuple);
if (++matches > 1)
break;
}
@@ -414,7 +415,8 @@

while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
{
- result = tuple->t_data->t_oid;
+ AssertRelationHasOids(hdesc);
+ result = HeapTupleGetOid(tuple);
if (++matches > 1)
break;
}
@@ -731,7 +733,10 @@
SnapshotNow, 1, skey);

if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-			result = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(hdesc);
+			result = HeapTupleGetOid(tuple);
+		}
else
elog(ERROR, "No class with name %s", class_name_or_oid);

@@ -884,7 +889,10 @@
SnapshotNow, 1, skey);

if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-			result = tuple->t_data->t_oid;
+		{
+			AssertRelationHasOids(hdesc);
+			result = HeapTupleGetOid(tuple);
+		}
else
elog(ERROR, "No type with name %s", typ_name_or_oid);
diff -ru ../base/src/backend/utils/adt/sets.c src/backend/utils/adt/sets.c
--- ../base/src/backend/utils/adt/sets.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/adt/sets.c	2002-07-04 00:26:39.000000000 +0200
@@ -120,7 +120,8 @@

simple_heap_update(procrel, &newtup->t_self, newtup);

-		setoid = newtup->t_data->t_oid;
+		AssertRelationHasOids(procrel);
+		setoid = HeapTupleGetOid(newtup);
if (RelationGetForm(procrel)->relhasindex)
{
diff -ru ../base/src/backend/utils/cache/catcache.c src/backend/utils/cache/catcache.c
--- ../base/src/backend/utils/cache/catcache.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/cache/catcache.c	2002-07-04 00:26:39.000000000 +0200
@@ -218,7 +218,7 @@
case 4:
cur_skey[3].sk_argument =
(cache->cc_key[3] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[3],
cache->cc_tupdesc,
@@ -228,7 +228,7 @@
case 3:
cur_skey[2].sk_argument =
(cache->cc_key[2] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[2],
cache->cc_tupdesc,
@@ -238,7 +238,7 @@
case 2:
cur_skey[1].sk_argument =
(cache->cc_key[1] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[1],
cache->cc_tupdesc,
@@ -248,7 +248,7 @@
case 1:
cur_skey[0].sk_argument =
(cache->cc_key[0] == ObjectIdAttributeNumber)
-				? ObjectIdGetDatum(tuple->t_data->t_oid)
+				? ObjectIdGetDatum(HeapTupleGetOid(tuple))
: fastgetattr(tuple,
cache->cc_key[0],
cache->cc_tupdesc,
@@ -572,7 +572,7 @@
if (isCommit)
elog(WARNING, "Cache reference leak: cache %s (%d), tuple %u has count %d",
ct->my_cache->cc_relname, ct->my_cache->id,
-					 ct->tuple.t_data->t_oid,
+					 HeapTupleGetOid(&ct->tuple),
ct->refcount);
ct->refcount = 0;
}
@@ -717,7 +717,7 @@
continue;
if (cache->cc_reloidattr == ObjectIdAttributeNumber)
-					tupRelid = ct->tuple.t_data->t_oid;
+					tupRelid = HeapTupleGetOid(&ct->tuple);
else
{
bool		isNull;
@@ -1685,7 +1685,7 @@
}
ntp = heap_formtuple(tupDesc, values, nulls);
-	ntp->t_data->t_oid = tupOid;
+	HeapTupleSetOid(ntp, tupOid);
pfree(values);
pfree(nulls);
diff -ru ../base/src/backend/utils/cache/inval.c src/backend/utils/cache/inval.c
--- ../base/src/backend/utils/cache/inval.c	2002-06-21 02:12:22.000000000 +0200
+++ src/backend/utils/cache/inval.c	2002-07-04 00:26:39.000000000 +0200
@@ -525,7 +525,10 @@
tupleRelId = RelationGetRelid(relation);
if (tupleRelId == RelOid_pg_class)
-		relationId = tuple->t_data->t_oid;
+	{
+		AssertRelationHasOids(relation);
+		relationId = HeapTupleGetOid(tuple);
+	}
else if (tupleRelId == RelOid_pg_attribute)
relationId = ((Form_pg_attribute) GETSTRUCT(tuple))->attrelid;
else
diff -ru ../base/src/backend/utils/cache/relcache.c src/backend/utils/cache/relcache.c
--- ../base/src/backend/utils/cache/relcache.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/cache/relcache.c	2002-07-04 00:26:39.000000000 +0200
@@ -701,7 +701,8 @@
rule = (RewriteRule *) MemoryContextAlloc(rulescxt,
sizeof(RewriteRule));
-		rule->ruleId = rewrite_tuple->t_data->t_oid;
+		AssertRelationHasOids(rewrite_desc);
+		rule->ruleId = HeapTupleGetOid(rewrite_tuple);
rule->event = rewrite_form->ev_type - '0';
rule->attrno = rewrite_form->ev_attr;
@@ -839,7 +840,8 @@
/*
* get information from the pg_class_tuple
*/
-	relid = pg_class_tuple->t_data->t_oid;
+	/* Assert(pg_class_tuple has oid); */
+	relid = HeapTupleGetOid(pg_class_tuple);
relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
/*
diff -ru ../base/src/backend/utils/cache/syscache.c src/backend/utils/cache/syscache.c
--- ../base/src/backend/utils/cache/syscache.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/cache/syscache.c	2002-07-04 00:26:39.000000000 +0200
@@ -574,7 +574,8 @@
tuple = SearchSysCache(cacheId, key1, key2, key3, key4);
if (!HeapTupleIsValid(tuple))
return InvalidOid;
-	result = tuple->t_data->t_oid;
+	/* Assert(tuple has oid); */
+	result = HeapTupleGetOid(tuple);
ReleaseSysCache(tuple);
return result;
}
diff -ru ../base/src/backend/utils/init/postinit.c src/backend/utils/init/postinit.c
--- ../base/src/backend/utils/init/postinit.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/init/postinit.c	2002-07-04 00:26:40.000000000 +0200
@@ -98,8 +98,9 @@
pgdbscan = heap_beginscan(pgdbrel, SnapshotNow, 1, &key);
tup = heap_getnext(pgdbscan, ForwardScanDirection);
+	AssertRelationHasOids(pgdbrel);
if (!HeapTupleIsValid(tup) ||
-		tup->t_data->t_oid != MyDatabaseId)
+		HeapTupleGetOid(tup) != MyDatabaseId)
{
/* OOPS */
heap_close(pgdbrel, AccessShareLock);
diff -ru ../base/src/backend/utils/misc/database.c src/backend/utils/misc/database.c
--- ../base/src/backend/utils/misc/database.c	2002-06-21 02:12:23.000000000 +0200
+++ src/backend/utils/misc/database.c	2002-07-04 00:26:40.000000000 +0200
@@ -220,7 +220,8 @@
if (strcmp(name, NameStr(tup_db->datname)) == 0)
{
/* Found it; extract the OID and the database path. */
-				*db_id = tup.t_data->t_oid;
+				/* Assert(&tup has oid); */
+				*db_id = HeapTupleGetOid(&tup);
pathlen = VARSIZE(&(tup_db->datpath)) - VARHDRSZ;
if (pathlen < 0)
pathlen = 0;				/* pure paranoia */
diff -ru ../base/src/include/access/htup.h src/include/access/htup.h
--- ../base/src/include/access/htup.h	2002-07-03 12:27:42.000000000 +0200
+++ src/include/access/htup.h	2002-07-04 18:05:04.000000000 +0200
@@ -123,10 +123,41 @@

#define HEAP_XACT_MASK 0xFFF0 /* visibility-related bits */

+/* paranoid checking */
+
+#ifdef DEBUG_TUPLE_ACCESS
+
+#define HeapTupleHeaderExpectedLen(tup) \
+	MAXALIGN(offsetof(HeapTupleHeaderData, t_bits) + \
+	         (((tup)->t_infomask & HEAP_HASNULL) \
+	          ? BITMAPLEN((tup)->t_natts) : 0) \
+	        ) 
+
+#define AssertHeapTupleHeaderHoffIsValid(tup) \
+	AssertMacro((tup)->t_hoff == HeapTupleHeaderExpectedLen(tup))
+
+#else
+
+#define AssertHeapTupleHeaderHoffIsValid(tup) ((void)true)
+
+#endif  /* DEBUG_TUPLE_ACCESS */

/* HeapTupleHeader accessor macros */

+#define HeapTupleHeaderGetOid(tup) \
+( \
+	AssertHeapTupleHeaderHoffIsValid(tup), \
+	(tup)->t_oid \
+)
+
+#define HeapTupleHeaderSetOid(tup, oid) \
+( \
+	AssertHeapTupleHeaderHoffIsValid(tup), \
+	(tup)->t_oid = (oid) \
+)
+		
+
#define HeapTupleHeaderGetXmin(tup) \
( \
(tup)->t_xmin \
@@ -406,4 +437,10 @@
#define HeapTupleHasExtended(tuple) \
((((HeapTuple)(tuple))->t_data->t_infomask & HEAP_HASEXTENDED) != 0)
+#define HeapTupleGetOid(tuple) \
+		HeapTupleHeaderGetOid(((HeapTuple)(tuple))->t_data)
+
+#define HeapTupleSetOid(tuple, oid) \
+		HeapTupleHeaderSetOid(((HeapTuple)(tuple))->t_data, (oid))
+
#endif   /* HTUP_H */
diff -ru ../base/src/include/pg_config.h.in src/include/pg_config.h.in
--- ../base/src/include/pg_config.h.in	2002-05-05 02:03:29.000000000 +0200
+++ src/include/pg_config.h.in	2002-07-04 16:53:52.000000000 +0200
@@ -311,6 +311,12 @@
/* #define ACLDEBUG */
/* #define RTDEBUG */
/* #define GISTDEBUG */
+/*
+ * DEBUG_TUPLE_ACCESS enables paranoid assertions during
+ * elimination of oids from the fixed sized part of HeapTupleHeader.
+ * This is expected to be undef'd after v7.3 release at the latest.
+ */
+#define DEBUG_TUPLE_ACCESS
/*
* defining unsafe floats will make float4 and float8 ops faster
diff -ru ../base/src/include/utils/rel.h src/include/utils/rel.h
--- ../base/src/include/utils/rel.h	2002-06-21 02:12:31.000000000 +0200
+++ src/include/utils/rel.h	2002-07-04 16:29:59.000000000 +0200
@@ -258,4 +258,10 @@
#define RelationGetNamespace(relation) \
((relation)->rd_rel->relnamespace)
+/*
+ * AssertRelationHasOids
+ *    to be used before ...GetOid() and ...SetOid()
+ */
+#define AssertRelationHasOids(rel) Assert(rel->rd_rel->relhasoids)
+
#endif   /* REL_H */
diff -ru ../base/src/pl/plpython/plpython.c src/pl/plpython/plpython.c
--- ../base/src/pl/plpython/plpython.c	2002-06-17 10:11:34.000000000 +0200
+++ src/pl/plpython/plpython.c	2002-07-04 00:26:40.000000000 +0200
@@ -2091,7 +2091,7 @@
Py_DECREF(optr);
optr = NULL;	/* this is important */
-				plan->types[i] = typeTup->t_data->t_oid;
+				plan->types[i] = HeapTupleGetOid(typeTup);
typeStruct = (Form_pg_type) GETSTRUCT(typeTup);
if (typeStruct->typrelid == InvalidOid)
PLy_output_datum_func(&plan->args[i], typeStruct);
diff -ru ../base/src/pl/tcl/pltcl.c src/pl/tcl/pltcl.c
--- ../base/src/pl/tcl/pltcl.c	2002-06-17 10:11:34.000000000 +0200
+++ src/pl/tcl/pltcl.c	2002-07-04 00:26:40.000000000 +0200
@@ -1755,7 +1755,7 @@
{
/* XXX should extend this to allow qualified type names */
typeTup = typenameType(makeTypeName(args[i]));
-		qdesc->argtypes[i] = typeTup->t_data->t_oid;
+		qdesc->argtypes[i] = HeapTupleGetOid(typeTup);
perm_fmgr_info(((Form_pg_type) GETSTRUCT(typeTup))->typinput,
&(qdesc->arginfuncs[i]));
qdesc->argtypelems[i] = ((Form_pg_type) GETSTRUCT(typeTup))->typelem;
diff -ru ../base/contrib/dbsize/dbsize.c contrib/dbsize/dbsize.c
--- ../base/contrib/dbsize/dbsize.c	2002-05-21 11:54:08.000000000 +0200
+++ contrib/dbsize/dbsize.c	2002-07-04 00:26:40.000000000 +0200
@@ -65,7 +65,8 @@
if (!HeapTupleIsValid(tuple))
elog(ERROR, "database %s does not exist", NameStr(*dbname));
-	dbid = tuple->t_data->t_oid;
+	AssertRelationHasOids(relation);
+	dbid = HeapTupleGetOid(tuple);
if (dbid == InvalidOid)
elog(ERROR, "invalid database id");
diff -ru ../base/contrib/fulltextindex/fti.c contrib/fulltextindex/fti.c
--- ../base/contrib/fulltextindex/fti.c	2001-11-05 19:46:23.000000000 +0100
+++ contrib/fulltextindex/fti.c	2002-07-04 00:26:40.000000000 +0200
@@ -190,7 +190,7 @@
tupdesc = rel->rd_att;		/* what the tuple looks like (?) */
/* get oid of current tuple, needed by all, so place here */
-	oid = rettuple->t_data->t_oid;
+	oid = rel->rd_rel->relhasoids ? HeapTupleGetOid(rettuple) : InvalidOid;
if (!OidIsValid(oid))
elog(ERROR, "Full Text Indexing: Oid of current tuple is invalid");
diff -ru ../base/contrib/rserv/rserv.c contrib/rserv/rserv.c
--- ../base/contrib/rserv/rserv.c	2002-03-06 08:09:11.000000000 +0100
+++ contrib/rserv/rserv.c	2002-07-04 00:26:40.000000000 +0200
@@ -102,7 +102,9 @@
if (keynum == ObjectIdAttributeNumber)
{
-		sprintf(oidbuf, "%u", tuple->t_data->t_oid);
+		sprintf(oidbuf, "%u", rel->rd_rel->relhasoids
+		                      ? HeapTupleGetOid(tuple)
+		                      : InvalidOid);
key = oidbuf;
}
else

Servus
Manfred

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026