Re: Recording foreign key relationships for the system catalogs

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Recording foreign key relationships for the system catalogs
Дата
Msg-id 3863749.1612308375@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Recording foreign key relationships for the system catalogs  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
I wrote:
> * It would now be possible to remove the PGNSP and PGUID kluges
> entirely in favor of plain BKI_LOOKUP references to pg_namespace
> and pg_authid.  The catalog header usage would get a little
> more verbose: BKI_DEFAULT(PGNSP) becomes BKI_DEFAULT(pg_catalog)
> and BKI_DEFAULT(PGUID) becomes BKI_DEFAULT(POSTGRES).  I'm a bit
> inclined to do it, simply to remove one bit of mechanism that has
> to be documented; but it's material for a separate patch perhaps.

Here's a patch for that part.  I think this is probably a good
idea not only because it removes magic, but because now that we
have various predefined roles it's becoming more and more likely
that some of those will need to be cross-referenced in other
catalogs' initial data.  With this change, nothing special
will be needed for that.  Multiple built-in schemas also become
more feasible than they were.

            regards, tom lane

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 <literal>pg_catalog</literal> schema.
      </para>
     </listitem>
-
-    <listitem>
-     <para>
-      In addition to the generic lookup mechanisms, there is a special
-      convention that <literal>PGNSP</literal> is replaced by the OID of
-      the <literal>pg_catalog</literal> schema,
-      and <literal>PGUID</literal> 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.
-     </para>
-    </listitem>
    </itemizedlist>

    <para>
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

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Alvaro Herrera
Дата:
Сообщение: Re: LogwrtResult contended spinlock
Следующее
От: Andres Freund
Дата:
Сообщение: Re: LogwrtResult contended spinlock