On 11.04.2011 23:35, jagan wrote:
Hi,
Suppose I create a table as follows:

CREATE TABLE test2 (name TEXT, age INTEGER) WITH oids;

Now, for every tuple in this table is associated with a unique oid, which I can 
retrieve by:

SELECT oid, name, age FROM test2;

which works great. So far so good.

Now, if look at the corresponding WAL entry for any insert into this relation, 
it creates the following WAL entry which I can decode.

XLogRecord --->  Followed by -->  xl_heap_insert struct -->followed by -->  
xl_heap_header -->  Followed by -->  tuple data

If I use the macro  HeapTupleHeaderGetOid([xl_heap_header struct])

Yeah, that won't work because xl_heap_header is not a HeapTupleHeader.

or equivalently if I test ([xl_heap_header struct]->t_infomask&  HEAP_HASOID), 
it tells me that the tuple oid is not stored with this record.

That's strange, the flag should be set.

Where is the OID of tuple stored in a WAL record of a tuple? If not with 
xl_heap_header, where is it stored? Is it stored at all?

It's stored in the "tuple data" portion. See the code that writes the WAL record, here:

http://git.postgresql.org/gitweb?p=postgresql.git;a=blob;f=src/backend/access/heap/heapam.c;h=1fbd8b39b4a73f6aee337fccf2dcce548d0850bb;hb=HEAD#l1987

Maybe the WAL record you're looking at is a full-page image? A record with a full-page image includes a verbatim copy of the page, and the individual tuple is omitted in that case.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to