Re: Single-User Mode oid assignment

2024-03-18 Thread Laurenz Albe
On Sat, 2024-03-16 at 14:14 +0300, PetSerAl wrote:
> I have following script, which initialize two clusters:
> 
> echo CREATE ROLE new_user WITH LOGIN;>init_cluster.sql
> echo CREATE DATABASE new_database WITH OWNER = new_user;>>init_cluster.sql
> initdb -D case1 -U postgres
> pg_ctl start -D case1 -w
> psql "host=localhost dbname=postgres user=postgres" pg_ctl stop -D case1 -m smart -w
> initdb -D case2 -U postgres
> postgres --single -D case2 postgres 
> In case1 I have following oid assigned:
> new_user: 16384
> new_database: 16385
> 
> In case2:
> new_user: 15062
> new_database: 15063
> And pgAdmin does not show new_database in the server tree.
> Documentation says following:
> > OIDs assigned during normal database operation are constrained to be 16384 
> > or higher. This ensures that the range 1—16383 is free for OIDs 
> > assigned automatically by genbki.pl or during initdb.
> 
> Is such difference in oid assignment in Single-User Mode expected?

Yes; see the comment in GetNewObjectId():

/*
 * Check for wraparound of the OID counter.  We *must* not return 0
 * (InvalidOid), and in normal operation we mustn't return anything below
 * FirstNormalObjectId since that range is reserved for initdb (see
 * IsCatalogRelationOid()).  Note we are relying on unsigned comparison.
 *
 * During initdb, we start the OID generator at FirstGenbkiObjectId, so we
 * only wrap if before that point when in bootstrap or standalone mode.
 * The first time through this routine after normal postmaster start, the
 * counter will be forced up to FirstNormalObjectId.  This mechanism
 * leaves the OIDs between FirstGenbkiObjectId and FirstNormalObjectId
 * available for automatic assignment during initdb, while ensuring they
 * will never conflict with user-assigned OIDs.
 */16384

Object IDs are forced to be 16384 or above "after normal postmaster start".

Yours,
Laurenz Albe




Single-User Mode oid assignment

2024-03-18 Thread PetSerAl
I have following script, which initialize two clusters:

echo CREATE ROLE new_user WITH LOGIN;>init_cluster.sql
echo CREATE DATABASE new_database WITH OWNER = new_user;>>init_cluster.sql
initdb -D case1 -U postgres
pg_ctl start -D case1 -w
psql "host=localhost dbname=postgres user=postgres"OIDs assigned during normal database operation are constrained to be 16384 or 
>higher. This ensures that the range 1—16383 is free for OIDs assigned 
>automatically by genbki.pl or during initdb.

Is such difference in oid assignment in Single-User Mode expected?