<!--
-$PostgreSQL: pgsql/doc/src/sgml/bki.sgml,v 1.15 2005/04/13 18:54:55 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/bki.sgml,v 1.16 2005/04/14 01:38:15 tgl Exp $
  -->
 
 <chapter id="bki">
   </para>
 
   <para>
-   Lines starting with a <literal>#</literal> are ignored.
+   Lines starting with <literal>#</literal> are ignored.
   </para>
 
  </sect1>
   <variablelist>
    <varlistentry>
     <term>
-     create 
-     <optional>bootstrap</optional>
-     <optional>shared_relation</optional>
-     <optional>without_oids</optional>
+     <literal>create</> 
+     <optional><literal>bootstrap</></optional>
+     <optional><literal>shared_relation</></optional>
+     <optional><literal>without_oids</></optional>
      <replaceable class="parameter">tablename</replaceable>
+     <replaceable class="parameter">tableoid</replaceable>
      (<replaceable class="parameter">name1</replaceable> =
      <replaceable class="parameter">type1</replaceable> <optional>,
      <replaceable class="parameter">name2</replaceable> = <replaceable
     <listitem>
      <para>
       Create a table named <replaceable
-      class="parameter">tablename</replaceable> with the columns given
-      in parentheses.
+      class="parameter">tablename</replaceable>, and having the OID
+      <replaceable class="parameter">tableoid</replaceable>,
+      with the columns given in parentheses.
      </para>
 
      <para>
       <type>_aclitem</type> (array).  Although it is possible to create
       tables containing columns of other types, this cannot be done until
       after <structname>pg_type</> has been created and filled with
-      appropriate entries.
+      appropriate entries.  (That effectively means that only these
+      column types can be used in bootstrapped tables, but non-bootstrap
+      catalogs can contain any built-in type.)
      </para>
 
      <para>
 
    <varlistentry>
     <term>
-     open <replaceable class="parameter">tablename</replaceable>
+     <literal>open</> <replaceable class="parameter">tablename</replaceable>
     </term>
 
     <listitem>
      <para>
-      Open the table called
+      Open the table named
       <replaceable class="parameter">tablename</replaceable>
-      for further manipulation.
+      for insertion of data.  Any currently open table is closed.
      </para>
     </listitem>
    </varlistentry>
 
    <varlistentry>
     <term>
-     close <optional><replaceable class="parameter">tablename</replaceable></optional>
+     <literal>close</> <optional><replaceable class="parameter">tablename</replaceable></optional>
     </term>
 
     <listitem>
      <para>
-      Close the open table called <replaceable
-      class="parameter">tablename</replaceable>.  It is an error if
-      <replaceable class="parameter">tablename</replaceable> is not
-      already opened.  If no <replaceable
-      class="parameter">tablename</replaceable> is given, then the
-      currently open table is closed.
+      Close the open table.  The name of the table can be given as a
+      cross-check, but this is not required.
      </para>
     </listitem>
    </varlistentry>
 
    <varlistentry>
     <term>
-     insert <optional>OID = <replaceable class="parameter">oid_value</replaceable></optional> (<replaceable class="parameter">value1</replaceable> <replaceable class="parameter">value2</replaceable> ...)
+     <literal>insert</> <optional><literal>OID =</> <replaceable class="parameter">oid_value</replaceable></optional> <literal>(</> <replaceable class="parameter">value1</replaceable> <replaceable class="parameter">value2</replaceable> ... <literal>)</>
     </term>
 
     <listitem>
 
    <varlistentry>
     <term>
-     declare <optional>unique</optional> index <replaceable
-     class="parameter">indexname</replaceable> on <replaceable
-     class="parameter">tablename</replaceable> using <replaceable
-     class="parameter">amname</replaceable> (<replaceable
-     class="parameter">opclass1</replaceable> <replaceable
-     class="parameter">name1</replaceable> <optional>, ...</optional>)
+     <literal>declare</> <optional><literal>unique</></optional>
+     <literal>index</> <replaceable class="parameter">indexname</replaceable>
+     <replaceable class="parameter">indexoid</replaceable>
+     <literal>on</> <replaceable class="parameter">tablename</replaceable>
+     <literal>using</> <replaceable class="parameter">amname</replaceable>
+     <literal>(</> <replaceable class="parameter">opclass1</replaceable>
+     <replaceable class="parameter">name1</replaceable>
+     <optional>, ...</optional> <literal>)</>
     </term>
 
     <listitem>
      <para>
       Create an index named <replaceable
-      class="parameter">indexname</replaceable> on the table named
-      <replaceable class="parameter">tablename</replaceable> using the
+      class="parameter">indexname</replaceable>, having OID
+      <replaceable class="parameter">indexoid</replaceable>,
+      on the table named
+      <replaceable class="parameter">tablename</replaceable>, using the
       <replaceable class="parameter">amname</replaceable> access
       method.  The fields to index are called <replaceable
       class="parameter">name1</replaceable>, <replaceable
    </varlistentry>
 
    <varlistentry>
-    <term>build indices</term>
+    <term><literal>build indices</></term>
 
     <listitem>
      <para>
 
  </sect1>
 
+ <sect1 id="bki-structure">
+  <title>Structure of the Bootstrap <acronym>BKI</acronym> File</title>
+
+  <para>
+   The <literal>open</> command cannot be used until the tables it uses
+   exist and have entries for the table that is to be opened.
+   (These minimum tables are <structname>pg_class</>,
+   <structname>pg_attribute</>, <structname>pg_proc</>, and
+   <structname>pg_type</>.)   To allow those tables themselves to be filled,
+   <literal>create</> with the <literal>bootstrap</> option implicitly opens
+   the created table for data insertion.
+  </para>
+
+  <para>
+   Thus, the structure of the <filename>postgres.bki</filename> file has to
+   be:
+   <orderedlist>
+    <listitem>
+     <para>
+      <literal>create bootstrap</> one of the critical tables
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <literal>insert</> data describing at least the critical tables
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <literal>close</>
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Repeat for the other critical tables.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <literal>create</> (without <literal>bootstrap</>) a noncritical table
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <literal>open</>
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <literal>insert</> desired data
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <literal>close</>
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Repeat for the other noncritical tables.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      Define indexes.
+     </para>
+    </listitem>
+    <listitem>
+     <para>
+      <literal>build indices</>
+     </para>
+    </listitem>
+   </orderedlist>
+  </para>
+
+  <para>
+   There are doubtless other, undocumented ordering dependencies.
+  </para>
+ </sect1>
+
  <sect1 id="bki-example">
   <title>Example</title>
 
   <para>
    The following sequence of commands will create the
-   table <literal>test_table</literal> with two columns
+   table <literal>test_table</literal> with OID 420, having two columns
    <literal>cola</literal> and <literal>colb</literal> of type
    <type>int4</type> and <type>text</type>, respectively, and insert
    two rows into the table.
 <programlisting>
-create test_table (cola = int4, colb = text)
+create test_table 420 (cola = int4, colb = text)
 open test_table
 insert OID=421 ( 1 "value1" )
 insert OID=422 ( 2 _null_ )
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.75 2004/12/31 21:59:34 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.76 2005/04/14 01:38:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "utils/nabstime.h"
 #include "utils/rel.h"
 
+#define atooid(x)  ((Oid) strtoul((x), NULL, 10))
+
 
 static void
 do_start(void)
 %type <ival>  boot_const boot_ident
 %type <ival>  optbootstrap optsharedrelation optwithoutoids
 %type <ival>  boot_tuple boot_tuplelist
-%type <oidval> optoideq
+%type <oidval> oidspec optoideq
 
 %token <ival> CONST_P ID
 %token OPEN XCLOSE XCREATE INSERT_TUPLE
-%token STRING XDEFINE
 %token XDECLARE INDEX ON USING XBUILD INDICES UNIQUE
 %token COMMA EQUALS LPAREN RPAREN
 %token OBJ_ID XBOOTSTRAP XSHARED_RELATION XWITHOUT_OIDS NULLVAL
        ;
 
 Boot_CreateStmt:
-         XCREATE optbootstrap optsharedrelation optwithoutoids boot_ident LPAREN
+         XCREATE optbootstrap optsharedrelation optwithoutoids boot_ident oidspec LPAREN
                {
                    do_start();
                    numattr = 0;
-                   elog(DEBUG4, "creating%s%s relation %s",
+                   elog(DEBUG4, "creating%s%s relation %s %u",
                         $2 ? " bootstrap" : "",
                         $3 ? " shared" : "",
-                        LexIDStr($5));
+                        LexIDStr($5),
+                        $6);
                }
          boot_typelist
                {
                        boot_reldesc = heap_create(LexIDStr($5),
                                                   PG_CATALOG_NAMESPACE,
                                                   $3 ? GLOBALTABLESPACE_OID : 0,
+                                                  $6,
                                                   tupdesc,
                                                   RELKIND_RELATION,
                                                   $3,
                        id = heap_create_with_catalog(LexIDStr($5),
                                                      PG_CATALOG_NAMESPACE,
                                                      $3 ? GLOBALTABLESPACE_OID : 0,
+                                                     $6,
                                                      tupdesc,
                                                      RELKIND_RELATION,
                                                      $3,
        ;
 
 Boot_DeclareIndexStmt:
-         XDECLARE INDEX boot_ident ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
+         XDECLARE INDEX boot_ident oidspec ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
                {
                    do_start();
 
-                   DefineIndex(makeRangeVar(NULL, LexIDStr($5)),
+                   DefineIndex(makeRangeVar(NULL, LexIDStr($6)),
                                LexIDStr($3),
-                               LexIDStr($7),
+                               $4,
+                               LexIDStr($8),
                                NULL,
-                               $9,
+                               $10,
                                NULL, NIL,
                                false, false, false,
                                false, false, true, false);
        ;
 
 Boot_DeclareUniqueIndexStmt:
-         XDECLARE UNIQUE INDEX boot_ident ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
+         XDECLARE UNIQUE INDEX boot_ident oidspec ON boot_ident USING boot_ident LPAREN boot_index_params RPAREN
                {
                    do_start();
 
-                   DefineIndex(makeRangeVar(NULL, LexIDStr($6)),
+                   DefineIndex(makeRangeVar(NULL, LexIDStr($7)),
                                LexIDStr($4),
-                               LexIDStr($8),
+                               $5,
+                               LexIDStr($9),
                                NULL,
-                               $10,
+                               $11,
                                NULL, NIL,
                                true, false, false,
                                false, false, true, false);
                }
        ;
 
+oidspec:
+           boot_ident                          { $$ = atooid(LexIDStr($1)); }
+       ;
+
 optoideq:
-           OBJ_ID EQUALS boot_ident { $$ = atol(LexIDStr($3)); }
-       |                       { $$ = (Oid) 0; }
+           OBJ_ID EQUALS oidspec               { $$ = $3; }
+       |                                       { $$ = (Oid) 0; }
        ;
 
 boot_tuplelist:
 
-$PostgreSQL: pgsql/src/backend/catalog/README,v 1.8 2003/11/29 19:51:42 pgsql Exp $
+$PostgreSQL: pgsql/src/backend/catalog/README,v 1.9 2005/04/14 01:38:15 tgl Exp $
 
 This directory contains .c files that manipulate the system catalogs;
 src/include/catalog contains the .h files that define the structure
 
 When the compile-time scripts (such as Gen_fmgrtab.sh and genbki.sh)
 execute, they grep the DATA statements out of the .h files and munge
-these in order to generate the .bki files.  The .bki files are then
+these in order to generate the postgres.bki file.  The .bki file is then
 used as input to initdb (which is just a wrapper around postgres
 running single-user in bootstrapping mode) in order to generate the
 initial (template) system catalog relation files.
 cases, the OID assigned to a tuple may be explicitly set by use of the
 "OID = n" clause of the .bki insert statement.  If no such pointers are
 required to a given tuple, then the OID = n clause may be omitted
-(then the system generates a random OID in the usual way, or leaves it
-0 in a catalog that has no OIDs).  In practice we usually preassign OIDs
+(then the system generates an OID in the usual way, or leaves it 0 in a
+catalog that has no OIDs).  In practice we usually preassign OIDs
 for all or none of the pre-loaded tuples in a given catalog, even if only
 some of them are actually cross-referenced.
 
 be known directly in the C code.  In such cases, put a #define in the
 catalog's .h file, and use the #define symbol in the C code.  Writing
 the actual numeric value of any OID in C code is considered very bad form.
-(Direct references to pg_proc OIDs are common enough that there's a special
+Direct references to pg_proc OIDs are common enough that there's a special
 mechanism to create the necessary #define's automatically: see
-backend/utils/Gen_fmgrtab.sh.  For all the other system catalogs, you have
-to manually create any #define's you need.)
+backend/utils/Gen_fmgrtab.sh.  We also have standard conventions for setting
+up #define's for the pg_class OIDs of system catalogs and indexes.  For all
+the other system catalogs, you have to manually create any #define's you
+need.
 
-- If you need to find a valid OID for a tuple that will be referred to by
-others, use the unused_oids script.  It generates inclusive ranges of
+- If you need to find a valid OID for a new predefined tuple,
+use the unused_oids script.  It generates inclusive ranges of
 *unused* OIDs (e.g., the line "45-900" means OIDs 45 through 900 have
 not been allocated yet).  Currently, OIDs 1-9999 are reserved for manual
 assignment; the unused_oids script simply looks through the include/catalog
-headers to see which ones do not appear in "OID =" clauses.
+headers to see which ones do not appear in "OID =" clauses in DATA lines.
+(As of Postgres 8.1, it also looks at CATALOG and DECLARE_INDEX lines.)
+You can also use the duplicate_oids script to check for mistakes.
 
-- OIDs 10000-16383 are reserved for assignment by the genbki.sh script:
-it will insert these OIDs if it sees a clause "OID = 0" in a DATA
-statement.  You would typically use this feature if you don't care exactly
-which OID is assigned to a catalog row (because it has no cross-references
-you need to hardwire) but you want to give it a DESCR entry.  The DESCR macro
-will not work for rows that don't have any OID at genbki.sh time.
-
-- The OID counter starts at 16384 at bootstrap.  If a catalog row is in a
-table that requires OIDs, but no OID was preassigned by hand or by genbki.sh,
-then it will receive an OID of 16384 or above.
+- The OID counter starts at 10000 at bootstrap.  If a catalog row is in a
+table that requires OIDs, but no OID was preassigned by an "OID =" clause,
+then it will receive an OID of 10000 or above.
 
 - To create a "BOOTSTRAP" table you have to do a lot of extra work: these
 tables are not created through a normal CREATE TABLE operation, but spring
 into existence when first written to during initdb.  Therefore, you must
 manually create appropriate entries for them in the pre-loaded contents of
-pg_class, pg_attribute, and pg_type.  You'll also need to add code to function
-heap_create() in heap.c to force the correct OID to be assigned when the table
-is first referenced.  (It's near the top of the function with the comment
-beginning in "Real ugly stuff".)  Avoid making new catalogs be bootstrap
+pg_class, pg_attribute, and pg_type.  Avoid making new catalogs be bootstrap
 catalogs if at all possible; generally, only tables that must be written to
 in order to create a table should be bootstrapped.
 
 - Certain BOOTSTRAP tables must be at the start of the Makefile
-POSTGRES_BKI_SRCS variable, as these will not be created through the standard
+POSTGRES_BKI_SRCS variable, as these cannot be created through the standard
 heap_create_with_catalog process, because it needs these tables to exist
 already.  The list of files this currently includes is:
    pg_proc.h pg_type.h pg_attribute.h pg_class.h
 "typetyp->typelem", which follows typdelim).  This will result in
 random errors or even segmentation violations.  Hence, do NOT insert
 catalog tuples that contain NULL attributes except in their
-variable-length portions!
+variable-length portions!  (The bootstrapping code is fairly good about
+marking NOT NULL each of the columns that can legally be referenced via
+C struct declarations ... but those markings won't be enforced against
+DATA commands, so you must get it right in a DATA line.)
 
 - Modification of the catalogs must be performed with the proper
 updating of catalog indexes!  That is, most catalogs have indexes
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.42 2005/02/22 04:35:34 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/dependency.c,v 1.43 2005/04/14 01:38:15 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "catalog/pg_depend.h"
 #include "catalog/pg_language.h"
 #include "catalog/pg_opclass.h"
+#include "catalog/pg_proc.h"
 #include "catalog/pg_rewrite.h"
 #include "catalog/pg_trigger.h"
+#include "catalog/pg_type.h"
 #include "commands/comment.h"
 #include "commands/defrem.h"
 #include "commands/proclang.h"
        {
            ObjectAddress *thisobj = context.addrs.refs + oldref;
 
-           if (thisobj->classId == RelOid_pg_class &&
+           if (thisobj->classId == RelationRelationId &&
                thisobj->objectId == relId)
            {
                /* Move this ref into self_addrs */
 static void
 init_object_classes(void)
 {
-   object_classes[OCLASS_CLASS] = RelOid_pg_class;
-   object_classes[OCLASS_PROC] = RelOid_pg_proc;
-   object_classes[OCLASS_TYPE] = RelOid_pg_type;
+   object_classes[OCLASS_CLASS] = RelationRelationId;
+   object_classes[OCLASS_PROC] = ProcedureRelationId;
+   object_classes[OCLASS_TYPE] = TypeRelationId;
    object_classes[OCLASS_CAST] = get_system_catalog_relid(CastRelationName);
    object_classes[OCLASS_CONSTRAINT] = get_system_catalog_relid(ConstraintRelationName);
    object_classes[OCLASS_CONVERSION] = get_system_catalog_relid(ConversionRelationName);
    /* Easy for the bootstrapped catalogs... */
    switch (object->classId)
    {
-       case RelOid_pg_class:
+       case RelationRelationId:
            /* caller must check objectSubId */
            return OCLASS_CLASS;
 
-       case RelOid_pg_proc:
+       case ProcedureRelationId:
            Assert(object->objectSubId == 0);
            return OCLASS_PROC;
 
-       case RelOid_pg_type:
+       case TypeRelationId:
            Assert(object->objectSubId == 0);
            return OCLASS_TYPE;
    }
 
                attrdef = (Form_pg_attrdef) GETSTRUCT(tup);
 
-               colobject.classId = RelOid_pg_class;
+               colobject.classId = RelationRelationId;
                colobject.objectId = attrdef->adrelid;
                colobject.objectSubId = attrdef->adnum;
 
 
 #
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/catalog/genbki.sh,v 1.34 2005/04/13 18:54:56 tgl Exp $
+#    $PostgreSQL: pgsql/src/backend/catalog/genbki.sh,v 1.35 2005/04/14 01:38:16 tgl Exp $
 #
 # NOTES
 #    non-essential whitespace is removed from the generated file.
 # ----------------
 #  DATA() statements are basically passed right through after
 #  stripping off the DATA( and the ) on the end.
-#  Remember any explicit OID for use by DESCR().
+#  Remember the OID for use by DESCR().
 # ----------------
 /^DATA\(/ {
    data = substr($0, 6, length($0) - 6);
 #  end any prior catalog data insertions before starting a define index
 # ----
    if (reln_open == 1) {
-#      print "show";
        print "close " catalog;
        reln_open = 0;
    }
 
    data = substr($0, 15, length($0) - 15);
-   print "declare index " data
+   pos = index(data, ",");
+   iname = substr(data, 1, pos-1);
+   data = substr(data, pos+1, length(data)-pos);
+   pos = index(data, ",");
+   ioid = substr(data, 1, pos-1);
+   data = substr(data, pos+1, length(data)-pos);
+
+   print "declare index " iname " " ioid " " data
 }
 
 /^DECLARE_UNIQUE_INDEX\(/ {
 #  end any prior catalog data insertions before starting a define unique index
 # ----
    if (reln_open == 1) {
-#      print "show";
        print "close " catalog;
        reln_open = 0;
    }
 
    data = substr($0, 22, length($0) - 22);
-   print "declare unique index " data
+   pos = index(data, ",");
+   iname = substr(data, 1, pos-1);
+   data = substr(data, pos+1, length(data)-pos);
+   pos = index(data, ",");
+   ioid = substr(data, 1, pos-1);
+   data = substr(data, pos+1, length(data)-pos);
+
+   print "declare unique index " iname " " ioid " " data
 }
 
 /^BUILD_INDICES/   { print "build indices"; }
 #  end any prior catalog data insertions before starting a new one..
 # ----
    if (reln_open == 1) {
-#      print "show";
        print "close " catalog;
        reln_open = 0;
    }
 #  get the name and properties of the new catalog
 # ----
    pos = index($1,")");
-   catalog = substr($1,9,pos-9); 
+   catalogandoid = substr($1,9,pos-9);
+   pos = index(catalogandoid, ",");
+   catalog = substr(catalogandoid, 1, pos-1);
+   catalogoid = substr(catalogandoid, pos+1, length(catalogandoid)-pos);
 
-   if ($0 ~ /BOOTSTRAP/) {
+   if ($0 ~ /BKI_BOOTSTRAP/) {
        bootstrap = "bootstrap ";
    }
    if ($0 ~ /BKI_SHARED_RELATION/) {
 #  if this is the last line, then output the bki catalog stuff.
 # ----
    if ($1 ~ /}/) {
-       print "create " bootstrap shared_relation without_oids catalog;
+       print "create " bootstrap shared_relation without_oids catalog " " catalogoid;
        print "\t(";
 
        for (j=1; j<i-1; j++) {
 
 END {
    if (reln_open == 1) {
-#      print "show";
        print "close " catalog;
        reln_open = 0;
    }
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.282 2005/04/13 16:50:54 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/heap.c,v 1.283 2005/04/14 01:38:16 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
 /* ----------------------------------------------------------------
  *     heap_create     - Create an uncataloged heap relation
  *
+ *     relid is normally InvalidOid to specify that this routine should
+ *     generate an OID for the relation.  During bootstrap, it can be
+ *     nonzero to specify a preselected OID.
+ *
  *     rel->rd_rel is initialized by RelationBuildLocalRelation,
  *     and is mostly zeroes at return.
- *
- *     Remove the system relation specific code to elsewhere eventually.
  * ----------------------------------------------------------------
  */
 Relation
 heap_create(const char *relname,
            Oid relnamespace,
            Oid reltablespace,
+           Oid relid,
            TupleDesc tupDesc,
            char relkind,
            bool shared_relation,
            bool allow_system_table_mods)
 {
-   Oid         relid;
-   bool        nailme = false;
    bool        create_storage;
    Relation    rel;
 
                 errdetail("System catalog modifications are currently disallowed.")));
 
    /*
-    * Real ugly stuff to assign the proper relid in the relation
-    * descriptor follows.  Note that only "bootstrapped" relations whose
-    * OIDs are hard-coded in pg_class.h should be listed here.  We also
-    * have to recognize those rels that must be nailed in cache.
+    * Allocate an OID for the relation, unless we were told what to use.
     */
-   if (IsSystemNamespace(relnamespace))
-   {
-       if (strcmp(TypeRelationName, relname) == 0)
-       {
-           nailme = true;
-           relid = RelOid_pg_type;
-       }
-       else if (strcmp(AttributeRelationName, relname) == 0)
-       {
-           nailme = true;
-           relid = RelOid_pg_attribute;
-       }
-       else if (strcmp(ProcedureRelationName, relname) == 0)
-       {
-           nailme = true;
-           relid = RelOid_pg_proc;
-       }
-       else if (strcmp(RelationRelationName, relname) == 0)
-       {
-           nailme = true;
-           relid = RelOid_pg_class;
-       }
-       else if (strcmp(ShadowRelationName, relname) == 0)
-           relid = RelOid_pg_shadow;
-       else if (strcmp(GroupRelationName, relname) == 0)
-           relid = RelOid_pg_group;
-       else if (strcmp(DatabaseRelationName, relname) == 0)
-           relid = RelOid_pg_database;
-       else if (strcmp(TableSpaceRelationName, relname) == 0)
-           relid = RelOid_pg_tablespace;
-       else
-           relid = newoid();
-   }
-   else
+   if (!OidIsValid(relid))
        relid = newoid();
 
    /*
                                     tupDesc,
                                     relid,
                                     reltablespace,
-                                    shared_relation,
-                                    nailme);
+                                    shared_relation);
 
    /*
     * have the storage manager create the relation's disk file, if
 
        heap_freetuple(tup);
 
-       myself.classId = RelOid_pg_class;
+       myself.classId = RelationRelationId;
        myself.objectId = new_rel_oid;
        myself.objectSubId = i + 1;
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = (*dpp)->atttypid;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 heap_create_with_catalog(const char *relname,
                         Oid relnamespace,
                         Oid reltablespace,
+                        Oid relid,
                         TupleDesc tupdesc,
                         char relkind,
                         bool shared_relation,
    new_rel_desc = heap_create(relname,
                               relnamespace,
                               reltablespace,
+                              relid,
                               tupdesc,
                               relkind,
                               shared_relation,
        ObjectAddress myself,
                    referenced;
 
-       myself.classId = RelOid_pg_class;
+       myself.classId = RelationRelationId;
        myself.objectId = new_rel_oid;
        myself.objectSubId = 0;
        referenced.classId = get_system_catalog_relid(NamespaceRelationName);
     * Make a dependency so that the pg_attrdef entry goes away if the
     * column (or whole table) is deleted.
     */
-   colobject.classId = RelOid_pg_class;
+   colobject.classId = RelationRelationId;
    colobject.objectId = RelationGetRelid(rel);
    colobject.objectSubId = attnum;
 
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.250 2005/03/29 00:16:55 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/index.c,v 1.251 2005/04/14 01:38:16 tgl Exp $
  *
  *
  * INTERFACE ROUTINES
 /* ----------------------------------------------------------------
  *     index_create
  *
+ *     indexRelationId is normally InvalidOid to let this routine
+ *     generate an OID for the index.  During bootstrap it may be
+ *     nonzero to specify a preselected OID.
+ *
  * Returns OID of the created index.
  * ----------------------------------------------------------------
  */
 Oid
 index_create(Oid heapRelationId,
             const char *indexRelationName,
+            Oid indexRelationId,
             IndexInfo *indexInfo,
             Oid accessMethodObjectId,
             Oid tableSpaceId,
    indexRelation = heap_create(indexRelationName,
                                namespaceId,
                                tableSpaceId,
+                               indexRelationId,
                                indexTupDesc,
                                RELKIND_INDEX,
                                shared_relation,
        ObjectAddress myself,
                    referenced;
 
-       myself.classId = RelOid_pg_class;
+       myself.classId = RelationRelationId;
        myself.objectId = indexoid;
        myself.objectSubId = 0;
 
            {
                if (indexInfo->ii_KeyAttrNumbers[i] != 0)
                {
-                   referenced.classId = RelOid_pg_class;
+                   referenced.classId = RelationRelationId;
                    referenced.objectId = heapRelationId;
                    referenced.objectSubId = indexInfo->ii_KeyAttrNumbers[i];
 
     * be created with an entry for its own pg_class row because we do
     * setNewRelfilenode() before we do index_build().
     */
-   is_pg_class = (RelationGetRelid(rel) == RelOid_pg_class);
+   is_pg_class = (RelationGetRelid(rel) == RelationRelationId);
    doneIndexes = NIL;
 
    /* Reindex all the indexes. */
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.73 2005/04/12 04:26:17 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_aggregate.c,v 1.74 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
     * dependency on aggTransType since we depend on it indirectly through
     * transfn.
     */
-   myself.classId = RelOid_pg_proc;
+   myself.classId = ProcedureRelationId;
    myself.objectId = procOid;
    myself.objectSubId = 0;
 
    /* Depends on transition function */
-   referenced.classId = RelOid_pg_proc;
+   referenced.classId = ProcedureRelationId;
    referenced.objectId = transfn;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* Depends on final function, if any */
    if (OidIsValid(finalfn))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = finalfn;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.23 2005/03/25 21:57:57 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.24 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
         */
        ObjectAddress relobject;
 
-       relobject.classId = RelOid_pg_class;
+       relobject.classId = RelationRelationId;
        relobject.objectId = relId;
        if (constraintNKeys > 0)
        {
         */
        ObjectAddress domobject;
 
-       domobject.classId = RelOid_pg_type;
+       domobject.classId = TypeRelationId;
        domobject.objectId = domainId;
        domobject.objectSubId = 0;
 
         */
        ObjectAddress relobject;
 
-       relobject.classId = RelOid_pg_class;
+       relobject.classId = RelationRelationId;
        relobject.objectId = foreignRelId;
        if (foreignNKeys > 0)
        {
         */
        ObjectAddress relobject;
 
-       relobject.classId = RelOid_pg_class;
+       relobject.classId = RelationRelationId;
        relobject.objectId = indexRelId;
        relobject.objectSubId = 0;
 
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_conversion.c,v 1.20 2004/12/31 21:59:38 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_conversion.c,v 1.21 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "catalog/catname.h"
 #include "catalog/dependency.h"
 #include "catalog/indexing.h"
-#include "catalog/pg_class.h"
 #include "catalog/pg_conversion.h"
+#include "catalog/pg_proc.h"
 #include "catalog/namespace.h"
 #include "utils/builtins.h"
 #include "utils/lsyscache.h"
    myself.objectSubId = 0;
 
    /* create dependency on conversion procedure */
-   referenced.classId = RelOid_pg_proc;
+   referenced.classId = ProcedureRelationId;
    referenced.objectId = conproc;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_operator.c,v 1.89 2005/03/29 03:01:30 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_operator.c,v 1.90 2005/04/14 01:38:16 tgl Exp $
  *
  * NOTES
  *   these routines moved here from commands/define.c and somewhat cleaned up.
 #include "catalog/indexing.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_operator.h"
+#include "catalog/pg_proc.h"
 #include "catalog/pg_type.h"
 #include "miscadmin.h"
 #include "parser/parse_func.h"
    /* Dependency on left type */
    if (OidIsValid(oper->oprleft))
    {
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = oper->oprleft;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* Dependency on right type */
    if (OidIsValid(oper->oprright))
    {
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = oper->oprright;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* Dependency on result type */
    if (OidIsValid(oper->oprresult))
    {
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = oper->oprresult;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* Dependency on implementation function */
    if (OidIsValid(oper->oprcode))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = oper->oprcode;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* Dependency on restriction selectivity function */
    if (OidIsValid(oper->oprrest))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = oper->oprrest;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* Dependency on join selectivity function */
    if (OidIsValid(oper->oprjoin))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = oper->oprjoin;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.126 2005/03/31 22:46:06 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_proc.c,v 1.127 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
     * existing function, first delete any existing pg_depend entries.
     */
    if (is_update)
-       deleteDependencyRecordsFor(RelOid_pg_proc, retval);
+       deleteDependencyRecordsFor(ProcedureRelationId, retval);
 
-   myself.classId = RelOid_pg_proc;
+   myself.classId = ProcedureRelationId;
    myself.objectId = retval;
    myself.objectSubId = 0;
 
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    /* dependency on return type */
-   referenced.classId = RelOid_pg_type;
+   referenced.classId = TypeRelationId;
    referenced.objectId = returnType;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* dependency on parameter types */
    for (i = 0; i < allParamCount; i++)
    {
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = allParams[i];
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.98 2005/01/27 23:23:51 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/catalog/pg_type.c,v 1.99 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "catalog/catname.h"
 #include "catalog/dependency.h"
 #include "catalog/indexing.h"
+#include "catalog/pg_proc.h"
 #include "catalog/pg_type.h"
 #include "miscadmin.h"
 #include "utils/builtins.h"
                referenced;
 
    if (rebuild)
-       deleteDependencyRecordsFor(RelOid_pg_type,
-                                  typeObjectId);
+       deleteDependencyRecordsFor(TypeRelationId, typeObjectId);
 
-   myself.classId = RelOid_pg_type;
+   myself.classId = TypeRelationId;
    myself.objectId = typeObjectId;
    myself.objectSubId = 0;
 
    /* Normal dependencies on the I/O functions */
    if (OidIsValid(inputProcedure))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = inputProcedure;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    if (OidIsValid(outputProcedure))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = outputProcedure;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    if (OidIsValid(receiveProcedure))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = receiveProcedure;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    if (OidIsValid(sendProcedure))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = sendProcedure;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    if (OidIsValid(analyzeProcedure))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = analyzeProcedure;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
     */
    if (OidIsValid(relationOid))
    {
-       referenced.classId = RelOid_pg_class;
+       referenced.classId = RelationRelationId;
        referenced.objectId = relationOid;
        referenced.objectSubId = 0;
 
     */
    if (OidIsValid(elementType))
    {
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = elementType;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO);
    /* Normal dependency from a domain to its base type. */
    if (OidIsValid(baseType))
    {
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = baseType;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.24 2005/04/12 04:26:20 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/aggregatecmds.c,v 1.25 2005/04/14 01:38:16 tgl Exp $
  *
  * DESCRIPTION
  *   The "DefineFoo" routines take the parse tree and pick out the
    /*
     * Do the deletion
     */
-   object.classId = RelOid_pg_proc;
+   object.classId = ProcedureRelationId;
    object.objectId = procOid;
    object.objectSubId = 0;
 
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.134 2005/03/29 00:16:57 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/cluster.c,v 1.135 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    CommandCounterIncrement();
 
    /* Destroy new heap with old filenode */
-   object.classId = RelOid_pg_class;
+   object.classId = RelationRelationId;
    object.objectId = OIDNewHeap;
    object.objectSubId = 0;
 
    OIDNewHeap = heap_create_with_catalog(NewName,
                                          RelationGetNamespace(OldHeap),
                                          NewTableSpace,
+                                         InvalidOid,
                                          tupdesc,
                                          OldHeap->rd_rel->relkind,
                                          OldHeap->rd_rel->relisshared,
        /* Delete old dependencies */
        if (relform1->reltoastrelid)
        {
-           count = deleteDependencyRecordsFor(RelOid_pg_class,
+           count = deleteDependencyRecordsFor(RelationRelationId,
                                               relform1->reltoastrelid);
            if (count != 1)
                elog(ERROR, "expected one dependency record for TOAST table, found %ld",
        }
        if (relform2->reltoastrelid)
        {
-           count = deleteDependencyRecordsFor(RelOid_pg_class,
+           count = deleteDependencyRecordsFor(RelationRelationId,
                                               relform2->reltoastrelid);
            if (count != 1)
                elog(ERROR, "expected one dependency record for TOAST table, found %ld",
        }
 
        /* Register new dependencies */
-       baseobject.classId = RelOid_pg_class;
+       baseobject.classId = RelationRelationId;
        baseobject.objectSubId = 0;
-       toastobject.classId = RelOid_pg_class;
+       toastobject.classId = RelationRelationId;
        toastobject.objectSubId = 0;
 
        if (relform1->reltoastrelid)
 
  * Copyright (c) 1996-2005, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.81 2005/01/27 23:23:54 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.82 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #include "catalog/indexing.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_constraint.h"
+#include "catalog/pg_database.h"
 #include "catalog/pg_description.h"
 #include "catalog/pg_largeobject.h"
 #include "catalog/pg_operator.h"
+#include "catalog/pg_proc.h"
 #include "catalog/pg_rewrite.h"
 #include "catalog/pg_trigger.h"
 #include "catalog/pg_type.h"
 
    /* Create the comment using the relation's oid */
 
-   CreateComments(RelationGetRelid(relation), RelOid_pg_class, 0, comment);
+   CreateComments(RelationGetRelid(relation), RelationRelationId, 0, comment);
 
    /* Done, but hold lock until commit */
    relation_close(relation, NoLock);
 
    /* Create the comment using the relation's oid */
 
-   CreateComments(RelationGetRelid(relation), RelOid_pg_class,
+   CreateComments(RelationGetRelid(relation), RelationRelationId,
                   (int32) attnum, comment);
 
    /* Done, but hold lock until commit */
                       database);
 
    /* Create the comment with the pg_database oid */
-   CreateComments(oid, RelOid_pg_database, 0, comment);
+   CreateComments(oid, DatabaseRelationId, 0, comment);
 }
 
 /*
 
    /* Call CreateComments() to create/drop the comments */
 
-   CreateComments(oid, RelOid_pg_type, 0, comment);
+   CreateComments(oid, TypeRelationId, 0, comment);
 }
 
 /*
 
    /* Call CreateComments() to create/drop the comments */
 
-   CreateComments(oid, RelOid_pg_proc, 0, comment);
+   CreateComments(oid, ProcedureRelationId, 0, comment);
 }
 
 /*
 
    /* Call CreateComments() to create/drop the comments */
 
-   CreateComments(oid, RelOid_pg_proc, 0, comment);
+   CreateComments(oid, ProcedureRelationId, 0, comment);
 }
 
 /*
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.59 2005/03/31 22:46:07 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/functioncmds.c,v 1.60 2005/04/14 01:38:16 tgl Exp $
  *
  * DESCRIPTION
  *   These routines take the parse tree and pick out the
    /*
     * Do the deletion
     */
-   object.classId = RelOid_pg_proc;
+   object.classId = ProcedureRelationId;
    object.objectId = funcOid;
    object.objectSubId = 0;
 
    myself.objectSubId = 0;
 
    /* dependency on source type */
-   referenced.classId = RelOid_pg_type;
+   referenced.classId = TypeRelationId;
    referenced.objectId = sourcetypeid;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    /* dependency on target type */
-   referenced.classId = RelOid_pg_type;
+   referenced.classId = TypeRelationId;
    referenced.objectId = targettypeid;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* dependency on function */
    if (OidIsValid(funcid))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = funcid;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.128 2004/12/31 21:59:41 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/indexcmds.c,v 1.129 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
  * 'heapRelation': the relation the index will apply to.
  * 'indexRelationName': the name for the new index, or NULL to indicate
  *     that a nonconflicting default name should be picked.
+ * 'indexRelationId': normally InvalidOid, but during bootstrap can be
+ *     nonzero to specify a preselected OID for the index.
  * 'accessMethodName': name of the AM to use.
  * 'tableSpaceName': name of the tablespace to create the index in.
  *     NULL specifies using the appropriate default.
 void
 DefineIndex(RangeVar *heapRelation,
            char *indexRelationName,
+           Oid indexRelationId,
            char *accessMethodName,
            char *tableSpaceName,
            List *attributeList,
                        primary ? "PRIMARY KEY" : "UNIQUE",
                      indexRelationName, RelationGetRelationName(rel))));
 
-   index_create(relationId, indexRelationName,
+   index_create(relationId, indexRelationName, indexRelationId,
                 indexInfo, accessMethodId, tablespaceId, classObjectId,
                 primary, isconstraint,
                 allowSystemTableMods, skip_build);
                 errmsg("\"%s\" is not an index",
                        relation->relname)));
 
-   object.classId = RelOid_pg_class;
+   object.classId = RelationRelationId;
    object.objectId = indOid;
    object.objectSubId = 0;
 
     * reindexing itself will try to update pg_class.
     */
    old = MemoryContextSwitchTo(private_context);
-   relids = lappend_oid(relids, RelOid_pg_class);
+   relids = lappend_oid(relids, RelationRelationId);
    MemoryContextSwitchTo(old);
 
    /*
                continue;
        }
 
-       if (HeapTupleGetOid(tuple) == RelOid_pg_class)
+       if (HeapTupleGetOid(tuple) == RelationRelationId)
            continue;           /* got it already */
 
        old = MemoryContextSwitchTo(private_context);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.30 2005/03/29 00:16:57 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/opclasscmds.c,v 1.31 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    /* dependency on indexed datatype */
-   referenced.classId = RelOid_pg_type;
+   referenced.classId = TypeRelationId;
    referenced.objectId = typeoid;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* dependency on storage datatype */
    if (OidIsValid(storageoid))
    {
-       referenced.classId = RelOid_pg_type;
+       referenced.classId = TypeRelationId;
        referenced.objectId = storageoid;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    {
        OpClassMember *proc = (OpClassMember *) lfirst(l);
 
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = proc->object;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.58 2005/03/29 03:01:30 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/proclang.c,v 1.59 2005/04/14 01:38:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    myself.objectSubId = 0;
 
    /* dependency on the PL handler function */
-   referenced.classId = RelOid_pg_proc;
+   referenced.classId = ProcedureRelationId;
    referenced.objectId = procOid;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    /* dependency on the validator function, if any */
    if (OidIsValid(valProcOid))
    {
-       referenced.classId = RelOid_pg_proc;
+       referenced.classId = ProcedureRelationId;
        referenced.objectId = valProcOid;
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.153 2005/04/13 16:50:54 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.154 2005/04/14 01:38:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    relationId = heap_create_with_catalog(relname,
                                          namespaceId,
                                          tablespaceId,
+                                         InvalidOid,
                                          descriptor,
                                          relkind,
                                          false,
 
    relOid = RangeVarGetRelid(relation, false);
 
-   object.classId = RelOid_pg_class;
+   object.classId = RelationRelationId;
    object.objectId = relOid;
    object.objectSubId = 0;
 
        /*
         * Store a dependency too
         */
-       parentobject.classId = RelOid_pg_class;
+       parentobject.classId = RelationRelationId;
        parentobject.objectId = parentOid;
        parentobject.objectSubId = 0;
-       childobject.classId = RelOid_pg_class;
+       childobject.classId = RelationRelationId;
        childobject.objectId = relationId;
        childobject.objectSubId = 0;
 
            CommandCounterIncrement();
 
            /* Destroy new heap with old filenode */
-           object.classId = RelOid_pg_class;
+           object.classId = RelationRelationId;
            object.objectId = OIDNewHeap;
            object.objectSubId = 0;
 
    ScanKeyInit(&key[0],
                Anum_pg_depend_refclassid,
                BTEqualStrategyNumber, F_OIDEQ,
-               ObjectIdGetDatum(RelOid_pg_type));
+               ObjectIdGetDatum(TypeRelationId));
    ScanKeyInit(&key[1],
                Anum_pg_depend_refobjid,
                BTEqualStrategyNumber, F_OIDEQ,
 
        /* Ignore dependees that aren't user columns of relations */
        /* (we assume system columns are never of rowtypes) */
-       if (pg_depend->classid != RelOid_pg_class ||
+       if (pg_depend->classid != RelationRelationId ||
            pg_depend->objsubid <= 0)
            continue;
 
    ObjectAddress myself,
                referenced;
 
-   myself.classId = RelOid_pg_class;
+   myself.classId = RelationRelationId;
    myself.objectId = relid;
    myself.objectSubId = attnum;
-   referenced.classId = RelOid_pg_type;
+   referenced.classId = TypeRelationId;
    referenced.objectId = typid;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
    ObjectAddress colobject,
                suppobject;
 
-   colobject.classId = RelOid_pg_class;
+   colobject.classId = RelationRelationId;
    colobject.objectId = relid;
    colobject.objectSubId = attnum;
-   suppobject.classId = RelOid_pg_class;
+   suppobject.classId = RelationRelationId;
    suppobject.objectId = RangeVarGetRelid(support, false);
    suppobject.objectSubId = 0;
    recordDependencyOn(&suppobject, &colobject, DEPENDENCY_INTERNAL);
    /*
     * Perform the actual column deletion
     */
-   object.classId = RelOid_pg_class;
+   object.classId = RelationRelationId;
    object.objectId = RelationGetRelid(rel);
    object.objectSubId = attnum;
 
 
    DefineIndex(stmt->relation, /* relation */
                stmt->idxname,  /* index name */
+               InvalidOid,     /* no predefined OID */
                stmt->accessMethod,     /* am name */
                stmt->tableSpace,
                stmt->indexParams,      /* parameters */
    ScanKeyInit(&key[0],
                Anum_pg_depend_refclassid,
                BTEqualStrategyNumber, F_OIDEQ,
-               ObjectIdGetDatum(RelOid_pg_class));
+               ObjectIdGetDatum(RelationRelationId));
    ScanKeyInit(&key[1],
                Anum_pg_depend_refobjid,
                BTEqualStrategyNumber, F_OIDEQ,
    ScanKeyInit(&key[0],
                Anum_pg_depend_classid,
                BTEqualStrategyNumber, F_OIDEQ,
-               ObjectIdGetDatum(RelOid_pg_class));
+               ObjectIdGetDatum(RelationRelationId));
    ScanKeyInit(&key[1],
                Anum_pg_depend_objid,
                BTEqualStrategyNumber, F_OIDEQ,
        if (foundDep->deptype != DEPENDENCY_NORMAL)
            elog(ERROR, "found unexpected dependency type '%c'",
                 foundDep->deptype);
-       if (foundDep->refclassid != RelOid_pg_type ||
+       if (foundDep->refclassid != TypeRelationId ||
            foundDep->refobjid != attTup->atttypid)
            elog(ERROR, "found unexpected dependency for column");
 
        performDeletion(&obj, DROP_RESTRICT);
    }
 
-   obj.classId = RelOid_pg_class;
+   obj.classId = RelationRelationId;
    foreach(l, tab->changedIndexOids)
    {
        obj.objectId = lfirst_oid(l);
    ScanKeyInit(&key[0],
            Anum_pg_depend_refclassid,
            BTEqualStrategyNumber, F_OIDEQ,
-           ObjectIdGetDatum(RelOid_pg_class));
+           ObjectIdGetDatum(RelationRelationId));
    ScanKeyInit(&key[1],
            Anum_pg_depend_refobjid,
            BTEqualStrategyNumber, F_OIDEQ,
 
        /* skip dependencies other than internal dependencies on columns */
        if (depForm->refobjsubid == 0 ||
-           depForm->classid != RelOid_pg_class ||
+           depForm->classid != RelationRelationId ||
            depForm->objsubid != 0 ||
            depForm->deptype != DEPENDENCY_INTERNAL)
            continue;
    toast_relid = heap_create_with_catalog(toast_relname,
                                           PG_TOAST_NAMESPACE,
                                           rel->rd_rel->reltablespace,
+                                          InvalidOid,
                                           tupdesc,
                                           RELKIND_TOASTVALUE,
                                           shared_relation,
    classObjectId[0] = OID_BTREE_OPS_OID;
    classObjectId[1] = INT4_BTREE_OPS_OID;
 
-   toast_idxid = index_create(toast_relid, toast_idxname, indexInfo,
+   toast_idxid = index_create(toast_relid, toast_idxname, InvalidOid,
+                              indexInfo,
                               BTREE_AM_OID,
                               rel->rd_rel->reltablespace,
                               classObjectId,
     * Register dependency from the toast table to the master, so that the
     * toast table will be deleted if the master is.
     */
-   baseobject.classId = RelOid_pg_class;
+   baseobject.classId = RelationRelationId;
    baseobject.objectId = relOid;
    baseobject.objectSubId = 0;
-   toastobject.classId = RelOid_pg_class;
+   toastobject.classId = RelationRelationId;
    toastobject.objectId = toast_relid;
    toastobject.objectSubId = 0;
 
                {
                    ObjectAddress object;
 
-                   object.classId = RelOid_pg_class;
+                   object.classId = RelationRelationId;
                    object.objectId = oc->relid;
                    object.objectSubId = 0;
                    performDeletion(&object, DROP_CASCADE);
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.184 2005/04/11 19:51:15 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.185 2005/04/14 01:38:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
     * dependency on the constraint will indirectly depend on the
     * relations.
     */
-   referenced.classId = RelOid_pg_proc;
+   referenced.classId = ProcedureRelationId;
    referenced.objectId = funcoid;
    referenced.objectSubId = 0;
    recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL);
 
    if (!forConstraint)
    {
-       referenced.classId = RelOid_pg_class;
+       referenced.classId = RelationRelationId;
        referenced.objectId = RelationGetRelid(rel);
        referenced.objectSubId = 0;
        recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO);
        if (constrrelid != InvalidOid)
        {
-           referenced.classId = RelOid_pg_class;
+           referenced.classId = RelationRelationId;
            referenced.objectId = constrrelid;
            referenced.objectSubId = 0;
            recordDependencyOn(&myself, &referenced, DEPENDENCY_AUTO);
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.68 2005/03/29 03:01:30 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.69 2005/04/14 01:38:17 tgl Exp $
  *
  * DESCRIPTION
  *   The "DefineFoo" routines take the parse tree and pick out the
    /*
     * Do the deletion
     */
-   object.classId = RelOid_pg_type;
+   object.classId = TypeRelationId;
    object.objectId = typeoid;
    object.objectSubId = 0;
 
    /*
     * Do the deletion
     */
-   object.classId = RelOid_pg_type;
+   object.classId = TypeRelationId;
    object.objectId = typeoid;
    object.objectSubId = 0;
 
    ScanKeyInit(&key[0],
                Anum_pg_depend_refclassid,
                BTEqualStrategyNumber, F_OIDEQ,
-               ObjectIdGetDatum(RelOid_pg_type));
+               ObjectIdGetDatum(TypeRelationId));
    ScanKeyInit(&key[1],
                Anum_pg_depend_refobjid,
                BTEqualStrategyNumber, F_OIDEQ,
 
        /* Ignore dependees that aren't user columns of relations */
        /* (we assume system columns are never of domain types) */
-       if (pg_depend->classid != RelOid_pg_class ||
+       if (pg_depend->classid != RelationRelationId ||
            pg_depend->objsubid <= 0)
            continue;
 
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.149 2005/02/20 02:21:34 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.150 2005/04/14 01:38:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    HeapTuple   htup;
 
    htup = SearchSysCache(RELOID,
-                         ObjectIdGetDatum(RelOid_pg_shadow),
+                         ObjectIdGetDatum(ShadowRelationId),
                          0, 0, 0);
    if (!HeapTupleIsValid(htup))    /* should not happen, we hope */
-       elog(ERROR, "cache lookup failed for relation %u", RelOid_pg_shadow);
+       elog(ERROR, "cache lookup failed for relation %u", ShadowRelationId);
 
    if (heap_attisnull(htup, Anum_pg_class_relacl))
        ereport(ERROR,
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.89 2005/04/13 16:50:54 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.90 2005/04/14 01:38:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 
    viewOid = RangeVarGetRelid(view, false);
 
-   object.classId = RelOid_pg_class;
+   object.classId = RelationRelationId;
    object.objectId = viewOid;
    object.objectSubId = 0;
 
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.245 2005/04/06 16:34:04 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/executor/execMain.c,v 1.246 2005/04/14 01:38:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
        intoRelationId = heap_create_with_catalog(intoName,
                                                  namespaceId,
                                                  InvalidOid,
+                                                 InvalidOid,
                                                  tupdesc,
                                                  RELKIND_RELATION,
                                                  false,
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.102 2005/04/06 16:34:06 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/rewrite/rewriteDefine.c,v 1.103 2005/04/14 01:38:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
     * implicit --- this prevents deleting a view's SELECT rule.  Other
     * kinds of rules can be AUTO.
     */
-   myself.classId = RelationGetRelid(pg_rewrite_desc);
+   myself.classId = RewriteRelationId;
    myself.objectId = rewriteObjectId;
    myself.objectSubId = 0;
 
-   referenced.classId = RelOid_pg_class;
+   referenced.classId = RelationRelationId;
    referenced.objectId = eventrel_oid;
    referenced.objectSubId = 0;
 
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.234 2005/03/14 00:19:36 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.235 2005/04/14 01:38:18 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 
                DefineIndex(stmt->relation,     /* relation */
                            stmt->idxname,      /* index name */
+                           InvalidOid,         /* no predefined OID */
                            stmt->accessMethod, /* am name */
                            stmt->tableSpace,
                            stmt->indexParams,  /* parameters */
 
  *             back to source text
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.191 2005/04/07 01:51:39 neilc Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.192 2005/04/14 01:38:19 tgl Exp $
  *
  *   This software is copyrighted by Jan Wieck - Hamburg.
  *
    ScanKeyInit(&key[0],
                Anum_pg_depend_refclassid,
                BTEqualStrategyNumber, F_OIDEQ,
-               ObjectIdGetDatum(RelOid_pg_class));
+               ObjectIdGetDatum(RelationRelationId));
    ScanKeyInit(&key[1],
                Anum_pg_depend_refobjid,
                BTEqualStrategyNumber, F_OIDEQ,
         * We assume any internal dependency of a relation on a column
         * must be what we are looking for.
         */
-       if (deprec->classid == RelOid_pg_class &&
+       if (deprec->classid == RelationRelationId &&
            deprec->objsubid == 0 &&
            deprec->deptype == DEPENDENCY_INTERNAL)
        {
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/cache/inval.c,v 1.70 2005/01/10 21:57:17 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/cache/inval.c,v 1.71 2005/04/14 01:38:19 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
     */
    tupleRelId = RelationGetRelid(relation);
 
-   if (tupleRelId == RelOid_pg_class)
+   if (tupleRelId == RelationRelationId)
    {
        Form_pg_class classtup = (Form_pg_class) GETSTRUCT(tuple);
        RelFileNode rnode;
        rnode.relNode = classtup->relfilenode;
        RegisterSmgrInvalidation(rnode);
    }
-   else if (tupleRelId == RelOid_pg_attribute)
+   else if (tupleRelId == AttributeRelationId)
    {
        Form_pg_attribute atttup = (Form_pg_attribute) GETSTRUCT(tuple);
 
 
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.218 2005/03/29 00:17:11 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.219 2005/04/14 01:38:19 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
                           TupleDesc tupDesc,
                           Oid relid,
                           Oid reltablespace,
-                          bool shared_relation,
-                          bool nailit)
+                          bool shared_relation)
 {
    Relation    rel;
    MemoryContext oldcxt;
    int         natts = tupDesc->natts;
    int         i;
    bool        has_not_null;
+   bool        nailit;
 
    AssertArg(natts >= 0);
 
+   /*
+    * check for creation of a rel that must be nailed in cache.
+    *
+    * XXX this list had better match RelationCacheInitialize's list.
+    */
+   switch (relid)
+   {
+       case RelationRelationId:
+       case AttributeRelationId:
+       case ProcedureRelationId:
+       case TypeRelationId:
+           nailit = true;
+           break;
+       default:
+           nailit = false;
+           break;
+   }
+
    /*
     * switch to the cache context to create the relcache entry.
     */
    /* make sure relation is marked as having no open file yet */
    rel->rd_smgr = NULL;
 
+   /* mark it nailed if appropriate */
+   rel->rd_isnailed = nailit;
+
    rel->rd_refcnt = nailit ? 1 : 0;
 
    /* it's being created in this transaction */
    /* is it a temporary relation? */
    rel->rd_istemp = isTempNamespace(relnamespace);
 
-   /*
-    * nail the reldesc if this is a bootstrap create reln and we may need
-    * it in the cache later on in the bootstrap process so we don't ever
-    * want it kicked out.  e.g. pg_attribute!!!
-    */
-   if (nailit)
-       rel->rd_isnailed = true;
-
    /*
     * create a new tuple descriptor from the one passed in.  We do this
     * partly to copy it into the cache context, and partly because the
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.4 2005/02/26 18:43:33 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/init/flatfiles.c,v 1.5 2005/04/14 01:38:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
    /* hard-wired path to pg_database */
    rnode.spcNode = GLOBALTABLESPACE_OID;
    rnode.dbNode = 0;
-   rnode.relNode = RelOid_pg_database;
+   rnode.relNode = DatabaseRelationId;
 
    /* No locking is needed because no one else is alive yet */
    rel = XLogOpenRelation(true, 0, rnode);
        /* hard-wired path to pg_group */
        rnode.spcNode = GLOBALTABLESPACE_OID;
        rnode.dbNode = 0;
-       rnode.relNode = RelOid_pg_group;
+       rnode.relNode = GroupRelationId;
 
        rel = XLogOpenRelation(true, 0, rnode);
        write_group_file(rel);
        /* hard-wired path to pg_shadow */
        rnode.spcNode = GLOBALTABLESPACE_OID;
        rnode.dbNode = 0;
-       rnode.relNode = RelOid_pg_shadow;
+       rnode.relNode = ShadowRelationId;
 
        rel = XLogOpenRelation(true, 0, rnode);
        write_user_file(rel);
 
    switch (RelationGetRelid(trigdata->tg_relation))
    {
-       case RelOid_pg_database:
+       case DatabaseRelationId:
            database_file_update_needed();
            break;
-       case RelOid_pg_group:
+       case GroupRelationId:
            group_file_update_needed();
            break;
-       case RelOid_pg_shadow:
+       case ShadowRelationId:
            user_file_update_needed();
            break;
        default:
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catname.h,v 1.34 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catname.h,v 1.35 2005/04/14 01:38:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #define  StatisticRelationName "pg_statistic"
 #define  TableSpaceRelationName "pg_tablespace"
 #define  TypeRelationName "pg_type"
-#define  VersionRelationName "pg_version"
 #define  AttrDefaultRelationName "pg_attrdef"
 #define  TriggerRelationName "pg_trigger"
 
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.264 2005/04/12 04:26:28 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.265 2005/04/14 01:38:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 200504111
+#define CATALOG_VERSION_NO 200504131
 
 #endif
 
 #
 # duplicate_oids
 #
-# $PostgreSQL: pgsql/src/include/catalog/duplicate_oids,v 1.6 2005/04/13 18:54:57 tgl Exp $
+# $PostgreSQL: pgsql/src/include/catalog/duplicate_oids,v 1.7 2005/04/14 01:38:20 tgl Exp $
 #
 # finds manually-assigned oids that are duplicated in the system tables.
 #
 # run this script in src/include/catalog.
 #
 
-FILES=`ls pg_*.h`
+# note: we exclude BKI_BOOTSTRAP relations since they are expected to have
+# matching DATA lines in pg_class.h
 
-egrep '^DATA' $FILES | \
-   sed -e 's/^.*OID[^=]*=[^0-9]*//' -e 's/[^0-9].*$//' | \
-   sort -n | uniq -d | \
-   egrep -v '^0*$'
+cat pg_*.h indexing.h | \
+egrep -v -e '^CATALOG\(.*BKI_BOOTSTRAP' | \
+sed -n -e 's/^DATA(insert *OID *= *\([0-9][0-9]*\).*$/\1/p' \
+   -e 's/^CATALOG([^,]*, *\([0-9][0-9]*\).*$/\1/p' \
+   -e 's/^DECLARE_INDEX([^,]*, *\([0-9][0-9]*\).*$/\1/p' \
+   -e 's/^DECLARE_UNIQUE_INDEX([^,]*, *\([0-9][0-9]*\).*$/\1/p' | \
+sort -n | \
+uniq -d
 
 exit 0
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/heap.h,v 1.73 2005/01/27 03:18:15 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/heap.h,v 1.74 2005/04/14 01:38:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 extern Relation heap_create(const char *relname,
            Oid relnamespace,
            Oid reltablespace,
+           Oid relid,
            TupleDesc tupDesc,
            char relkind,
            bool shared_relation,
 extern Oid heap_create_with_catalog(const char *relname,
                         Oid relnamespace,
                         Oid reltablespace,
+                        Oid relid,
                         TupleDesc tupdesc,
                         char relkind,
                         bool shared_relation,
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.61 2005/03/21 01:24:04 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/index.h,v 1.62 2005/04/14 01:38:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 extern Oid index_create(Oid heapRelationId,
             const char *indexRelationName,
+            Oid indexRelationId,
             IndexInfo *indexInfo,
             Oid accessMethodObjectId,
             Oid tableSpaceId,
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/indexing.h,v 1.85 2005/03/29 00:17:17 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/indexing.h,v 1.86 2005/04/14 01:38:20 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
  * These macros are just to keep the C compiler from spitting up on the
  * upcoming commands for genbki.sh.
  */
-#define DECLARE_INDEX(x) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX(x) extern int no_such_variable
+#define DECLARE_INDEX(name,oid,decl) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX(name,oid,decl) extern int no_such_variable
 #define BUILD_INDICES
 
 
  * What follows are lines processed by genbki.sh to create the statements
  * the bootstrap parser will turn into DefineIndex commands.
  *
- * The keyword is DECLARE_INDEX or DECLARE_UNIQUE_INDEX.  Everything after
- * that is just like in a normal 'create index' SQL command.
+ * The keyword is DECLARE_INDEX or DECLARE_UNIQUE_INDEX.  The first two
+ * arguments are the index name and OID, the rest is much like a standard
+ * 'create index' SQL command.
  */
 
-DECLARE_UNIQUE_INDEX(pg_aggregate_fnoid_index on pg_aggregate using btree(aggfnoid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_am_name_index on pg_am using btree(amname name_ops));
-DECLARE_UNIQUE_INDEX(pg_am_oid_index on pg_am using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_amop_opc_strat_index on pg_amop using btree(amopclaid oid_ops, amopsubtype oid_ops, amopstrategy int2_ops));
-DECLARE_UNIQUE_INDEX(pg_amop_opr_opc_index on pg_amop using btree(amopopr oid_ops, amopclaid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_amproc_opc_proc_index on pg_amproc using btree(amopclaid oid_ops, amprocsubtype oid_ops, amprocnum int2_ops));
-DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops));
-DECLARE_UNIQUE_INDEX(pg_attrdef_oid_index on pg_attrdef using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index on pg_attribute using btree(attrelid oid_ops, attname name_ops));
-DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnum_index on pg_attribute using btree(attrelid oid_ops, attnum int2_ops));
-DECLARE_UNIQUE_INDEX(pg_cast_oid_index on pg_cast using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_cast_source_target_index on pg_cast using btree(castsource oid_ops, casttarget oid_ops));
-DECLARE_UNIQUE_INDEX(pg_class_oid_index on pg_class using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index on pg_class using btree(relname name_ops, relnamespace oid_ops));
-/* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_constraint_conname_nsp_index on pg_constraint using btree(conname name_ops, connamespace oid_ops));
+DECLARE_UNIQUE_INDEX(pg_aggregate_fnoid_index,2650, on pg_aggregate using btree(aggfnoid oid_ops));
+#define AggregateFnoidIndexId  2650
+
+DECLARE_UNIQUE_INDEX(pg_am_name_index,2651, on pg_am using btree(amname name_ops));
+#define AmNameIndexId  2651
+DECLARE_UNIQUE_INDEX(pg_am_oid_index,2652, on pg_am using btree(oid oid_ops));
+#define AmOidIndexId  2652
+
+DECLARE_UNIQUE_INDEX(pg_amop_opc_strat_index,2653, on pg_amop using btree(amopclaid oid_ops, amopsubtype oid_ops, amopstrategy int2_ops));
+#define AccessMethodStrategyIndexId  2653
+DECLARE_UNIQUE_INDEX(pg_amop_opr_opc_index,2654, on pg_amop using btree(amopopr oid_ops, amopclaid oid_ops));
+#define AccessMethodOperatorIndexId  2654
+
+DECLARE_UNIQUE_INDEX(pg_amproc_opc_proc_index,2655, on pg_amproc using btree(amopclaid oid_ops, amprocsubtype oid_ops, amprocnum int2_ops));
+#define AccessMethodProcedureIndexId  2655
+
+DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index,2656, on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops));
+#define AttrDefaultIndexId  2656
+DECLARE_UNIQUE_INDEX(pg_attrdef_oid_index,2657, on pg_attrdef using btree(oid oid_ops));
+#define AttrDefaultOidIndexId  2657
+
+DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index,2658, on pg_attribute using btree(attrelid oid_ops, attname name_ops));
+#define AttributeRelidNameIndexId  2658
+DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnum_index,2659, on pg_attribute using btree(attrelid oid_ops, attnum int2_ops));
+#define AttributeRelidNumIndexId  2659
+
+DECLARE_UNIQUE_INDEX(pg_cast_oid_index,2660, on pg_cast using btree(oid oid_ops));
+#define CastOidIndexId  2660
+DECLARE_UNIQUE_INDEX(pg_cast_source_target_index,2661, on pg_cast using btree(castsource oid_ops, casttarget oid_ops));
+#define CastSourceTargetIndexId  2661
+
+DECLARE_UNIQUE_INDEX(pg_class_oid_index,2662, on pg_class using btree(oid oid_ops));
+#define ClassOidIndexId  2662
+DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index,2663, on pg_class using btree(relname name_ops, relnamespace oid_ops));
+#define ClassNameNspIndexId  2663
+
 /* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_constraint_conrelid_index on pg_constraint using btree(conrelid oid_ops));
+DECLARE_INDEX(pg_constraint_conname_nsp_index,2664, on pg_constraint using btree(conname name_ops, connamespace oid_ops));
+#define ConstraintNameNspIndexId  2664
 /* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_constraint_contypid_index on pg_constraint using btree(contypid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_constraint_oid_index on pg_constraint using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_conversion_default_index on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index on pg_conversion using btree(conname name_ops, connamespace oid_ops));
-DECLARE_UNIQUE_INDEX(pg_conversion_oid_index on pg_conversion using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_database_datname_index on pg_database using btree(datname name_ops));
-DECLARE_UNIQUE_INDEX(pg_database_oid_index on pg_database using btree(oid oid_ops));
+DECLARE_INDEX(pg_constraint_conrelid_index,2665, on pg_constraint using btree(conrelid oid_ops));
+#define ConstraintRelidIndexId  2665
 /* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_depend_depender_index on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops));
+DECLARE_INDEX(pg_constraint_contypid_index,2666, on pg_constraint using btree(contypid oid_ops));
+#define ConstraintTypidIndexId  2666
+DECLARE_UNIQUE_INDEX(pg_constraint_oid_index,2667, on pg_constraint using btree(oid oid_ops));
+#define ConstraintOidIndexId  2667
+
+DECLARE_UNIQUE_INDEX(pg_conversion_default_index,2668, on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
+#define ConversionDefaultIndexId  2668
+DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index,2669, on pg_conversion using btree(conname name_ops, connamespace oid_ops));
+#define ConversionNameNspIndexId  2669
+DECLARE_UNIQUE_INDEX(pg_conversion_oid_index,2670, on pg_conversion using btree(oid oid_ops));
+#define ConversionOidIndexId  2670
+
+DECLARE_UNIQUE_INDEX(pg_database_datname_index,2671, on pg_database using btree(datname name_ops));
+#define DatabaseNameIndexId  2671
+DECLARE_UNIQUE_INDEX(pg_database_oid_index,2672, on pg_database using btree(oid oid_ops));
+#define DatabaseOidIndexId  2672
+
 /* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_depend_reference_index on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));
-DECLARE_UNIQUE_INDEX(pg_description_o_c_o_index on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
-DECLARE_UNIQUE_INDEX(pg_group_name_index on pg_group using btree(groname name_ops));
-DECLARE_UNIQUE_INDEX(pg_group_sysid_index on pg_group using btree(grosysid int4_ops));
+DECLARE_INDEX(pg_depend_depender_index,2673, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops));
+#define DependDependerIndexId  2673
 /* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_index_indrelid_index on pg_index using btree(indrelid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_index_indexrelid_index on pg_index using btree(indexrelid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_inherits_relid_seqno_index on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops));
-DECLARE_UNIQUE_INDEX(pg_language_name_index on pg_language using btree(lanname name_ops));
-DECLARE_UNIQUE_INDEX(pg_language_oid_index on pg_language using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_largeobject_loid_pn_index on pg_largeobject using btree(loid oid_ops, pageno int4_ops));
-DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index on pg_namespace using btree(nspname name_ops));
-DECLARE_UNIQUE_INDEX(pg_namespace_oid_index on pg_namespace using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index on pg_opclass using btree(opcamid oid_ops, opcname name_ops, opcnamespace oid_ops));
-DECLARE_UNIQUE_INDEX(pg_opclass_oid_index on pg_opclass using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_operator_oid_index on pg_operator using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
-DECLARE_UNIQUE_INDEX(pg_proc_oid_index on pg_proc using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
+DECLARE_INDEX(pg_depend_reference_index,2674, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));
+#define DependReferenceIndexId  2674
+
+DECLARE_UNIQUE_INDEX(pg_description_o_c_o_index,2675, on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
+#define DescriptionObjIndexId  2675
+
+DECLARE_UNIQUE_INDEX(pg_group_name_index,2676, on pg_group using btree(groname name_ops));
+#define GroupNameIndexId  2676
+DECLARE_UNIQUE_INDEX(pg_group_sysid_index,2677, on pg_group using btree(grosysid int4_ops));
+#define GroupSysidIndexId  2677
+
 /* This following index is not used for a cache and is not unique */
-DECLARE_UNIQUE_INDEX(pg_rewrite_oid_index on pg_rewrite using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index on pg_rewrite using btree(ev_class oid_ops, rulename name_ops));
-DECLARE_UNIQUE_INDEX(pg_shadow_usename_index on pg_shadow using btree(usename name_ops));
-DECLARE_UNIQUE_INDEX(pg_shadow_usesysid_index on pg_shadow using btree(usesysid int4_ops));
-DECLARE_UNIQUE_INDEX(pg_statistic_relid_att_index on pg_statistic using btree(starelid oid_ops, staattnum int2_ops));
-DECLARE_UNIQUE_INDEX(pg_tablespace_oid_index on pg_tablespace using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index on pg_tablespace using btree(spcname name_ops));
+DECLARE_INDEX(pg_index_indrelid_index,2678, on pg_index using btree(indrelid oid_ops));
+#define IndexIndrelidIndexId  2678
+DECLARE_UNIQUE_INDEX(pg_index_indexrelid_index,2679, on pg_index using btree(indexrelid oid_ops));
+#define IndexRelidIndexId  2679
+
+DECLARE_UNIQUE_INDEX(pg_inherits_relid_seqno_index,2680, on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops));
+#define InheritsRelidSeqnoIndexId  2680
+
+DECLARE_UNIQUE_INDEX(pg_language_name_index,2681, on pg_language using btree(lanname name_ops));
+#define LanguageNameIndexId  2681
+DECLARE_UNIQUE_INDEX(pg_language_oid_index,2682, on pg_language using btree(oid oid_ops));
+#define LanguageOidIndexId  2682
+
+DECLARE_UNIQUE_INDEX(pg_largeobject_loid_pn_index,2683, on pg_largeobject using btree(loid oid_ops, pageno int4_ops));
+#define LargeObjectLOidPNIndexId  2683
+
+DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index,2684, on pg_namespace using btree(nspname name_ops));
+#define NamespaceNameIndexId  2684
+DECLARE_UNIQUE_INDEX(pg_namespace_oid_index,2685, on pg_namespace using btree(oid oid_ops));
+#define NamespaceOidIndexId  2685
+
+DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index,2686, on pg_opclass using btree(opcamid oid_ops, opcname name_ops, opcnamespace oid_ops));
+#define OpclassAmNameNspIndexId  2686
+DECLARE_UNIQUE_INDEX(pg_opclass_oid_index,2687, on pg_opclass using btree(oid oid_ops));
+#define OpclassOidIndexId  2687
+
+DECLARE_UNIQUE_INDEX(pg_operator_oid_index,2688, on pg_operator using btree(oid oid_ops));
+#define OperatorOidIndexId  2688
+DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index,2689, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
+#define OperatorNameNspIndexId  2689
+
+DECLARE_UNIQUE_INDEX(pg_proc_oid_index,2690, on pg_proc using btree(oid oid_ops));
+#define ProcedureOidIndexId  2690
+DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index,2691, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
+#define ProcedureNameArgsNspIndexId  2691
+
+DECLARE_UNIQUE_INDEX(pg_rewrite_oid_index,2692, on pg_rewrite using btree(oid oid_ops));
+#define RewriteOidIndexId  2692
+DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index,2693, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops));
+#define RewriteRelRulenameIndexId  2693
+
+DECLARE_UNIQUE_INDEX(pg_shadow_usename_index,2694, on pg_shadow using btree(usename name_ops));
+#define ShadowNameIndexId  2694
+DECLARE_UNIQUE_INDEX(pg_shadow_usesysid_index,2695, on pg_shadow using btree(usesysid int4_ops));
+#define ShadowSysidIndexId  2695
+
+DECLARE_UNIQUE_INDEX(pg_statistic_relid_att_index,2696, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops));
+#define StatisticRelidAttnumIndexId  2696
+
+DECLARE_UNIQUE_INDEX(pg_tablespace_oid_index,2697, on pg_tablespace using btree(oid oid_ops));
+#define TablespaceOidIndexId  2697
+DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index,2698, on pg_tablespace using btree(spcname name_ops));
+#define TablespaceNameIndexId  2698
+
 /* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_trigger_tgconstrname_index on pg_trigger using btree(tgconstrname name_ops));
+DECLARE_INDEX(pg_trigger_tgconstrname_index,2699, on pg_trigger using btree(tgconstrname name_ops));
+#define TriggerConstrNameIndexId  2699
 /* This following index is not used for a cache and is not unique */
-DECLARE_INDEX(pg_trigger_tgconstrrelid_index on pg_trigger using btree(tgconstrrelid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index on pg_trigger using btree(tgrelid oid_ops, tgname name_ops));
-DECLARE_UNIQUE_INDEX(pg_trigger_oid_index on pg_trigger using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_type_oid_index on pg_type using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index on pg_type using btree(typname name_ops, typnamespace oid_ops));
+DECLARE_INDEX(pg_trigger_tgconstrrelid_index,2700, on pg_trigger using btree(tgconstrrelid oid_ops));
+#define TriggerConstrRelidIndexId  2700
+DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index,2701, on pg_trigger using btree(tgrelid oid_ops, tgname name_ops));
+#define TriggerRelidNameIndexId  2701
+DECLARE_UNIQUE_INDEX(pg_trigger_oid_index,2702, on pg_trigger using btree(oid oid_ops));
+#define TriggerOidIndexId  2702
+
+DECLARE_UNIQUE_INDEX(pg_type_oid_index,2703, on pg_type using btree(oid oid_ops));
+#define TypeOidIndexId  2703
+DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index,2704, on pg_type using btree(typname name_ops, typnamespace oid_ops));
+#define TypeNameNspIndexId  2704
+
 
 /* last step of initialization script: build the indexes declared above */
 BUILD_INDICES
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_aggregate.h,v 1.50 2005/04/12 04:26:28 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_aggregate.h,v 1.51 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  * agginitval          initial value for transition state (can be NULL)
  * ----------------------------------------------------------------
  */
-CATALOG(pg_aggregate) BKI_WITHOUT_OIDS
+#define AggregateRelationId  2600
+
+CATALOG(pg_aggregate,2600) BKI_WITHOUT_OIDS
 {
    regproc     aggfnoid;
    regproc     aggtransfn;
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_am.h,v 1.32 2005/03/27 23:53:05 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_am.h,v 1.33 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *     the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_am
  * ----------------
  */
-CATALOG(pg_am)
+#define AccessMethodRelationId  2601
+
+CATALOG(pg_am,2601)
 {
    NameData    amname;         /* access method name */
    int2        amstrategies;   /* total NUMBER of strategies (operators)
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_amop.h,v 1.62 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_amop.h,v 1.63 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *  the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_amop
  * ----------------
  */
-CATALOG(pg_amop) BKI_WITHOUT_OIDS
+#define AccessMethodOperatorRelationId  2602
+
+CATALOG(pg_amop,2602) BKI_WITHOUT_OIDS
 {
    Oid         amopclaid;      /* the index opclass this entry is for */
    Oid         amopsubtype;    /* operator subtype, or zero if default */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_amproc.h,v 1.52 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_amproc.h,v 1.53 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_amproc
  * ----------------
  */
-CATALOG(pg_amproc) BKI_WITHOUT_OIDS
+#define AccessMethodProcedureRelationId  2603
+
+CATALOG(pg_amproc,2603) BKI_WITHOUT_OIDS
 {
    Oid         amopclaid;      /* the index opclass this entry is for */
    Oid         amprocsubtype;  /* procedure subtype, or zero if default */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_attrdef.h,v 1.18 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_attrdef.h,v 1.19 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_attrdef
  * ----------------
  */
-CATALOG(pg_attrdef)
+#define AttrDefaultRelationId  2604
+
+CATALOG(pg_attrdef,2604)
 {
    Oid         adrelid;
    int2        adnum;
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_attribute.h,v 1.115 2005/03/29 19:44:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_attribute.h,v 1.116 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     system attributes in catalog/heap.c also.
  * ----------------
  */
-CATALOG(pg_attribute) BOOTSTRAP BKI_WITHOUT_OIDS
+#define AttributeRelationId  1249
+
+CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS
 {
    Oid         attrelid;       /* OID of relation containing this
                                 * attribute */
 { 1247, {"typdefaultbin"}, 25, -1, -1, 22, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0 }, \
 { 1247, {"typdefault"},    25, -1, -1, 23, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0 }
 
-
 DATA(insert ( 1247 typname         19 -1 NAMEDATALEN   1 0 -1 -1 f p i t f f t 0));
 DATA(insert ( 1247 typnamespace        26 -1 4   2 0 -1 -1 t p i t f f t 0));
 DATA(insert ( 1247 typowner            23 -1 4   3 0 -1 -1 t p i t f f t 0));
 DATA(insert ( 1247 cmax                29 0  4  -6 0 -1 -1 t p i t f f t 0));
 DATA(insert ( 1247 tableoid            26 0  4  -7 0 -1 -1 t p i t f f t 0));
 
-/* ----------------
- *     pg_database
- * ----------------
- */
-DATA(insert ( 1262 datname         19 -1 NAMEDATALEN   1 0 -1 -1 f p i t f f t 0));
-DATA(insert ( 1262 datdba          23 -1 4   2 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 encoding            23 -1 4   3 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 datistemplate   16 -1 1   4 0 -1 -1 t p c t f f t 0));
-DATA(insert ( 1262 datallowconn        16 -1 1   5 0 -1 -1 t p c t f f t 0));
-DATA(insert ( 1262 datlastsysoid   26 -1 4   6 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 datvacuumxid        28 -1 4   7 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 datfrozenxid        28 -1 4   8 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 dattablespace   26 -1 4   9 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 datconfig     1009 -1 -1 10 1 -1 -1 f x i f f f t 0));
-DATA(insert ( 1262 datacl        1034 -1 -1 11 1 -1 -1 f x i f f f t 0));
-DATA(insert ( 1262 ctid                27 0  6  -1 0 -1 -1 f p s t f f t 0));
-DATA(insert ( 1262 oid             26 0  4  -2 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 xmin                28 0  4  -3 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 cmin                29 0  4  -4 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 xmax                28 0  4  -5 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 cmax                29 0  4  -6 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1262 tableoid            26 0  4  -7 0 -1 -1 t p i t f f t 0));
-
 /* ----------------
  *     pg_proc
  * ----------------
 DATA(insert ( 1255 cmax                29 0  4  -6 0 -1 -1 t p i t f f t 0));
 DATA(insert ( 1255 tableoid            26 0  4  -7 0 -1 -1 t p i t f f t 0));
 
-/* ----------------
- *     pg_shadow
- * ----------------
- */
-DATA(insert ( 1260 usename         19  -1 NAMEDATALEN  1 0 -1 -1 f p i t f f t 0));
-DATA(insert ( 1260 usesysid            23  -1  4   2 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1260 usecreatedb     16  -1  1   3 0 -1 -1 t p c t f f t 0));
-DATA(insert ( 1260 usesuper            16  -1  1   4 0 -1 -1 t p c t f f t 0));
-DATA(insert ( 1260 usecatupd       16  -1  1   5 0 -1 -1 t p c t f f t 0));
-DATA(insert ( 1260 passwd          25  -1 -1   6 0 -1 -1 f x i f f f t 0));
-DATA(insert ( 1260 valuntil           702  -1  4   7 0 -1 -1 t p i f f f t 0));
-DATA(insert ( 1260 useconfig     1009  -1 -1   8 1 -1 -1 f x i f f f t 0));
-DATA(insert ( 1260 ctid                27 0  6  -1 0 -1 -1 f p s t f f t 0));
-/* no OIDs in pg_shadow */
-DATA(insert ( 1260 xmin                28 0  4  -3 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1260 cmin                29 0  4  -4 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1260 xmax                28 0  4  -5 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1260 cmax                29 0  4  -6 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1260 tableoid            26 0  4  -7 0 -1 -1 t p i t f f t 0));
-
-/* ----------------
- *     pg_group
- * ----------------
- */
-DATA(insert ( 1261 groname         19 -1 NAMEDATALEN  1 0 -1 -1 f p i t f f t 0));
-DATA(insert ( 1261 grosysid            23 -1  4   2 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1261 grolist       1007 -1 -1   3 1 -1 -1 f x i f f f t 0));
-DATA(insert ( 1261 ctid                27 0  6  -1 0 -1 -1 f p s t f f t 0));
-/* no OIDs in pg_group */
-DATA(insert ( 1261 xmin                28 0  4  -3 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1261 cmin                29 0  4  -4 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1261 xmax                28 0  4  -5 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1261 cmax                29 0  4  -6 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1261 tableoid            26 0  4  -7 0 -1 -1 t p i t f f t 0));
-
 /* ----------------
  *     pg_attribute
  * ----------------
 DATA(insert ( 1259 cmax                29 0  4  -6 0 -1 -1 t p i t f f t 0));
 DATA(insert ( 1259 tableoid            26 0  4  -7 0 -1 -1 t p i t f f t 0));
 
-/* ----------------
- *     pg_tablespace
- * ----------------
- */
-
-DATA(insert ( 1213 spcname         19 -1 NAMEDATALEN 1 0 -1 -1 f p i t f f t 0));
-DATA(insert ( 1213 spcowner            23 -1 4  2 0  -1 -1 t p i t f f t 0));
-DATA(insert ( 1213 spclocation     25 -1 -1 3 0  -1 -1 f x i t f f t 0));
-DATA(insert ( 1213 spcacl        1034 -1 -1 4 1  -1 -1 f x i f f f t 0));
-DATA(insert ( 1213 ctid                27 0  6  -1 0 -1 -1 f p s t f f t 0));
-DATA(insert ( 1213 oid             26 0  4  -2 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1213 xmin                28 0  4  -3 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1213 cmin                29 0  4  -4 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1213 xmax                28 0  4  -5 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1213 cmax                29 0  4  -6 0 -1 -1 t p i t f f t 0));
-DATA(insert ( 1213 tableoid            26 0  4  -7 0 -1 -1 t p i t f f t 0));
-
 /* ----------------
  *     pg_index
  *
 
  *
  * Copyright (c) 2002-2005, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_cast.h,v 1.20 2005/04/13 16:15:35 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_cast.h,v 1.21 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 #ifndef PG_CAST_H
 #define PG_CAST_H
 
-CATALOG(pg_cast)
+#define CastRelationId  2605
+
+CATALOG(pg_cast,2605)
 {
    Oid         castsource;     /* source datatype for cast */
    Oid         casttarget;     /* destination datatype for cast */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_class.h,v 1.86 2005/03/29 19:44:23 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_class.h,v 1.87 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     to get the relacl field ... and don't forget to check isNull.
  * ----------------
  */
-CATALOG(pg_class) BOOTSTRAP
+#define RelationRelationId  1259
+
+CATALOG(pg_class,1259) BKI_BOOTSTRAP
 {
    NameData    relname;        /* class name */
    Oid         relnamespace;   /* OID of namespace containing this class */
 /* ----------------
  *     initial contents of pg_class
  *
- * NOTE: only "bootstrapped" relations need to be declared here.
+ * NOTE: only "bootstrapped" relations need to be declared here.  Be sure that
+ * the OIDs listed here match those given in their CATALOG macros.
  * ----------------
  */
 
 DESCR("");
 DATA(insert OID = 1259 (  pg_class     PGNSP 83 PGUID 0 1259 0 0 0 0 0 f f r 25 0 0 0 0 0 t f f f _null_ ));
 DESCR("");
-DATA(insert OID = 1260 (  pg_shadow        PGNSP 86 PGUID 0 1260 1664 0 0 0 0 f t r 8  0 0 0 0 0 f f f f _null_ ));
-DESCR("");
-DATA(insert OID = 1261 (  pg_group     PGNSP 87 PGUID 0 1261 1664 0 0 0 0 f t r 3  0 0 0 0 0 f f f f _null_ ));
-DESCR("");
-DATA(insert OID = 1262 (  pg_database  PGNSP 88 PGUID 0 1262 1664 0 0 0 0 f t r 11 0 0 0 0 0 t f f f _null_ ));
-DESCR("");
-DATA(insert OID = 1213 (  pg_tablespace PGNSP 90 PGUID 0 1213 1664 0 0 0 0 f t r 4 0 0 0 0 0 t f f f _null_ ));
-DESCR("");
 DATA(insert OID = 376  (  pg_xactlock  PGNSP  0 PGUID 0 0 1664 0 0 0 0 f t s 1  0 0 0 0 0 f f f f _null_ ));
 DESCR("");
 
-#define RelOid_pg_type         1247
-#define RelOid_pg_attribute        1249
-#define RelOid_pg_proc         1255
-#define RelOid_pg_class            1259
-#define RelOid_pg_shadow       1260
-#define RelOid_pg_group            1261
-#define RelOid_pg_database     1262
-#define RelOid_pg_tablespace   1213
-
 /* Xact lock pseudo-table */
 #define XactLockTableId            376
 
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_constraint.h,v 1.15 2005/03/25 21:57:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_constraint.h,v 1.16 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_constraint
  * ----------------
  */
-CATALOG(pg_constraint)
+#define ConstraintRelationId  2606
+
+CATALOG(pg_constraint,2606)
 {
    /*
     * conname + connamespace is deliberately not unique; we allow, for
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_conversion.h,v 1.14 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_conversion.h,v 1.15 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  * condefault          TRUE if this is a default conversion
  * ----------------------------------------------------------------
  */
-CATALOG(pg_conversion)
+#define ConversionRelationId  2607
+
+CATALOG(pg_conversion,2607)
 {
    NameData    conname;
    Oid         connamespace;
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_database.h,v 1.34 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_database.h,v 1.35 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_database
  * ----------------
  */
-CATALOG(pg_database) BOOTSTRAP BKI_SHARED_RELATION
+#define DatabaseRelationId  1262
+
+CATALOG(pg_database,1262) BKI_SHARED_RELATION
 {
    NameData    datname;        /* database name */
    int4        datdba;         /* sysid of owner */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_depend.h,v 1.5 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_depend.h,v 1.6 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_depend
  * ----------------
  */
-CATALOG(pg_depend) BKI_WITHOUT_OIDS
+#define DependRelationId  2608
+
+CATALOG(pg_depend,2608) BKI_WITHOUT_OIDS
 {
    /*
     * Identification of the dependent (referencing) object.
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_description.h,v 1.22 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_description.h,v 1.23 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *     the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_description
  * ----------------
  */
-CATALOG(pg_description) BKI_WITHOUT_OIDS
+#define DescriptionRelationId  2609
+
+CATALOG(pg_description,2609) BKI_WITHOUT_OIDS
 {
    Oid         objoid;         /* OID of object itself */
    Oid         classoid;       /* OID of table containing object */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_group.h,v 1.20 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_group.h,v 1.21 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
+#define GroupRelationId  1261
 
-CATALOG(pg_group) BOOTSTRAP BKI_SHARED_RELATION BKI_WITHOUT_OIDS
+CATALOG(pg_group,1261) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
 {
    NameData    groname;
    int4        grosysid;
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_index.h,v 1.36 2005/03/29 00:17:17 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_index.h,v 1.37 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_index.
  * ----------------
  */
-CATALOG(pg_index) BKI_WITHOUT_OIDS
+#define IndexRelationId  2610
+
+CATALOG(pg_index,2610) BKI_WITHOUT_OIDS
 {
    Oid         indexrelid;     /* OID of the index */
    Oid         indrelid;       /* OID of the relation it indexes */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_inherits.h,v 1.19 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_inherits.h,v 1.20 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_inherits
  * ----------------
  */
-CATALOG(pg_inherits) BKI_WITHOUT_OIDS
+#define InheritsRelationId  2611
+
+CATALOG(pg_inherits,2611) BKI_WITHOUT_OIDS
 {
    Oid         inhrelid;
    Oid         inhparent;
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_language.h,v 1.25 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_language.h,v 1.26 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_language
  * ----------------
  */
-CATALOG(pg_language)
+#define LanguageRelationId  2612
+
+CATALOG(pg_language,2612)
 {
    NameData    lanname;
    bool        lanispl;        /* Is a procedural language */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_largeobject.h,v 1.18 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_largeobject.h,v 1.19 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_largeobject
  * ----------------
  */
+#define LargeObjectRelationId  2613
 
-CATALOG(pg_largeobject) BKI_WITHOUT_OIDS
+CATALOG(pg_largeobject,2613) BKI_WITHOUT_OIDS
 {
    Oid         loid;           /* Identifier of large object */
    int4        pageno;         /* Page number (starting from 0) */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_listener.h,v 1.18 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_listener.h,v 1.19 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     cpp turns this into typedef struct FormData_pg_listener
  * ----------------------------------------------------------------
  */
+#define ListenerRelationId  2614
 
-CATALOG(pg_listener) BKI_WITHOUT_OIDS
+CATALOG(pg_listener,2614) BKI_WITHOUT_OIDS
 {
    NameData    relname;
    int4        listenerpid;
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_namespace.h,v 1.16 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_namespace.h,v 1.17 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  * nspacl              access privilege list
  * ----------------------------------------------------------------
  */
-CATALOG(pg_namespace)
+#define NamespaceRelationId  2615
+
+CATALOG(pg_namespace,2615)
 {
    NameData    nspname;
    int4        nspowner;
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_opclass.h,v 1.63 2005/03/26 23:29:19 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_opclass.h,v 1.64 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_opclass
  * ----------------
  */
+#define OperatorClassRelationId  2616
 
-CATALOG(pg_opclass)
+CATALOG(pg_opclass,2616)
 {
    Oid         opcamid;        /* index access method opclass is for */
    NameData    opcname;        /* name of this opclass */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_operator.h,v 1.130 2004/12/31 22:03:24 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_operator.h,v 1.131 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_operator
  * ----------------
  */
-CATALOG(pg_operator)
+#define OperatorRelationId  2617
+
+CATALOG(pg_operator,2617)
 {
    NameData    oprname;        /* name of operator */
    Oid         oprnamespace;   /* OID of namespace containing this oper */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.358 2005/04/12 04:26:28 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.359 2005/04/14 01:38:20 tgl Exp $
  *
  * NOTES
  *   The script catalog/genbki.sh reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_proc
  * ----------------
  */
-CATALOG(pg_proc) BOOTSTRAP
+#define ProcedureRelationId  1255
+
+CATALOG(pg_proc,1255) BKI_BOOTSTRAP
 {
    NameData    proname;        /* procedure name */
    Oid         pronamespace;   /* OID of namespace containing this proc */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_rewrite.h,v 1.24 2004/12/31 22:03:25 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_rewrite.h,v 1.25 2005/04/14 01:38:21 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_rewrite
  * ----------------
  */
-CATALOG(pg_rewrite)
+#define RewriteRelationId  2618
+
+CATALOG(pg_rewrite,2618)
 {
    NameData    rulename;
    Oid         ev_class;
 
  * pg_shadow.h
  *   definition of the system "shadow" relation (pg_shadow)
  *   along with the relation's initial contents.
- *       pg_user is now a public accessible view on pg_shadow.
+ *
+ *   pg_user is now a publicly accessible view on pg_shadow.
  *
  *
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_shadow.h,v 1.27 2004/12/31 22:03:26 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_shadow.h,v 1.28 2005/04/14 01:38:21 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
  *   information from the DATA() statements.
  *
- *       WHENEVER the definition for pg_shadow changes, the
- *       view creation of pg_user must be changed in initdb.sh!
- *
  *-------------------------------------------------------------------------
  */
 #ifndef PG_SHADOW_H
  *     typedef struct FormData_pg_shadow
  * ----------------
  */
-CATALOG(pg_shadow) BOOTSTRAP BKI_SHARED_RELATION BKI_WITHOUT_OIDS
+#define ShadowRelationId  1260
+
+CATALOG(pg_shadow,1260) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
 {
    NameData    usename;
    int4        usesysid;
  *     compiler constants for pg_shadow
  * ----------------
  */
-#define Natts_pg_shadow                8
+#define Natts_pg_shadow                    8
 #define Anum_pg_shadow_usename         1
 #define Anum_pg_shadow_usesysid            2
 #define Anum_pg_shadow_usecreatedb     3
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_statistic.h,v 1.28 2004/12/31 22:03:26 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_statistic.h,v 1.29 2005/04/14 01:38:21 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_statistic
  * ----------------
  */
-CATALOG(pg_statistic) BKI_WITHOUT_OIDS
+#define StatisticRelationId  2619
+
+CATALOG(pg_statistic,2619) BKI_WITHOUT_OIDS
 {
    /* These fields form the unique key for the entry: */
    Oid         starelid;       /* relation containing attribute */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_tablespace.h,v 1.5 2004/12/31 22:03:26 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_tablespace.h,v 1.6 2005/04/14 01:38:21 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_tablespace
  * ----------------
  */
-CATALOG(pg_tablespace) BOOTSTRAP BKI_SHARED_RELATION
+#define TableSpaceRelationId  1213
+
+CATALOG(pg_tablespace,1213) BKI_SHARED_RELATION
 {
    NameData    spcname;        /* tablespace name */
    int4        spcowner;       /* sysid of owner */
 
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     typedef struct FormData_pg_trigger
  * ----------------
  */
-CATALOG(pg_trigger)
+#define TriggerRelationId  2620
+
+CATALOG(pg_trigger,2620)
 {
    Oid         tgrelid;        /* triggered relation */
    NameData    tgname;         /* trigger' name */
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.159 2005/03/29 00:17:17 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.160 2005/04/14 01:38:21 tgl Exp $
  *
  * NOTES
  *   the genbki.sh script reads this file and generates .bki
 
 /* ----------------
  *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
+ *     CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file
  *     can be read by both genbki.sh and the C compiler.
  * ----------------
  */
  *     See struct FormData_pg_attribute for details.
  * ----------------
  */
-CATALOG(pg_type) BOOTSTRAP
+#define TypeRelationId  1247
+
+CATALOG(pg_type,1247) BKI_BOOTSTRAP
 {
    NameData    typname;        /* type name */
    Oid         typnamespace;   /* OID of namespace containing this type */
 DESCR("array of oids, used in system tables");
 #define OIDVECTOROID   30
 
+/* hand-built rowtype entries for bootstrapped catalogs: */
+
 DATA(insert OID = 71 ( pg_type         PGNSP PGUID -1 f c t \054 1247 0 record_in record_out record_recv record_send - d x f 0 -1 0 _null_ _null_ ));
 #define PG_TYPE_RELTYPE_OID 71
 DATA(insert OID = 75 ( pg_attribute    PGNSP PGUID -1 f c t \054 1249 0 record_in record_out record_recv record_send - d x f 0 -1 0 _null_ _null_ ));
 #define PG_PROC_RELTYPE_OID 81
 DATA(insert OID = 83 ( pg_class        PGNSP PGUID -1 f c t \054 1259 0 record_in record_out record_recv record_send - d x f 0 -1 0 _null_ _null_ ));
 #define PG_CLASS_RELTYPE_OID 83
-DATA(insert OID = 86 ( pg_shadow       PGNSP PGUID -1 f c t \054 1260 0 record_in record_out record_recv record_send - d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 87 ( pg_group        PGNSP PGUID -1 f c t \054 1261 0 record_in record_out record_recv record_send - d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 88 ( pg_database     PGNSP PGUID -1 f c t \054 1262 0 record_in record_out record_recv record_send - d x f 0 -1 0 _null_ _null_ ));
-DATA(insert OID = 90 ( pg_tablespace   PGNSP PGUID -1 f c t \054 1213 0 record_in record_out record_recv record_send - d x f 0 -1 0 _null_ _null_ ));
 
 /* OIDS 100 - 199 */
 
 
+++ /dev/null
-/*-------------------------------------------------------------------------
- *
- * pg_version.h
- *   definition of the system "version" relation (pg_version)
- *   along with the relation's initial contents.
- *
- * NOTE: this table has nothing to do with the overall Postgres system
- * version or anything like that.  It is for defining individual relations
- * that have multiple concurrently-existing versions.  Yes, there used to
- * be such a feature in Postgres, but it's been broken for a long time
- * (see src/backend/commands/_deadcode/version.c). The pg_version table
- * isn't even created at present.
- *
- *
- * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * $PostgreSQL: pgsql/src/include/catalog/pg_version.h,v 1.20 2004/12/31 22:03:26 pgsql Exp $
- *
- * NOTES
- *   the genbki.sh script reads this file and generates .bki
- *   information from the DATA() statements.
- *
- *-------------------------------------------------------------------------
- */
-#ifndef PG_VERSION_H
-#define PG_VERSION_H
-
-/* ----------------
- *     postgres.h contains the system type definitions and the
- *     CATALOG(), BOOTSTRAP and DATA() sugar words so this file
- *     can be read by both genbki.sh and the C compiler.
- * ----------------
- */
-
-/* ----------------
- *     pg_version definition.  cpp turns this into
- *     typedef struct FormData_pg_version
- * ----------------
- */
-CATALOG(pg_version)
-{
-   Oid         verrelid;
-   Oid         verbaseid;
-   int4        vertime;        /* really should be some abstime */
-} FormData_pg_version;
-
-/* ----------------
- *     Form_pg_version corresponds to a pointer to a tuple with
- *     the format of pg_version relation.
- * ----------------
- */
-typedef FormData_pg_version *Form_pg_version;
-
-/* ----------------
- *     compiler constants for pg_version
- * ----------------
- */
-#define Natts_pg_version               3
-#define Anum_pg_version_verrelid       1
-#define Anum_pg_version_verbaseid      2
-#define Anum_pg_version_vertime            3
-
-#endif   /* PG_VERSION_H */
 
 #
 # unused_oids
 #
-# $PostgreSQL: pgsql/src/include/catalog/unused_oids,v 1.6 2005/04/13 18:54:57 tgl Exp $
+# $PostgreSQL: pgsql/src/include/catalog/unused_oids,v 1.7 2005/04/14 01:38:21 tgl Exp $
 #
 #  finds blocks of manually-assignable oids that have not already been
 #  claimed by post_hackers.  primarily useful for finding available
 FIRSTOBJECTID=`grep '#define[  ]*FirstBootstrapObjectId' ../access/transam.h | $AWK '{ print $3 }'`
 export FIRSTOBJECTID
 
-egrep '^DATA' pg_*.h | \
-   sed -e 's/^.*OID[^=]*=[^0-9]*//' -e 's/[^0-9].*$//' | \
-   sort -n | \
-   uniq | \
-   $AWK '
+# this part (down to the uniq step) should match the unused_oids script
+# note: we exclude BKI_BOOTSTRAP relations since they are expected to have
+# matching DATA lines in pg_class.h
+
+cat pg_*.h indexing.h | \
+egrep -v -e '^CATALOG\(.*BKI_BOOTSTRAP' | \
+sed -n -e 's/^DATA(insert *OID *= *\([0-9][0-9]*\).*$/\1/p' \
+   -e 's/^CATALOG([^,]*, *\([0-9][0-9]*\).*$/\1/p' \
+   -e 's/^DECLARE_INDEX([^,]*, *\([0-9][0-9]*\).*$/\1/p' \
+   -e 's/^DECLARE_UNIQUE_INDEX([^,]*, *\([0-9][0-9]*\).*$/\1/p' | \
+sort -n | \
+uniq | \
+$AWK '
 BEGIN {
    last = 0;
 }
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.63 2005/03/14 00:19:37 neilc Exp $
+ * $PostgreSQL: pgsql/src/include/commands/defrem.h,v 1.64 2005/04/14 01:38:21 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 /* commands/indexcmds.c */
 extern void DefineIndex(RangeVar *heapRelation,
            char *indexRelationName,
+           Oid indexRelationId,
            char *accessMethodName,
            char *tableSpaceName,
            List *attributeList,
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1995, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/postgres.h,v 1.70 2004/12/31 22:03:19 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/postgres.h,v 1.71 2005/04/14 01:38:21 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
  *             Section 4: genbki macros used by catalog/pg_xxx.h files
  * ----------------------------------------------------------------
  */
-#define CATALOG(x) typedef struct CppConcat(FormData_,x)
+#define CATALOG(name,oid)  typedef struct CppConcat(FormData_,name)
 
-#define BOOTSTRAP
+#define BKI_BOOTSTRAP
 #define BKI_SHARED_RELATION
 #define BKI_WITHOUT_OIDS
 
 
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/relcache.h,v 1.48 2005/01/10 20:02:24 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/utils/relcache.h,v 1.49 2005/04/14 01:38:22 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
                           TupleDesc tupDesc,
                           Oid relid,
                           Oid reltablespace,
-                          bool shared_relation,
-                          bool nailit);
+                          bool shared_relation);
 
 /*
  * Routines for flushing/rebuilding relcache entries in various scenarios