Subject: [PATCH 2/3] Do much more stuff in genbki.pl

From: Andres Freund <[email-masked]>
Date: Sun, 22 Feb 2015 00:06:18 +0100

---
 src/backend/catalog/Catalog.pm                | 261 +++++++++++++++++++++++++-
 src/backend/catalog/Makefile                  |   7 +-
 src/backend/catalog/genbki.pl                 | 163 ++++++++++++++--
 src/backend/utils/Gen_fmgrtab.pl              |   8 +-
 src/backend/utils/Makefile                    |   2 +-
 src/backend/utils/adt/regproc.c               |  82 +-------
 src/include/c.h                               |   4 +
 src/include/catalog/pg_aggregate.h            |   4 +-
 src/include/catalog/pg_amop.h                 |   4 +-
 src/include/catalog/pg_amproc.h               |   4 +-
 src/include/catalog/pg_attrdef.h              |   2 +-
 src/include/catalog/pg_attribute.h            |   4 +-
 src/include/catalog/pg_cast.h                 |   6 +-
 src/include/catalog/pg_class.h                |   2 +-
 src/include/catalog/pg_depend.h               |   4 +-
 src/include/catalog/pg_description.h          |   2 +-
 src/include/catalog/pg_enum.h                 |   2 +-
 src/include/catalog/pg_event_trigger.h        |   2 +-
 src/include/catalog/pg_foreign_data_wrapper.h |   4 +-
 src/include/catalog/pg_index.h                |   4 +-
 src/include/catalog/pg_inherits.h             |   4 +-
 src/include/catalog/pg_language.h             |   6 +-
 src/include/catalog/pg_opclass.h              |   4 +-
 src/include/catalog/pg_operator.h             |   6 +-
 src/include/catalog/pg_policy.h               |   2 +-
 src/include/catalog/pg_proc.h                 |  67 +++----
 src/include/catalog/pg_range.h                |   4 +-
 src/include/catalog/pg_seclabel.h             |   2 +-
 src/include/catalog/pg_shdepend.h             |   4 +-
 src/include/catalog/pg_shdescription.h        |   2 +-
 src/include/catalog/pg_statistic.h            |   2 +-
 src/include/catalog/pg_trigger.h              |   8 +-
 src/include/catalog/pg_type.h                 |   8 +-
 src/test/regress/expected/opr_sanity.out      |  22 +--
 src/test/regress/expected/rules.out           |  64 +++----
 35 files changed, 547 insertions(+), 229 deletions(-)

diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index c7b1c17..d00bc85 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -16,17 +16,104 @@ package Catalog;
 use strict;
 use warnings;
 
+use Carp;
+
 require Exporter;
 our @ISA       = qw(Exporter);
-our @EXPORT    = ();
+our @EXPORT    = qw(regstarout regstarin);
 our @EXPORT_OK = qw(Catalogs RenameTempFile);
 
+
+use feature 'say';
+use Data::Dumper;
+
+sub remember_oid
+{
+	my $catalogs = shift;
+	my $oid = shift;
+	my $data = shift;
+
+	if (!defined $oid)
+	{
+		return;
+	}
+
+	if (defined $catalogs->{oids}->{$oid})
+	{
+		croak "oid $oid is already used: ",
+		Dumper($catalogs->{oids}->{$oid}),
+		" while inserting", Dumper($data);
+	}
+
+	$catalogs->{oids}->{$oid} = $data;
+}
+
+sub assign_oid
+{
+	my $catalogs = shift;
+	my $freeoid;
+
+	#say Dumper($catalogs->{oids});
+	while (1)
+	{
+		if (defined $catalogs->{oids}->{$catalogs->{auto_oid}})
+		{
+			print Dumper($catalogs->{oids}->{$catalogs->{auto_oid}});
+			$catalogs->{auto_oid}++;
+			next;
+		}
+		return $catalogs->{auto_oid}++;
+	}
+}
+
+sub regstarin
+{
+	my $catalogs = shift;
+	my $catname = shift;
+	my $value = shift;
+
+	if ($value ne '-' && $value !~ /^\d+$/)
+	{
+		my $replacement = $catalogs->{$catname}->{byname}->{$value};
+		if (!defined $replacement)
+		{
+			die "could not map $value by name via $catname";
+		}
+		#say "mapping $value to $replacement";
+		$value = $replacement;
+	}
+	return $value
+}
+
+sub regstarout
+{
+	my $catalogs = shift;
+	my $catname = shift;
+	my $value = shift;
+
+	if ($value ne '-' && $value ne '0' && $value =~ /^\d+$/)
+	{
+		my $replacement = $catalogs->{$catname}->{byoid}->{$value};
+		#say "mapping $value to $replacement";
+		if (!defined $replacement)
+		{
+			die "could not map $value via $catname";
+		}
+		$value = $replacement;
+	}
+
+	return $value
+}
+
+
 # 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} = [];
+	$catalogs{oids} = {};
+	$catalogs{auto_oid} = 4500;
 
 	# 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.
@@ -36,7 +123,10 @@ sub Catalogs
 		'int64'         => 'int8',
 		'Oid'           => 'oid',
 		'NameData'      => 'name',
-		'TransactionId' => 'xid');
+		'TransactionId' => 'xid',
+		'regtypea'		=> 'oidvector',
+		'pseudoregtype_' => '_oid'
+	    );
 
 	foreach my $input_file (@_)
 	{
@@ -83,9 +173,9 @@ sub Catalogs
 				{
 					die "DESCR() does not apply to any catalog ($input_file)";
 				}
-				if (!defined $most_recent->{oid})
+				elsif ($catalog{without_oids} ne '')
 				{
-					die "DESCR() does not apply to any oid ($input_file)";
+					die "DESCR() only applies to tables with oids ($input_file)";
 				}
 				elsif ($1 ne '')
 				{
@@ -102,9 +192,9 @@ sub Catalogs
 					die
 					  "SHDESCR() does not apply to any catalog ($input_file)";
 				}
-				if (!defined $most_recent->{oid})
+				elsif ($catalog{without_oids} ne '')
 				{
-					die "SHDESCR() does not apply to any oid ($input_file)";
+					die "SHDESCR() only applies to tables with oids ($input_file)";
 				}
 				elsif ($1 ne '')
 				{
@@ -117,6 +207,9 @@ sub Catalogs
 				my ($toast_name, $toast_oid, $index_oid) = ($1, $2, $3);
 				push @{ $catalog{data} },
 				  "declare toast $toast_oid $index_oid on $toast_name\n";
+
+				remember_oid(\%catalogs, $toast_oid,
+							 {catalog => $catname, toast_name => $toast_name});
 			}
 			elsif (/^DECLARE_(UNIQUE_)?INDEX\(\s*(\w+),\s*(\d+),\s*(.+)\)/)
 			{
@@ -128,6 +221,9 @@ sub Catalogs
 					"declare %sindex %s %s %s\n",
 					$is_unique ? 'unique ' : '',
 					$index_name, $index_oid, $using);
+
+				remember_oid(\%catalogs, $index_oid,
+							 {catalog => $catname, toast_name => $index_name});
 			}
 			elsif (/^BUILD_INDICES/)
 			{
@@ -150,6 +246,13 @@ sub Catalogs
 				  /BKI_ROWTYPE_OID\((\d+)\)/ ? " rowtype_oid $1" : '';
 				$catalog{schema_macro} = /BKI_SCHEMA_MACRO/ ? 'True' : '';
 				$declaring_attributes = 1;
+
+				# skip, these will be in pg_class again
+				if (!$catalog{bootstrap})
+				{
+					remember_oid(\%catalogs, $catalog{relation_oid},
+								 {catalog => $catname, relation_name => $catname});
+				}
 			}
 			elsif ($declaring_attributes)
 			{
@@ -164,10 +267,14 @@ sub Catalogs
 					my %row;
 					my ($atttype, $attname, $attopt) = split /\s+/, $_;
 					die "parse error ($input_file)" unless $attname;
+
+					$row{'original_type'} = $atttype;
+
 					if (exists $RENAME_ATTTYPE{$atttype})
 					{
 						$atttype = $RENAME_ATTTYPE{$atttype};
 					}
+
 					if ($attname =~ /(.*)\[.*\]/)    # array attribute
 					{
 						$attname = $1;
@@ -196,9 +303,151 @@ sub Catalogs
 				}
 			}
 		}
+
+		# allow to lookup columns by name
+		$catalog{columns_byname} = {};
+		my @columnnames;
+		my @columntypes;
+
+		foreach my $column (@{ $catalog{columns} })
+		{
+		    $catalog{column_byname}{$column->{'name'}} = $column;
+		    push @columnnames, $column->{'name'};
+		    push @columntypes, $column->{'type'};
+		}
+		$catalog{columnnames} = \@columnnames;
+		$catalog{columntypes} = \@columntypes;
+
 		$catalogs{$catname} = \%catalog;
 		close INPUT_FILE;
 	}
+
+	# now that we parsed all the data, we can do some cleanup of the
+	# data and build lookup tables
+	foreach my $catname (@{ $catalogs{names} })
+	{
+		my $catalog = $catalogs{$catname};
+		my %byname;
+		my %byoid;
+		my $name;
+
+		# Column to use for lookup mapping
+		if ($catname eq 'pg_type')
+		{
+			$name = 'typname';
+		}
+		elsif ($catname eq 'pg_proc')
+		{
+			$name = 'proname';
+		}
+		elsif ($catname eq 'pg_class')
+		{
+			$name = 'relname';
+		}
+
+		foreach my $row (@{ $catalog->{data} })
+		{
+			my %valuesbyname;
+
+			# split data into actual columns, similar grammar to bootscanner.l
+			my @values = $row->{bki_values} =~ /([^\s\"]+|\"[^\"]*\")(?:\s+|$)/g;
+
+			# remove quotes from the second alternative above
+			for (@values) {
+				s/^\"([^\"]*)\"$/$1/;
+			}
+			# store values in a more useful format
+			$row->{values} = \@values;
+
+			# Assign oid if needed
+			if ($catalog->{without_oids} eq '' && !defined $row->{oid} &&
+				(defined $name || defined $row->{descr}))
+			{
+				$row->{oid_is_auto} = 1;
+				$row->{oid} = assign_oid(\%catalogs).'';
+			}
+
+			# build lookup table if necessary
+			if ($name and defined $row->{oid})
+			{
+				@valuesbyname{ @{ $catalog->{columnnames} } } = @values;
+				$byname{$valuesbyname{$name}} = $row->{oid};
+				$byoid{$row->{oid}} = $valuesbyname{$name};
+			}
+		}
+		if (%byname)
+		{
+			$catalog->{byname} = \%byname;
+			$catalog->{byoid} = \%byoid;
+		}
+	}
+
+	# Now that we've built lookup tables, we can resolve some references
+	foreach my $catname (@{ $catalogs{names} })
+	{
+		my $catalog = $catalogs{$catname};
+
+		foreach my $row (@{ $catalog->{data} })
+		{
+			my $colno = 0;
+			foreach my $column (@{ $catalog->{columns} })
+			{
+				my $value = $row->{values}->[$colno];
+
+				if ($value eq '_null_')
+				{
+					# no point in mapping
+				}
+				elsif ($column->{type} eq 'regproc')
+				{
+					$value = regstarin(\%catalogs, 'pg_proc', $value);
+				}
+				elsif ($column->{type} eq 'regtype')
+				{
+					$value = regstarin(\%catalogs, 'pg_type', $value);
+				}
+				elsif ($column->{type} eq 'regclass')
+				{
+					$value = regstarin(\%catalogs, 'pg_class', $value);
+				}
+				elsif ($column->{original_type} eq 'regtypea')
+				{
+					my @vals;
+					for my $cval (split /\s+/, $value)
+					{
+						if ($cval ne '-' && $cval !~ /^\d+$/)
+						{
+							push @vals, regstarin(\%catalogs, 'pg_type', $cval);
+						}
+						push @vals, $cval;
+					}
+					$value = join(' ', @vals);
+				}
+				elsif ($column->{original_type} eq 'pseudoregtype_')
+				{
+					my $origvalue = $value;
+					my @vals;
+
+					# strip curlies
+					$value =~ s/^\{([^\"]*)\}$/$1/;
+
+					for my $cval (split /,/, $value)
+					{
+						$cval = regstarin(\%catalogs, 'pg_type', $cval);
+						push @vals, $cval;
+					}
+					$value = '{'.join(',', @vals).'}';
+				}
+
+				# and replace the stored value
+				$row->{values}->[$colno] = $value;
+
+				$colno++;
+			}
+		}
+	}
+
+
 	return \%catalogs;
 }
 
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index a403c64..d0bcdff 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -17,7 +17,7 @@ OBJS = catalog.o dependency.o heap.o index.o indexing.o namespace.o aclchk.o \
        pg_operator.o pg_proc.o pg_range.o pg_db_role_setting.o pg_shdepend.o \
        pg_type.o storage.o toasting.o
 
-BKIFILES = postgres.bki postgres.description postgres.shdescription
+BKIFILES = postgres.bki postgres.data postgres.description postgres.shdescription
 
 include $(top_srcdir)/src/backend/common.mk
 
@@ -55,6 +55,8 @@ postgres.description: postgres.bki ;
 
 postgres.shdescription: postgres.bki ;
 
+postgres.data: postgres.bki ;
+
 schemapg.h: postgres.bki ;
 
 # Technically, this should depend on Makefile.global, but then
@@ -64,7 +66,8 @@ schemapg.h: postgres.bki ;
 # changes.
 postgres.bki: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS) $(top_srcdir)/configure $(top_srcdir)/src/include/catalog/duplicate_oids
 	cd $(top_srcdir)/src/include/catalog && $(PERL) ./duplicate_oids
-	$(PERL) -I $(catalogdir) $< $(pg_includes) --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS)
+	echo $(PERL) -I $(catalogdir) $< $(pg_includes) --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS)
+	$(PERL) -I $(catalogdir) $< $(pg_includes) --set-version=$(MAJORVERSION) --srcdir="$(srcdir)" $(POSTGRES_BKI_SRCS)
 
 .PHONY: install-data
 install-data: $(BKIFILES) installdirs
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index a5c78ee..0723555 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -15,13 +15,19 @@
 #----------------------------------------------------------------------
 
 use Catalog;
+use Data::Dumper;
 
 use strict;
 use warnings;
 
+use feature 'say';
+
+use Carp;
+
 my @input_files;
 our @include_path;
 my $output_path = '';
+my $srcdir = '';
 my $major_version;
 
 # Process command line switches.
@@ -46,6 +52,10 @@ while (@ARGV)
 		die "Version must be in format nn.nn.\n"
 		  if !($major_version =~ /^\d+\.\d+$/);
 	}
+	elsif ($arg =~ /^--srcdir=(.*)$/)
+	{
+		$srcdir = $1;
+	}
 	else
 	{
 		usage();
@@ -104,6 +114,8 @@ my %schemapg_entries;
 my @tables_needing_macros;
 our @types;
 
+my %catalogs_by_name;
+
 # produce output, one catalog at a time
 foreach my $catname (@{ $catalogs->{names} })
 {
@@ -116,8 +128,6 @@ foreach my $catname (@{ $catalogs->{names} })
 	  . $catalog->{without_oids}
 	  . $catalog->{rowtype_oid} . "\n";
 
-	my %bki_attr;
-	my @attnames;
 	my $first = 1;
 
 	print BKI " (\n";
@@ -125,8 +135,6 @@ foreach my $catname (@{ $catalogs->{names} })
 	{
 		my $attname = $column->{name};
 		my $atttype = $column->{type};
-		$bki_attr{$attname} = $column;
-		push @attnames, $attname;
 
 		if (!$first)
 		{
@@ -160,24 +168,20 @@ foreach my $catname (@{ $catalogs->{names} })
 		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};
+				@type{@{ $catalog->{columnnames} } } = @{$row->{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};
+			printf BKI "insert %s( %s)\n", $oid, join(' ', map bki_escape($_), @{$row->{values}});
 
-		   # Write comments to postgres.description and postgres.shdescription
+			# Write comments to postgres.description and postgres.shdescription
 			if (defined $row->{descr})
 			{
 				printf DESCR "%s\t%s\t0\t%s\n", $row->{oid}, $catname,
@@ -218,22 +222,27 @@ foreach my $catname (@{ $catalogs->{names} })
 				my $row = emit_pgattr_row($table_name, $attr, $priornotnull);
 				$row->{attnum}        = $attnum;
 				$row->{attstattarget} = '-1';
+				if (!defined $row->{attnotnull})
+				{
+					say STDERR Dumper($row);
+				}
 				$priornotnull &= ($row->{attnotnull} eq 't');
 
 				# If it's bootstrapped, put an entry in postgres.bki.
 				if ($is_bootstrap eq ' bootstrap')
 				{
-					bki_insert($row, @attnames);
+					bki_insert($row, @{$catalog->{columnnames} });
 				}
 
 				# Store schemapg entries for later.
+				# XXX: Note that this doesn't escape correctly.
 				$row =
 				  emit_schemapg_row($row,
-					grep { $bki_attr{$_}{type} eq 'bool' } @attnames);
+					grep { $catalog->{column_byname}->{$_}{type} eq 'bool' } @{ $catalog->{columnnames} });
 				push @{ $schemapg_entries{$table_name} }, '{ '
 				  . join(
 					', ',             grep { defined $_ }
-					  map $row->{$_}, @attnames) . ' }';
+					  map $row->{$_}, @{ $catalog->{columnnames} }) . ' }';
 			}
 
 			# Generate entries for system attributes.
@@ -261,7 +270,7 @@ foreach my $catname (@{ $catalogs->{names} })
 					  if $table->{without_oids} eq ' without_oids'
 						  && $row->{attname} eq 'oid';
 
-					bki_insert($row, @attnames);
+					bki_insert($row, @{ $catalog->{columnnames} });
 				}
 			}
 		}
@@ -321,6 +330,103 @@ foreach my $table_name (@tables_needing_macros)
 # Closing boilerplate for schemapg.h
 print SCHEMAPG "\n#endif /* SCHEMAPG_H */\n";
 
+# write out data in a nicer format
+my %output;
+foreach my $catname (@{ $catalogs->{names} })
+{
+    my $catalog = $catalogs->{$catname};
+
+    my @data; # one row per output row
+
+    foreach my $row (@{ $catalog->{data} })
+    {
+		my %row;
+		my %rowdata;
+
+		my $colno = 0;
+
+		foreach my $column (@{ $catalog->{columns} })
+		{
+			my $value = $row->{values}->[$colno];
+
+			# map values back to a more convenient format
+			if ($value eq '_null_')
+			{
+				$value = undef;
+			}
+			elsif ($column->{type} eq 'regproc')
+			{
+				$value = regstarout($catalogs, 'pg_proc', $value);
+			}
+			elsif ($column->{type} eq 'regtype')
+			{
+				$value = regstarout($catalogs, 'pg_type', $value);
+			}
+			elsif ($column->{type} eq 'regclass')
+			{
+				$value = regstarout($catalogs, 'pg_class', $value);
+			}
+			elsif ($column->{original_type} eq 'regtypea')
+			{
+				my @vals;
+				for my $cval (split /\s+/, $value)
+				{
+					$cval = regstarout($catalogs, 'pg_type', $cval);
+					push @vals, $cval;
+				}
+				$value = join(' ', @vals);
+			}
+			elsif ($column->{original_type} eq 'pseudoregtype_')
+			{
+				my $origvalue = $value;
+				my @vals;
+
+				# strip curlies
+				$value =~ s/^\{([^\"]*)\}$/$1/;
+
+				for my $cval (split /,/, $value)
+				{
+					$cval = regstarout($catalogs, 'pg_type', $cval);
+					push @vals, $cval;
+				}
+				$value = '{'.join(',', @vals).'}';
+			}
+
+			# only set value if there's one - no need to carry pointless stuff around
+			if (defined $value)
+			{
+				$rowdata{$column->{name}} = $value;
+			}
+
+			$colno++;
+		}
+
+		$row{data} = \%rowdata;
+
+		if (defined $row->{descr})
+		{
+			$row{description} = $row->{descr};
+		}
+
+		# Dump assigned oids unless automatically asssigned
+		if (defined $row->{oid} && !defined $row->{oid_is_auto})
+		{
+			$row{oid} = $row->{oid};
+		}
+		push @data, \%row;
+    }
+    $output{$catname} = \@data;
+
+	my $newdatafile = $srcdir .'/'. $catname. '.data';
+	open NEWDATA, '>', $newdatafile . $tmpext
+		or die "can't open $newdatafile$tmpext: $!";
+	my $dumper = Data::Dumper->new([\@data]);
+	print NEWDATA $dumper->Sortkeys(1)->Terse(1)->Indent(1)->Quotekeys(0)->Dump;
+	close NEWDATA;
+	Catalog::RenameTempFile($newdatafile, $tmpext);
+}
+
+
 # We're done emitting data
 close BKI;
 close SCHEMAPG;
@@ -418,12 +524,37 @@ sub emit_pgattr_row
 }
 
 # Write a pg_attribute entry to postgres.bki
+sub bki_escape
+{
+    my $val = shift;
+
+	if (!defined $val)
+	{
+		croak("undefined value");
+	}
+	elsif ($val eq 'PGUID')
+	{
+		$val = $BOOTSTRAP_SUPERUSERID;
+	}
+	elsif  ($val eq 'PGNSP')
+	{
+		$val = $PG_CATALOG_NAMESPACE;
+	}
+	elsif ($val eq '_null_')
+	{
+	}
+	elsif ($val =~ /[^0-9a-zA-Z]/ || $val eq '')
+	{
+		$val = '"'.$val.'"';
+	}
+	return $val;
+}
 sub bki_insert
 {
 	my $row        = shift;
 	my @attnames   = @_;
 	my $oid        = $row->{oid} ? "OID = $row->{oid} " : '';
-	my $bki_values = join ' ', map $row->{$_}, @attnames;
+	my $bki_values = join ' ', map bki_escape($row->{$_}), @attnames;
 	printf BKI "insert %s( %s)\n", $oid, $bki_values;
 }
 
diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl
index f5cc265..e4e2ee6 100644
--- a/src/backend/utils/Gen_fmgrtab.pl
+++ b/src/backend/utils/Gen_fmgrtab.pl
@@ -19,14 +19,14 @@ use strict;
 use warnings;
 
 # Collect arguments
-my $infile;    # pg_proc.h
+my @input_files;
 my $output_path = '';
 while (@ARGV)
 {
 	my $arg = shift @ARGV;
 	if ($arg !~ /^-/)
 	{
-		$infile = $arg;
+		push @input_files, $arg;
 	}
 	elsif ($arg =~ /^-o/)
 	{
@@ -45,7 +45,7 @@ if ($output_path ne '' && substr($output_path, -1) ne '/')
 }
 
 # Read all the data from the include/catalog files.
-my $catalogs = Catalog::Catalogs($infile);
+my $catalogs = Catalog::Catalogs(@input_files);
 
 # Collect the raw data from pg_proc.h.
 my @fmgr = ();
@@ -110,7 +110,6 @@ qq|/*-------------------------------------------------------------------------
  *	******************************
  *
  *	It has been GENERATED by $0
- *	from $infile
  *
  *-------------------------------------------------------------------------
  */
@@ -146,7 +145,6 @@ qq|/*-------------------------------------------------------------------------
  *	******************************
  *
  *	It has been GENERATED by $0
- *	from $infile
  *
  *-------------------------------------------------------------------------
  */
diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile
index 8374533..f16e1a9 100644
--- a/src/backend/utils/Makefile
+++ b/src/backend/utils/Makefile
@@ -24,7 +24,7 @@ $(SUBDIRS:%=%-recursive): fmgroids.h
 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
+	$(PERL) -I $(catalogdir) $< $(top_srcdir)/src/include/catalog/pg_proc.h $(top_srcdir)/src/include/catalog/pg_type.h
 
 errcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errcodes.pl
 	$(PERL) $(srcdir)/generate-errcodes.pl $< > $@
diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c
index 3d1bb32..f7c99ff 100644
--- a/src/backend/utils/adt/regproc.c
+++ b/src/backend/utils/adt/regproc.c
@@ -84,51 +84,11 @@ regprocin(PG_FUNCTION_ARGS)
 	/* Else it's a name, possibly schema-qualified */
 
 	/*
-	 * In bootstrap mode we assume the given name is not schema-qualified, and
-	 * just search pg_proc for a unique match.  This is needed for
-	 * initializing other system catalogs (pg_namespace may not exist yet, and
-	 * certainly there are no schemas other than pg_catalog).
+	 * We should never get here in bootstrap mode, as all references should
+	 * have been resolved by genbki.pl.
 	 */
 	if (IsBootstrapProcessingMode())
-	{
-		int			matches = 0;
-		Relation	hdesc;
-		ScanKeyData skey[1];
-		SysScanDesc sysscan;
-		HeapTuple	tuple;
-
-		ScanKeyInit(&skey[0],
-					Anum_pg_proc_proname,
-					BTEqualStrategyNumber, F_NAMEEQ,
-					CStringGetDatum(pro_name_or_oid));
-
-		hdesc = heap_open(ProcedureRelationId, AccessShareLock);
-		sysscan = systable_beginscan(hdesc, ProcedureNameArgsNspIndexId, true,
-									 NULL, 1, skey);
-
-		while (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-		{
-			result = (RegProcedure) HeapTupleGetOid(tuple);
-			if (++matches > 1)
-				break;
-		}
-
-		systable_endscan(sysscan);
-		heap_close(hdesc, AccessShareLock);
-
-		if (matches == 0)
-			ereport(ERROR,
-					(errcode(ERRCODE_UNDEFINED_FUNCTION),
-				 errmsg("function \"%s\" does not exist", pro_name_or_oid)));
-
-		else if (matches > 1)
-			ereport(ERROR,
-					(errcode(ERRCODE_AMBIGUOUS_FUNCTION),
-					 errmsg("more than one function named \"%s\"",
-							pro_name_or_oid)));
-
-		PG_RETURN_OID(result);
-	}
+		elog(ERROR, "regprocin with textual values is not supported in bootstrap mode");
 
 	/*
 	 * Normal case: parse the name into components and see if it matches any
@@ -1196,41 +1156,11 @@ regtypein(PG_FUNCTION_ARGS)
 	/* Else it's a type name, possibly schema-qualified or decorated */
 
 	/*
-	 * In bootstrap mode we assume the given name is not schema-qualified, and
-	 * just search pg_type for a match.  This is needed for initializing other
-	 * system catalogs (pg_namespace may not exist yet, and certainly there
-	 * are no schemas other than pg_catalog).
+	 * We should never get here in bootstrap mode, as all references should
+	 * have been resolved by genbki.pl.
 	 */
 	if (IsBootstrapProcessingMode())
-	{
-		Relation	hdesc;
-		ScanKeyData skey[1];
-		SysScanDesc sysscan;
-		HeapTuple	tuple;
-
-		ScanKeyInit(&skey[0],
-					Anum_pg_type_typname,
-					BTEqualStrategyNumber, F_NAMEEQ,
-					CStringGetDatum(typ_name_or_oid));
-
-		hdesc = heap_open(TypeRelationId, AccessShareLock);
-		sysscan = systable_beginscan(hdesc, TypeNameNspIndexId, true,
-									 NULL, 1, skey);
-
-		if (HeapTupleIsValid(tuple = systable_getnext(sysscan)))
-			result = HeapTupleGetOid(tuple);
-		else
-			ereport(ERROR,
-					(errcode(ERRCODE_UNDEFINED_OBJECT),
-					 errmsg("type \"%s\" does not exist", typ_name_or_oid)));
-
-		/* We assume there can be only one match */
-
-		systable_endscan(sysscan);
-		heap_close(hdesc, AccessShareLock);
-
-		PG_RETURN_OID(result);
-	}
+		elog(ERROR, "regtypein with textual values is not supported in bootstrap mode");
 
 	/*
 	 * Normal case: invoke the full parser to deal with special cases such as
diff --git a/src/include/c.h b/src/include/c.h
index ee615ee..d04c686 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -347,6 +347,10 @@ typedef double float8;
 typedef Oid regproc;
 typedef regproc RegProcedure;
 
+
+typedef Oid regtype;
+typedef Oid regclass;
+
 typedef uint32 TransactionId;
 
 typedef uint32 LocalTransactionId;
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 5e1196d..598e5bc 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -61,9 +61,9 @@ CATALOG(pg_aggregate,2600) BKI_WITHOUT_OIDS
 	bool		aggfinalextra;
 	bool		aggmfinalextra;
 	Oid			aggsortop;
-	Oid			aggtranstype;
+	regtype		aggtranstype;
 	int32		aggtransspace;
-	Oid			aggmtranstype;
+	regtype		aggmtranstype;
 	int32		aggmtransspace;
 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index 5aab896..40aee6a 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -56,8 +56,8 @@
 CATALOG(pg_amop,2602)
 {
 	Oid			amopfamily;		/* the index opfamily this entry is for */
-	Oid			amoplefttype;	/* operator's left input data type */
-	Oid			amoprighttype;	/* operator's right input data type */
+	regtype		amoplefttype;	/* operator's left input data type */
+	regtype		amoprighttype;	/* operator's right input data type */
 	int16		amopstrategy;	/* operator strategy number */
 	char		amoppurpose;	/* is operator for 's'earch or 'o'rdering? */
 	Oid			amopopr;		/* the operator's pg_operator OID */
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 49d3d13..c4fa1c5 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -45,8 +45,8 @@
 CATALOG(pg_amproc,2603)
 {
 	Oid			amprocfamily;	/* the index opfamily this entry is for */
-	Oid			amproclefttype; /* procedure's left input data type */
-	Oid			amprocrighttype;	/* procedure's right input data type */
+	regtype		amproclefttype; /* procedure's left input data type */
+	regtype		amprocrighttype;	/* procedure's right input data type */
 	int16		amprocnum;		/* support procedure index */
 	regproc		amproc;			/* OID of the proc */
 } FormData_pg_amproc;
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index 1011040..171edbb 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -30,7 +30,7 @@
 
 CATALOG(pg_attrdef,2604)
 {
-	Oid			adrelid;		/* OID of table containing attribute */
+	regclass	adrelid;		/* OID of table containing attribute */
 	int16		adnum;			/* attnum of attribute */
 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 87a3462..21b8854 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -35,7 +35,7 @@
 
 CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BKI_SCHEMA_MACRO
 {
-	Oid			attrelid;		/* OID of relation containing this attribute */
+	regclass	attrelid;		/* OID of relation containing this attribute */
 	NameData	attname;		/* name of attribute */
 
 	/*
@@ -45,7 +45,7 @@ CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BK
 	 * attributes of this instance, so they had better match or Postgres will
 	 * fail.
 	 */
-	Oid			atttypid;
+	regtype		atttypid;
 
 	/*
 	 * attstattarget is the target number of statistics datapoints to collect
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index b314369..55457cc 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -32,9 +32,9 @@
 
 CATALOG(pg_cast,2605)
 {
-	Oid			castsource;		/* source datatype for cast */
-	Oid			casttarget;		/* destination datatype for cast */
-	Oid			castfunc;		/* cast function; 0 = binary coercible */
+	regtype		castsource;		/* source datatype for cast */
+	regtype		casttarget;		/* destination datatype for cast */
+	regproc			castfunc;		/* cast function; 0 = binary coercible */
 	char		castcontext;	/* contexts in which cast can be used */
 	char		castmethod;		/* cast method */
 } FormData_pg_cast;
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 8b4c35c..ccf33e6 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -35,7 +35,7 @@ CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO
 	Oid			relnamespace;	/* OID of namespace containing this class */
 	Oid			reltype;		/* OID of entry in pg_type for table's
 								 * implicit row type */
-	Oid			reloftype;		/* OID of entry in pg_type for underlying
+	regtype		reloftype;		/* OID of entry in pg_type for underlying
 								 * composite type */
 	Oid			relowner;		/* class owner */
 	Oid			relam;			/* index access method; 0 if not an index */
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index 038e564..e276a3d 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -35,14 +35,14 @@ CATALOG(pg_depend,2608) BKI_WITHOUT_OIDS
 	 *
 	 * These fields are all zeroes for a DEPENDENCY_PIN entry.
 	 */
-	Oid			classid;		/* OID of table containing object */
+	regclass	classid;		/* OID of table containing object */
 	Oid			objid;			/* OID of object itself */
 	int32		objsubid;		/* column number, or 0 if not used */
 
 	/*
 	 * Identification of the independent (referenced) object.
 	 */
-	Oid			refclassid;		/* OID of table containing object */
+	regclass	refclassid;		/* OID of table containing object */
 	Oid			refobjid;		/* OID of object itself */
 	int32		refobjsubid;	/* column number, or 0 if not used */
 
diff --git a/src/include/catalog/pg_description.h b/src/include/catalog/pg_description.h
index 692455f..c38a4b8 100644
--- a/src/include/catalog/pg_description.h
+++ b/src/include/catalog/pg_description.h
@@ -48,7 +48,7 @@
 CATALOG(pg_description,2609) BKI_WITHOUT_OIDS
 {
 	Oid			objoid;			/* OID of object itself */
-	Oid			classoid;		/* OID of table containing object */
+	regclass	classoid;		/* OID of table containing object */
 	int32		objsubid;		/* column number, or 0 if not used */
 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index 1ce9795..2ea9a75 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -33,7 +33,7 @@
 
 CATALOG(pg_enum,3501)
 {
-	Oid			enumtypid;		/* OID of owning enum type */
+	regtype		enumtypid;		/* OID of owning enum type */
 	float4		enumsortorder;	/* sort position of this enum value */
 	NameData	enumlabel;		/* text representation of enum value */
 } FormData_pg_enum;
diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h
index ca81a81..0f27e45 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -33,7 +33,7 @@ CATALOG(pg_event_trigger,3466)
 	NameData	evtname;		/* trigger's name */
 	NameData	evtevent;		/* trigger's event */
 	Oid			evtowner;		/* trigger's owner */
-	Oid			evtfoid;		/* OID of function to be called */
+	regproc		evtfoid;		/* OID of function to be called */
 	char		evtenabled;		/* trigger's firing configuration WRT
 								 * session_replication_role */
 
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index 1c7db04..046e5e2 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -32,8 +32,8 @@ CATALOG(pg_foreign_data_wrapper,2328)
 {
 	NameData	fdwname;		/* foreign-data wrapper name */
 	Oid			fdwowner;		/* FDW owner */
-	Oid			fdwhandler;		/* handler function, or 0 if none */
-	Oid			fdwvalidator;	/* option validation function, or 0 if none */
+	regproc		fdwhandler;		/* handler function, or 0 if none */
+	regproc		fdwvalidator;	/* option validation function, or 0 if none */
 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
 	aclitem		fdwacl[1];		/* access permissions */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index 45c96e3..92eba70 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -30,8 +30,8 @@
 
 CATALOG(pg_index,2610) BKI_WITHOUT_OIDS BKI_SCHEMA_MACRO
 {
-	Oid			indexrelid;		/* OID of the index */
-	Oid			indrelid;		/* OID of the relation it indexes */
+	regclass	indexrelid;		/* OID of the index */
+	regclass	indrelid;		/* OID of the relation it indexes */
 	int16		indnatts;		/* number of columns in index */
 	bool		indisunique;	/* is this a unique index? */
 	bool		indisprimary;	/* is this index for primary key? */
diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h
index af48d24..17895d3 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -30,8 +30,8 @@
 
 CATALOG(pg_inherits,2611) BKI_WITHOUT_OIDS
 {
-	Oid			inhrelid;
-	Oid			inhparent;
+	regclass	inhrelid;
+	regclass	inhparent;
 	int32		inhseqno;
 } FormData_pg_inherits;
 
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index b82cca2..555b050 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -34,9 +34,9 @@ CATALOG(pg_language,2612)
 	Oid			lanowner;		/* Language's owner */
 	bool		lanispl;		/* Is a procedural language */
 	bool		lanpltrusted;	/* PL is trusted */
-	Oid			lanplcallfoid;	/* Call handler for PL */
-	Oid			laninline;		/* Optional anonymous-block handler function */
-	Oid			lanvalidator;	/* Optional validation function */
+	regproc		lanplcallfoid;	/* Call handler for PL */
+	regproc		laninline;		/* Optional anonymous-block handler function */
+	regproc		lanvalidator;	/* Optional validation function */
 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
 	aclitem		lanacl[1];		/* Access privileges */
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index b3acef6..f911afb 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -55,9 +55,9 @@ CATALOG(pg_opclass,2616)
 	Oid			opcnamespace;	/* namespace of this opclass */
 	Oid			opcowner;		/* opclass owner */
 	Oid			opcfamily;		/* containing operator family */
-	Oid			opcintype;		/* type of data indexed by opclass */
+	regtype		opcintype;		/* type of data indexed by opclass */
 	bool		opcdefault;		/* T if opclass is default for opcintype */
-	Oid			opckeytype;		/* type of data in index, or InvalidOid */
+	regtype		opckeytype;		/* type of data in index, or InvalidOid */
 } FormData_pg_opclass;
 
 /* ----------------
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index af991d3..2a8edad 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -40,9 +40,9 @@ CATALOG(pg_operator,2617)
 	char		oprkind;		/* 'l', 'r', or 'b' */
 	bool		oprcanmerge;	/* can be used in merge join? */
 	bool		oprcanhash;		/* can be used in hash join? */
-	Oid			oprleft;		/* left arg type, or 0 if 'l' oprkind */
-	Oid			oprright;		/* right arg type, or 0 if 'r' oprkind */
-	Oid			oprresult;		/* result datatype */
+	regtype		oprleft;		/* left arg type, or 0 if 'l' oprkind */
+	regtype		oprright;		/* right arg type, or 0 if 'r' oprkind */
+	regtype		oprresult;		/* result datatype */
 	Oid			oprcom;			/* OID of commutator oper, or 0 if none */
 	Oid			oprnegate;		/* OID of negator oper, or 0 if none */
 	regproc		oprcode;		/* OID of underlying function */
diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h
index ae71f3f..6299e93 100644
--- a/src/include/catalog/pg_policy.h
+++ b/src/include/catalog/pg_policy.h
@@ -21,7 +21,7 @@
 CATALOG(pg_policy,3256)
 {
 	NameData		polname;		/* Policy name. */
-	Oid				polrelid;		/* Oid of the relation with policy. */
+	regclass		polrelid;		/* Oid of the relation with policy. */
 	char			polcmd;			/* One of ACL_*_CHR, or '*' for all */
 
 #ifdef CATALOG_VARLEN
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 4268b99..4d78210 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -25,6 +25,9 @@
 
 #include "catalog/genbki.h"
 
+typedef Oid pseudoregtype_;
+typedef oidvector regtypea;
+
 /* ----------------
  *		pg_proc definition.  cpp turns this into
  *		typedef struct FormData_pg_proc
@@ -41,7 +44,7 @@ CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO
 	Oid			prolang;		/* OID of pg_language entry */
 	float4		procost;		/* estimated execution cost */
 	float4		prorows;		/* estimated # of rows out (if proretset) */
-	Oid			provariadic;	/* element type of variadic array, or 0 */
+	regtype		provariadic;	/* element type of variadic array, or 0 */
 	regproc		protransform;	/* transforms calls to it during planning */
 	bool		proisagg;		/* is it an aggregate? */
 	bool		proiswindow;	/* is it a window function? */
@@ -52,17 +55,17 @@ CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO
 	char		provolatile;	/* see PROVOLATILE_ categories below */
 	int16		pronargs;		/* number of arguments */
 	int16		pronargdefaults;	/* number of arguments with defaults */
-	Oid			prorettype;		/* OID of result type */
+	regtype		prorettype;		/* OID of result type */
 
 	/*
 	 * variable-length fields start here, but we allow direct access to
 	 * proargtypes
 	 */
-	oidvector	proargtypes;	/* parameter types (excludes OUT params) */
+	regtypea	proargtypes;	/* parameter types (excludes OUT params) */
 
 #ifdef CATALOG_VARLEN
-	Oid			proallargtypes[1];		/* all param types (NULL if IN only) */
-	char		proargmodes[1]; /* parameter modes (NULL if IN only) */
+	pseudoregtype_ proallargtypes;		/* all param types (NULL if IN only) */
+	char		proargmodes[1]; /* FIXME: type: parameter modes (NULL if IN only) */
 	text		proargnames[1]; /* parameter names (NULL if no names) */
 	pg_node_tree proargdefaults;/* list of expression trees for argument
 								 * defaults (NULL if none) */
@@ -153,7 +156,7 @@ DATA(insert OID = 1245 (  charin		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 18
 DESCR("I/O");
 DATA(insert OID =  33 (  charout		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "18" _null_ _null_ _null_ _null_ charout _null_ _null_ _null_ ));
 DESCR("I/O");
-DATA(insert OID =  34 (  namein			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "2275" _null_ _null_ _null_ _null_ namein _null_ _null_ _null_ ));
+DATA(insert OID =  34 (  namein			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 name "2275" _null_ _null_ _null_ _null_ namein _null_ _null_ _null_ ));
 DESCR("I/O");
 DATA(insert OID =  35 (  nameout		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "19" _null_ _null_ _null_ _null_ nameout _null_ _null_ _null_ ));
 DESCR("I/O");
@@ -674,11 +677,11 @@ DATA(insert OID =  401 (  text			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25
 DESCR("convert char(n) to text");
 DATA(insert OID =  406 (  text			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "19" _null_ _null_ _null_ _null_ name_text _null_ _null_ _null_ ));
 DESCR("convert name to text");
-DATA(insert OID =  407 (  name			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "25" _null_ _null_ _null_ _null_ text_name _null_ _null_ _null_ ));
+DATA(insert OID =  407 (  name			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 name "25" _null_ _null_ _null_ _null_ text_name _null_ _null_ _null_ ));
 DESCR("convert text to name");
 DATA(insert OID =  408 (  bpchar		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1042 "19" _null_ _null_ _null_ _null_ name_bpchar _null_ _null_ _null_ ));
 DESCR("convert name to char(n)");
-DATA(insert OID =  409 (  name			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "1042" _null_ _null_ _null_ _null_	bpchar_name _null_ _null_ _null_ ));
+DATA(insert OID =  409 (  name			   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 name "1042" _null_ _null_ _null_ _null_	bpchar_name _null_ _null_ _null_ ));
 DESCR("convert char(n) to name");
 
 DATA(insert OID = 440 (  hashgettuple	   PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "2281 2281" _null_ _null_ _null_ _null_	hashgettuple _null_ _null_ _null_ ));
@@ -819,7 +822,7 @@ DATA(insert OID = 680 (  oidvectorge	   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0
 DATA(insert OID = 681 (  oidvectorgt	   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "30 30" _null_ _null_ _null_ _null_ oidvectorgt _null_ _null_ _null_ ));
 
 /* OIDS 700 - 799 */
-DATA(insert OID = 710 (  getpgusername	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ current_user _null_ _null_ _null_ ));
+DATA(insert OID = 710 (  getpgusername	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 name "" _null_ _null_ _null_ _null_ current_user _null_ _null_ _null_ ));
 DESCR("deprecated, use current_user instead");
 DATA(insert OID = 716 (  oidlt			   PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ oidlt _null_ _null_ _null_ ));
 DATA(insert OID = 717 (  oidle			   PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ oidle _null_ _null_ _null_ ));
@@ -851,9 +854,9 @@ DATA(insert OID = 741 (  text_le		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16
 DATA(insert OID = 742 (  text_gt		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ text_gt _null_ _null_ _null_ ));
 DATA(insert OID = 743 (  text_ge		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ text_ge _null_ _null_ _null_ ));
 
-DATA(insert OID = 745 (  current_user	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ current_user _null_ _null_ _null_ ));
+DATA(insert OID = 745 (  current_user	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 name "" _null_ _null_ _null_ _null_ current_user _null_ _null_ _null_ ));
 DESCR("current user name");
-DATA(insert OID = 746 (  session_user	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ session_user _null_ _null_ _null_ ));
+DATA(insert OID = 746 (  session_user	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 name "" _null_ _null_ _null_ _null_ session_user _null_ _null_ _null_ ));
 DESCR("session user name");
 
 DATA(insert OID = 744 (  array_eq		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ array_eq _null_ _null_ _null_ ));
@@ -1017,7 +1020,7 @@ DATA(insert OID =  859 (  namenlike		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0
 DATA(insert OID =  860 (  bpchar		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1042 "18" _null_ _null_ _null_ _null_	char_bpchar _null_ _null_ _null_ ));
 DESCR("convert char to char(n)");
 
-DATA(insert OID = 861 ( current_database	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ current_database _null_ _null_ _null_ ));
+DATA(insert OID = 861 ( current_database	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 name "" _null_ _null_ _null_ _null_ current_database _null_ _null_ _null_ ));
 DESCR("name of the current database");
 DATA(insert OID = 817 (  current_query		  PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 25 "" _null_ _null_ _null_ _null_  current_query _null_ _null_ _null_ ));
 DESCR("get the currently executing query");
@@ -1341,11 +1344,11 @@ DESCR("transform an interval length coercion");
 DATA(insert OID = 1200 (  interval			PGNSP PGUID 12 1 0 0 interval_transform f f f f t f i 2 0 1186 "1186 23" _null_ _null_ _null_ _null_ interval_scale _null_ _null_ _null_ ));
 DESCR("adjust interval precision");
 
-DATA(insert OID = 1215 (  obj_description	PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 19" _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP) and objsubid = 0" _null_ _null_ _null_ ));
+DATA(insert OID = 1215 (  obj_description	PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 19" _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = 11) and objsubid = 0" _null_ _null_ _null_ ));
 DESCR("get description for object id and catalog name");
 DATA(insert OID = 1216 (  col_description	PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 23" _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = ''pg_catalog.pg_class''::pg_catalog.regclass and objsubid = $2" _null_ _null_ _null_ ));
 DESCR("get description for table column");
-DATA(insert OID = 1993 ( shobj_description	PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 19" _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_shdescription where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP)" _null_ _null_ _null_ ));
+DATA(insert OID = 1993 ( shobj_description	PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 19" _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_shdescription where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = 11)" _null_ _null_ _null_ ));
 DESCR("get description for object id and shared catalog name");
 
 DATA(insert OID = 1217 (  date_trunc	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 1184 "25 1184" _null_ _null_ _null_ _null_ timestamptz_trunc _null_ _null_ _null_ ));
@@ -1605,12 +1608,12 @@ DESCR("absolute value");
 
 /* OIDS 1400 - 1499 */
 
-DATA(insert OID = 1400 (  name		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "1043" _null_ _null_ _null_ _null_	text_name _null_ _null_ _null_ ));
+DATA(insert OID = 1400 (  name		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 name "1043" _null_ _null_ _null_ _null_	text_name _null_ _null_ _null_ ));
 DESCR("convert varchar to name");
 DATA(insert OID = 1401 (  varchar	   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1043 "19" _null_ _null_ _null_ _null_	name_text _null_ _null_ _null_ ));
 DESCR("convert name to varchar");
 
-DATA(insert OID = 1402 (  current_schema	PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ current_schema _null_ _null_ _null_ ));
+DATA(insert OID = 1402 (  current_schema	PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 name "" _null_ _null_ _null_ _null_ current_schema _null_ _null_ _null_ ));
 DESCR("current schema name");
 DATA(insert OID = 1403 (  current_schemas	PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1003 "16" _null_ _null_ _null_ _null_	current_schemas _null_ _null_ _null_ ));
 DESCR("current schema search list");
@@ -1967,11 +1970,11 @@ DESCR("convert int8 number to hex");
 /* for character set encoding support */
 
 /* return database encoding name */
-DATA(insert OID = 1039 (  getdatabaseencoding	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ getdatabaseencoding _null_ _null_ _null_ ));
+DATA(insert OID = 1039 (  getdatabaseencoding	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 name "" _null_ _null_ _null_ _null_ getdatabaseencoding _null_ _null_ _null_ ));
 DESCR("encoding name of current database");
 
 /* return client encoding name i.e. session encoding */
-DATA(insert OID = 810 (  pg_client_encoding    PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ pg_client_encoding _null_ _null_ _null_ ));
+DATA(insert OID = 810 (  pg_client_encoding    PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 name "" _null_ _null_ _null_ _null_ pg_client_encoding _null_ _null_ _null_ ));
 DESCR("encoding name of current database");
 
 DATA(insert OID = 1713 (  length		   PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 23 "17 19" _null_ _null_ _null_ _null_ length_in_encoding _null_ _null_ _null_ ));
@@ -1989,7 +1992,7 @@ DESCR("convert string with specified encoding names");
 DATA(insert OID = 1264 (  pg_char_to_encoding	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "19" _null_ _null_ _null_ _null_ PG_char_to_encoding _null_ _null_ _null_ ));
 DESCR("convert encoding name to encoding id");
 
-DATA(insert OID = 1597 (  pg_encoding_to_char	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 19 "23" _null_ _null_ _null_ _null_ PG_encoding_to_char _null_ _null_ _null_ ));
+DATA(insert OID = 1597 (  pg_encoding_to_char	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 name "23" _null_ _null_ _null_ _null_ PG_encoding_to_char _null_ _null_ _null_ ));
 DESCR("convert encoding id to encoding name");
 
 DATA(insert OID = 2319 (  pg_encoding_max_length   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ pg_encoding_max_length_sql _null_ _null_ _null_ ));
@@ -2005,7 +2008,7 @@ DATA(insert OID = 1640 (  pg_get_viewdef	   PGNSP PGUID 12 1 0 0 0 f f f f t f s
 DESCR("select statement of a view");
 DATA(insert OID = 1641 (  pg_get_viewdef	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ pg_get_viewdef _null_ _null_ _null_ ));
 DESCR("select statement of a view");
-DATA(insert OID = 1642 (  pg_get_userbyid	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 19 "26" _null_ _null_ _null_ _null_ pg_get_userbyid _null_ _null_ _null_ ));
+DATA(insert OID = 1642 (  pg_get_userbyid	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 name "26" _null_ _null_ _null_ _null_ pg_get_userbyid _null_ _null_ _null_ ));
 DESCR("role name by OID (with fallback)");
 DATA(insert OID = 1643 (  pg_get_indexdef	   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ pg_get_indexdef _null_ _null_ _null_ ));
 DESCR("index description");
@@ -3765,7 +3768,7 @@ DATA(insert OID = 2420 (  oidvectorrecv		   PGNSP PGUID 12 1 0 0 0 f f f f t f i
 DESCR("I/O");
 DATA(insert OID = 2421 (  oidvectorsend		   PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "30" _null_ _null_ _null_ _null_ oidvectorsend _null_ _null_ _null_ ));
 DESCR("I/O");
-DATA(insert OID = 2422 (  namerecv			   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 19 "2281" _null_ _null_ _null_ _null_	namerecv _null_ _null_ _null_ ));
+DATA(insert OID = 2422 (  namerecv			   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 name "2281" _null_ _null_ _null_ _null_	namerecv _null_ _null_ _null_ ));
 DESCR("I/O");
 DATA(insert OID = 2423 (  namesend			   PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "19" _null_ _null_ _null_ _null_ namesend _null_ _null_ _null_ ));
 DESCR("I/O");
@@ -5065,30 +5068,30 @@ DATA(insert OID = 3473 (  spg_range_quad_leaf_consistent	PGNSP PGUID 12 1 0 0 0
 DESCR("SP-GiST support for quad tree over range");
 
 /* replication slots */
-DATA(insert OID = 3779 (  pg_create_physical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f f f v 1 0 2249 "19" "{19,19,3220}" "{i,o,o}" "{slot_name,slot_name,xlog_position}" _null_ pg_create_physical_replication_slot _null_ _null_ _null_ ));
+DATA(insert (  pg_create_physical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f f f v 1 0 2249 "19" "{19,19,3220}" "{i,o,o}" "{slot_name,slot_name,xlog_position}" _null_ pg_create_physical_replication_slot _null_ _null_ _null_ ));
 DESCR("create a physical replication slot");
-DATA(insert OID = 3780 (  pg_drop_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f f f v 1 0 2278 "19" _null_ _null_ _null_ _null_ pg_drop_replication_slot _null_ _null_ _null_ ));
+DATA(insert (  pg_drop_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f f f v 1 0 2278 "19" _null_ _null_ _null_ _null_ pg_drop_replication_slot _null_ _null_ _null_ ));
 DESCR("drop a replication slot");
-DATA(insert OID = 3781 (  pg_get_replication_slots	PGNSP PGUID 12 1 10 0 0 f f f f f t s 0 0 2249 "" "{19,19,25,26,16,28,28,3220}" "{o,o,o,o,o,o,o,o}" "{slot_name,plugin,slot_type,datoid,active,xmin,catalog_xmin,restart_lsn}" _null_ pg_get_replication_slots _null_ _null_ _null_ ));
+DATA(insert (  pg_get_replication_slots	PGNSP PGUID 12 1 10 0 0 f f f f f t s 0 0 2249 "" "{name,name,text,oid,bool,xid,xid,pg_lsn}" "{o,o,o,o,o,o,o,o}" "{slot_name,plugin,slot_type,datoid,active,xmin,catalog_xmin,restart_lsn}" _null_ pg_get_replication_slots _null_ _null_ _null_ ));
 DESCR("information about replication slots currently in use");
-DATA(insert OID = 3786 (  pg_create_logical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f f f v 2 0 2249 "19 19" "{19,19,25,3220}" "{i,i,o,o}" "{slot_name,plugin,slot_name,xlog_position}" _null_ pg_create_logical_replication_slot _null_ _null_ _null_ ));
+DATA(insert (  pg_create_logical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f f f v 2 0 2249 "19 19" "{19,19,25,3220}" "{i,i,o,o}" "{slot_name,plugin,slot_name,xlog_position}" _null_ pg_create_logical_replication_slot _null_ _null_ _null_ ));
 DESCR("set up a logical replication slot");
-DATA(insert OID = 3782 (  pg_logical_slot_get_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_get_changes _null_ _null_ _null_ ));
+DATA(insert (  pg_logical_slot_get_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_get_changes _null_ _null_ _null_ ));
 DESCR("get changes from replication slot");
-DATA(insert OID = 3783 (  pg_logical_slot_get_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_get_binary_changes _null_ _null_ _null_ ));
+DATA(insert (  pg_logical_slot_get_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_get_binary_changes _null_ _null_ _null_ ));
 DESCR("get binary changes from replication slot");
-DATA(insert OID = 3784 (  pg_logical_slot_peek_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_peek_changes _null_ _null_ _null_ ));
+DATA(insert (  pg_logical_slot_peek_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_peek_changes _null_ _null_ _null_ ));
 DESCR("peek at changes from replication slot");
-DATA(insert OID = 3785 (  pg_logical_slot_peek_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_peek_binary_changes _null_ _null_ _null_ ));
+DATA(insert (  pg_logical_slot_peek_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ pg_logical_slot_peek_binary_changes _null_ _null_ _null_ ));
 DESCR("peek at binary changes from replication slot");
 
 /* event triggers */
-DATA(insert OID = 3566 (  pg_event_trigger_dropped_objects		PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{26,26,23,16,16,25,25,25,25,1009,1009}" "{o,o,o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, original, normal, object_type, schema_name, object_name, object_identity, address_names, address_args}" _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ ));
+DATA(insert (  pg_event_trigger_dropped_objects		PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{26,26,23,16,16,25,25,25,25,1009,1009}" "{o,o,o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, original, normal, object_type, schema_name, object_name, object_identity, address_names, address_args}" _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ ));
 
 DESCR("list objects dropped by the current command");
-DATA(insert OID = 4566 (  pg_event_trigger_table_rewrite_oid	PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 26 "" "{26}" "{o}" "{oid}" _null_ pg_event_trigger_table_rewrite_oid _null_ _null_ _null_ ));
+DATA(insert (  pg_event_trigger_table_rewrite_oid	PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 26 "" "{26}" "{o}" "{oid}" _null_ pg_event_trigger_table_rewrite_oid _null_ _null_ _null_ ));
 DESCR("return Oid of the table getting rewritten");
-DATA(insert OID = 4567 (  pg_event_trigger_table_rewrite_reason PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 23 "" _null_ _null_ _null_ _null_ pg_event_trigger_table_rewrite_reason _null_ _null_ _null_ ));
+DATA(insert (  pg_event_trigger_table_rewrite_reason PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 23 "" _null_ _null_ _null_ _null_ pg_event_trigger_table_rewrite_reason _null_ _null_ _null_ ));
 DESCR("return reason code for table getting rewritten");
 
 /* generic transition functions for ordered-set aggregates */
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index 9a15890..c493b8d 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -33,8 +33,8 @@
 
 CATALOG(pg_range,3541) BKI_WITHOUT_OIDS
 {
-	Oid			rngtypid;		/* OID of owning range type */
-	Oid			rngsubtype;		/* OID of range's element type (subtype) */
+	regtype		rngtypid;		/* OID of owning range type */
+	regtype		rngsubtype;		/* OID of range's element type (subtype) */
 	Oid			rngcollation;	/* collation for this range type, or 0 */
 	Oid			rngsubopc;		/* subtype's btree opclass */
 	regproc		rngcanonical;	/* canonicalize range, or 0 */
diff --git a/src/include/catalog/pg_seclabel.h b/src/include/catalog/pg_seclabel.h
index c9f5b0c..87ac5ae 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -23,7 +23,7 @@
 CATALOG(pg_seclabel,3596) BKI_WITHOUT_OIDS
 {
 	Oid			objoid;			/* OID of the object itself */
-	Oid			classoid;		/* OID of table containing the object */
+	regclass	classoid;		/* OID of table containing the object */
 	int32		objsubid;		/* column number, or 0 if not used */
 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
diff --git a/src/include/catalog/pg_shdepend.h b/src/include/catalog/pg_shdepend.h
index 1268698..95e40ec 100644
--- a/src/include/catalog/pg_shdepend.h
+++ b/src/include/catalog/pg_shdepend.h
@@ -37,7 +37,7 @@ CATALOG(pg_shdepend,1214) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
 	 * be zero to denote a shared object.
 	 */
 	Oid			dbid;			/* OID of database containing object */
-	Oid			classid;		/* OID of table containing object */
+	regclass	classid;		/* OID of table containing object */
 	Oid			objid;			/* OID of object itself */
 	int32		objsubid;		/* column number, or 0 if not used */
 
@@ -46,7 +46,7 @@ CATALOG(pg_shdepend,1214) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
 	 * a shared object, so we need no database ID field.  We don't bother with
 	 * a sub-object ID either.
 	 */
-	Oid			refclassid;		/* OID of table containing object */
+	regclass	refclassid;		/* OID of table containing object */
 	Oid			refobjid;		/* OID of object itself */
 
 	/*
diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h
index c524099..4b1b380 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -41,7 +41,7 @@
 CATALOG(pg_shdescription,2396) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
 {
 	Oid			objoid;			/* OID of object itself */
-	Oid			classoid;		/* OID of table containing object */
+	regclass	classoid;		/* OID of table containing object */
 
 #ifdef CATALOG_VARLEN			/* variable-length fields start here */
 	text		description BKI_FORCE_NOT_NULL; /* description of object */
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 62a00fe..e437cbe 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -31,7 +31,7 @@
 CATALOG(pg_statistic,2619) BKI_WITHOUT_OIDS
 {
 	/* These fields form the unique key for the entry: */
-	Oid			starelid;		/* relation containing attribute */
+	regclass	starelid;		/* relation containing attribute */
 	int16		staattnum;		/* attribute (column) stats are for */
 	bool		stainherit;		/* true if inheritance children are included */
 
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index bff8fcf..4c7be4e 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -35,16 +35,16 @@
 
 CATALOG(pg_trigger,2620)
 {
-	Oid			tgrelid;		/* relation trigger is attached to */
+	regclass	tgrelid;		/* relation trigger is attached to */
 	NameData	tgname;			/* trigger's name */
-	Oid			tgfoid;			/* OID of function to be called */
+	regproc		tgfoid;			/* OID of function to be called */
 	int16		tgtype;			/* BEFORE/AFTER/INSTEAD, UPDATE/DELETE/INSERT,
 								 * ROW/STATEMENT; see below */
 	char		tgenabled;		/* trigger's firing configuration WRT
 								 * session_replication_role */
 	bool		tgisinternal;	/* trigger is system-generated */
-	Oid			tgconstrrelid;	/* constraint's FROM table, if any */
-	Oid			tgconstrindid;	/* constraint's supporting index, if any */
+	regclass	tgconstrrelid;	/* constraint's FROM table, if any */
+	regclass	tgconstrindid;	/* constraint's supporting index, if any */
 	Oid			tgconstraint;	/* associated pg_constraint entry, if any */
 	bool		tgdeferrable;	/* constraint trigger is deferrable */
 	bool		tginitdeferred; /* constraint trigger is deferred initially */
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 0a900dd..e970389 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -86,7 +86,7 @@ CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71) BKI_SCHEMA_MACRO
 
 	char		typdelim;		/* delimiter for arrays of this type */
 
-	Oid			typrelid;		/* 0 if not a composite type */
+	regclass	typrelid;		/* 0 if not a composite type */
 
 	/*
 	 * If typelem is not 0 then it identifies another row in pg_type. The
@@ -99,13 +99,13 @@ CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71) BKI_SCHEMA_MACRO
 	 *
 	 * typelem != 0 and typlen == -1.
 	 */
-	Oid			typelem;
+	regtype		typelem;
 
 	/*
 	 * If there is a "true" array type having this type as element type,
 	 * typarray links to it.  Zero if no associated "true" array type.
 	 */
-	Oid			typarray;
+	regtype		typarray;
 
 	/*
 	 * I/O conversion procedures for the datatype.
@@ -178,7 +178,7 @@ CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71) BKI_SCHEMA_MACRO
 	 * Domains use typbasetype to show the base (or domain) type that the
 	 * domain is based on.  Zero if the type is not a domain.
 	 */
-	Oid			typbasetype;
+	regtype		typbasetype;
 
 	/*
 	 * Domains use typtypmod to record the typmod to be applied to their base
diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out
index 6b248f2..af28ecd 100644
--- a/src/test/regress/expected/opr_sanity.out
+++ b/src/test/regress/expected/opr_sanity.out
@@ -154,10 +154,10 @@ WHERE p1.oid != p2.oid AND
     p2.prosrc NOT LIKE E'range\\_constructor_' AND
     (p1.prorettype < p2.prorettype)
 ORDER BY 1, 2;
- prorettype | prorettype 
-------------+------------
-         25 |       1043
-       1114 |       1184
+         prorettype          |        prorettype        
+-----------------------------+--------------------------
+ text                        | character varying
+ timestamp without time zone | timestamp with time zone
 (2 rows)
 
 SELECT DISTINCT p1.proargtypes[0], p2.proargtypes[0]
@@ -764,13 +764,13 @@ WHERE c.castmethod = 'b' AND
                     k.casttarget = c.castsource);
     castsource     |    casttarget     | castfunc | castcontext 
 -------------------+-------------------+----------+-------------
- text              | character         |        0 | i
- character varying | character         |        0 | i
- pg_node_tree      | text              |        0 | i
- cidr              | inet              |        0 | i
- xml               | text              |        0 | a
- xml               | character varying |        0 | a
- xml               | character         |        0 | a
+ text              | character         | -        | i
+ character varying | character         | -        | i
+ pg_node_tree      | text              | -        | i
+ cidr              | inet              | -        | i
+ xml               | text              | -        | a
+ xml               | character varying | -        | a
+ xml               | character         | -        | a
 (7 rows)
 
 -- **************** pg_operator ****************
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index d50b103..44f51fb 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -1321,8 +1321,8 @@ pg_indexes| SELECT n.nspname AS schemaname,
     t.spcname AS tablespace,
     pg_get_indexdef(i.oid) AS indexdef
    FROM ((((pg_index x
-     JOIN pg_class c ON ((c.oid = x.indrelid)))
-     JOIN pg_class i ON ((i.oid = x.indexrelid)))
+     JOIN pg_class c ON ((c.oid = (x.indrelid)::oid)))
+     JOIN pg_class i ON ((i.oid = (x.indexrelid)::oid)))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
      LEFT JOIN pg_tablespace t ON ((t.oid = i.reltablespace)))
   WHERE ((c.relkind = ANY (ARRAY['r'::"char", 'm'::"char"])) AND (i.relkind = 'i'::"char"));
@@ -1371,10 +1371,10 @@ pg_policies| SELECT n.nspname AS schemaname,
             WHEN '*'::"char" THEN 'ALL'::text
             ELSE NULL::text
         END AS cmd,
-    pg_get_expr(pol.polqual, pol.polrelid) AS qual,
-    pg_get_expr(pol.polwithcheck, pol.polrelid) AS with_check
+    pg_get_expr(pol.polqual, (pol.polrelid)::oid) AS qual,
+    pg_get_expr(pol.polwithcheck, (pol.polrelid)::oid) AS with_check
    FROM ((pg_policy pol
-     JOIN pg_class c ON ((c.oid = pol.polrelid)))
+     JOIN pg_class c ON ((c.oid = (pol.polrelid)::oid)))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)));
 pg_prepared_statements| SELECT p.name,
     p.statement,
@@ -1444,7 +1444,7 @@ pg_seclabels| SELECT l.objoid,
     l.provider,
     l.label
    FROM ((pg_seclabel l
-     JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
+     JOIN pg_class rel ON ((((l.classoid)::oid = rel.tableoid) AND (l.objoid = rel.oid))))
      JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
   WHERE (l.objsubid = 0)
 UNION ALL
@@ -1461,8 +1461,8 @@ UNION ALL
     l.provider,
     l.label
    FROM (((pg_seclabel l
-     JOIN pg_class rel ON (((l.classoid = rel.tableoid) AND (l.objoid = rel.oid))))
-     JOIN pg_attribute att ON (((rel.oid = att.attrelid) AND (l.objsubid = att.attnum))))
+     JOIN pg_class rel ON ((((l.classoid)::oid = rel.tableoid) AND (l.objoid = rel.oid))))
+     JOIN pg_attribute att ON (((rel.oid = (att.attrelid)::oid) AND (l.objsubid = att.attnum))))
      JOIN pg_namespace nsp ON ((rel.relnamespace = nsp.oid)))
   WHERE (l.objsubid <> 0)
 UNION ALL
@@ -1483,7 +1483,7 @@ UNION ALL
     l.provider,
     l.label
    FROM ((pg_seclabel l
-     JOIN pg_proc pro ON (((l.classoid = pro.tableoid) AND (l.objoid = pro.oid))))
+     JOIN pg_proc pro ON ((((l.classoid)::oid = pro.tableoid) AND (l.objoid = pro.oid))))
      JOIN pg_namespace nsp ON ((pro.pronamespace = nsp.oid)))
   WHERE (l.objsubid = 0)
 UNION ALL
@@ -1502,7 +1502,7 @@ UNION ALL
     l.provider,
     l.label
    FROM ((pg_seclabel l
-     JOIN pg_type typ ON (((l.classoid = typ.tableoid) AND (l.objoid = typ.oid))))
+     JOIN pg_type typ ON ((((l.classoid)::oid = typ.tableoid) AND (l.objoid = typ.oid))))
      JOIN pg_namespace nsp ON ((typ.typnamespace = nsp.oid)))
   WHERE (l.objsubid = 0)
 UNION ALL
@@ -1516,7 +1516,7 @@ UNION ALL
     l.label
    FROM (pg_seclabel l
      JOIN pg_largeobject_metadata lom ON ((l.objoid = lom.oid)))
-  WHERE ((l.classoid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0))
+  WHERE (((l.classoid)::oid = ('pg_largeobject'::regclass)::oid) AND (l.objsubid = 0))
 UNION ALL
  SELECT l.objoid,
     l.classoid,
@@ -1527,7 +1527,7 @@ UNION ALL
     l.provider,
     l.label
    FROM (pg_seclabel l
-     JOIN pg_language lan ON (((l.classoid = lan.tableoid) AND (l.objoid = lan.oid))))
+     JOIN pg_language lan ON ((((l.classoid)::oid = lan.tableoid) AND (l.objoid = lan.oid))))
   WHERE (l.objsubid = 0)
 UNION ALL
  SELECT l.objoid,
@@ -1539,7 +1539,7 @@ UNION ALL
     l.provider,
     l.label
    FROM (pg_seclabel l
-     JOIN pg_namespace nsp ON (((l.classoid = nsp.tableoid) AND (l.objoid = nsp.oid))))
+     JOIN pg_namespace nsp ON ((((l.classoid)::oid = nsp.tableoid) AND (l.objoid = nsp.oid))))
   WHERE (l.objsubid = 0)
 UNION ALL
  SELECT l.objoid,
@@ -1551,7 +1551,7 @@ UNION ALL
     l.provider,
     l.label
    FROM (pg_seclabel l
-     JOIN pg_event_trigger evt ON (((l.classoid = evt.tableoid) AND (l.objoid = evt.oid))))
+     JOIN pg_event_trigger evt ON ((((l.classoid)::oid = evt.tableoid) AND (l.objoid = evt.oid))))
   WHERE (l.objsubid = 0)
 UNION ALL
  SELECT l.objoid,
@@ -1647,8 +1647,8 @@ pg_stat_all_indexes| SELECT c.oid AS relid,
     pg_stat_get_tuples_returned(i.oid) AS idx_tup_read,
     pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch
    FROM (((pg_class c
-     JOIN pg_index x ON ((c.oid = x.indrelid)))
-     JOIN pg_class i ON ((i.oid = x.indexrelid)))
+     JOIN pg_index x ON ((c.oid = (x.indrelid)::oid)))
+     JOIN pg_class i ON ((i.oid = (x.indexrelid)::oid)))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
   WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]));
 pg_stat_all_tables| SELECT c.oid AS relid,
@@ -1656,8 +1656,8 @@ pg_stat_all_tables| SELECT c.oid AS relid,
     c.relname,
     pg_stat_get_numscans(c.oid) AS seq_scan,
     pg_stat_get_tuples_returned(c.oid) AS seq_tup_read,
-    (sum(pg_stat_get_numscans(i.indexrelid)))::bigint AS idx_scan,
-    ((sum(pg_stat_get_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch,
+    (sum(pg_stat_get_numscans((i.indexrelid)::oid)))::bigint AS idx_scan,
+    ((sum(pg_stat_get_tuples_fetched((i.indexrelid)::oid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch,
     pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins,
     pg_stat_get_tuples_updated(c.oid) AS n_tup_upd,
     pg_stat_get_tuples_deleted(c.oid) AS n_tup_del,
@@ -1674,7 +1674,7 @@ pg_stat_all_tables| SELECT c.oid AS relid,
     pg_stat_get_analyze_count(c.oid) AS analyze_count,
     pg_stat_get_autoanalyze_count(c.oid) AS autoanalyze_count
    FROM ((pg_class c
-     LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
+     LEFT JOIN pg_index i ON ((c.oid = (i.indrelid)::oid)))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
   WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
   GROUP BY c.oid, n.nspname, c.relname;
@@ -1827,14 +1827,14 @@ pg_stat_xact_all_tables| SELECT c.oid AS relid,
     c.relname,
     pg_stat_get_xact_numscans(c.oid) AS seq_scan,
     pg_stat_get_xact_tuples_returned(c.oid) AS seq_tup_read,
-    (sum(pg_stat_get_xact_numscans(i.indexrelid)))::bigint AS idx_scan,
-    ((sum(pg_stat_get_xact_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_xact_tuples_fetched(c.oid)) AS idx_tup_fetch,
+    (sum(pg_stat_get_xact_numscans((i.indexrelid)::oid)))::bigint AS idx_scan,
+    ((sum(pg_stat_get_xact_tuples_fetched((i.indexrelid)::oid)))::bigint + pg_stat_get_xact_tuples_fetched(c.oid)) AS idx_tup_fetch,
     pg_stat_get_xact_tuples_inserted(c.oid) AS n_tup_ins,
     pg_stat_get_xact_tuples_updated(c.oid) AS n_tup_upd,
     pg_stat_get_xact_tuples_deleted(c.oid) AS n_tup_del,
     pg_stat_get_xact_tuples_hot_updated(c.oid) AS n_tup_hot_upd
    FROM ((pg_class c
-     LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
+     LEFT JOIN pg_index i ON ((c.oid = (i.indrelid)::oid)))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
   WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
   GROUP BY c.oid, n.nspname, c.relname;
@@ -1881,8 +1881,8 @@ pg_statio_all_indexes| SELECT c.oid AS relid,
     (pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read,
     pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit
    FROM (((pg_class c
-     JOIN pg_index x ON ((c.oid = x.indrelid)))
-     JOIN pg_class i ON ((i.oid = x.indexrelid)))
+     JOIN pg_index x ON ((c.oid = (x.indrelid)::oid)))
+     JOIN pg_class i ON ((i.oid = (x.indexrelid)::oid)))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
   WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]));
 pg_statio_all_sequences| SELECT c.oid AS relid,
@@ -1898,16 +1898,16 @@ pg_statio_all_tables| SELECT c.oid AS relid,
     c.relname,
     (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS heap_blks_read,
     pg_stat_get_blocks_hit(c.oid) AS heap_blks_hit,
-    (sum((pg_stat_get_blocks_fetched(i.indexrelid) - pg_stat_get_blocks_hit(i.indexrelid))))::bigint AS idx_blks_read,
-    (sum(pg_stat_get_blocks_hit(i.indexrelid)))::bigint AS idx_blks_hit,
+    (sum((pg_stat_get_blocks_fetched((i.indexrelid)::oid) - pg_stat_get_blocks_hit((i.indexrelid)::oid))))::bigint AS idx_blks_read,
+    (sum(pg_stat_get_blocks_hit((i.indexrelid)::oid)))::bigint AS idx_blks_hit,
     (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read,
     pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit,
-    (sum((pg_stat_get_blocks_fetched(x.indexrelid) - pg_stat_get_blocks_hit(x.indexrelid))))::bigint AS tidx_blks_read,
-    (sum(pg_stat_get_blocks_hit(x.indexrelid)))::bigint AS tidx_blks_hit
+    (sum((pg_stat_get_blocks_fetched((x.indexrelid)::oid) - pg_stat_get_blocks_hit((x.indexrelid)::oid))))::bigint AS tidx_blks_read,
+    (sum(pg_stat_get_blocks_hit((x.indexrelid)::oid)))::bigint AS tidx_blks_hit
    FROM ((((pg_class c
-     LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
+     LEFT JOIN pg_index i ON ((c.oid = (i.indrelid)::oid)))
      LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid)))
-     LEFT JOIN pg_index x ON ((t.oid = x.indrelid)))
+     LEFT JOIN pg_index x ON ((t.oid = (x.indrelid)::oid)))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
   WHERE (c.relkind = ANY (ARRAY['r'::"char", 't'::"char", 'm'::"char"]))
   GROUP BY c.oid, n.nspname, c.relname, t.oid, x.indrelid;
@@ -2033,8 +2033,8 @@ pg_stats| SELECT n.nspname AS schemaname,
             ELSE NULL::real[]
         END AS elem_count_histogram
    FROM (((pg_statistic s
-     JOIN pg_class c ON ((c.oid = s.starelid)))
-     JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum))))
+     JOIN pg_class c ON ((c.oid = (s.starelid)::oid)))
+     JOIN pg_attribute a ON (((c.oid = (a.attrelid)::oid) AND (a.attnum = s.staattnum))))
      LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
   WHERE ((NOT a.attisdropped) AND has_column_privilege(c.oid, a.attnum, 'select'::text));
 pg_tables| SELECT n.nspname AS schemaname,
-- 
2.10.2

--4kwzxvc3povogjkv
Content-Type: text/x-patch; charset=us-ascii
Content-Disposition: attachment; filename="0003-example-conversion.patch"