diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml
index d0c08e08d9c4bab1721a1b87e080ae12782b6419..d747f9244e74b26ef927dc8d75e2f2e15dcf90a3 100644
--- a/doc/src/sgml/bki.sgml
+++ b/doc/src/sgml/bki.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/bki.sgml,v 1.22 2009/09/26 22:42:00 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/bki.sgml,v 1.23 2010/01/05 01:06:55 tgl Exp $ -->
 
 <chapter id="bki">
  <title><acronym>BKI</acronym> Backend Interface</title>
@@ -20,10 +20,10 @@
   to do part of its job when creating a new database cluster.  The
   input file used by <application>initdb</application> is created as
   part of building and installing <productname>PostgreSQL</productname>
-  by a program named <filename>genbki.sh</filename>, which reads some
+  by a program named <filename>genbki.pl</filename>, which reads some
   specially formatted C header files in the <filename>src/include/catalog/</>
-  directory of the source tree.  The created
-  <acronym>BKI</acronym> file is called <filename>postgres.bki</filename> and is
+  directory of the source tree.  The created <acronym>BKI</acronym> file
+  is called <filename>postgres.bki</filename> and is
   normally installed in the
   <filename>share</filename> subdirectory of the installation tree.
  </para>
diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml
index 3074172bc5ddcdb86735a52843129e594a4c34d0..41513dcb9a123e8cb52d1a9b8dc528b23d3bac6f 100644
--- a/doc/src/sgml/installation.sgml
+++ b/doc/src/sgml/installation.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.335 2009/12/18 21:37:38 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/installation.sgml,v 1.336 2010/01/05 01:06:55 tgl Exp $ -->
 
 <chapter id="installation">
  <title><![%standalone-include[<productname>PostgreSQL</>]]>
@@ -125,10 +125,10 @@ su - postgres
       <filename>libedit</filename> library is
       GNU <productname>Readline</productname>-compatible and is used if
       <filename>libreadline</filename> is not found, or if
-      <option>--with-libedit-preferred</option> is used as an 
+      <option>--with-libedit-preferred</option> is used as an
       option to <filename>configure</>. If you are using a package-based
-      Linux distribution, be aware that you need both the 
-      <literal>readline</> and <literal>readline-devel</> packages, if 
+      Linux distribution, be aware that you need both the
+      <literal>readline</> and <literal>readline-devel</> packages, if
       those are separate in your distribution.
      </para>
     </listitem>
@@ -266,7 +266,7 @@ su - postgres
 
     <listitem>
      <para>
-      <application>Kerberos</>, <productname>OpenSSL</>, 
+      <application>Kerberos</>, <productname>OpenSSL</>,
       <productname>OpenLDAP</>, and/or
       <application>PAM</>, if you want to support authentication or
       encryption using these services.
@@ -310,7 +310,7 @@ su - postgres
        <primary>perl</primary>
       </indexterm>
 
-      <application>Perl</> is also needed to build from a CVS checkout,
+      <application>Perl</> 5.8 or later is needed to build from a CVS checkout,
       or if you changed the input files for any of the build steps that
       use Perl scripts.  If building on Windows you will need
       <application>Perl</> in any case.
@@ -456,7 +456,7 @@ su - postgres
      delete it, in case you have trouble and need to revert to it.  Keep
      in mind the directory might consume significant disk space.  To rename
      the directory, use a command like this:
-<screen> 
+<screen>
 <userinput>mv /usr/local/pgsql /usr/local/pgsql.old</>
 </screen>
     </para>
@@ -581,7 +581,7 @@ su - postgres
         </para>
 
         <para>
-         For relocatable installs, you might want to use 
+         For relocatable installs, you might want to use
          <filename>configure</filename>'s <literal>--disable-rpath</>
          option.  Also, you will need to tell the operating system how
          to find the shared libraries.
@@ -943,7 +943,7 @@ su - postgres
        <listitem>
         <para>
          Build with <acronym>LDAP</><indexterm><primary>LDAP</></>
-         support for authentication and connection parameter lookup (see 
+         support for authentication and connection parameter lookup (see
          <![%standalone-include[the documentation about client authentication
          and libpq]]><![%standalone-ignore[<xref linkend="libpq-ldap"> and
          <xref linkend="auth-ldap">]]> for more information). On Unix,
@@ -952,7 +952,7 @@ su - postgres
          library is used.  <filename>configure</> will check for the required
          header files and libraries to make sure that your
          <productname>OpenLDAP</> installation is sufficient before
-         proceeding. 
+         proceeding.
         </para>
        </listitem>
       </varlistentry>
@@ -1381,7 +1381,7 @@ su - postgres
     <para>
      Here is a list of the significant variables that can be set in
      this manner:
- 
+
      <variablelist>
       <varlistentry>
        <term><envar>BISON</envar></term>
@@ -1635,7 +1635,7 @@ All of PostgreSQL is successfully made. Ready to install.
   </procedure>
 
   <formalpara>
-   <title>Registering <application>eventlog</> on <systemitem 
+   <title>Registering <application>eventlog</> on <systemitem
    class="osname">Windows</>:</title>
    <para>
     To register a <systemitem class="osname">Windows</> <application>eventlog</>
@@ -1887,7 +1887,7 @@ postgres$ <userinput>/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data</>
     <para>
      At this point, if you did not use the <command>initdb</> <literal>-A</>
      option, you might want to modify <filename>pg_hba.conf</> to control
-     local access to the server before you start it.  The default is to 
+     local access to the server before you start it.  The default is to
      trust all local users.
     </para>
    </step>
@@ -2678,7 +2678,7 @@ cc-1020 cc: ERROR File = pqcomm.c, Line = 427
     MinGW.  The ready-made installer files are available on the main
     PostgreSQL FTP servers in the <filename>binary/win32</filename>
     directory.
-   </para>   
+   </para>
 
    <para>
     The native Win32 port requires a 32-bit NT-based Microsoft
diff --git a/src/backend/Makefile b/src/backend/Makefile
index 352357bee8e625573cc05cd9e15f0c5dc29a335a..ac46d5083661b2bbe2637c2a585e9493b5d7e63d 100644
--- a/src/backend/Makefile
+++ b/src/backend/Makefile
@@ -5,7 +5,7 @@
 # Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
 # Portions Copyright (c) 1994, Regents of the University of California
 #
-# $PostgreSQL: pgsql/src/backend/Makefile,v 1.137 2010/01/02 16:57:33 momjian Exp $
+# $PostgreSQL: pgsql/src/backend/Makefile,v 1.138 2010/01/05 01:06:56 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -42,7 +42,7 @@ LIBS := $(filter-out -lz -lreadline -ledit -ltermcap -lncurses -lcurses, $(LIBS)
 
 ##########################################################################
 
-all: submake-libpgport postgres $(POSTGRES_IMP)
+all: submake-libpgport submake-schemapg postgres $(POSTGRES_IMP)
 
 ifneq ($(PORTNAME), cygwin)
 ifneq ($(PORTNAME), win32)
@@ -111,7 +111,13 @@ endif
 endif # aix
 
 # Update the commonly used headers before building the subdirectories
-$(SUBDIRS:%=%-recursive): $(top_builddir)/src/include/parser/gram.h $(top_builddir)/src/include/utils/fmgroids.h $(top_builddir)/src/include/utils/probes.h
+$(SUBDIRS:%=%-recursive): $(top_builddir)/src/include/parser/gram.h $(top_builddir)/src/include/catalog/schemapg.h $(top_builddir)/src/include/utils/fmgroids.h $(top_builddir)/src/include/utils/probes.h
+
+# run this unconditionally to avoid needing to know its dependencies here:
+submake-schemapg:
+	$(MAKE) -C catalog schemapg.h
+
+.PHONY: submake-schemapg
 
 
 # The postgres.o target is needed by the rule in Makefile.global that
@@ -127,7 +133,7 @@ postgres.o: $(OBJS)
 parser/gram.h: parser/gram.y
 	$(MAKE) -C parser gram.h
 
-utils/fmgroids.h: utils/Gen_fmgrtab.sh $(top_srcdir)/src/include/catalog/pg_proc.h
+utils/fmgroids.h: utils/Gen_fmgrtab.pl catalog/Catalog.pm $(top_srcdir)/src/include/catalog/pg_proc.h
 	$(MAKE) -C utils fmgroids.h
 
 utils/probes.h: utils/probes.d
@@ -136,15 +142,28 @@ utils/probes.h: utils/probes.d
 # Make symlinks for these headers in the include directory. That way
 # we can cut down on the -I options. Also, a symlink is automatically
 # up to date when we update the base file.
+#
+# The point of the prereqdir incantation in some of the rules below is to
+# force the symlink to use an absolute path rather than a relative path.
+# For headers which are generated by make distprep, the actual header within
+# src/backend will be in the source tree, while the symlink in src/include
+# will be in the build tree, so a simple ../.. reference won't work.
+# For headers generated during regular builds, we prefer a relative symlink.
 
 $(top_builddir)/src/include/parser/gram.h: parser/gram.h
 	prereqdir=`cd $(dir $<) >/dev/null && pwd` && \
 	  cd $(dir $@) && rm -f $(notdir $@) && \
 	  $(LN_S) "$$prereqdir/$(notdir $<)" .
 
+$(top_builddir)/src/include/catalog/schemapg.h: catalog/schemapg.h
+	prereqdir=`cd $(dir $<) >/dev/null && pwd` && \
+	  cd $(dir $@) && rm -f $(notdir $@) && \
+	  $(LN_S) "$$prereqdir/$(notdir $<)" .
+
 $(top_builddir)/src/include/utils/fmgroids.h: utils/fmgroids.h
-	cd $(dir $@) && rm -f $(notdir $@) && \
-	    $(LN_S) ../../../$(subdir)/utils/fmgroids.h .
+	prereqdir=`cd $(dir $<) >/dev/null && pwd` && \
+	  cd $(dir $@) && rm -f $(notdir $@) && \
+	  $(LN_S) "$$prereqdir/$(notdir $<)" .
 
 $(top_builddir)/src/include/utils/probes.h: utils/probes.h
 	cd $(dir $@) && rm -f $(notdir $@) && \
@@ -160,6 +179,8 @@ utils/probes.o: utils/probes.d $(SUBDIROBJS)
 distprep:
 	$(MAKE) -C parser	gram.c gram.h scan.c
 	$(MAKE) -C bootstrap	bootparse.c bootscanner.c
+	$(MAKE) -C catalog	schemapg.h postgres.bki postgres.description postgres.shdescription
+	$(MAKE) -C utils	fmgrtab.c fmgroids.h 
 	$(MAKE) -C utils/misc	guc-file.c
 
 
@@ -243,8 +264,10 @@ endif
 
 clean:
 	rm -f $(LOCALOBJS) postgres$(X) $(POSTGRES_IMP) \
-		$(top_srcdir)/src/include/parser/gram.h \
-		$(top_builddir)/src/include/utils/fmgroids.h
+		$(top_builddir)/src/include/parser/gram.h \
+		$(top_builddir)/src/include/catalog/schemapg.h \
+		$(top_builddir)/src/include/utils/fmgroids.h \
+		$(top_builddir)/src/include/utils/probes.h
 ifeq ($(PORTNAME), cygwin)
 	rm -f postgres.dll postgres.def libpostgres.a
 endif
@@ -261,6 +284,12 @@ maintainer-clean: distclean
 	      parser/gram.c \
 	      parser/scan.c \
 	      parser/gram.h \
+	      catalog/schemapg.h \
+	      catalog/postgres.bki \
+	      catalog/postgres.description \
+	      catalog/postgres.shdescription \
+	      utils/fmgroids.h \
+	      utils/fmgrtab.c \
 	      utils/misc/guc-file.c
 
 
diff --git a/src/backend/catalog/.cvsignore b/src/backend/catalog/.cvsignore
new file mode 100644
index 0000000000000000000000000000000000000000..242e32155fbd291369ffe4b70c01883d89dddde4
--- /dev/null
+++ b/src/backend/catalog/.cvsignore
@@ -0,0 +1,4 @@
+postgres.bki
+postgres.description
+postgres.shdescription
+schemapg.h
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
new file mode 100644
index 0000000000000000000000000000000000000000..3b6a723faa64bc0e2fd4db2bb45f9c297225833c
--- /dev/null
+++ b/src/backend/catalog/Catalog.pm
@@ -0,0 +1,201 @@
+#----------------------------------------------------------------------
+#
+# Catalog.pm
+#    Perl module that extracts info from catalog headers into Perl
+#    data structures
+#
+# Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# $PostgreSQL: pgsql/src/backend/catalog/Catalog.pm,v 1.1 2010/01/05 01:06:56 tgl Exp $
+#
+#----------------------------------------------------------------------
+
+package Catalog;
+
+use strict;
+use warnings;
+
+require Exporter;
+our @ISA       = qw(Exporter);
+our @EXPORT    = ();
+our @EXPORT_OK = qw(Catalogs RenameTempFile);
+
+# Call this function with an array of names of header files to parse.
+# Returns a nested data structure describing the data in the headers.
+sub Catalogs
+{
+    my (%catalogs, $catname, $declaring_attributes, $most_recent);
+    $catalogs{names} = [];
+
+    # There are a few types which are given one name in the C source, but a
+    # different name at the SQL level.  These are enumerated here.
+    my %RENAME_ATTTYPE = (
+        'Oid'           => 'oid',
+        'NameData'      => 'name',
+        'TransactionId' => 'xid'
+    );
+
+    foreach my $input_file (@_)
+    {
+        my %catalog;
+        $catalog{columns} = [];
+        $catalog{data} = [];
+
+        open(INPUT_FILE, '<', $input_file) || die "$input_file: $!";
+
+        # Scan the input file.
+        while (<INPUT_FILE>)
+        {
+            # Strip C-style comments.
+            s;/\*(.|\n)*\*/;;g;
+            if (m;/\*;)
+            {
+                # handle multi-line comments properly.
+                my $next_line = <INPUT_FILE>;
+                die "$input_file: ends within C-style comment\n"
+                  if !defined $next_line;
+                $_ .= $next_line;
+                redo;
+            }
+
+            # Strip useless whitespace and trailing semicolons.
+            chomp;
+            s/^\s+//;
+            s/;\s*$//;
+            s/\s+/ /g;
+
+            # Push the data into the appropriate data structure.
+            if (/^DATA\(insert(\s+OID\s+=\s+(\d+))?\s+\(\s*(.*)\s*\)\s*\)$/)
+            {
+                push @{ $catalog{data} }, {oid => $2, bki_values => $3};
+            }
+            elsif (/^DESCR\(\"(.*)\"\)$/)
+            {
+                $most_recent = $catalog{data}->[-1];
+                # this tests if most recent line is not a DATA() statement
+                if (ref $most_recent ne 'HASH')
+                {
+                    die "DESCR() does not apply to any catalog ($input_file)";
+                }
+                if (!defined $most_recent->{oid})
+                {
+                    die "DESCR() does not apply to any oid ($input_file)";
+                }
+                elsif ($1 ne '')
+                {
+                    $most_recent->{descr} = $1;
+                }
+            }
+            elsif (/^SHDESCR\(\"(.*)\"\)$/)
+            {
+                $most_recent = $catalog{data}->[-1];
+                # this tests if most recent line is not a DATA() statement
+                if (ref $most_recent ne 'HASH')
+                {
+                    die "SHDESCR() does not apply to any catalog ($input_file)";
+                }
+                if (!defined $most_recent->{oid})
+                {
+                    die "SHDESCR() does not apply to any oid ($input_file)";
+                }
+                elsif ($1 ne '')
+                {
+                    $most_recent->{shdescr} = $1;
+                }
+            }
+            elsif (/^DECLARE_TOAST\(\s*(\w+),\s*(\d+),\s*(\d+)\)/)
+            {
+                $catname = 'toasting';
+                my ($toast_name, $toast_oid, $index_oid) = ($1, $2, $3);
+                push @{ $catalog{data} }, "declare toast $toast_oid $index_oid on $toast_name\n";
+            }
+            elsif (/^DECLARE_(UNIQUE_)?INDEX\(\s*(\w+),\s*(\d+),\s*(.+)\)/)
+            {
+                $catname = 'indexing';
+                my ($is_unique, $index_name, $index_oid, $using) = ($1, $2, $3, $4);
+                push @{ $catalog{data} },
+                  sprintf(
+                    "declare %sindex %s %s %s\n",
+                    $is_unique ? 'unique ' : '',
+                    $index_name, $index_oid, $using
+                  );
+            }
+            elsif (/^BUILD_INDICES/)
+            {
+                push @{ $catalog{data} }, "build indices\n";
+            }
+            elsif (/^CATALOG\(([^,]*),(\d+)\)/)
+            {
+                $catname = $1;
+                $catalog{relation_oid} = $2;
+
+                # Store pg_* catalog names in the same order we receive them
+                push @{ $catalogs{names} }, $catname;
+
+                $catalog{bootstrap}       = /BKI_BOOTSTRAP/            ? ' bootstrap'       : '';
+                $catalog{shared_relation} = /BKI_SHARED_RELATION/      ? ' shared_relation' : '';
+                $catalog{without_oids}    = /BKI_WITHOUT_OIDS/         ? ' without_oids'    : '';
+                $catalog{rowtype_oid}     = /BKI_ROWTYPE_OID\((\d+)\)/ ? " rowtype_oid $1"  : '';
+                $catalog{schema_macro}    = /BKI_SCHEMA_MACRO/         ? 'True'             : '';
+                $declaring_attributes = 1;
+            }
+            elsif ($declaring_attributes)
+            {
+                next if (/^{|^$/);
+                if (/^}/)
+                {
+                    undef $declaring_attributes;
+                }
+                else
+                {
+                    my ($atttype, $attname) = split /\s+/, $_;
+                    if (exists $RENAME_ATTTYPE{$atttype})
+                    {
+                        $atttype = $RENAME_ATTTYPE{$atttype};
+                    }
+                    if ($attname =~ /(.*)\[.*\]/)        # array attribute
+                    {
+                        $attname = $1;
+                        $atttype .= '[]';                # variable-length only
+                    }
+                    push @{ $catalog{columns} }, {$attname => $atttype};
+                }
+            }
+        }
+        $catalogs{$catname} = \%catalog;
+        close INPUT_FILE;
+    }
+    return \%catalogs;
+}
+
+# Rename temporary files to final names, if anything has changed.
+# Call this function with the final file name --- we append .tmp automatically
+sub RenameTempFile
+{
+    my $final_name = shift;
+    my $temp_name = $final_name . '.tmp';
+    if (-e $final_name && -s $temp_name == -s $final_name)
+    {
+        open TN, '<', "$temp_name" || die "$temp_name: $!";
+        if (open FN, '<', $final_name)
+        {
+            local $/ = undef;
+            my $tn = <TN>;
+            my $fn = <FN>;
+            close FN;
+            if ($tn eq $fn)
+            {
+                print "$final_name unchanged, not replacing\n";
+                close TN;
+                unlink($temp_name) || die "unlink: $temp_name: $!";
+                return;
+            }
+        }
+        close TN;
+    }
+    print "Writing $final_name\n";
+    rename($temp_name, $final_name) || die "rename: $temp_name: $!";
+}
+
+1;
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index 02a2b01b815b936475de6088a51947ae1e99cd99..7e75a99abd8908bacff77aac2536709ad3673891 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -2,7 +2,7 @@
 #
 # Makefile for backend/catalog
 #
-# $PostgreSQL: pgsql/src/backend/catalog/Makefile,v 1.74 2009/12/11 03:34:55 itagaki Exp $
+# $PostgreSQL: pgsql/src/backend/catalog/Makefile,v 1.75 2010/01/05 01:06:56 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -19,7 +19,7 @@ BKIFILES = postgres.bki postgres.description postgres.shdescription
 
 include $(top_srcdir)/src/backend/common.mk
 
-all: $(BKIFILES)
+all: $(BKIFILES) schemapg.h
 
 # Note: there are some undocumented dependencies on the ordering in which
 # the catalog header files are assembled into postgres.bki.  In particular,
@@ -41,15 +41,21 @@ POSTGRES_BKI_SRCS = $(addprefix $(top_srcdir)/src/include/catalog/,\
 	toasting.h indexing.h \
     )
 
-pg_includes = $(sort -I$(top_srcdir)/src/include -I$(top_builddir)/src/include)
+# location of Catalog.pm
+catalogdir = $(top_srcdir)/src/backend/catalog
+
+# locations of headers that genbki.pl needs to read
+pg_includes = -I$(top_srcdir)/src/include/catalog -I$(top_builddir)/src/include/catalog
 
 # see explanation in ../parser/Makefile
 postgres.description: postgres.bki ;
 
 postgres.shdescription: postgres.bki ;
 
-postgres.bki: genbki.sh $(POSTGRES_BKI_SRCS) $(top_builddir)/src/include/pg_config_manual.h
-	AWK='$(AWK)' $(SHELL) $< $(pg_includes) --set-version=$(VERSION) -o postgres $(POSTGRES_BKI_SRCS)
+schemapg.h: postgres.bki ;
+
+postgres.bki: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS)
+	$(PERL) -I $(catalogdir) $< $(pg_includes) --set-version=$(VERSION) $(POSTGRES_BKI_SRCS)
 
 .PHONY: install-data
 install-data: $(BKIFILES) installdirs
@@ -67,5 +73,9 @@ installdirs:
 uninstall-data:
 	rm -f $(addprefix '$(DESTDIR)$(datadir)'/, $(BKIFILES) system_views.sql information_schema.sql sql_features.txt)
 
+# postgres.bki, postgres.description, postgres.shdescription, and schemapg.h
+# are in the distribution tarball, so they are not cleaned here.
 clean:
+
+maintainer-clean: clean
 	rm -f $(BKIFILES)
diff --git a/src/backend/catalog/README b/src/backend/catalog/README
index 7b71cd582d1e3b6647d78ed3fdb36038d8cbfc54..6d7e0e23c1f83343c71af8fc5ca7df3b08fd6164 100644
--- a/src/backend/catalog/README
+++ b/src/backend/catalog/README
@@ -1,4 +1,4 @@
-$PostgreSQL: pgsql/src/backend/catalog/README,v 1.13 2008/03/21 13:23:28 momjian Exp $
+$PostgreSQL: pgsql/src/backend/catalog/README,v 1.14 2010/01/05 01:06:56 tgl Exp $
 
 System Catalog
 ==============
@@ -7,7 +7,7 @@ This directory contains .c files that manipulate the system catalogs;
 src/include/catalog contains the .h files that define the structure
 of the system catalogs.
 
-When the compile-time scripts (such as Gen_fmgrtab.sh and genbki.sh)
+When the compile-time scripts (Gen_fmgrtab.pl and genbki.pl)
 execute, they grep the DATA statements out of the .h files and munge
 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
@@ -44,7 +44,7 @@ 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
 mechanism to create the necessary #define's automatically: see
-backend/utils/Gen_fmgrtab.sh.  We also have standard conventions for setting
+backend/utils/Gen_fmgrtab.pl.  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.
@@ -75,6 +75,7 @@ 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
+Within this list, pg_type.h must come before pg_attribute.h.
 Also, indexing.h must be last, since the indexes can't be created until all
 the tables are in place, and toasting.h should probably be next-to-last
 (or at least after all the tables that need toast tables).  There are
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
new file mode 100644
index 0000000000000000000000000000000000000000..2020aeeb208dca629334e7f8a91eb9f89bfd94b7
--- /dev/null
+++ b/src/backend/catalog/genbki.pl
@@ -0,0 +1,432 @@
+#!/usr/bin/perl -w
+#----------------------------------------------------------------------
+#
+# genbki.pl
+#    Perl script that generates postgres.bki, postgres.description,
+#    postgres.shdescription, and schemapg.h from specially formatted
+#    header files.  The .bki files are used to initialize the postgres
+#    template database.
+#
+# Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+#
+# $PostgreSQL: pgsql/src/backend/catalog/genbki.pl,v 1.1 2010/01/05 01:06:56 tgl Exp $
+#
+#----------------------------------------------------------------------
+
+use Catalog;
+
+use strict;
+use warnings;
+
+my @input_files;
+our @include_path;
+my $output_path = '';
+my $major_version;
+
+# Process command line switches.
+while (@ARGV)
+{
+    my $arg = shift @ARGV;
+    if ($arg !~ /^-/)
+    {
+        push @input_files, $arg;
+    }
+    elsif ($arg =~ /^-o/)
+    {
+        $output_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
+    }
+    elsif ($arg =~ /^-I/)
+    {
+        push @include_path, length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
+    }
+    elsif ($arg =~ /^--set-version=(\d+\.\d+).*$/)
+    {
+        $major_version = $1;
+    }
+    else
+    {
+        usage();
+    }
+}
+
+# Sanity check arguments.
+die "No input files.\n" if !@input_files;
+die "No include path; you must specify -I at least once.\n" if !@include_path;
+die "Version not specified or wrong format.\n" if !defined $major_version;
+
+# Make sure output_path ends in a slash.
+if ($output_path ne '' && substr($output_path, -1) ne '/')
+{
+    $output_path .= '/';
+}
+
+# Open temp files
+open BKI,      '>', $output_path . 'postgres.bki.tmp'
+  || die "can't open postgres.bki.tmp: $!";
+open SCHEMAPG, '>', $output_path . 'schemapg.h.tmp'
+  || die "can't open 'schemapg.h.tmp: $!";
+open DESCR,    '>', $output_path . 'postgres.description.tmp'
+  || die "can't open postgres.description.tmp: $!";
+open SHDESCR,  '>', $output_path . 'postgres.shdescription.tmp'
+  || die "can't open postgres.shdescription.tmp: $!";
+
+# Fetch some special data that we will substitute into the output file.
+# CAUTION: be wary about what symbols you substitute into the .bki file here!
+# It's okay to substitute things that are expected to be really constant
+# within a given Postgres release, such as fixed OIDs.  Do not substitute
+# anything that could depend on platform or configuration.  (The right place
+# to handle those sorts of things is in initdb.c's bootstrap_template1().)
+# NB: make sure that the files used here are known to be part of the .bki
+# file's dependencies by src/backend/catalog/Makefile.
+my $BOOTSTRAP_SUPERUSERID = find_defined_symbol('pg_authid.h', 'BOOTSTRAP_SUPERUSERID');
+my $PG_CATALOG_NAMESPACE  = find_defined_symbol('pg_namespace.h', 'PG_CATALOG_NAMESPACE');
+
+# Read all the input header files into internal data structures
+my $catalogs = Catalog::Catalogs(@input_files);
+
+# Generate postgres.bki, postgres.description, and postgres.shdescription
+
+# version marker for .bki file
+print BKI "# PostgreSQL $major_version\n";
+
+# vars to hold data needed for schemapg.h
+my %schemapg_entries;
+my @tables_needing_macros;
+our @types;
+
+# produce output, one catalog at a time
+foreach my $catname ( @{ $catalogs->{names} } )
+{
+    # .bki CREATE command for this catalog
+    my $catalog = $catalogs->{$catname};
+    print BKI "create $catname $catalog->{relation_oid}"
+      . $catalog->{shared_relation}
+      . $catalog->{bootstrap}
+      . $catalog->{without_oids}
+      . $catalog->{rowtype_oid}. "\n";
+
+    my %bki_attr;
+    my @attnames;
+    foreach my $column ( @{ $catalog->{columns} } )
+    {
+        my ($attname, $atttype) = %$column;
+        $bki_attr{$attname} = $atttype;
+        push @attnames, $attname;
+    }
+    print BKI " (\n";
+    print BKI join " ,\n", map(" $_ = $bki_attr{$_}", @attnames);
+    print BKI "\n )\n";
+
+    # open it, unless bootstrap case (create bootstrap does this automatically)
+    if ($catalog->{bootstrap} eq '')
+    {
+        print BKI "open $catname\n";
+    }
+
+    if (defined $catalog->{data})
+    {
+        # Ordinary catalog with DATA line(s)
+        foreach my $row ( @{ $catalog->{data} } )
+        {
+            # substitute constant values we acquired above
+            $row->{bki_values} =~ s/\bPGUID\b/$BOOTSTRAP_SUPERUSERID/g;
+            $row->{bki_values} =~ s/\bPGNSP\b/$PG_CATALOG_NAMESPACE/g;
+
+            # Save pg_type info for pg_attribute processing below
+            if ($catname eq 'pg_type')
+            {
+                my %type;
+                $type{oid} = $row->{oid};
+                @type{@attnames} = split /\s+/, $row->{bki_values};
+                push @types, \%type;
+            }
+
+            # Write to postgres.bki
+            my $oid = $row->{oid} ? "OID = $row->{oid} " : '';
+            printf BKI "insert %s( %s)\n", $oid, $row->{bki_values};
+
+            # Write values to postgres.description and postgres.shdescription
+            if (defined $row->{descr})
+            {
+                printf DESCR "%s\t%s\t0\t%s\n", $row->{oid}, $catname, $row->{descr};
+            }
+            if (defined $row->{shdescr})
+            {
+                printf SHDESCR  "%s\t%s\t%s\n", $row->{oid}, $catname, $row->{shdescr};
+            }
+        }
+    }
+    if ($catname eq 'pg_attribute')
+    {
+        # For pg_attribute.h, we generate DATA entries ourselves.
+        # NB: pg_type.h must come before pg_attribute.h in the input list
+        # of catalog names, since we use info from pg_type.h here.
+        foreach my $table_name ( @{ $catalogs->{names} } )
+        {
+            my $table = $catalogs->{$table_name};
+
+            # Build Schema_pg_xxx macros needed by relcache.c.
+            next if $table->{schema_macro} ne 'True';
+
+            $schemapg_entries{$table_name} = [];
+            push @tables_needing_macros, $table_name;
+            my $is_bootstrap = $table->{bootstrap};
+
+            # Both postgres.bki and schemapg.h have entries corresponding
+            # to user attributes
+            my $attnum = 0;
+            my @user_attrs = @{ $table->{columns} };
+            foreach my $attr (@user_attrs)
+            {
+                $attnum++;
+                my $row = emit_pgattr_row($table_name, $attr);
+                $row->{attnum} = $attnum;
+                $row->{attstattarget} = '-1';
+
+                # Of these tables, only bootstrapped ones
+                # have data declarations in postgres.bki
+                if ($is_bootstrap eq ' bootstrap')
+                {
+                    bki_insert($row, @attnames);
+                }
+
+                # Store schemapg entries for later
+                $row = emit_schemapg_row($row, grep { $bki_attr{$_} eq 'bool' } @attnames);
+                push @{ $schemapg_entries{$table_name} },
+                  '{ ' . join(', ', map $row->{$_}, @attnames) . ' }';
+            }
+
+            # Only postgres.bki has entries corresponding to system
+            # attributes, so only bootstrapped relations here
+            if ($is_bootstrap eq ' bootstrap')
+            {
+                $attnum = 0;
+                my @SYS_ATTRS = (
+                    {ctid      => 'tid'},
+                    {oid       => 'oid'},
+                    {xmin      => 'xid'},
+                    {cmin      => 'cid'},
+                    {xmax      => 'xid'},
+                    {cmax      => 'cid'},
+                    {tableoid  => 'oid'}
+                );
+                foreach my $attr (@SYS_ATTRS)
+                {
+                    $attnum--;
+                    my $row = emit_pgattr_row($table_name, $attr);
+
+                    # pg_attribute has no oids -- skip
+                    next if $table_name eq 'pg_attribute' && $row->{attname} eq 'oid';
+
+                    $row->{attnum} = $attnum;
+                    $row->{attstattarget} = '0';
+                    bki_insert($row, @attnames);
+                }
+            }
+        }
+    }
+
+    print BKI "close $catname\n";
+}
+
+# Any information needed for the BKI that is not contained in a pg_*.h header
+# (i.e., not contained in a header with a CATALOG() statement) comes here
+
+# Write out declare toast/index statements
+foreach my $declaration ( @{ $catalogs->{toasting}->{data} } )
+{
+    print BKI $declaration;
+}
+
+foreach my $declaration ( @{ $catalogs->{indexing}->{data} } )
+{
+    print BKI $declaration;
+}
+
+
+# Now generate schemapg.h
+
+# Opening boilerplate for schemapg.h
+print SCHEMAPG <<EOM;
+/*-------------------------------------------------------------------------
+ *
+ * schemapg.h
+ *    Schema_pg_xxx macros for use by relcache.c
+ *
+ * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ *  ******************************
+ *  *** DO NOT EDIT THIS FILE! ***
+ *  ******************************
+ *
+ *  It has been GENERATED by $0
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef SCHEMAPG_H
+#define SCHEMAPG_H
+EOM
+
+# Emit schemapg declarations
+foreach my $table_name (@tables_needing_macros)
+{
+    print SCHEMAPG "\n#define Schema_$table_name \\\n";
+    print SCHEMAPG join ", \\\n", @{ $schemapg_entries{$table_name} };
+    print SCHEMAPG "\n";
+}
+
+# Closing boilerplate for schemapg.h
+print SCHEMAPG "\n#endif /* SCHEMAPG_H */\n";
+
+# We're done emitting data
+close BKI;
+close DESCR;
+close SHDESCR;
+close SCHEMAPG;
+
+# Rename temp files on top of final files, if they have changed
+Catalog::RenameTempFile($output_path . 'postgres.bki');
+Catalog::RenameTempFile($output_path . 'postgres.description');
+Catalog::RenameTempFile($output_path . 'postgres.shdescription');
+Catalog::RenameTempFile($output_path . 'schemapg.h');
+
+exit 0;
+
+#################### Subroutines ########################
+
+
+# Given a system catalog name and a reference to a key-value pair corresponding
+# to the name and type of a column, generate a reference to a pg_attribute
+# entry
+sub emit_pgattr_row
+{
+    my ($table_name, $attr) = @_;
+    my ($attname, $atttype) = %$attr;
+    my %row;
+
+    $row{attrelid} = $catalogs->{$table_name}->{relation_oid};
+    $row{attname} = $attname;
+
+    # Adjust type name for arrays: foo[] becomes _foo
+    # so we can look it up in pg_type
+    if ($atttype =~ /(.+)\[\]$/)
+    {
+        $atttype = '_' . $1;
+    }
+
+    # Copy the type data from pg_type, with minor modifications:
+    foreach my $type (@types)
+    {
+        if ( defined $type->{typname} && $type->{typname} eq $atttype )
+        {
+            $row{atttypid}    = $type->{oid};
+            $row{attlen}      = $type->{typlen};
+            $row{attbyval}    = $type->{typbyval};
+            $row{attstorage}  = $type->{typstorage};
+            $row{attalign}    = $type->{typalign};
+            $row{attndims}    = $type->{typcategory} eq 'A' ? '1' : '0';
+            $row{attnotnull}  = $type->{typstorage}  eq 'x' ? 'f' : 't';
+            last;
+        }
+    }
+
+    # Add in default values for pg_attribute
+    my %PGATTR_DEFAULTS = (
+        attdistinct   => '0',
+        attcacheoff   => '-1',
+        atttypmod     => '-1',
+        atthasdef     => 'f',
+        attisdropped  => 'f',
+        attislocal    => 't',
+        attinhcount   => '0',
+        attacl        => '_null_'
+    );
+    return {%PGATTR_DEFAULTS, %row};
+}
+
+# Write a pg_attribute entry to postgres.bki
+sub bki_insert
+{
+    my $row = shift;
+    my @attnames = @_;
+    my $oid = $row->{oid} ? "OID = $row->{oid} " : '';
+    my $bki_values = join ' ', map $row->{$_}, @attnames;
+    printf BKI "insert %s( %s)\n", $oid, $bki_values;
+}
+
+# The values of a Schema_pg_xxx declaration are similar, but not
+# quite identical, to the corresponding values in pg_attribute.
+sub emit_schemapg_row
+{
+    my $row = shift;
+    my @bool_attrs = @_;
+
+    # pg_index has attrelid = 0 in schemapg.h
+    if ($row->{attrelid} eq '2610')
+    {
+        $row->{attrelid} = '0';
+    }
+
+    $row->{attname}     = q|{"| . $row->{attname}    . q|"}|;
+    $row->{attstorage}  = q|'|  . $row->{attstorage} . q|'|;
+    $row->{attalign}    = q|'|  . $row->{attalign}   . q|'|;
+    $row->{attacl}      = q|{ 0 }|;
+
+    # Expand booleans, accounting for FLOAT4PASSBYVAL etc.
+    foreach my $attr (@bool_attrs)
+    {
+        $row->{$attr} =
+            $row->{$attr} eq 't' ? 'true'
+          : $row->{$attr} eq 'f' ? 'false'
+          :                        $row->{$attr};
+    }
+    return $row;
+}
+
+# Find a symbol defined in a particular header file and extract the value.
+sub find_defined_symbol
+{
+    my ($catalog_header, $symbol) = @_;
+    for my $path (@include_path)
+    {
+        # Make sure include path ends in a slash.
+        if (substr($path, -1) ne '/')
+        {
+            $path .= '/';
+        }
+        my $file = $path . $catalog_header;
+        next if !-f $file;
+        open(FIND_DEFINED_SYMBOL, '<', $file) || die "$file: $!";
+        while (<FIND_DEFINED_SYMBOL>)
+        {
+            if (/^#define\s+\Q$symbol\E\s+(\S+)/)
+            {
+                return $1;
+            }
+        }
+        close FIND_DEFINED_SYMBOL;
+        die "$file: no definition found for $symbol\n";
+    }
+    die "$catalog_header: not found in any include directory\n";
+}
+
+sub usage
+{
+    die <<EOM;
+Usage: genbki.pl [options] header...
+
+Options:
+    -I               path to include files
+    -o               output path
+    --set-version    PostgreSQL version number for initdb cross-check
+
+genbki.pl generates BKI files from specially formatted
+header files.  These BKI files are used to initialize the
+postgres template database.
+
+Report bugs to <pgsql-bugs\@postgresql.org>.
+EOM
+}
diff --git a/src/backend/catalog/genbki.sh b/src/backend/catalog/genbki.sh
deleted file mode 100644
index d1acfe2e6f457016daefb22cfa25319a05d3fba4..0000000000000000000000000000000000000000
--- a/src/backend/catalog/genbki.sh
+++ /dev/null
@@ -1,438 +0,0 @@
-#! /bin/sh
-#-------------------------------------------------------------------------
-#
-# genbki.sh--
-#    shell script which generates .bki files from specially formatted .h
-#    files.  These .bki files are used to initialize the postgres template
-#    database.
-#
-# Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
-# Portions Copyright (c) 1994, Regents of the University of California
-#
-#
-# IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/catalog/genbki.sh,v 1.49 2010/01/02 16:57:36 momjian Exp $
-#
-# NOTES
-#    non-essential whitespace is removed from the generated file.
-#    if this is ever a problem, then the sed script at the very
-#    end can be changed into another awk script or something smarter.
-#
-#-------------------------------------------------------------------------
-
-: ${AWK='awk'}
-
-CMDNAME=`basename $0`
-
-INCLUDE_DIRS=
-OUTPUT_PREFIX=
-INFILES=
-major_version=
-
-#
-# Process command line switches.
-#
-while [ $# -gt 0 ]
-do
-    case $1 in
-        -I)
-            INCLUDE_DIRS="$INCLUDE_DIRS $2"
-            shift;;
-        -I*)
-            arg=`echo $1 | sed -e 's/^-I//'`
-            INCLUDE_DIRS="$INCLUDE_DIRS $arg"
-            ;;
-        -o)
-            OUTPUT_PREFIX="$2"
-            shift;;
-        -o*)
-            OUTPUT_PREFIX=`echo $1 | sed -e 's/^-o//'`
-            ;;
-        --set-version=*)
-            arg=`expr x"$1" : x"--set-version=\(.*\)"`
-            major_version=`expr x"$arg" : x'\([0-9][0-9]*\.[0-9][0-9]*\)'`
-            ;;
-        --help)
-            echo "$CMDNAME generates system catalog bootstrapping files."
-            echo
-            echo "Usage:"
-            echo "  $CMDNAME [ -I dir ] --set-version=VERSION -o prefix files..."
-            echo
-            echo "Options:"
-            echo "  -I  path to include files"
-            echo "  -o  prefix of output files"
-            echo "  --set-version  PostgreSQL version number for initdb cross-check"
-            echo
-            echo "The environment variable AWK determines which Awk program"
-            echo "to use. The default is \`awk'."
-            echo
-            echo "Report bugs to <pgsql-bugs@postgresql.org>."
-            exit 0
-            ;;
-        -*)
-            echo "$CMDNAME: invalid option: $1"
-            exit 1
-            ;;
-        *)
-            INFILES="$INFILES $1"
-            ;;
-    esac
-    shift
-done
-
-if [ x"$INFILES" = x"" ] ; then
-    echo "$CMDNAME: no input files" 1>&2
-    exit 1
-fi
-
-if [ x"$OUTPUT_PREFIX" = x"" ] ; then
-    echo "$CMDNAME: no output prefix specified" 1>&2
-    exit 1
-fi
-
-if [ x"$INCLUDE_DIRS" = x"" ] ; then
-    echo "$CMDNAME: path to include directory unknown" 1>&2
-    exit 1
-fi
-
-if [ x"$major_version" = x"" ] ; then
-    echo "$CMDNAME: invalid or no version number specified" 1>&2
-    exit 1
-fi
-
-
-TMPFILE="genbkitmp$$.c"
-
-trap "rm -f $TMPFILE ${OUTPUT_PREFIX}.bki.$$ ${OUTPUT_PREFIX}.description.$$ ${OUTPUT_PREFIX}.shdescription.$$" 0 1 2 3 15
-
-
-# CAUTION: be wary about what symbols you substitute into the .bki file here!
-# It's okay to substitute things that are expected to be really constant
-# within a given Postgres release, such as fixed OIDs.  Do not substitute
-# anything that could depend on platform or configuration.  (The right place
-# to handle those sorts of things is in initdb.c's bootstrap_template1().)
-
-# Get BOOTSTRAP_SUPERUSERID from catalog/pg_authid.h
-for dir in $INCLUDE_DIRS; do
-    if [ -f "$dir/catalog/pg_authid.h" ]; then
-        BOOTSTRAP_SUPERUSERID=`grep '^#define[ 	]*BOOTSTRAP_SUPERUSERID' $dir/catalog/pg_authid.h | $AWK '{ print $3 }'`
-        break
-    fi
-done
-
-# Get PG_CATALOG_NAMESPACE from catalog/pg_namespace.h
-for dir in $INCLUDE_DIRS; do
-    if [ -f "$dir/catalog/pg_namespace.h" ]; then
-        PG_CATALOG_NAMESPACE=`grep '^#define[ 	]*PG_CATALOG_NAMESPACE' $dir/catalog/pg_namespace.h | $AWK '{ print $3 }'`
-        break
-    fi
-done
-
-touch ${OUTPUT_PREFIX}.description.$$
-touch ${OUTPUT_PREFIX}.shdescription.$$
-
-# ----------------
-# 	Strip comments and other trash from .h
-#
-#	Put multi-line start/end comments on a separate line
-#
-#	Rename datatypes that have different names in .h files than in SQL
-#
-#	Substitute values of configuration constants
-# ----------------
-#
-cat $INFILES | \
-sed -e 's;/\*.*\*/;;g' \
-    -e 's;/\*;\
-/*\
-;g' \
-    -e 's;\*/;\
-*/\
-;g' | # we must run a new sed here to see the newlines we added
-sed -e "s/;[ 	]*$//g" \
-    -e "s/^[ 	]*//" \
-    -e "s/[ 	]Oid/ oid/g" \
-    -e "s/^Oid/oid/g" \
-    -e "s/(Oid/(oid/g" \
-    -e "s/[ 	]NameData/ name/g" \
-    -e "s/^NameData/name/g" \
-    -e "s/(NameData/(name/g" \
-    -e "s/[ 	]TransactionId/ xid/g" \
-    -e "s/^TransactionId/xid/g" \
-    -e "s/(TransactionId/(xid/g" \
-    -e "s/PGUID/$BOOTSTRAP_SUPERUSERID/g" \
-    -e "s/PGNSP/$PG_CATALOG_NAMESPACE/g" \
-| $AWK '
-# ----------------
-#	now use awk to process remaining .h file..
-#
-#	nc is the number of catalogs
-#	inside is a variable set to 1 when we are scanning the
-#	   contents of a catalog definition.
-#	reln_open is a flag indicating when we are processing DATA lines.
-#	   (i.e. have a relation open and need to close it)
-#	oid is the most recently seen oid, or 0 if none in the last DATA line.
-# ----------------
-BEGIN {
-	inside = 0;
-	bootstrap = "";
-	shared_relation = "";
-	without_oids = "";
-	rowtype_oid = "";
-	nc = 0;
-	reln_open = 0;
-	comment_level = 0;
-	oid = 0;
-}
-
-# ----------------
-# Anything in a /* .. */ block should be ignored.
-# Blank lines also go.
-# Note that any /* */ comment on a line by itself was removed from the line
-# by the sed above.
-# ----------------
-/^\/\*/           { comment_level += 1; next; }
-/^\*\//           { comment_level -= 1; next; }
-comment_level > 0 { next; }
-
-/^[ 	]*$/      { next; }
-
-# ----------------
-#	DATA() statements are basically passed right through after
-#	stripping off the DATA( and the ) on the end.
-#	Remember the OID for use by DESCR() and SHDESCR().
-# ----------------
-/^DATA\(/ {
-	data = substr($0, 6, length($0) - 6);
-	oid = 0;
-	nf = split(data, datafields);
-	if (nf >= 4 && datafields[1] == "insert" && datafields[2] == "OID" && datafields[3] == "=")
-	{
-		oid = datafields[4];
-	}
-	print data;
-	next;
-}
-
-/^DESCR\(/ {
-	if (oid != 0)
-	{
-		data = substr($0, 8, length($0) - 9);
-		if (data != "")
-			printf "%d\t%s\t0\t%s\n", oid, catalog, data >>descriptionfile;
-	}
-	next;
-}
-
-/^SHDESCR\(/ {
-	if (oid != 0)
-	{
-		data = substr($0, 10, length($0) - 11);
-		if (data != "")
-			printf "%d\t%s\t%s\n", oid, catalog, data >>shdescriptionfile;
-	}
-	next;
-}
-
-/^DECLARE_INDEX\(/ {
-# ----
-#  end any prior catalog data insertions before starting a define index
-# ----
-	if (reln_open == 1) {
-		print "close " catalog;
-		reln_open = 0;
-	}
-
-	data = substr($0, 15, length($0) - 15);
-	pos = index(data, ",");
-	iname = substr(data, 1, pos-1);
-	data = substr(data, pos+1, length(data)-pos);
-	pos = index(data, ",");
-	oid = substr(data, 1, pos-1);
-	data = substr(data, pos+1, length(data)-pos);
-
-	print "declare index " iname " " oid " " data
-}
-
-/^DECLARE_UNIQUE_INDEX\(/ {
-# ----
-#  end any prior catalog data insertions before starting a define unique index
-# ----
-	if (reln_open == 1) {
-		print "close " catalog;
-		reln_open = 0;
-	}
-
-	data = substr($0, 22, length($0) - 22);
-	pos = index(data, ",");
-	iname = substr(data, 1, pos-1);
-	data = substr(data, pos+1, length(data)-pos);
-	pos = index(data, ",");
-	oid = substr(data, 1, pos-1);
-	data = substr(data, pos+1, length(data)-pos);
-
-	print "declare unique index " iname " " oid " " data
-}
-
-/^DECLARE_TOAST\(/ {
-# ----
-#  end any prior catalog data insertions before starting a define toast
-# ----
-	if (reln_open == 1) {
-		print "close " catalog;
-		reln_open = 0;
-	}
-
-	data = substr($0, 15, length($0) - 15);
-	pos = index(data, ",");
-	tname = substr(data, 1, pos-1);
-	data = substr(data, pos+1, length(data)-pos);
-	pos = index(data, ",");
-	toastoid = substr(data, 1, pos-1);
-	data = substr(data, pos+1, length(data)-pos);
-	# previous commands already removed the trailing );
-	indexoid = data;
-
-	print "declare toast " toastoid " " indexoid " on " tname
-}
-
-/^BUILD_INDICES/	{ print "build indices"; }
-	
-# ----------------
-#	CATALOG() definitions take some more work.
-# ----------------
-/^CATALOG\(/ { 
-# ----
-#  end any prior catalog data insertions before starting a new one..
-# ----
-	if (reln_open == 1) {
-		print "close " catalog;
-		reln_open = 0;
-	}
-
-# ----
-#  get the name and properties of the new catalog
-# ----
-	pos = index($1,")");
-	catalogandoid = substr($1,9,pos-9);
-	pos = index(catalogandoid, ",");
-	catalog = substr(catalogandoid, 1, pos-1);
-	oid = substr(catalogandoid, pos+1, length(catalogandoid)-pos);
-
-	if ($0 ~ /BKI_BOOTSTRAP/) {
-		bootstrap = " bootstrap";
-	}
-	if ($0 ~ /BKI_SHARED_RELATION/) {
-		shared_relation = " shared_relation";
-	}
-	if ($0 ~ /BKI_WITHOUT_OIDS/) {
-		without_oids = " without_oids";
-	}
-	if ($0 ~ /BKI_ROWTYPE_OID\([0-9]*\)/) {
-		tmp = $0;
-		sub(/^.*BKI_ROWTYPE_OID\(/, "", tmp);
-		sub(/\).*$/, "", tmp);
-		rowtype_oid = " rowtype_oid " tmp;
-	}
-
-        i = 1;
-	inside = 1;
-        nc++;
-	next;
-}
-
-# ----------------
-#	process the columns of the catalog definition
-#
-#	attname[ x ] contains the attribute name for attribute x
-#	atttype[ x ] contains the attribute type fot attribute x
-# ----------------
-inside == 1 {
-# ----
-#  ignore a leading brace line..
-# ----
-        if ($1 ~ /\{/)
-		next;
-
-# ----
-#  if this is the last line, then output the bki catalog stuff.
-# ----
-	if ($1 ~ /}/) {
-		print "create " catalog " " oid bootstrap shared_relation without_oids rowtype_oid;
-		print "\t(";
-
-		for (j=1; j<i-1; j++) {
-			print "\t " attname[ j ] " = " atttype[ j ] " ,";
-		}
-		print "\t " attname[ j ] " = " atttype[ j ] ;
-		print "\t)";
-
-		if (bootstrap == "") {
-			print "open " catalog;
-		}
-
-		i = 1;
-		reln_open = 1;
-		inside = 0;
-		bootstrap = "";
-		shared_relation = "";
-		without_oids = "";
-		rowtype_oid = "";
-		next;
-	}
-
-# ----
-#  we are inside the catalog definition, so keep sucking up
-#  attribute names and types
-# ----
-	if ($2 ~ /\[.*\]/) {			# array attribute
-		idlen = index($2,"[") - 1;
-		atttype[ i ] = $1 "[]";		# variable-length only..
-		attname[ i ] = substr($2,1,idlen);
-	} else {
-		atttype[ i ] = $1;
-		attname[ i ] = $2;
-	}
-	i++;
-	next;
-}
-
-END {
-	if (reln_open == 1) {
-		print "close " catalog;
-		reln_open = 0;
-	}
-}
-' "descriptionfile=${OUTPUT_PREFIX}.description.$$" "shdescriptionfile=${OUTPUT_PREFIX}.shdescription.$$" > $TMPFILE || exit
-
-echo "# PostgreSQL $major_version" >${OUTPUT_PREFIX}.bki.$$
-
-sed -e '/^[ 	]*$/d' \
-    -e 's/[ 	][ 	]*/ /g' $TMPFILE >>${OUTPUT_PREFIX}.bki.$$ || exit
-
-#
-# Sanity check: if one of the sed/awk/etc commands fails, we'll probably
-# end up with a .bki file that is empty or just a few lines.  Cross-check
-# that the files are of reasonable size.  The numbers here are arbitrary,
-# but are much smaller than the actual expected sizes as of Postgres 7.2.
-#
-if [ `wc -c < ${OUTPUT_PREFIX}.bki.$$` -lt 100000 ]; then
-    echo "$CMDNAME: something seems to be wrong with the .bki file" >&2
-    exit 1
-fi
-if [ `wc -c < ${OUTPUT_PREFIX}.description.$$` -lt 10000 ]; then
-    echo "$CMDNAME: something seems to be wrong with the .description file" >&2
-    exit 1
-fi
-if [ `wc -c < ${OUTPUT_PREFIX}.shdescription.$$` -lt 10 ]; then
-    echo "$CMDNAME: something seems to be wrong with the .shdescription file" >&2
-    exit 1
-fi
-
-# Looks good, commit ...
-
-mv ${OUTPUT_PREFIX}.bki.$$ ${OUTPUT_PREFIX}.bki || exit
-mv ${OUTPUT_PREFIX}.description.$$ ${OUTPUT_PREFIX}.description || exit
-mv ${OUTPUT_PREFIX}.shdescription.$$ ${OUTPUT_PREFIX}.shdescription || exit
-
-exit 0
diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl
index 1ba7d9d3626f7a168c9d0bb4494c3c6efb777db3..5b281e874e922e209ec0ceab183a93660b0307bc 100644
--- a/src/backend/utils/Gen_fmgrtab.pl
+++ b/src/backend/utils/Gen_fmgrtab.pl
@@ -2,85 +2,89 @@
 #-------------------------------------------------------------------------
 #
 # Gen_fmgrtab.pl
-#    Perl equivalent of Gen_fmgrtab.sh
-#
-# Usage: perl Gen_fmgrtab.pl path-to-pg_proc.h
-#
-# The reason for implementing this functionality twice is that we don't
-# require people to have perl to build from a tarball, but on the other
-# hand Windows can't deal with shell scripts.
+#    Perl script that generates fmgroids.h and fmgrtab.c from pg_proc.h
 #
 # Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
 # Portions Copyright (c) 1994, Regents of the University of California
 #
 #
 # IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/utils/Gen_fmgrtab.pl,v 1.3 2010/01/02 16:57:53 momjian Exp $
+#    $PostgreSQL: pgsql/src/backend/utils/Gen_fmgrtab.pl,v 1.4 2010/01/05 01:06:56 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
+use Catalog;
+
 use strict;
 use warnings;
 
 # Collect arguments
-my $infile = shift;
-defined($infile) || die "$0: missing required argument: pg_proc.h\n";
-
-# Note: see Gen_fmgrtab.sh for detailed commentary on what this is doing
-
-# Collect column numbers for pg_proc columns we need
-my ($proname, $prolang, $proisstrict, $proretset, $pronargs, $prosrc);
-
-open(I, $infile) || die "Could not open $infile: $!";
-while (<I>)
+my $infile;        # pg_proc.h
+my $output_path = '';
+while (@ARGV)
 {
-    if (m/#define Anum_pg_proc_proname\s+(\d+)/) {
-	$proname = $1;
+    my $arg = shift @ARGV;
+    if ($arg !~ /^-/)
+    {
+        $infile = $arg;
     }
-    if (m/#define Anum_pg_proc_prolang\s+(\d+)/) {
-	$prolang = $1;
+    elsif ($arg =~ /^-o/)
+    {
+        $output_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
     }
-    if (m/#define Anum_pg_proc_proisstrict\s+(\d+)/) {
-	$proisstrict = $1;
-    }
-    if (m/#define Anum_pg_proc_proretset\s+(\d+)/) {
-	$proretset = $1;
-    }
-    if (m/#define Anum_pg_proc_pronargs\s+(\d+)/) {
-	$pronargs = $1;
-    }
-    if (m/#define Anum_pg_proc_prosrc\s+(\d+)/) {
-	$prosrc = $1;
+    else
+    {
+        usage();
     }
 }
-close(I);
 
-# Collect the raw data
+# Make sure output_path ends in a slash.
+if ($output_path ne '' && substr($output_path, -1) ne '/')
+{
+    $output_path .= '/';
+}
+
+# Read all the data from the include/catalog files.
+my $catalogs = Catalog::Catalogs($infile);
+
+# Collect the raw data from pg_proc.h.
 my @fmgr = ();
+my @attnames;
+foreach my $column ( @{ $catalogs->{pg_proc}->{columns} } )
+{
+    push @attnames, keys %$column;
+}
 
-open(I, $infile) || die "Could not open $infile: $!";
-while (<I>)
+my $data = $catalogs->{pg_proc}->{data};
+foreach my $row (@$data)
 {
-    next unless (/^DATA/);
-    s/^[^O]*OID[^=]*=[ \t]*//;
-    s/\(//;
-    s/"[^"]*"/"xxx"/g;
-    my @p = split;
-    next if ($p[$prolang] ne "12");
+
+    # To construct fmgroids.h and fmgrtab.c, we need to inspect some
+    # of the individual data fields.  Just splitting on whitespace
+    # won't work, because some quoted fields might contain internal
+    # whitespace.  We handle this by folding them all to a simple
+    # "xxx". Fortunately, this script doesn't need to look at any
+    # fields that might need quoting, so this simple hack is
+    # sufficient.
+    $row->{bki_values} =~ s/"[^"]*"/"xxx"/g;
+    @{$row}{@attnames} = split /\s+/, $row->{bki_values};
+
+    # Select out just the rows for internal-language procedures.
+    # Note assumption here that INTERNALlanguageId is 12.
+    next if $row->{prolang} ne '12';
+
     push @fmgr,
       {
-        oid     => $p[0],
-        proname => $p[$proname],
-        strict  => $p[$proisstrict],
-        retset  => $p[$proretset],
-        nargs   => $p[$pronargs],
-        prosrc  => $p[$prosrc],
+        oid    => $row->{oid},
+        strict => $row->{proisstrict},
+        retset => $row->{proretset},
+        nargs  => $row->{pronargs},
+        prosrc => $row->{prosrc},
       };
 }
-close(I);
 
 # Emit headers for both files
-open(H, '>', "$$-fmgroids.h") || die "Could not open $$-fmgroids.h: $!";
+open H, '>', $output_path . 'fmgroids.h.tmp' || die "Could not open fmgroids.h.tmp: $!";
 print H 
 qq|/*-------------------------------------------------------------------------
  *
@@ -119,7 +123,7 @@ qq|/*-------------------------------------------------------------------------
  */
 |;
 
-open(T, '>', "$$-fmgrtab.c") || die "Could not open $$-fmgrtab.c: $!";
+open T, '>', $output_path . 'fmgrtab.c.tmp' || die "Could not open fmgrtab.c.tmp: $!";
 print T
 qq|/*-------------------------------------------------------------------------
  *
@@ -186,9 +190,18 @@ const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1;
 close(T);
 
 # Finally, rename the completed files into place.
-rename "$$-fmgroids.h", "fmgroids.h"
-    || die "Could not rename $$-fmgroids.h to fmgroids.h: $!";
-rename "$$-fmgrtab.c", "fmgrtab.c"
-    || die "Could not rename $$-fmgrtab.c to fmgrtab.c: $!";
+Catalog::RenameTempFile($output_path . 'fmgroids.h');
+Catalog::RenameTempFile($output_path . 'fmgrtab.c');
+
+sub usage
+{
+    die <<EOM;
+Usage: perl -I [directory of Catalog.pm] Gen_fmgrtab.pl [path to pg_proc.h]
+
+Gen_fmgrtab.pl generates fmgroids.h and fmgrtab.c from pg_proc.h
+
+Report bugs to <pgsql-bugs\@postgresql.org>.
+EOM
+}
 
 exit 0;
diff --git a/src/backend/utils/Gen_fmgrtab.sh b/src/backend/utils/Gen_fmgrtab.sh
deleted file mode 100644
index 96b2d21164c9100b5805db21c718c2d3c2f2c2ec..0000000000000000000000000000000000000000
--- a/src/backend/utils/Gen_fmgrtab.sh
+++ /dev/null
@@ -1,253 +0,0 @@
-#! /bin/sh
-#-------------------------------------------------------------------------
-#
-# Gen_fmgrtab.sh
-#    shell script to generate fmgroids.h and fmgrtab.c from pg_proc.h
-#
-# NOTE: if you change this, you need to fix Gen_fmgrtab.pl too!
-#
-# Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
-# Portions Copyright (c) 1994, Regents of the University of California
-#
-#
-# IDENTIFICATION
-#    $PostgreSQL: pgsql/src/backend/utils/Gen_fmgrtab.sh,v 1.42 2010/01/02 16:57:53 momjian Exp $
-#
-#-------------------------------------------------------------------------
-
-CMDNAME=`basename $0`
-
-if [ x"$AWK" = x"" ]; then
-	AWK=awk
-fi
-
-cleanup(){
-    [ x"$noclean" != x"t" ] && rm -f "$SORTEDFILE" "$$-$OIDSFILE" "$$-$TABLEFILE"
-}
-
-noclean=
-
-#
-# Process command line switches.
-#
-while [ $# -gt 0 ]
-do
-    case $1 in
-        --noclean)
-            noclean=t
-            ;;
-        --help)
-            echo "$CMDNAME generates fmgroids.h and fmgrtab.c from pg_proc.h."
-            echo
-            echo "Usage:"
-            echo "  $CMDNAME inputfile"
-            echo
-            echo "The environment variable AWK determines which Awk program"
-            echo "to use. The default is \`awk'."
-            echo
-            echo "Report bugs to <pgsql-bugs@postgresql.org>."
-            exit 0
-            ;;
-        -*)
-            echo "$CMDNAME: invalid option: $1"
-            exit 1
-            ;;
-        *)
-            INFILE=$1
-            ;;
-    esac
-    shift
-done
-
-
-if [ x"$INFILE" = x ] ; then
-    echo "$CMDNAME: no input file"
-    exit 1
-fi
-
-SORTEDFILE="$$-fmgr.data"
-OIDSFILE=fmgroids.h
-TABLEFILE=fmgrtab.c
-
-
-trap 'echo "Caught signal." ; cleanup ; exit 1' 1 2 15
-
-#
-# Collect the column numbers of the pg_proc columns we need.  Because we will
-# be looking at data that includes the OID as the first column, add one to
-# each column number.
-#
-proname=`egrep '^#define Anum_pg_proc_proname[ 	]' $INFILE | $AWK '{print $3+1}'`
-prolang=`egrep '^#define Anum_pg_proc_prolang[ 	]' $INFILE | $AWK '{print $3+1}'`
-proisstrict=`egrep '^#define Anum_pg_proc_proisstrict[ 	]' $INFILE | $AWK '{print $3+1}'`
-proretset=`egrep '^#define Anum_pg_proc_proretset[ 	]' $INFILE | $AWK '{print $3+1}'`
-pronargs=`egrep '^#define Anum_pg_proc_pronargs[ 	]' $INFILE | $AWK '{print $3+1}'`
-prosrc=`egrep '^#define Anum_pg_proc_prosrc[ 	]' $INFILE | $AWK '{print $3+1}'`
-
-#
-# Generate the file containing raw pg_proc data.  We do three things here:
-# 1. Strip off the DATA macro call, leaving procedure OID as $1
-# and all the pg_proc field values as $2, $3, etc on each line.
-# 2. Fold quoted fields to simple "xxx".  We need this because such fields
-# may contain whitespace, which would confuse awk's counting of fields.
-# Fortunately, this script doesn't need to look at any fields that might
-# need quoting, so this simple hack is sufficient.
-# 3. Select out just the rows for internal-language procedures.
-#
-# Note assumption here that INTERNALlanguageId == 12.
-#
-egrep '^DATA' $INFILE | \
-sed 	-e 's/^[^O]*OID[^=]*=[ 	]*//' \
-	-e 's/(//' \
-	-e 's/"[^"]*"/"xxx"/g' | \
-$AWK "\$$prolang == \"12\" { print }" | \
-sort -n > $SORTEDFILE
-
-if [ $? -ne 0 ]; then
-    cleanup
-    echo "$CMDNAME failed"
-    exit 1
-fi
-
-
-cpp_define=`echo $OIDSFILE | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | sed -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`
-
-#
-# Generate fmgroids.h
-#
-cat > "$$-$OIDSFILE" <<FuNkYfMgRsTuFf
-/*-------------------------------------------------------------------------
- *
- * $OIDSFILE
- *    Macros that define the OIDs of built-in functions.
- *
- * These macros can be used to avoid a catalog lookup when a specific
- * fmgr-callable function needs to be referenced.
- *
- * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *	******************************
- *	*** DO NOT EDIT THIS FILE! ***
- *	******************************
- *
- *	It has been GENERATED by $CMDNAME
- *	from $INFILE
- *
- *-------------------------------------------------------------------------
- */
-#ifndef $cpp_define
-#define $cpp_define
-
-/*
- *	Constant macros for the OIDs of entries in pg_proc.
- *
- *	NOTE: macros are named after the prosrc value, ie the actual C name
- *	of the implementing function, not the proname which may be overloaded.
- *	For example, we want to be able to assign different macro names to both
- *	char_text() and name_text() even though these both appear with proname
- *	'text'.  If the same C function appears in more than one pg_proc entry,
- *	its equivalent macro will be defined with the lowest OID among those
- *	entries.
- */
-FuNkYfMgRsTuFf
-
-tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' < $SORTEDFILE | \
-$AWK "{ if (seenit[\$$prosrc]++ == 0)
-	printf \"#define F_%s %s\\n\", \$$prosrc, \$1; }" >> "$$-$OIDSFILE"
-
-if [ $? -ne 0 ]; then
-    cleanup
-    echo "$CMDNAME failed"
-    exit 1
-fi
-
-cat >> "$$-$OIDSFILE" <<FuNkYfMgRsTuFf
-
-#endif /* $cpp_define */
-FuNkYfMgRsTuFf
-
-#
-# Generate fmgr's built-in-function table.
-#
-# Print out the function declarations, then the table that refers to them.
-#
-cat > "$$-$TABLEFILE" <<FuNkYfMgRtAbStUfF
-/*-------------------------------------------------------------------------
- *
- * $TABLEFILE
- *    The function manager's table of internal functions.
- *
- * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *
- *	******************************
- *	*** DO NOT EDIT THIS FILE! ***
- *	******************************
- *
- *	It has been GENERATED by $CMDNAME
- *	from $INFILE
- *
- *-------------------------------------------------------------------------
- */
-
-#include "postgres.h"
-
-#include "utils/fmgrtab.h"
-
-FuNkYfMgRtAbStUfF
-
-$AWK "{ if (seenit[\$$prosrc]++ == 0)
-	print \"extern Datum\", \$$prosrc, \"(PG_FUNCTION_ARGS);\"; }" $SORTEDFILE >> "$$-$TABLEFILE"
-
-if [ $? -ne 0 ]; then
-    cleanup
-    echo "$CMDNAME failed"
-    exit 1
-fi
-
-
-cat >> "$$-$TABLEFILE" <<FuNkYfMgRtAbStUfF
-
-const FmgrBuiltin fmgr_builtins[] = {
-FuNkYfMgRtAbStUfF
-
-# Note: using awk arrays to translate from pg_proc values to fmgrtab values
-# may seem tedious, but avoid the temptation to write a quick x?y:z
-# conditional expression instead.  Not all awks have conditional expressions.
-
-$AWK "BEGIN {
-    Bool[\"t\"] = \"true\";
-    Bool[\"f\"] = \"false\";
-}
-{ printf (\"  { %d, \\\"%s\\\", %d, %s, %s, %s },\\n\"),
-	\$1, \$$prosrc, \$$pronargs, Bool[\$$proisstrict], Bool[\$$proretset], \$$prosrc ;
-}" $SORTEDFILE >> "$$-$TABLEFILE"
-
-if [ $? -ne 0 ]; then
-    cleanup
-    echo "$CMDNAME failed"
-    exit 1
-fi
-
-cat >> "$$-$TABLEFILE" <<FuNkYfMgRtAbStUfF
-  /* dummy entry is easier than getting rid of comma after last real one */
-  /* (not that there has ever been anything wrong with *having* a
-     comma after the last field in an array initializer) */
-  { 0, NULL, 0, false, false, NULL }
-};
-
-/* Note fmgr_nbuiltins excludes the dummy entry */
-const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin)) - 1;
-FuNkYfMgRtAbStUfF
-
-# We use the temporary files to avoid problems with concurrent runs
-# (which can happen during parallel make).
-mv "$$-$OIDSFILE" $OIDSFILE
-mv "$$-$TABLEFILE" $TABLEFILE
-
-cleanup
-exit 0
diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index b48b267bc0b0349eb4579ef084720ccecef9b384..8f71c78d43fc50717871ce376888f47da5aca360 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -1,7 +1,7 @@
 #
 # Makefile for utils
 #
-# $PostgreSQL: pgsql/src/backend/utils/Makefile,v 1.28 2008/08/01 13:16:09 alvherre Exp $
+# $PostgreSQL: pgsql/src/backend/utils/Makefile,v 1.29 2010/01/05 01:06:56 tgl Exp $
 #
 
 subdir = src/backend/utils
@@ -11,14 +11,20 @@ include $(top_builddir)/src/Makefile.global
 OBJS        = fmgrtab.o
 SUBDIRS     = adt cache error fmgr hash init mb misc mmgr resowner sort time
 
+# location of Catalog.pm
+catalogdir  = $(top_srcdir)/src/backend/catalog
+
 include $(top_srcdir)/src/backend/common.mk
 
 all: fmgroids.h probes.h
 
 $(SUBDIRS:%=%-recursive): fmgroids.h
 
-fmgroids.h fmgrtab.c: Gen_fmgrtab.sh $(top_srcdir)/src/include/catalog/pg_proc.h
-	AWK='$(AWK)' $(SHELL) $< $(top_srcdir)/src/include/catalog/pg_proc.h
+# see explanation in ../parser/Makefile
+fmgroids.h: fmgrtab.c ;
+
+fmgrtab.c: Gen_fmgrtab.pl $(catalogdir)/Catalog.pm $(top_srcdir)/src/include/catalog/pg_proc.h
+	$(PERL) -I $(catalogdir) $< $(top_srcdir)/src/include/catalog/pg_proc.h
 
 ifneq ($(enable_dtrace), yes)
 probes.h: Gen_dummy_probes.sed
@@ -34,5 +40,10 @@ else
 endif
 
 
+# fmgroids.h and fmgrtab.c are in the distribution tarball, so they
+# are not cleaned here.
 clean:
-	rm -f fmgroids.h fmgrtab.c probes.h
+	rm -f probes.h
+
+maintainer-clean: clean
+	rm -f fmgroids.h fmgrtab.c
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 45a55596be25a436cfa7b854550b4619bdcddd25..bb88ab5eef726b3f12c4aec7a1b8520400e171a3 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.295 2010/01/02 16:57:55 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/cache/relcache.c,v 1.296 2010/01/05 01:06:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -50,6 +50,7 @@
 #include "catalog/pg_rewrite.h"
 #include "catalog/pg_tablespace.h"
 #include "catalog/pg_type.h"
+#include "catalog/schemapg.h"
 #include "commands/trigger.h"
 #include "miscadmin.h"
 #include "optimizer/clauses.h"
diff --git a/src/include/Makefile b/src/include/Makefile
index 1367a7d8f27d3c1ca2e89395c1a8f0c2ddd4363e..ed88dca39429439d026ac1f1a9115cf0e2fdec7c 100644
--- a/src/include/Makefile
+++ b/src/include/Makefile
@@ -4,7 +4,7 @@
 #
 # 'make install' installs whole contents of src/include.
 #
-# $PostgreSQL: pgsql/src/include/Makefile,v 1.29 2009/08/26 22:24:43 petere Exp $
+# $PostgreSQL: pgsql/src/include/Makefile,v 1.30 2010/01/05 01:06:56 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -62,7 +62,7 @@ uninstall:
 
 
 clean:
-	rm -f utils/fmgroids.h parser/gram.h utils/probes.h
+	rm -f utils/fmgroids.h parser/gram.h utils/probes.h catalog/schemapg.h
 
 distclean maintainer-clean: clean
 	rm -f pg_config.h dynloader.h pg_config_os.h stamp-h
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index 05bf73111abb963ff5460f61869696ec57bf4e9f..0fe9b74e716ed1a6dbe715341348cd3af8723e3a 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -5,14 +5,14 @@
  *
  * genbki.h defines CATALOG(), DATA(), BKI_BOOTSTRAP and related macros
  * so that the catalog header files can be read by the C compiler.
- * (These same words are recognized by genbki.sh to build the BKI
+ * (These same words are recognized by genbki.pl to build the BKI
  * bootstrap file from these header files.)
  *
  *
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/genbki.h,v 1.5 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/genbki.h,v 1.6 2010/01/05 01:06:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,6 +27,7 @@
 #define BKI_SHARED_RELATION
 #define BKI_WITHOUT_OIDS
 #define BKI_ROWTYPE_OID(oid)
+#define BKI_SCHEMA_MACRO
 
 /* Declarations that provide the initial content of a catalog */
 /* In C, these need to expand into some harmless, repeatable declaration */
diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h
index a32a8b8b05624aa7db09364a94dd965840a5ac38..6bbb6f71926ada2a19e3469f9f23664db577eb63 100644
--- a/src/include/catalog/indexing.h
+++ b/src/include/catalog/indexing.h
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/indexing.h,v 1.114 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/indexing.h,v 1.115 2010/01/05 01:06:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -37,7 +37,7 @@ extern void CatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple);
 
 /*
  * These macros are just to keep the C compiler from spitting up on the
- * upcoming commands for genbki.sh.
+ * upcoming commands for genbki.pl.
  */
 #define DECLARE_INDEX(name,oid,decl) extern int no_such_variable
 #define DECLARE_UNIQUE_INDEX(name,oid,decl) extern int no_such_variable
@@ -45,7 +45,7 @@ extern void CatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple);
 
 
 /*
- * What follows are lines processed by genbki.sh to create the statements
+ * What follows are lines processed by genbki.pl to create the statements
  * the bootstrap parser will turn into DefineIndex commands.
  *
  * The keyword is DECLARE_INDEX or DECLARE_UNIQUE_INDEX.  The first two
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 236992e1350fb58a1a4af1e3255770adbd4434f0..88b783fcc322f3978f052ca3877fa6b904101927 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_aggregate.h,v 1.69 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_aggregate.h,v 1.70 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index 6d185a54f4a0c7837a96bab66e96891ce84fa547..0daa0b67af5ad99777be40e1075a878e62a613ef 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_am.h,v 1.64 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_am.h,v 1.65 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index ea7267b73560cb98ed6915dc21abe4401dfd25cd..b107c6e4bae85774c97678862a00cd85d135c251 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -29,10 +29,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_amop.h,v 1.91 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_amop.h,v 1.92 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	 the genbki.sh script reads this file and generates .bki
+ *	 the genbki.pl script reads this file and generates .bki
  *	 information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index ba1e5ab41cb150ec944dc5a564fc76e628730cb3..739f2c4b64e52cf7ed0c72b3ff4a02084c9a12d4 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -22,10 +22,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_amproc.h,v 1.76 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_amproc.h,v 1.77 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index 6ac809fdd1e35b39c57fc611dcf6d99f4871bb73..81da20a50265212b8467146d07d0a99493ad4b8b 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_attrdef.h,v 1.25 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_attrdef.h,v 1.26 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index ba689b6f248e4e53241a4bfb5857d75849a809b3..f0de816e592c7b4ec0f349a8411bb97ad10f9921 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -8,17 +8,12 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_attribute.h,v 1.156 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_attribute.h,v 1.157 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
- *	  utils/cache/relcache.c requires hard-coded tuple descriptors
- *	  for some of the system catalogs.	So if the schema for any of
- *	  these changes, be sure and change the appropriate Schema_xxx
- *	  macros!  -cim 2/5/91
- *
  *-------------------------------------------------------------------------
  */
 #ifndef PG_ATTRIBUTE_H
@@ -32,12 +27,13 @@
  *
  *		If you change the following, make sure you change the structs for
  *		system attributes in catalog/heap.c also.
+ *		You may need to change catalog/genbki.pl as well.
  * ----------------
  */
 #define AttributeRelationId  1249
 #define AttributeRelation_Rowtype_Id  75
 
-CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75)
+CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BKI_SCHEMA_MACRO
 {
 	Oid			attrelid;		/* OID of relation containing this attribute */
 	NameData	attname;		/* name of attribute */
@@ -209,310 +205,9 @@ typedef FormData_pg_attribute *Form_pg_attribute;
 /* ----------------
  *		initial contents of pg_attribute
  *
- * NOTE: only "bootstrapped" relations need to be declared here.
- *
- * NOTE: if changing pg_attribute column set, also see the hard-coded
- * entries for system attributes in catalog/heap.c.
- * ----------------
- */
-
-/* ----------------
- *		pg_type
- * ----------------
- */
-#define Schema_pg_type \
-{ 1247, {"typname"},	   19, -1, 0, NAMEDATALEN, 1, 0, -1, -1, false, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typnamespace"},  26, -1, 0,	4,	2, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typowner"},	   26, -1, 0,	4,	3, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typlen"},		   21, -1, 0,	2,	4, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typbyval"},	   16, -1, 0,	1,	5, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typtype"},	   18, -1, 0,	1,	6, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typcategory"},   18, -1, 0,	1,	7, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typispreferred"},16, -1, 0,	1,	8, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typisdefined"},  16, -1, 0,	1,	9, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typdelim"},	   18, -1, 0,	1, 10, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typrelid"},	   26, -1, 0,	4, 11, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typelem"},	   26, -1, 0,	4, 12, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typarray"},	   26, -1, 0,	4, 13, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typinput"},	   24, -1, 0,	4, 14, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typoutput"},	   24, -1, 0,	4, 15, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typreceive"},    24, -1, 0,	4, 16, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typsend"},	   24, -1, 0,	4, 17, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typmodin"},	   24, -1, 0,	4, 18, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typmodout"},	   24, -1, 0,	4, 19, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typanalyze"},    24, -1, 0,	4, 20, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typalign"},	   18, -1, 0,	1, 21, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typstorage"},    18, -1, 0,	1, 22, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typnotnull"},    16, -1, 0,	1, 23, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typbasetype"},   26, -1, 0,	4, 24, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typtypmod"},	   23, -1, 0,	4, 25, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typndims"},	   23, -1, 0,	4, 26, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1247, {"typdefaultbin"}, 25, -1, 0, -1, 27, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1247, {"typdefault"},    25, -1, 0, -1, 28, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }
-
-DATA(insert ( 1247 typname			19 -1 0 NAMEDATALEN	1 0 -1 -1 f p c t f f t 0 _null_));
-DATA(insert ( 1247 typnamespace		26 -1 0 4   2 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typowner			26 -1 0 4   3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typlen			21 -1 0 2   4 0 -1 -1 t p s t f f t 0 _null_));
-DATA(insert ( 1247 typbyval			16 -1 0 1   5 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typtype			18 -1 0 1   6 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typcategory		18 -1 0 1   7 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typispreferred	16 -1 0 1   8 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typisdefined		16 -1 0 1   9 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typdelim			18 -1 0 1  10 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typrelid			26 -1 0 4  11 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typelem			26 -1 0 4  12 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typarray			26 -1 0 4  13 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typinput			24 -1 0 4  14 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typoutput		24 -1 0 4  15 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typreceive		24 -1 0 4  16 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typsend			24 -1 0 4  17 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typmodin			24 -1 0 4  18 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typmodout		24 -1 0 4  19 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typanalyze		24 -1 0 4  20 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typalign			18 -1 0 1  21 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typstorage		18 -1 0 1  22 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typnotnull		16 -1 0 1  23 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1247 typbasetype		26 -1 0 4  24 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typtypmod		23 -1 0 4  25 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typndims			23 -1 0 4  26 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 typdefaultbin	25 -1 0 -1 27 0 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1247 typdefault		25 -1 0 -1 28 0 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1247 ctid				27 0 0  6  -1 0 -1 -1 f p s t f f t 0 _null_));
-DATA(insert ( 1247 oid				26 0 0  4  -2 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 xmin				28 0 0  4  -3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 cmin				29 0 0  4  -4 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 xmax				28 0 0  4  -5 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 cmax				29 0 0  4  -6 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1247 tableoid			26 0 0  4  -7 0 -1 -1 t p i t f f t 0 _null_));
-
-/* ----------------
- *		pg_proc
- * ----------------
- */
-#define Schema_pg_proc \
-{ 1255, {"proname"},			19, -1, 0, NAMEDATALEN,  1, 0, -1, -1, false, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"pronamespace"},		26, -1, 0, 4,	2, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"proowner"},			26, -1, 0, 4,	3, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"prolang"},			26, -1, 0, 4,	4, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"procost"},		   700, -1, 0, 4,	5, 0, -1, -1, FLOAT4PASSBYVAL, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"prorows"},		   700, -1, 0, 4,	6, 0, -1, -1, FLOAT4PASSBYVAL, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"provariadic"},		26, -1, 0, 4,	7, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"proisagg"},			16, -1, 0, 1,	8, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"proiswindow"},		16, -1, 0, 1,	9, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"prosecdef"},			16, -1, 0, 1, 10, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"proisstrict"},		16, -1, 0, 1, 11, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"proretset"},			16, -1, 0, 1, 12, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"provolatile"},		18, -1, 0, 1, 13, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"pronargs"},			21, -1, 0, 2, 14, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"pronargdefaults"},	21, -1, 0, 2, 15, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"prorettype"},			26, -1, 0, 4, 16, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"proargtypes"},		30, -1, 0, -1, 17, 1, -1, -1, false, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1255, {"proallargtypes"},   1028, -1, 0, -1, 18, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1255, {"proargmodes"},	  1002, -1, 0, -1, 19, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1255, {"proargnames"},	  1009, -1, 0, -1, 20, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1255, {"proargdefaults"},		25, -1, 0, -1, 21, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1255, {"prosrc"},				25, -1, 0, -1, 22, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1255, {"probin"},				25, -1, 0, -1, 23, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1255, {"proconfig"},		  1009, -1, 0, -1, 24, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1255, {"proacl"},			  1034, -1, 0, -1, 25, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }
-
-DATA(insert ( 1255 proname			19 -1 0 NAMEDATALEN	1 0 -1 -1 f p c t f f t 0 _null_));
-DATA(insert ( 1255 pronamespace		26 -1 0 4   2 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 proowner			26 -1 0 4   3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 prolang			26 -1 0 4   4 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 procost		   700 -1 0 4   5 0 -1 -1 FLOAT4PASSBYVAL p i t f f t 0 _null_));
-DATA(insert ( 1255 prorows		   700 -1 0 4   6 0 -1 -1 FLOAT4PASSBYVAL p i t f f t 0 _null_));
-DATA(insert ( 1255 provariadic		26 -1 0 4   7 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 proisagg			16 -1 0 1   8 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1255 proiswindow		16 -1 0 1   9 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1255 prosecdef		16 -1 0 1  10 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1255 proisstrict		16 -1 0 1  11 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1255 proretset		16 -1 0 1  12 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1255 provolatile		18 -1 0 1  13 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1255 pronargs			21 -1 0 2  14 0 -1 -1 t p s t f f t 0 _null_));
-DATA(insert ( 1255 pronargdefaults	21 -1 0 2  15 0 -1 -1 t p s t f f t 0 _null_));
-DATA(insert ( 1255 prorettype		26 -1 0 4  16 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 proargtypes		30 -1 0 -1 17 1 -1 -1 f p i t f f t 0 _null_));
-DATA(insert ( 1255 proallargtypes 1028 -1 0 -1 18 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 proargmodes	  1002 -1 0 -1 19 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 proargnames	  1009 -1 0 -1 20 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 proargdefaults	25 -1 0 -1 21 0 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 prosrc			25 -1 0 -1 22 0 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 probin			25 -1 0 -1 23 0 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 proconfig	  1009 -1 0 -1 24 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 proacl		  1034 -1 0 -1 25 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1255 ctid				27 0 0  6  -1 0 -1 -1 f p s t f f t 0 _null_));
-DATA(insert ( 1255 oid				26 0 0  4  -2 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 xmin				28 0 0  4  -3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 cmin				29 0 0  4  -4 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 xmax				28 0 0  4  -5 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 cmax				29 0 0  4  -6 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1255 tableoid			26 0 0  4  -7 0 -1 -1 t p i t f f t 0 _null_));
-
-/* ----------------
- *		pg_attribute
- * ----------------
- */
-#define Schema_pg_attribute \
-{ 1249, {"attrelid"},	  26, -1, 0,	4,	1, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attname"},	  19, -1, 0, NAMEDATALEN,	2, 0, -1, -1, false, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"atttypid"},	  26, -1, 0,	4,	3, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attstattarget"}, 23, -1, 0,	4,	4, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attdistinct"}, 700, -1, 0,	4,	5, 0, -1, -1, FLOAT4PASSBYVAL, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attlen"},		  21, -1, 0,	2,	6, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attnum"},		  21, -1, 0,	2,	7, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attndims"},	  23, -1, 0,	4,	8, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attcacheoff"},  23, -1, 0,	4,	9, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"atttypmod"},	  23, -1, 0,	4, 10, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attbyval"},	  16, -1, 0,	1, 11, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attstorage"},   18, -1, 0,	1, 12, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attalign"},	  18, -1, 0,	1, 13, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attnotnull"},   16, -1, 0,	1, 14, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"atthasdef"},	  16, -1, 0,	1, 15, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attisdropped"}, 16, -1, 0,	1, 16, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attislocal"},   16, -1, 0,	1, 17, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attinhcount"},  23, -1, 0,	4, 18, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1249, {"attacl"},		1034, -1, 0,  -1, 19, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }
-
-DATA(insert ( 1249 attrelid			26 -1 0  4   1 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 attname			19 -1 0 NAMEDATALEN  2 0 -1 -1 f p c t f f t 0 _null_));
-DATA(insert ( 1249 atttypid			26 -1 0  4   3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 attstattarget	23 -1 0  4   4 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 attdistinct	   700 -1 0  4   5 0 -1 -1 FLOAT4PASSBYVAL p i t f f t 0 _null_));
-DATA(insert ( 1249 attlen			21 -1 0  2   6 0 -1 -1 t p s t f f t 0 _null_));
-DATA(insert ( 1249 attnum			21 -1 0  2   7 0 -1 -1 t p s t f f t 0 _null_));
-DATA(insert ( 1249 attndims			23 -1 0  4   8 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 attcacheoff		23 -1 0  4   9 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 atttypmod		23 -1 0  4  10 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 attbyval			16 -1 0  1  11 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1249 attstorage		18 -1 0  1  12 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1249 attalign			18 -1 0  1  13 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1249 attnotnull		16 -1 0  1  14 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1249 atthasdef		16 -1 0  1  15 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1249 attisdropped		16 -1 0  1  16 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1249 attislocal		16 -1 0  1  17 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1249 attinhcount		23 -1 0  4  18 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 attacl		  1034 -1 0 -1  19 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1249 ctid				27 0 0  6  -1 0 -1 -1 f p s t f f t 0 _null_));
-/* no OIDs in pg_attribute */
-DATA(insert ( 1249 xmin				28 0 0  4  -3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 cmin				29 0 0  4  -4 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 xmax				28 0 0  4  -5 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 cmax				29 0 0  4  -6 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1249 tableoid			26 0 0  4  -7 0 -1 -1 t p i t f f t 0 _null_));
-
-/* ----------------
- *		pg_class
- * ----------------
- */
-#define Schema_pg_class \
-{ 1259, {"relname"},	   19, -1, 0, NAMEDATALEN, 1, 0, -1, -1, false, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relnamespace"},  26, -1, 0,	4,	2, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"reltype"},	   26, -1, 0,	4,	3, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relowner"},	   26, -1, 0,	4,	4, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relam"},		   26, -1, 0,	4,	5, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relfilenode"},   26, -1, 0,	4,	6, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"reltablespace"}, 26, -1, 0,	4,	7, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relpages"},	   23, -1, 0,	4,	8, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"reltuples"},	   700, -1, 0, 4,	9, 0, -1, -1, FLOAT4PASSBYVAL, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"reltoastrelid"}, 26, -1, 0,	4, 10, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"reltoastidxid"}, 26, -1, 0,	4, 11, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relhasindex"},   16, -1, 0,	1, 12, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relisshared"},   16, -1, 0,	1, 13, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relistemp"},	   16, -1, 0,	1, 14, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relkind"},	   18, -1, 0,	1, 15, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relnatts"},	   21, -1, 0,	2, 16, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relchecks"},	   21, -1, 0,	2, 17, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relhasoids"},    16, -1, 0,	1, 18, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relhaspkey"},    16, -1, 0,	1, 19, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relhasexclusion"},16, -1, 0,	1, 20, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relhasrules"},   16, -1, 0,	1, 21, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relhastriggers"},16, -1, 0,	1, 22, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relhassubclass"},16, -1, 0,	1, 23, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relfrozenxid"},  28, -1, 0,	4, 24, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1259, {"relacl"},		 1034, -1, 0, -1, 25, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 1259, {"reloptions"},  1009, -1, 0, -1, 26, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }
-
-DATA(insert ( 1259 relname			19 -1 0 NAMEDATALEN	1 0 -1 -1 f p c t f f t 0 _null_));
-DATA(insert ( 1259 relnamespace		26 -1 0 4   2 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 reltype			26 -1 0 4   3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 relowner			26 -1 0 4   4 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 relam			26 -1 0 4   5 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 relfilenode		26 -1 0 4   6 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 reltablespace	26 -1 0 4   7 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 relpages			23 -1 0 4   8 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 reltuples	   700 -1 0 4   9 0 -1 -1 FLOAT4PASSBYVAL p i t f f t 0 _null_));
-DATA(insert ( 1259 reltoastrelid	26 -1 0 4  10 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 reltoastidxid	26 -1 0 4  11 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 relhasindex		16 -1 0 1  12 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relisshared		16 -1 0 1  13 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relistemp		16 -1 0 1  14 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relkind			18 -1 0 1  15 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relnatts			21 -1 0 2  16 0 -1 -1 t p s t f f t 0 _null_));
-DATA(insert ( 1259 relchecks		21 -1 0 2  17 0 -1 -1 t p s t f f t 0 _null_));
-DATA(insert ( 1259 relhasoids		16 -1 0 1  18 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relhaspkey		16 -1 0 1  19 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relhasexclusion	16 -1 0 1  20 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relhasrules		16 -1 0 1  21 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relhastriggers	16 -1 0 1  22 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relhassubclass	16 -1 0 1  23 0 -1 -1 t p c t f f t 0 _null_));
-DATA(insert ( 1259 relfrozenxid		28 -1 0 4  24 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 relacl		  1034 -1 0 -1 25 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1259 reloptions	  1009 -1 0 -1 26 1 -1 -1 f x i f f f t 0 _null_));
-DATA(insert ( 1259 ctid				27 0 0  6  -1 0 -1 -1 f p s t f f t 0 _null_));
-DATA(insert ( 1259 oid				26 0 0  4  -2 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 xmin				28 0 0  4  -3 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 cmin				29 0 0  4  -4 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 xmax				28 0 0  4  -5 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 cmax				29 0 0  4  -6 0 -1 -1 t p i t f f t 0 _null_));
-DATA(insert ( 1259 tableoid			26 0 0  4  -7 0 -1 -1 t p i t f f t 0 _null_));
-
-/* ----------------
- *		pg_database
- *
- * pg_database is not bootstrapped in the same way as the other relations that
- * have hardwired pg_attribute entries in this file.  However, we do need
- * a "Schema_xxx" macro for it --- see relcache.c.
- * ----------------
- */
-#define Schema_pg_database \
-{ 1262, {"datname"},		  19, -1, 0, NAMEDATALEN, 1, 0, -1, -1, false, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datdba"},			  26, -1, 0,	4,	2, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"encoding"},		  23, -1, 0,	4,	3, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datcollate"},		  19, -1, 0, NAMEDATALEN, 4, 0, -1, -1, false, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datctype"},		  19, -1, 0, NAMEDATALEN, 5, 0, -1, -1, false, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datistemplate"},	  16, -1, 0,	1, 6, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datallowconn"},	  16, -1, 0,	1, 7, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datconnlimit"},	  23, -1, 0,	4, 8, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datlastsysoid"},	  26, -1, 0,	4, 9, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datfrozenxid"},	  28, -1, 0,	4, 10, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"dattablespace"},	  26, -1, 0,	4, 11, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 1262, {"datacl"},			1034, -1, 0,   -1, 12, 1, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }
-
-/* ----------------
- *		pg_index
- *
- * pg_index is not bootstrapped in the same way as the other relations that
- * have hardwired pg_attribute entries in this file.  However, we do need
- * a "Schema_xxx" macro for it --- see relcache.c.
+ * The initial contents of pg_attribute are generated at compile time by
+ * genbki.pl.  Only "bootstrapped" relations need be included.
  * ----------------
  */
-#define Schema_pg_index \
-{ 0, {"indexrelid"},		26, -1, 0, 4, 1, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indrelid"},			26, -1, 0, 4, 2, 0, -1, -1, true, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indnatts"},			21, -1, 0, 2, 3, 0, -1, -1, true, 'p', 's', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indisunique"},		16, -1, 0, 1, 4, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indisprimary"},		16, -1, 0, 1, 5, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indimmediate"},		16, -1, 0, 1, 6, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indisclustered"},	16, -1, 0, 1, 7, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indisvalid"},		16, -1, 0, 1, 8, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indcheckxmin"},		16, -1, 0, 1, 9, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indisready"},		16, -1, 0, 1, 10, 0, -1, -1, true, 'p', 'c', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indkey"},			22, -1, 0, -1, 11, 1, -1, -1, false, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indclass"},			30, -1, 0, -1, 12, 1, -1, -1, false, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indoption"},			22, -1, 0, -1, 13, 1, -1, -1, false, 'p', 'i', true, false, false, true, 0, { 0 } }, \
-{ 0, {"indexprs"},			25, -1, 0, -1, 14, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }, \
-{ 0, {"indpred"},			25, -1, 0, -1, 15, 0, -1, -1, false, 'x', 'i', false, false, false, true, 0, { 0 } }
 
 #endif   /* PG_ATTRIBUTE_H */
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h
index a5ee6ac7bae2e036e414b2cb0afaf9734e3a6471..71ce63dc088dd2939e0220c36ac18367745fa93f 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_auth_members.h,v 1.7 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_auth_members.h,v 1.8 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index 53ccc2b8fa8faca0a158d53416a733c17f9d663a..da781035e5c04291ecc3a69f4eafbcfb46cabdcc 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -10,10 +10,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_authid.h,v 1.11 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_authid.h,v 1.12 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index 2d52d938288ea83ef0c8d8cc1408b620863dd7f3..3af28a1bb4fe7435375ab2b053643d9339aecb08 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -10,10 +10,10 @@
  *
  * Copyright (c) 2002-2010, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_cast.h,v 1.43 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_cast.h,v 1.44 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index fd40b455e887666ef83594c04bf834a71cf595e7..ffa7a4766d08e90b3337b5ce90982a78bd30f0d1 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_class.h,v 1.118 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_class.h,v 1.119 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
@@ -29,7 +29,7 @@
 #define RelationRelationId	1259
 #define RelationRelation_Rowtype_Id  83
 
-CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83)
+CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO
 {
 	NameData	relname;		/* class name */
 	Oid			relnamespace;	/* OID of namespace containing this class */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index fa92ff0373e4c6b3dec9d866d6e972eceba3f8b8..4242b24c0e1ced200fe4135965f4c3344fdfe3cf 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_constraint.h,v 1.35 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_constraint.h,v 1.36 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index 0094ca91fc481bc7e7a19ca14215382f728ee12e..5c894940d0a1a176525f811ef05f2a29017e3a83 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_conversion.h,v 1.23 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_conversion.h,v 1.24 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index 031f5f6324d6c1894aa8b72ebcc7def111fe7d84..b9b45a4c5df9a250347faf52c588781912206c44 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_database.h,v 1.52 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_database.h,v 1.53 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
@@ -29,7 +29,7 @@
 #define DatabaseRelationId	1262
 #define DatabaseRelation_Rowtype_Id  1248
 
-CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248)
+CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO
 {
 	NameData	datname;		/* database name */
 	Oid			datdba;			/* owner of database */
diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h
index c3766300e73666d5f7358d3dd01bba1eb30c84fa..fd70f435a51d99a457ce454f83d82d25345b88cb 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_db_role_setting.h,v 1.2 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_db_role_setting.h,v 1.3 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index a57ddae77b1bf2e7642dbe522b0634aff56d7f90..76a90aed4c586a184cf8ffe1abcaa5de9e3f386c 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_default_acl.h,v 1.2 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_default_acl.h,v 1.3 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index 0380189475c4ac7bb2f244de0b360fcf757bf541..0eec51b5ac07408a6f32601f6687d1804473b8fd 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_depend.h,v 1.12 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_depend.h,v 1.13 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_description.h b/src/include/catalog/pg_description.h
index 8aed2bccd49cc745a7a9e60b30013a8aee033655..9e792b375bccc7b3b94ae119b4dcdd90fe6f2db6 100644
--- a/src/include/catalog/pg_description.h
+++ b/src/include/catalog/pg_description.h
@@ -22,10 +22,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_description.h,v 1.29 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_description.h,v 1.30 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
@@ -78,7 +78,7 @@ typedef FormData_pg_description *Form_pg_description;
 /*
  *	Because the contents of this table are taken from the other *.h files,
  *	there is no initialization here.  The initial contents are extracted
- *	by genbki.sh and loaded during initdb.
+ *	by genbki.pl and loaded during initdb.
  */
 
 #endif   /* PG_DESCRIPTION_H */
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index 5528e41bf6dee7743f8df9473fe2b8ab40ab597c..985dcf0a4492ff60b023a9adc0adc68b742e57e6 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -7,10 +7,10 @@
  *
  * Copyright (c) 2006-2010, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_enum.h,v 1.7 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_enum.h,v 1.8 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *	  XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index 348a5d1eec2030446110f9772c49552a1504869d..a3f3b060e41a9b273f5b72ad0b9e6aeeb40a4c8d 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_foreign_data_wrapper.h,v 1.4 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_foreign_data_wrapper.h,v 1.5 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index 448dd1d70c53ac678b714649165dd45e8afbcf7f..e344fb621c103bb5b759af308dbad7c8c4416400 100644
--- a/src/include/catalog/pg_foreign_server.h
+++ b/src/include/catalog/pg_foreign_server.h
@@ -6,10 +6,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_foreign_server.h,v 1.4 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_foreign_server.h,v 1.5 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index a2f52a12996eb6f4fb183cf52f4bf39fb8b0c84c..685fae3c0e7dbef9f9e4dae0e63f8138ecd88b97 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_index.h,v 1.49 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_index.h,v 1.50 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
@@ -28,7 +28,7 @@
  */
 #define IndexRelationId  2610
 
-CATALOG(pg_index,2610) BKI_WITHOUT_OIDS
+CATALOG(pg_index,2610) BKI_WITHOUT_OIDS BKI_SCHEMA_MACRO
 {
 	Oid			indexrelid;		/* OID of the index */
 	Oid			indrelid;		/* OID of the relation it indexes */
diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h
index 73a8721a850392b2f7127def600413067ed9ebc9..4a7320746c2cda14c3952217dc52800396425f2e 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_inherits.h,v 1.29 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_inherits.h,v 1.30 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index 03380dc81920a4330f44d083b1ffbbf9fd206880..4d4a590bbfe4749a50d4a607ddebefd75c7a022c 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_language.h,v 1.36 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_language.h,v 1.37 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_largeobject.h b/src/include/catalog/pg_largeobject.h
index 22201c8a6b333d22b81fb54dc4b9e47608c152d5..cb65803a118196d65f70d8aebf7b30cb9e8ebe8d 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_largeobject.h,v 1.26 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_largeobject.h,v 1.27 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_largeobject_metadata.h b/src/include/catalog/pg_largeobject_metadata.h
index 907ec74ab8e30c1223e12f069a8022ec2c056b4f..bf74bb471d3d57c676c81f6a159be34a8217d90f 100755
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_largeobject_metadata.h,v 1.2 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_largeobject_metadata.h,v 1.3 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_listener.h b/src/include/catalog/pg_listener.h
index 2b0fc4d843906da46b8d5f04b85c0b61d4511091..4d1a77d6602c0dbbee3d40122e1c9b8a7946be94 100644
--- a/src/include/catalog/pg_listener.h
+++ b/src/include/catalog/pg_listener.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_listener.h,v 1.27 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_listener.h,v 1.28 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index 7fad841112ee6b9cb4c7b14b960e3d379889df4e..cc576a51d4f1e6dc38419a834a3ea991f0feedb0 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_namespace.h,v 1.26 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_namespace.h,v 1.27 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index 8b9989a8174cbba2c4bf25d9a80f6571f6e126f8..e5f19c895a868220d50cbc0e2a132237b73ccc8a 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -28,10 +28,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_opclass.h,v 1.86 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_opclass.h,v 1.87 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index 6eadee4a98260cd048a417df414c6455271815ac..fd59882006d87349a011b18aca96869541558c18 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_operator.h,v 1.168 2010/01/02 16:58:01 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_operator.h,v 1.169 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *	  XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 4e2c3b181de1391e10df8c541f368fcb8186e9bf..aa93df8eca25d4b9aa686bbc045146e002254d6c 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_opfamily.h,v 1.12 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_opfamily.h,v 1.13 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_pltemplate.h b/src/include/catalog/pg_pltemplate.h
index 1a03508e5dcb662584e2c41ec5b7cef4888f7330..f7b77081cbca81d3ba0e5a13b54da57866032534 100644
--- a/src/include/catalog/pg_pltemplate.h
+++ b/src/include/catalog/pg_pltemplate.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_pltemplate.h,v 1.11 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_pltemplate.h,v 1.12 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index e8ee82661100756a9f9082255eeb6de153c44a3e..17172969516185130e0a09dc4ac3379f36c81126 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -7,11 +7,11 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.558 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.559 2010/01/05 01:06:56 tgl Exp $
  *
  * NOTES
- *	  The script catalog/genbki.sh reads this file and generates .bki
- *	  information from the DATA() statements.  utils/Gen_fmgrtab.sh
+ *	  The script catalog/genbki.pl reads this file and generates .bki
+ *	  information from the DATA() statements.  utils/Gen_fmgrtab.pl
  *	  generates fmgroids.h and fmgrtab.c the same way.
  *
  *	  XXX do NOT break up DATA() statements into multiple lines!
@@ -33,7 +33,7 @@
 #define ProcedureRelationId  1255
 #define ProcedureRelation_Rowtype_Id  81
 
-CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81)
+CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO
 {
 	NameData	proname;		/* procedure name */
 	Oid			pronamespace;	/* OID of namespace containing this proc */
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index c5df08428cec4cf8a1b560677c4bfd0213c98218..20d4e00c43307477b10a6af5c4509fd5f8f8f08e 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -11,10 +11,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_rewrite.h,v 1.34 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_rewrite.h,v 1.35 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_shdepend.h b/src/include/catalog/pg_shdepend.h
index 57bcaf7b52883b3fdcd800ace79048d9d4aa9af2..081876f250e0ab47b55bf115738b28ce8f9ca981 100644
--- a/src/include/catalog/pg_shdepend.h
+++ b/src/include/catalog/pg_shdepend.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_shdepend.h,v 1.11 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_shdepend.h,v 1.12 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h
index d01e9213d6ad3d3e49eb938f41e6563f8a001db3..2a63b64559e2de09c4a5bb2acced728bdf420811 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -15,10 +15,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_shdescription.h,v 1.8 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_shdescription.h,v 1.9 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
@@ -69,7 +69,7 @@ typedef FormData_pg_shdescription *Form_pg_shdescription;
 /*
  *	Because the contents of this table are taken from the other *.h files,
  *	there is no initialization here.  The initial contents are extracted
- *	by genbki.sh and loaded during initdb.
+ *	by genbki.pl and loaded during initdb.
  */
 
 #endif   /* PG_SHDESCRIPTION_H */
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 31eb5650986abfc5d0bc67745fcd71d086570e26..797774339d1a7e382af735e2960ed3a2c60abb15 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_statistic.h,v 1.41 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_statistic.h,v 1.42 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index 615cf45340c580ac9be775ecf79c3597ecf1767a..1d15cdfa789d01a03379b34b482d2aa43cb3fa39 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_tablespace.h,v 1.13 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_tablespace.h,v 1.14 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index afaafaaa247e66cd71154b7e48b5448262b10bb9..8e1a4bf12b770f0058b31347e5147620918542d1 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_trigger.h,v 1.37 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_trigger.h,v 1.38 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h
index 2cb4628b4027b5bfa14fcc84429f747cabdb531c..fd459d85e67d8b4af50f787949c9c6567ad18b16 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_ts_config.h,v 1.6 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_ts_config.h,v 1.7 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_ts_config_map.h b/src/include/catalog/pg_ts_config_map.h
index 6ded976c65cc717d34de350ece7d200983c2ceae..051936c5551479959359a2114814de5a52b6189b 100644
--- a/src/include/catalog/pg_ts_config_map.h
+++ b/src/include/catalog/pg_ts_config_map.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_ts_config_map.h,v 1.6 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_ts_config_map.h,v 1.7 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h
index 30ff25851c0f8f358d3718f41644f5ae4ac8f9d7..24ba3d6f8b3a13526ff73da3f1de46c010592565 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_ts_dict.h,v 1.6 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_ts_dict.h,v 1.7 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h
index 0f75439e77e90d20783773cec3d122f6ab14052b..12332eadcc869e3c703ad7451a10340ca771ec3e 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_ts_parser.h,v 1.6 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_ts_parser.h,v 1.7 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h
index a860c3a72a1c13caff588ddcdf0162e468e08ac0..4270513115975c2ad2efc1f7612c03919cd24a4c 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -7,10 +7,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_ts_template.h,v 1.7 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_ts_template.h,v 1.8 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *		the genbki.sh script reads this file and generates .bki
+ *		the genbki.pl script reads this file and generates .bki
  *		information from the DATA() statements.
  *
  *		XXX do NOT break up DATA() statements into multiple lines!
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index df9bace87017c1fe7e993ef647dfe9896a612cff..3a10da25c374e49f8af067e4194dd0d03a58f1a0 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -8,10 +8,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.211 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.212 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
@@ -34,7 +34,7 @@
 #define TypeRelationId	1247
 #define TypeRelation_Rowtype_Id  71
 
-CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71)
+CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71) BKI_SCHEMA_MACRO
 {
 	NameData	typname;		/* type name */
 	Oid			typnamespace;	/* OID of namespace containing this type */
@@ -264,9 +264,7 @@ typedef FormData_pg_type *Form_pg_type;
  * Keep the following ordered by OID so that later changes can be made more
  * easily.
  *
- * For types used in the system catalogs, make sure the typlen, typbyval, and
- * typalign values here match the initial values for attlen, attbyval, and
- * attalign in both places in pg_attribute.h for every instance.  Also see
+ * For types used in the system catalogs, make sure the values here match
  * TypInfo[] in bootstrap.c.
  */
 
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index 447613bbe25d382ef26cc735cbc5186e84ef85f7..fb1ceb8f305cf0ff3c2beee512b7ea2b10bc0d48 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -6,10 +6,10 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/pg_user_mapping.h,v 1.4 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/pg_user_mapping.h,v 1.5 2010/01/05 01:06:57 tgl Exp $
  *
  * NOTES
- *	  the genbki.sh script reads this file and generates .bki
+ *	  the genbki.pl script reads this file and generates .bki
  *	  information from the DATA() statements.
  *
  *-------------------------------------------------------------------------
diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h
index 1d2cf86fc3dd0b492dc61d85ff9aa803d184d613..156b2b6374ef992fdbea6f7aa719e8a07687c9e0 100644
--- a/src/include/catalog/toasting.h
+++ b/src/include/catalog/toasting.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/catalog/toasting.h,v 1.11 2010/01/02 16:58:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/catalog/toasting.h,v 1.12 2010/01/05 01:06:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -25,13 +25,13 @@ extern void BootstrapToastTable(char *relName,
 
 /*
  * This macro is just to keep the C compiler from spitting up on the
- * upcoming commands for genbki.sh.
+ * upcoming commands for genbki.pl.
  */
 #define DECLARE_TOAST(name,toastoid,indexoid) extern int no_such_variable
 
 
 /*
- * What follows are lines processed by genbki.sh to create the statements
+ * What follows are lines processed by genbki.pl to create the statements
  * the bootstrap parser will turn into BootstrapToastTable commands.
  * Each line specifies the system catalog that needs a toast table,
  * the OID to assign to the toast table, and the OID to assign to the
diff --git a/src/interfaces/ecpg/ecpglib/pg_type.h b/src/interfaces/ecpg/ecpglib/pg_type.h
index 6b79edcde87be48b478eaba1afe082302d098524..ac6fa4910a2fb9ae6748bb0b1c4f123ebb8505b5 100644
--- a/src/interfaces/ecpg/ecpglib/pg_type.h
+++ b/src/interfaces/ecpg/ecpglib/pg_type.h
@@ -1,32 +1,20 @@
 /*-------------------------------------------------------------------------
  *
  * pg_type.h
- *	  definition of the system "type" relation (pg_type)
- *	  along with the relation's initial contents.
+ *	  Hard-wired knowledge about some standard type OIDs.
  *
+ * XXX keep this in sync with src/include/catalog/pg_type.h
  *
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/pg_type.h,v 1.10 2010/01/02 16:58:11 momjian Exp $
- *
- * NOTES
- *	  the genbki.sh script reads this file and generates .bki
- *	  information from the DATA() statements.
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/pg_type.h,v 1.11 2010/01/05 01:06:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 #ifndef PG_TYPE_H
 #define PG_TYPE_H
 
-/* ----------------
- *		initial contents of pg_type
- * ----------------
- */
-
-/* keep the following ordered by OID so that later changes can be made easier*/
-
-/* OIDS 1 - 99 */
 #define BOOLOID			16
 #define BYTEAOID		17
 #define CHAROID			18
diff --git a/src/tools/msvc/Genbki.pm b/src/tools/msvc/Genbki.pm
deleted file mode 100644
index beadb01babce9c417cf991a19a1ead5ba608c541..0000000000000000000000000000000000000000
--- a/src/tools/msvc/Genbki.pm
+++ /dev/null
@@ -1,262 +0,0 @@
-#!/usr/bin/perl
-#-------------------------------------------------------------------------
-#
-# Genbki.pm --
-#    perl script which generates .bki files from specially formatted .h
-#    files.  These .bki files are used to initialize the postgres template
-#    database.
-#
-# Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
-# Portions Copyright (c) 1994, Regents of the University of California
-#
-#
-# IDENTIFICATION
-#    $PostgreSQL: pgsql/src/tools/msvc/Genbki.pm,v 1.9 2010/01/02 16:58:17 momjian Exp $
-#
-#-------------------------------------------------------------------------
-
-package Genbki;
-
-use strict;
-use warnings;
-
-use Exporter;
-our (@ISA, @EXPORT_OK);
-@ISA = qw(Exporter);
-@EXPORT_OK = qw(genbki);
-
-sub genbki
-{
-    my $version = shift;
-    my $prefix = shift;
-
-    $version =~ /^(\d+\.\d+)/ || die "Bad format version $version\n";
-    my $majorversion = $1;
-
-    my $pgauthid = read_file("src/include/catalog/pg_authid.h");
-    $pgauthid =~ /^#define\s+BOOTSTRAP_SUPERUSERID\s+(\d+)$/mg
-      || die "Could not read BOOTSTRAP_SUPERUSERID from pg_authid.h\n";
-    my $bootstrapsuperuserid = $1;
-
-    my $pgnamespace = read_file("src/include/catalog/pg_namespace.h");
-    $pgnamespace =~ /^#define\s+PG_CATALOG_NAMESPACE\s+(\d+)$/mg
-      || die "Could not read PG_CATALOG_NAMESPACE from pg_namespace.h\n";
-    my $pgcatalognamespace = $1;
-
-    my $indata = "";
-
-    while (@_)
-    {
-        my $f = shift;
-        next unless $f;
-        $indata .= read_file($f);
-        $indata .= "\n";
-    }
-
-    # Strip C comments, from perl FAQ 4.27
-    $indata =~ s{/\*.*?\*/}{}gs;
-
-    $indata =~ s{;\s*$}{}gm;
-    $indata =~ s{^\s+}{}gm;
-    $indata =~ s{^Oid}{oid}gm;
-    $indata =~ s{\(Oid}{(oid}gm;
-    $indata =~ s{^NameData}{name}gm;
-    $indata =~ s{\(NameData}{(name}g;
-    $indata =~ s{^TransactionId}{xid}gm;
-    $indata =~ s{\(TransactionId}{(xid}g;
-    $indata =~ s{PGUID}{$bootstrapsuperuserid}g;
-    $indata =~ s{PGNSP}{$pgcatalognamespace}g;
-
-    #print $indata;
-
-    my $bki = "";
-    my $desc = "";
-    my $shdesc = "";
-
-    my $oid = 0;
-    my $catalog = 0;
-    my $reln_open = 0;
-    my $bootstrap = "";
-    my $shared_relation = "";
-    my $without_oids = "";
-    my $rowtype_oid = "";
-    my $nc = 0;
-    my $inside = 0;
-    my @attr;
-    my @types;
-
-    foreach my $line (split /\n/, $indata)
-    {
-        if ($line =~ /^DATA\((.*)\)$/m)
-        {
-            my $data = $1;
-            my @fields = split /\s+/,$data;
-            if ($#fields >=4 && $fields[0] eq "insert" && $fields[1] eq "OID" && $fields[2] eq "=")
-            {
-                $oid = $fields[3];
-            }
-            else
-            {
-                $oid = 0;
-            }
-            $data =~ s/\s+/ /g;
-            $bki .= $data . "\n";
-        }
-        elsif ($line =~ /^DESCR\("(.*)"\)$/m)
-        {
-            if ($oid != 0)
-            {
-                $desc .= sprintf("%d\t%s\t0\t%s\n", $oid, $catalog, $1);
-            }
-        }
-        elsif ($line =~ /^SHDESCR\("(.*)"\)$/m)
-        {
-            if ($oid != 0)
-            {
-                $shdesc .= sprintf("%d\t%s\t%s\n", $oid, $catalog, $1);
-            }
-        }
-        elsif ($line =~ /^DECLARE_(UNIQUE_)?INDEX\((.*)\)$/m)
-        {
-            if ($reln_open)
-            {
-                $bki .= "close $catalog\n";
-                $reln_open = 0;
-            }
-            my $u = $1?" unique":"";
-            my @fields = split /,/,$2,3;
-            $fields[0] =~ s/\s+//g;
-            $fields[1] =~ s/\s+//g;
-            $fields[2] =~ s/\s+/ /g;
-            $fields[2] =~ s/^\s+//;
-            $bki .= "declare$u index $fields[0] $fields[1] $fields[2]\n";
-        }
-        elsif ($line =~ /^DECLARE_TOAST\((.*)\)$/m)
-        {
-            if ($reln_open)
-            {
-                $bki .= "close $catalog\n";
-                $reln_open = 0;
-            }
-            my @fields = split /,/,$1;
-            $fields[1] =~ s/\s+//g;
-            $fields[2] =~ s/\s+//g;
-            $bki .= "declare toast $fields[1] $fields[2] on $fields[0]\n";
-        }
-        elsif ($line =~ /^BUILD_INDICES/)
-        {
-            $bki .= "build indices\n";
-        }
-        elsif ($line =~ /^CATALOG\(([^)]*)\)(.*)$/m)
-        {
-            if ($reln_open)
-            {
-                $bki .= "close $catalog\n";
-                $reln_open = 0;
-            }
-            my $rest = $2;
-            my @fields = split /,/,$1;
-            $catalog = $fields[0];
-            $oid = $fields[1];
-            $bootstrap=$shared_relation=$without_oids=$rowtype_oid="";
-            if ($rest =~ /BKI_BOOTSTRAP/)
-            {
-                $bootstrap = " bootstrap";
-            }
-            if ($rest =~ /BKI_SHARED_RELATION/)
-            {
-                $shared_relation = " shared_relation";
-            }
-            if ($rest =~ /BKI_WITHOUT_OIDS/)
-            {
-                $without_oids = " without_oids";
-            }
-            if ($rest =~ /BKI_ROWTYPE_OID\((\d+)\)/)
-            {
-                $rowtype_oid = " rowtype_oid $1";
-            }
-            $nc++;
-            $inside = 1;
-            next;
-        }
-        if ($inside==1)
-        {
-            next if ($line =~ /{/);
-            if ($line =~ /}/)
-            {
-
-                # Last line
-                $bki .= "create $catalog $oid$bootstrap$shared_relation$without_oids$rowtype_oid\n (\n";
-                my $first = 1;
-                for (my $i = 0; $i <= $#attr; $i++)
-                {
-                    if ($first == 1)
-                    {
-                        $first = 0;
-                    }
-                    else
-                    {
-                        $bki .= " ,\n";
-                    }
-                    $bki .= " " . $attr[$i] . " = " . $types[$i];
-                }
-                $bki .= "\n )\n";
-                undef(@attr);
-                undef(@types);
-                $reln_open = 1;
-                $inside = 0;
-                if ($bootstrap eq "")
-                {
-                    $bki .= "open $catalog\n";
-                }
-                next;
-            }
-
-            # inside catalog definition, so keep sucking up attributes
-            my @fields = split /\s+/,$line;
-            if ($fields[1] =~ /(.*)\[.*\]/)
-            { #Array attribute
-                push @attr, $1;
-                push @types, $fields[0] . '[]';
-            }
-            else
-            {
-                push @attr, $fields[1];
-                push @types, $fields[0];
-            }
-            next;
-        }
-    }
-    if ($reln_open == 1)
-    {
-        $bki .= "close $catalog\n";
-    }
-
-    open(O,">$prefix.bki") || die "Could not write $prefix.bki\n";
-    print O "# PostgreSQL $majorversion\n";
-    print O $bki;
-    close(O);
-    open(O,">$prefix.description") || die "Could not write $prefix.description\n";
-    print O $desc;
-    close(O);
-    open(O,">$prefix.shdescription") || die "Could not write $prefix.shdescription\n";
-    print O $shdesc;
-    close(O);
-}
-
-sub read_file
-{
-    my $filename = shift;
-    my $F;
-    my $t = $/;
-
-    undef $/;
-    open($F, $filename) || die "Could not open file $filename\n";
-    my $txt = <$F>;
-    close($F);
-    $/ = $t;
-
-    return $txt;
-}
-
-1;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 5dc95c99258fb7ac72ef0ca17190a00d5f966660..9cd8ce557fae8dc242a72958f481984d490b8bf5 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -3,14 +3,12 @@ package Solution;
 #
 # Package that encapsulates a Visual C++ solution file generation
 #
-# $PostgreSQL: pgsql/src/tools/msvc/Solution.pm,v 1.51 2010/01/01 17:34:25 mha Exp $
+# $PostgreSQL: pgsql/src/tools/msvc/Solution.pm,v 1.52 2010/01/05 01:06:57 tgl Exp $
 #
 use Carp;
 use strict;
 use warnings;
 
-use Genbki;
-
 sub new
 {
     my $junk = shift;
@@ -240,7 +238,7 @@ s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY
     {
         print "Generating fmgrtab.c and fmgroids.h...\n";
         chdir('src\backend\utils');
-        system("perl Gen_fmgrtab.pl ../../../src/include/catalog/pg_proc.h");
+        system("perl -I ../catalog Gen_fmgrtab.pl ../../../src/include/catalog/pg_proc.h");
         chdir('..\..\..');
         copyFile('src\backend\utils\fmgroids.h','src\include\utils\fmgroids.h');
     }
@@ -339,12 +337,12 @@ EOF
         next if $bki eq "";
         if (IsNewer('src/backend/catalog/postgres.bki', "src/include/catalog/$bki"))
         {
-            print "Generating postgres.bki...\n";
-            Genbki::genbki(
-                $self->{majorver},
-                "src/backend/catalog/postgres",
-                split(/ /,join(' src/include/catalog/',@allbki))
-            );
+            print "Generating postgres.bki and schemapg.h...\n";
+            chdir('src\backend\catalog');
+            my $bki_srcs = join(' ../../../src/include/catalog/', @allbki);
+            system("perl genbki.pl -I../../../src/include/catalog --set-version=$self->{majorver} $bki_srcs");
+            chdir('..\..\..');
+            copyFile('src\backend\catalog\schemapg.h', 'src\include\catalog\schemapg.h');
             last;
         }
     }
diff --git a/src/tools/msvc/clean.bat b/src/tools/msvc/clean.bat
index 07c9bcb4cdc89fe3a2f3886a13988f72ebedc155..09741f9e6dadd8fe8510875612e2a5cefa405beb 100755
--- a/src/tools/msvc/clean.bat
+++ b/src/tools/msvc/clean.bat
@@ -1,5 +1,5 @@
 @echo off
-REM $PostgreSQL: pgsql/src/tools/msvc/clean.bat,v 1.17 2010/01/01 16:58:53 mha Exp $
+REM $PostgreSQL: pgsql/src/tools/msvc/clean.bat,v 1.18 2010/01/05 01:06:57 tgl Exp $
 
 set DIST=0
 if "%1"=="dist" set DIST=1
@@ -23,11 +23,12 @@ if %DIST%==1 if exist src\backend\parser\gram.h del /q src\backend\parser\gram.h
 if exist src\include\utils\fmgroids.h del /q src\include\utils\fmgroids.h
 if exist src\include\utils\probes.h del /q src\include\utils\probes.h
 
-if exist src\backend\utils\fmgroids.h del /q src\backend\utils\fmgroids.h
-if exist src\backend\utils\fmgrtab.c del /q src\backend\utils\fmgrtab.c
-if exist src\backend\catalog\postgres.bki del /q src\backend\catalog\postgres.bki
-if exist src\backend\catalog\postgres.description del /q src\backend\catalog\postgres.description
-if exist src\backend\catalog\postgres.shdescription del /q src\backend\catalog\postgres.shdescription
+if %DIST%==1 if exist src\backend\utils\fmgroids.h del /q src\backend\utils\fmgroids.h
+if %DIST%==1 if exist src\backend\utils\fmgrtab.c del /q src\backend\utils\fmgrtab.c
+if %DIST%==1 if exist src\backend\catalog\postgres.bki del /q src\backend\catalog\postgres.bki
+if %DIST%==1 if exist src\backend\catalog\postgres.description del /q src\backend\catalog\postgres.description
+if %DIST%==1 if exist src\backend\catalog\postgres.shdescription del /q src\backend\catalog\postgres.shdescription
+if %DIST%==1 if exist src\backend\catalog\schemapg.h del /q src\backend\catalog\schemapg.h
 if %DIST%==1 if exist src\backend\parser\scan.c del /q src\backend\parser\scan.c
 if %DIST%==1 if exist src\backend\parser\gram.c del /q src\backend\parser\gram.c
 if %DIST%==1 if exist src\backend\bootstrap\bootscanner.c del /q src\backend\bootstrap\bootscanner.c