We have been discussing heap tuple header changes for a while now.
Here is my proposal for omitting the oid, when it is not needed:

First let's eliminate t_oid from HeapTupleHeaderData.

Then add the oid to the end of the structure, if and only if it is
needed.  The tricky part here is that there is a variable length field
(t_bits) and the oid has to be properly aligned.

This pseudo code snippet illustrates what I plan to do:

	len = offsetof(HeapTupleHeaderData, t_bits);  /* 23 */
	if (hasnulls) {
		len += BITMAPLEN(NumberOfAttributes);
	}
	if (hasoid) {
		len += sizeof(Oid);
	}
	len = MAXALIGN(len);
	hoff = len;
	oidoff = hoff - sizeof(Oid);

#define HeapTupleHeaderGetOid(hth) \
	( *((Oid *)((char *)(hth) + (hth)->t_hoff - sizeof(Oid))) )

And this is how the structure would look like:
               1         2           3
     0   4     0         0  34  78   2
now  oooo<---------fix--------->.x___X___
+oid <---------fix--------->.oooox___       MAXALIGN 4
+oid <---------fix--------->.....ooooX___   MAXALIGN 8
-oid <---------fix--------->.X___

1:
now  oooo<---------fix--------->bx___X___
+oid <---------fix--------->boooox___       MAXALIGN 4
+oid <---------fix--------->b....ooooX___   MAXALIGN 8
-oid <---------fix--------->bX___

2:
now  oooo<---------fix--------->bb...X___
+oid <---------fix--------->bb...ooooX___   MAXALIGN 4 und 8
-oid <---------fix--------->bb...x___X___
                                     3       4 
6:                                   2   6   0
now  oooo<---------fix--------->bbbbbb...x___X___
+oid <---------fix--------->bbbbbb...oooox___       MAXALIGN 4
+oid <---------fix--------->bbbbbb.......ooooX___   MAXALIGN 8
-oid <---------fix--------->bbbbbb...X___

where
<---------fix--------->  fixed sized part without oid, 23 bytes
oooo  oid, 4 bytes
b     one bitmap byte
.     one padding byte
x     start of data area (= hoff) with 4-byte-alignment
X     start of data area (= hoff) with 8-byte-alignment

Bytes saved on architectures with 4/8 byte alignment:
                                  hoff    bytes
natts  bitmaplen  hoff72  oidoff   woo    saved
       0          28/32     24    24/24    4/8
1-8    1          28/32     24    24/24    4/8
9-40   2-5        32/32     28    28/32    4/0
41-72  6-9        36/40     32    32/32    4/8

As a first step I've already posted a patch that eliminates direct
access to t_oid.  The final patch will change not much more than the
getter and setter macros.

Problems I have identified so far:

.  heap_formtuple needs a parameter bool withoid
.  Does heap_addheader *always* create a header with oid?
.  Have to check heap_xlog_xxxx routines
.  Occasionally a heap tuple header is copied by memmove.

Comments?

Servus
 Manfred



Mon, 01 Jul 2002 12:40:35 +0200
Manfred Koizar <mkoi-pg@aon.at>
HeapTupleHeader withoud oid
Manfred Koizar <mkoi-pg@aon.at> writes:
> .  Does heap_addheader *always* create a header with oid?

No.

			regards, tom lane



Mon, 01 Jul 2002 10:20:19 -0400
Tom Lane <tgl@sss.pgh.pa.us>
Re: HeapTupleHeader withoud oid 
On Mon, 01 Jul 2002 12:40:35 +0200, I wrote:
>Bytes saved on architectures with 4/8 byte alignment:
>                                  hoff    bytes
>natts  bitmaplen  hoff72  oidoff   woo    saved
>       0          28/32     24    24/24    4/8
>1-8    1          28/32     24    24/24    4/8
>9-40   2-5        32/32     28    28/32    4/0
>41-72  6-9        36/40     32    32/32    4/8

In this table oidoff contains wrong values, it is from my first
approach, where I tried to put oid at the first INTALIGNed position
after t_bits.  The table should be:

       bitmap                        hoff    bytes
natts   len   hoff1  hoff2  oidoff    woo    saved
        0      32    28/32   24/28    24      4/8
1-8     1      32    28/32   24/28    24      4/8
9-40    2-5   36/40   32      28     28/32    4/0
41-72   6-9    40    36/40   32/36    32      4/8

where hoff1 is the MAXALIGNed length of the tuple header with a v7.2
compatible tuple header format (with bitmaplen patch included);
hoff2 is the header size after the Xmin/Cid/Xmax patch, which is still
being discussed on -patches and -hackers;
with this proposal, if a table has oids, oidoff is the offset of the
oid and header size equals hoff2;
hoff woo is the header size without oid;
bytes saved is relative to hoff2.

I apologize for the confusion.

Servus
 Manfred



Mon, 01 Jul 2002 16:22:27 +0200
Manfred Koizar <mkoi-pg@aon.at>
Re: HeapTupleHeader without oid
Manfred Koizar <mkoi-pg@aon.at> writes:
> Here is my proposal for omitting the oid, when it is not needed:

I do not think you can make this work unless "has oids" is added to
TupleDescs.  There are too many places where tuples are manipulated
with only a tupdesc for reference.

It might also be necessary to add a "has oid" bit to t_infomask,
so that a tuple's OID can be fetched with *no* outside information,
but I'd prefer to avoid that if possible.  I think adding a tupledesc
parameter to heap_getsysattr might be enough to avoid it.

I'd suggest reworking your "Wrap access to Oid" patch, which currently
increases instead of reducing the dependency on access to a Relation
for the tuple.  Also, you could be a little more conservative about
adding Asserts --- those are not free, at least not from a development
point of view, so I object to adding multiple redundant Asserts in
hotspot routines.

			regards, tom lane



Mon, 01 Jul 2002 10:40:34 -0400
Tom Lane <tgl@sss.pgh.pa.us>
Re: HeapTupleHeader withoud oid 