From: Andres Freund Date: Sun, 22 Feb 2015 00:06:18 +0100 Subject: [PATCH 2/3] Do much more stuff in genbki.pl --- 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"