Обсуждение: Why does the OID jump by 3 when creating tables?

Поиск
Список
Период
Сортировка

Why does the OID jump by 3 when creating tables?

От
"Daniel Westermann (DWE)"
Дата:
Hi all,

as I could not find the reason in the source code, can someone tell me why the OID counter jumps by 3 between two
createtable statements? 

postgres=# create table t1 ( a int );
CREATE TABLE
postgres=# create table t2 ( a int );
CREATE TABLE
postgres=# select oid,relname from pg_class where relname in ('t1','t2');
  oid  | relname
-------+---------
 16453 | t1
 16456 | t2
(2 rows)

These seems not to happen with other objects, e.g. namespaces:

postgres=# create schema a;
CREATE SCHEMA
postgres=# create schema b;
CREATE SCHEMA
postgres=# select oid,nspname from pg_namespace where nspname in ('a','b');
  oid  | nspname
-------+---------
 16459 | a
 16460 | b
(2 rows)

... or indexes:

postgres=# select oid,relname from pg_class where relname in ('i1','i2');
  oid  | relname
-------+---------
 16461 | i1
 16462 | i2

Thanks in advance
Daniel



Re: Why does the OID jump by 3 when creating tables?

От
Guillaume Lelarge
Дата:
Hi,

Le sam. 30 oct. 2021 à 10:55, Daniel Westermann (DWE) <daniel.westermann@dbi-services.com> a écrit :
Hi all,

as I could not find the reason in the source code, can someone tell me why the OID counter jumps by 3 between two create table statements?

postgres=# create table t1 ( a int );
CREATE TABLE
postgres=# create table t2 ( a int );
CREATE TABLE
postgres=# select oid,relname from pg_class where relname in ('t1','t2');
  oid  | relname
-------+---------
 16453 | t1
 16456 | t2
(2 rows)

These seems not to happen with other objects, e.g. namespaces:

postgres=# create schema a;
CREATE SCHEMA
postgres=# create schema b;
CREATE SCHEMA
postgres=# select oid,nspname from pg_namespace where nspname in ('a','b');
  oid  | nspname
-------+---------
 16459 | a
 16460 | b
(2 rows)

... or indexes:

postgres=# select oid,relname from pg_class where relname in ('i1','i2');
  oid  | relname
-------+---------
 16461 | i1
 16462 | i2


When you create a table, it also creates two data types: tablename and _tablename. For example, for your table t1, you should have a t1 type and a _t1 type. Both have OIDs. On my cluster, your example gives me:

# select oid,relname from pg_class where relname in ('t1','t2');
┌───────┬─────────┐
│  oid  │ relname │
├───────┼─────────┤
│ 24635 │ t1      │
│ 24638 │ t2      │
└───────┴─────────┘
(2 rows)

Time: 0.507 ms
# select oid, typname from pg_type where typname like '%t1' or typname like '%t2' and oid>24000 order by oid;
┌───────┬─────────┐
│  oid  │ typname │
├───────┼─────────┤
│ 24636 │ _t1     │
│ 24637 │ t1      │
│ 24639 │ _t2     │
│ 24640 │ t2      │
└───────┴─────────┘
(4 rows)

Time: 1.203 ms


The jump between t1 OID (24635) and t2 OID (24638) is the _t1 data type OID (24636) and the t1 data type OID (24637).


--
Guillaume.

Re: Why does the OID jump by 3 when creating tables?

От
"Daniel Westermann (DWE)"
Дата:
>>Le sam. 30 oct. 2021 à 10:55, Daniel Westermann (DWE) <daniel.westermann@dbi-services.com> a écrit :
>>Hi all,

>>as I could not find the reason in the source code, can someone tell me why the OID counter jumps by 3 between two
createtable >>statements? 

>>postgres=# create table t1 ( a int );
>>CREATE TABLE
>>postgres=# create table t2 ( a int );
>>CREATE TABLE
>>postgres=# select oid,relname from pg_class where relname in ('t1','t2');
>>  oid  | relname
>>-------+---------
>> 16453 | t1
>> 16456 | t2
>>(2 rows)

>>These seems not to happen with other objects, e.g. namespaces:

>>postgres=# create schema a;
>>CREATE SCHEMA
>>postgres=# create schema b;
>>CREATE SCHEMA
>>postgres=# select oid,nspname from pg_namespace where nspname in ('a','b');
>>  oid  | nspname
>>-------+---------
>> 16459 | a
>> 16460 | b
>>(2 rows)

>>... or indexes:

>>postgres=# select oid,relname from pg_class where relname in ('i1','i2');
>>  oid  | relname
>>-------+---------
>> 16461 | i1
>> 16462 | i2


>When you create a table, it also creates two data types: tablename and _tablename. For example, for your table t1, you
shouldhave a >t1 type and a _t1 type. Both have OIDs. On my cluster, your example gives me: 

># select oid,relname from pg_class where relname in ('t1','t2');
>┌───────┬─────────┐
>│  oid  │ relname │
>├───────┼─────────┤
>│ 24635 │ t1      │
>│ 24638 │ t2      │
>└───────┴─────────┘
>(2 rows)

>Time: 0.507 ms
># select oid, typname from pg_type where typname like '%t1' or typname like '%t2' and oid>24000 order by oid;
>┌───────┬─────────┐
>│  oid  │ typname │
>├───────┼─────────┤
>│ 24636 │ _t1     │
>│ 24637 │ t1      │
>│ 24639 │ _t2     │
>│ 24640 │ t2      │
>└───────┴─────────┘
>(4 rows)

>Time: 1.203 ms

>The jump between t1 OID (24635) and t2 OID (24638) is the _t1 data type OID (24636) and the t1 data type OID (24637).

Thank you, Guillaume.

Re: Why does the OID jump by 3 when creating tables?

От
Ron
Дата:
On 10/30/21 3:55 AM, Daniel Westermann (DWE) wrote:
> Hi all,
>
> as I could not find the reason in the source code, can someone tell me why the OID counter jumps by 3 between two
createtable statements?
 
>
> postgres=# create table t1 ( a int );
> CREATE TABLE
> postgres=# create table t2 ( a int );
> CREATE TABLE
> postgres=# select oid,relname from pg_class where relname in ('t1','t2');
>    oid  | relname
> -------+---------
>   16453 | t1
>   16456 | t2
> (2 rows)
>
> These seems not to happen with other objects, e.g. namespaces:
>
> postgres=# create schema a;
> CREATE SCHEMA
> postgres=# create schema b;
> CREATE SCHEMA
> postgres=# select oid,nspname from pg_namespace where nspname in ('a','b');
>    oid  | nspname
> -------+---------
>   16459 | a
>   16460 | b
> (2 rows)
>
> ... or indexes:
>
> postgres=# select oid,relname from pg_class where relname in ('i1','i2');
>    oid  | relname
> -------+---------
>   16461 | i1
>   16462 | i2
>

I'd run this, and see if the results answer the question:

select oid,relname, reltype from pg_class where oid between 16453 and 16455;

-- 
Angular momentum makes the world go 'round.