Thread
-
Any reason to keep HEAP_HASOID_OLD?
David Rowley <dgrowleyml@gmail.com> — 2026-04-28T04:27:59Z
Andres mentioned to me that I might want to look at HeapTupleHeaderGetOidOld() as there's a comment and some code there that would lead you to believe we can still have tuples with oids. If that were true, the code I recently added for getting 'tp' in slot_selectively_deform_heap_tuple() is wrong. #define HEAP_HASOID_OLD 0x0008 /* has an object-id field */ On 11.22, I tried: create extension pageinspect; create table t1 (a int) with oids; insert into t1 select generate_Series(1,1000); select count(*) from heap_page_items(get_raw_page('public.t1',0)) where t_infomask & 8 <> 0; count ------- 185 alter table t1 set without oids; select count(*) from heap_page_items(get_raw_page('public.t1',0)) where t_infomask & 8 <> 0; count ------- 0 And also, if I try to pg_upgrade before SET WITHOUT OIDS, I get: $ pg_upgrade -d pgdata11 -D pgdata -b ~/pg11/bin -B ~/pg/bin Performing Consistency Checks ----------------------------- Checking cluster versions ok Checking database user is the install user ok Checking database connection settings ok Checking for prepared transactions ok Checking for system-defined composite types in user tables ok Checking for reg* data types in user tables ok Checking for contrib/isn with bigint-passing mismatch ok Checking for user-defined encoding conversions ok Checking for user-defined postfix operators ok Checking for incompatible polymorphic functions ok Checking for tables WITH OIDS fatal So, I'm not following how we could get a tuple with OIDs in versions after 11. Should we get rid of HEAP_HASOID_OLD and the code that relates to it? David -
Re: Any reason to keep HEAP_HASOID_OLD?
Andres Freund <andres@anarazel.de> — 2026-04-28T14:27:32Z
Hi, On 2026-04-28 16:27:59 +1200, David Rowley wrote: > Andres mentioned to me that I might want to look at > HeapTupleHeaderGetOidOld() as there's a comment and some code there > that would lead you to believe we can still have tuples with oids. If > that were true, the code I recently added for getting 'tp' in > slot_selectively_deform_heap_tuple() is wrong. > > #define HEAP_HASOID_OLD 0x0008 /* has an object-id field */ > > On 11.22, I tried: > > create extension pageinspect; > create table t1 (a int) with oids; > insert into t1 select generate_Series(1,1000); > select count(*) from heap_page_items(get_raw_page('public.t1',0)) > where t_infomask & 8 <> 0; > > count > ------- > 185 > > alter table t1 set without oids; > > select count(*) from heap_page_items(get_raw_page('public.t1',0)) > where t_infomask & 8 <> 0; > count > ------- > 0 Yea, it seems we've started rewriting tables for SET WITHOUT OIDS a long time ago: /* * If we dropped the OID column, must adjust pg_class.relhasoids and tell * Phase 3 to physically get rid of the column. We formerly left the * column in place physically, but this caused subtle problems. See * http://archives.postgresql.org/pgsql-hackers/2009-02/msg00363.php */ if (attnum == ObjectIdAttributeNumber) I also verified that we don't allow SET WITHOUT OIDS when it's used as a row type in another table. > And also, if I try to pg_upgrade before SET WITHOUT OIDS, I get: > > $ pg_upgrade -d pgdata11 -D pgdata -b ~/pg11/bin -B ~/pg/bin > Performing Consistency Checks > ----------------------------- > Checking cluster versions ok > Checking database user is the install user ok > Checking database connection settings ok > Checking for prepared transactions ok > Checking for system-defined composite types in user tables ok > Checking for reg* data types in user tables ok > Checking for contrib/isn with bigint-passing mismatch ok > Checking for user-defined encoding conversions ok > Checking for user-defined postfix operators ok > Checking for incompatible polymorphic functions ok > Checking for tables WITH OIDS fatal > > So, I'm not following how we could get a tuple with OIDs in versions after 11. I don't see it either. Wonder why I / decided to leave it :/. > Should we get rid of HEAP_HASOID_OLD and the code that relates to it? Looks like it. Greetings, Andres Freund