On Thu, Feb 13, 2020 at 10:30 AM Kyotaro Horiguchi <horikyota....@gmail.com> wrote: > At Mon, 10 Feb 2020 14:32:44 +0900, Amit Langote <amitlangot...@gmail.com> > wrote in > > Agree that ObjectIsUserObject(oid) is easier to read than oid >= > > FirstNormalObject. I would have not bothered, for example, if it was > > something like oid >= FirstUserObjectId to begin with. > > Aside from the naming, I'm not sure it's sensible to use > FirstNormalObjectId since I don't see a clear definition or required > characteristics for "user created objects" is. If we did CREATE > TABLE, FUNCTION or maybe any objects during single-user mode before > the first object is created during normal multiuser operation, the > "user-created(or not?)" object has an OID less than > FirstNormalObjectId. If such objects are the "user created object", we > need FirstUserObjectId defferent from FirstNormalObjectId.
Interesting observation. Connecting to database in --single mode, whether done using initdb or directly, is always considered "bootstrapping", so the OIDs from the bootstrapping range are consumed. $ postgres --single -D pgdata postgres PostgreSQL stand-alone backend 13devel backend> create table a (a int); backend> select 'a'::regclass::oid; 1: oid (typeid = 26, len = 4, typmod = -1, byval = t) ---- 1: oid = "14168" (typeid = 26, len = 4, typmod = -1, byval = t) Here, FirstBootstrapObjectId < 14168 < FirstNormalObjectId Maybe we could document that pg_is_user_object() and its internal counterpart returns true only for objects that are created during "normal" multi-user database operation. Thanks, Amit