From ba0faf81c65ac99dd42ce192f3257d4d2231ea50 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 3 Feb 2021 12:01:48 -0500 Subject: [PATCH] Remove special BKI_LOOKUP magic for namespace and role OIDs. Now that commit 62f34097c attached BKI_LOOKUP annotation to all the namespace and role OID columns in the catalogs, there's no real reason to have the magic PGNSP and PGUID symbols. Get rid of them in favor of implementing those lookups according to genbki.pl's normal pattern. This means that in the catalog headers, BKI_DEFAULT(PGNSP) becomes BKI_DEFAULT(pg_catalog), which seems a lot more transparent. BKI_DEFAULT(PGUID) becomes BKI_DEFAULT(POSTGRES), which is perhaps less so; but you can look into pg_authid.dat to discover that POSTGRES is the nonce name for the bootstrap superuser. This change also means that if we ever need cross-references in the initial catalog data to any of the other built-in roles besides POSTGRES, or to some other built-in schema besides pg_catalog, we can just do it. No catversion bump here, as there's no actual change in the contents of postgres.bki. Discussion: https://postgr.es/m/3240355.1612129197@sss.pgh.pa.us --- doc/src/sgml/bki.sgml | 11 ----------- src/backend/catalog/genbki.pl | 24 ++++++++++-------------- src/include/catalog/pg_authid.dat | 4 ++++ src/include/catalog/pg_class.h | 4 ++-- src/include/catalog/pg_collation.h | 9 ++++++--- src/include/catalog/pg_conversion.h | 4 ++-- src/include/catalog/pg_database.h | 2 +- src/include/catalog/pg_language.h | 2 +- src/include/catalog/pg_namespace.h | 2 +- src/include/catalog/pg_opclass.h | 4 ++-- src/include/catalog/pg_operator.h | 4 ++-- src/include/catalog/pg_opfamily.h | 4 ++-- src/include/catalog/pg_proc.h | 4 ++-- src/include/catalog/pg_tablespace.h | 4 +++- src/include/catalog/pg_ts_config.h | 4 ++-- src/include/catalog/pg_ts_dict.h | 4 ++-- src/include/catalog/pg_ts_parser.h | 2 +- src/include/catalog/pg_ts_template.h | 2 +- src/include/catalog/pg_type.h | 4 ++-- 19 files changed, 46 insertions(+), 52 deletions(-) diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml index 6d3c5be67f..db1b3d5e9a 100644 --- a/doc/src/sgml/bki.sgml +++ b/doc/src/sgml/bki.sgml @@ -540,17 +540,6 @@ expected to be in the pg_catalog schema. - - - - In addition to the generic lookup mechanisms, there is a special - convention that PGNSP is replaced by the OID of - the pg_catalog schema, - and PGUID is replaced by the OID of the bootstrap - superuser role. These usages are somewhat historical but so far - there hasn't been a need to generalize them. - - diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index 5bdc7adc44..b159958112 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -184,15 +184,9 @@ my $GenbkiNextOid = $FirstGenbkiObjectId; # within a given Postgres release, such as fixed OIDs. Do not substitute # anything that could depend on platform or configuration. (The right place # to handle those sorts of things is in initdb.c's bootstrap_template1().) -my $BOOTSTRAP_SUPERUSERID = - Catalog::FindDefinedSymbolFromData($catalog_data{pg_authid}, - 'BOOTSTRAP_SUPERUSERID'); my $C_COLLATION_OID = Catalog::FindDefinedSymbolFromData($catalog_data{pg_collation}, 'C_COLLATION_OID'); -my $PG_CATALOG_NAMESPACE = - Catalog::FindDefinedSymbolFromData($catalog_data{pg_namespace}, - 'PG_CATALOG_NAMESPACE'); # Fill in pg_class.relnatts by looking at the referenced catalog's schema. @@ -213,11 +207,12 @@ foreach my $row (@{ $catalog_data{pg_am} }) $amoids{ $row->{amname} } = $row->{oid}; } -# There is only one authid at bootstrap time, and we handle it specially: -# the usually-defaulted symbol PGUID becomes the bootstrap superuser's OID. -# (We could drop this in favor of writing out BKI_DEFAULT(POSTGRES) ...) +# role OID lookup my %authidoids; -$authidoids{'PGUID'} = $BOOTSTRAP_SUPERUSERID; +foreach my $row (@{ $catalog_data{pg_authid} }) +{ + $authidoids{ $row->{rolname} } = $row->{oid}; +} # class (relation) OID lookup (note this only covers bootstrap catalogs!) my %classoids; @@ -240,11 +235,12 @@ foreach my $row (@{ $catalog_data{pg_language} }) $langoids{ $row->{lanname} } = $row->{oid}; } -# There is only one namespace at bootstrap time, and we handle it specially: -# the usually-defaulted symbol PGNSP becomes the pg_catalog namespace's OID. -# (We could drop this in favor of writing out BKI_DEFAULT(pg_catalog) ...) +# namespace (schema) OID lookup my %namespaceoids; -$namespaceoids{'PGNSP'} = $PG_CATALOG_NAMESPACE; +foreach my $row (@{ $catalog_data{pg_namespace} }) +{ + $namespaceoids{ $row->{nspname} } = $row->{oid}; +} # opclass OID lookup my %opcoids; diff --git a/src/include/catalog/pg_authid.dat b/src/include/catalog/pg_authid.dat index a643a09588..87d917ffc3 100644 --- a/src/include/catalog/pg_authid.dat +++ b/src/include/catalog/pg_authid.dat @@ -15,6 +15,10 @@ # The C code typically refers to these roles using the #define symbols, # so make sure every entry has an oid_symbol value. +# The bootstrap superuser is named POSTGRES according to this data and +# according to BKI_DEFAULT entries in other catalogs. However, initdb +# will replace that at database initialization time. + { oid => '10', oid_symbol => 'BOOTSTRAP_SUPERUSERID', rolname => 'POSTGRES', rolsuper => 't', rolinherit => 't', rolcreaterole => 't', rolcreatedb => 't', rolcanlogin => 't', diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h index bb6938caa2..3e37729436 100644 --- a/src/include/catalog/pg_class.h +++ b/src/include/catalog/pg_class.h @@ -38,7 +38,7 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat NameData relname; /* OID of namespace containing this class */ - Oid relnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid relnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* OID of entry in pg_type for relation's implicit row type, if any */ Oid reltype BKI_LOOKUP_OPT(pg_type); @@ -47,7 +47,7 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat Oid reloftype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type); /* class owner */ - Oid relowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid relowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* access method; 0 if not a table / index */ Oid relam BKI_DEFAULT(heap) BKI_LOOKUP_OPT(pg_am); diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h index 3bd7873c68..c6394ca222 100644 --- a/src/include/catalog/pg_collation.h +++ b/src/include/catalog/pg_collation.h @@ -30,9 +30,12 @@ CATALOG(pg_collation,3456,CollationRelationId) { Oid oid; /* oid */ NameData collname; /* collation name */ - Oid collnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); /* OID of namespace - * containing collation */ - Oid collowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); /* owner of collation */ + + /* OID of namespace containing this collation */ + Oid collnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); + + /* owner of collation */ + Oid collowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); char collprovider; /* see constants below */ bool collisdeterministic BKI_DEFAULT(t); int32 collencoding; /* encoding for this collation; -1 = "all" */ diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h index 96bb92f251..ca556f6030 100644 --- a/src/include/catalog/pg_conversion.h +++ b/src/include/catalog/pg_conversion.h @@ -35,10 +35,10 @@ CATALOG(pg_conversion,2607,ConversionRelationId) NameData conname; /* namespace that the conversion belongs to */ - Oid connamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid connamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* owner of the conversion */ - Oid conowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid conowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* FOR encoding id */ int32 conforencoding BKI_LOOKUP(encoding); diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h index f0240c58cf..d3de45821c 100644 --- a/src/include/catalog/pg_database.h +++ b/src/include/catalog/pg_database.h @@ -35,7 +35,7 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID NameData datname; /* owner of database */ - Oid datdba BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid datdba BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* character encoding */ int32 encoding; diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h index e9df9dac09..3e56597ece 100644 --- a/src/include/catalog/pg_language.h +++ b/src/include/catalog/pg_language.h @@ -34,7 +34,7 @@ CATALOG(pg_language,2612,LanguageRelationId) NameData lanname; /* Language's owner */ - Oid lanowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid lanowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* Is a procedural language */ bool lanispl BKI_DEFAULT(f); diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h index d920c6cfc6..fe87a947ee 100644 --- a/src/include/catalog/pg_namespace.h +++ b/src/include/catalog/pg_namespace.h @@ -37,7 +37,7 @@ CATALOG(pg_namespace,2615,NamespaceRelationId) Oid oid; /* oid */ NameData nspname; - Oid nspowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid nspowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); #ifdef CATALOG_VARLEN /* variable-length fields start here */ aclitem nspacl[1]; diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h index 9f321f2a85..7b2cf25920 100644 --- a/src/include/catalog/pg_opclass.h +++ b/src/include/catalog/pg_opclass.h @@ -57,10 +57,10 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId) NameData opcname; /* namespace of this opclass */ - Oid opcnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid opcnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* opclass owner */ - Oid opcowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid opcowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* containing operator family */ Oid opcfamily BKI_LOOKUP(pg_opfamily); diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h index 7f06abaeec..d32fcdc64e 100644 --- a/src/include/catalog/pg_operator.h +++ b/src/include/catalog/pg_operator.h @@ -36,10 +36,10 @@ CATALOG(pg_operator,2617,OperatorRelationId) NameData oprname; /* OID of namespace containing this oper */ - Oid oprnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid oprnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* operator owner */ - Oid oprowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid oprowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* 'l' for prefix or 'b' for infix */ char oprkind BKI_DEFAULT(b); diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h index 1a723b76f6..129102b576 100644 --- a/src/include/catalog/pg_opfamily.h +++ b/src/include/catalog/pg_opfamily.h @@ -37,10 +37,10 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId) NameData opfname; /* namespace of this opfamily */ - Oid opfnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid opfnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* opfamily owner */ - Oid opfowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid opfowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); } FormData_pg_opfamily; /* ---------------- diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 2f54aa171e..78f230894b 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -35,10 +35,10 @@ CATALOG(pg_proc,1255,ProcedureRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81,Proce NameData proname; /* OID of namespace containing this proc */ - Oid pronamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid pronamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* procedure owner */ - Oid proowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid proowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* OID of pg_language entry */ Oid prolang BKI_DEFAULT(internal) BKI_LOOKUP(pg_language); diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h index ed38e6950d..58bb1087a3 100644 --- a/src/include/catalog/pg_tablespace.h +++ b/src/include/catalog/pg_tablespace.h @@ -30,7 +30,9 @@ CATALOG(pg_tablespace,1213,TableSpaceRelationId) BKI_SHARED_RELATION { Oid oid; /* oid */ NameData spcname; /* tablespace name */ - Oid spcowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); /* owner of tablespace */ + + /* owner of tablespace */ + Oid spcowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); #ifdef CATALOG_VARLEN /* variable-length fields start here */ aclitem spcacl[1]; /* access permissions */ diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h index e705899b17..2e0263962d 100644 --- a/src/include/catalog/pg_ts_config.h +++ b/src/include/catalog/pg_ts_config.h @@ -36,10 +36,10 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId) NameData cfgname; /* name space */ - Oid cfgnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid cfgnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* owner */ - Oid cfgowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid cfgowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* OID of parser */ Oid cfgparser BKI_LOOKUP(pg_ts_parser); diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h index 57f626e7b5..e53eead829 100644 --- a/src/include/catalog/pg_ts_dict.h +++ b/src/include/catalog/pg_ts_dict.h @@ -35,10 +35,10 @@ CATALOG(pg_ts_dict,3600,TSDictionaryRelationId) NameData dictname; /* name space */ - Oid dictnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid dictnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* owner */ - Oid dictowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid dictowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* dictionary's template */ Oid dicttemplate BKI_LOOKUP(pg_ts_template); diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h index e0d705fd9a..0231051cee 100644 --- a/src/include/catalog/pg_ts_parser.h +++ b/src/include/catalog/pg_ts_parser.h @@ -34,7 +34,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId) NameData prsname; /* name space */ - Oid prsnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid prsnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* init parsing session */ regproc prsstart BKI_LOOKUP(pg_proc); diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h index 2ee1ae4e85..194b921136 100644 --- a/src/include/catalog/pg_ts_template.h +++ b/src/include/catalog/pg_ts_template.h @@ -34,7 +34,7 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId) NameData tmplname; /* name space */ - Oid tmplnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid tmplnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* initialization method of dict (may be 0) */ regproc tmplinit BKI_LOOKUP_OPT(pg_proc); diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h index 1ec8606703..8ee5fa0507 100644 --- a/src/include/catalog/pg_type.h +++ b/src/include/catalog/pg_type.h @@ -41,10 +41,10 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati NameData typname; /* OID of namespace containing this type */ - Oid typnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); + Oid typnamespace BKI_DEFAULT(pg_catalog) BKI_LOOKUP(pg_namespace); /* type owner */ - Oid typowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); + Oid typowner BKI_DEFAULT(POSTGRES) BKI_LOOKUP(pg_authid); /* * For a fixed-size type, typlen is the number of bytes we use to