diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml
index 036a72c81e9..6d3c5be67f8 100644
--- a/doc/src/sgml/bki.sgml
+++ b/doc/src/sgml/bki.sgml
@@ -474,10 +474,15 @@
- In such a column, all entries must use the symbolic format except
- when writing 0 for InvalidOid. (If the column is
+ In some catalog columns, it's allowed for entries to be zero instead
+ of a valid reference. If this is allowed, write
+ BKI_LOOKUP_OPT instead
+ of BKI_LOOKUP. Then you can
+ write 0 for an entry. (If the column is
declared regproc, you can optionally
write - instead of 0.)
+ Except for this special case, all entries in
+ a BKI_LOOKUP column must be symbolic references.
genbki.pl will warn about unrecognized names.
@@ -554,6 +559,22 @@
therefore no need for the bootstrap backend to deal with symbolic
references.
+
+
+ It's desirable to mark OID reference columns
+ with BKI_LOOKUP or BKI_LOOKUP_OPT
+ even if the catalog has no initial data that requires lookup. This
+ allows genbki.pl to record the foreign key
+ relationships that exist in the system catalogs. That information is
+ used in the regression tests to check for incorrect entries. See also
+ the macros DECLARE_FOREIGN_KEY,
+ DECLARE_FOREIGN_KEY_OPT,
+ DECLARE_ARRAY_FOREIGN_KEY,
+ and DECLARE_ARRAY_FOREIGN_KEY_OPT, which are
+ used to declare foreign key relationships that are too complex
+ for BKI_LOOKUP (typically, multi-column foreign
+ keys).
+
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml
index 081f04ce1a9..b7150510aba 100644
--- a/doc/src/sgml/func.sgml
+++ b/doc/src/sgml/func.sgml
@@ -22789,6 +22789,38 @@ SELECT pg_type_is_visible('myschema.widget'::regtype);
+
+
+
+ pg_get_catalog_foreign_keys
+
+ pg_get_catalog_foreign_keys ()
+ setof record
+ ( fktable regclass,
+ fkcols text[],
+ pktable regclass,
+ pkcols text[],
+ is_array boolean,
+ is_opt boolean )
+
+
+ Returns a set of records describing the foreign key relationships
+ that exist within the PostgreSQL system
+ catalogs.
+ The fktable column contains the name of the
+ referencing catalog, and the fkcols column
+ contains the name(s) of the referencing column(s). Similarly,
+ the pktable column contains the name of the
+ referenced catalog, and the pkcols column
+ contains the name(s) of the referenced column(s).
+ If is_array is true, the last referencing
+ column is an array, each of whose elements should match some entry
+ in the referenced catalog.
+ If is_opt is true, the referencing column(s)
+ are allowed to contain zeroes instead of a valid reference.
+
+
+
diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore
index 4bd3ee9d7f3..237ff541659 100644
--- a/src/backend/catalog/.gitignore
+++ b/src/backend/catalog/.gitignore
@@ -1,5 +1,6 @@
/postgres.bki
/schemapg.h
+/system_fk_info.h
/system_constraints.sql
/pg_*_d.h
/bki-stamp
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index 061f3d8c21e..b44d568b544 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -105,6 +105,17 @@ sub ParseHeader
index_decl => $5
};
}
+ elsif (/^DECLARE_(ARRAY_)?FOREIGN_KEY(_OPT)?\(\s*\(([^)]+)\),\s*(\w+),\s*\(([^)]+)\)\)/)
+ {
+ push @{ $catalog{foreign_keys} },
+ {
+ is_array => $1 ? 1 : 0,
+ is_opt => $2 ? 1 : 0,
+ fk_cols => $3,
+ pk_table => $4,
+ pk_cols => $5
+ };
+ }
elsif (/^CATALOG\((\w+),(\d+),(\w+)\)/)
{
$catalog{catname} = $1;
@@ -197,9 +208,22 @@ sub ParseHeader
{
$column{array_default} = $1;
}
- elsif ($attopt =~ /BKI_LOOKUP\((\w+)\)/)
+ elsif ($attopt =~ /BKI_LOOKUP(_OPT)?\((\w+)\)/)
{
- $column{lookup} = $1;
+ $column{lookup} = $2;
+ $column{lookup_opt} = $1 ? 1 : 0;
+ # BKI_LOOKUP implicitly makes an FK reference
+ push @{ $catalog{foreign_keys} },
+ {
+ is_array =>
+ ($atttype eq 'oidvector' || $atttype eq '_oid')
+ ? 1
+ : 0,
+ is_opt => $column{lookup_opt},
+ fk_cols => $attname,
+ pk_table => $column{lookup},
+ pk_cols => 'oid'
+ };
}
else
{
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index 995ddf12852..70bc2123df7 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -70,7 +70,7 @@ CATALOG_HEADERS := \
pg_sequence.h pg_publication.h pg_publication_rel.h pg_subscription.h \
pg_subscription_rel.h
-GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h
+GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h system_fk_info.h
POSTGRES_BKI_SRCS := $(addprefix $(top_srcdir)/src/include/catalog/, $(CATALOG_HEADERS))
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index b68c1752c00..5bdc7adc440 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -213,6 +213,12 @@ foreach my $row (@{ $catalog_data{pg_am} })
$amoids{ $row->{amname} } = $row->{oid};
}
+# There is only one authid at bootstrap time, and we handle it specially:
+# the usually-defaulted symbol PGUID becomes the bootstrap superuser's OID.
+# (We could drop this in favor of writing out BKI_DEFAULT(POSTGRES) ...)
+my %authidoids;
+$authidoids{'PGUID'} = $BOOTSTRAP_SUPERUSERID;
+
# class (relation) OID lookup (note this only covers bootstrap catalogs!)
my %classoids;
foreach my $row (@{ $catalog_data{pg_class} })
@@ -234,6 +240,12 @@ foreach my $row (@{ $catalog_data{pg_language} })
$langoids{ $row->{lanname} } = $row->{oid};
}
+# There is only one namespace at bootstrap time, and we handle it specially:
+# the usually-defaulted symbol PGNSP becomes the pg_catalog namespace's OID.
+# (We could drop this in favor of writing out BKI_DEFAULT(pg_catalog) ...)
+my %namespaceoids;
+$namespaceoids{'PGNSP'} = $PG_CATALOG_NAMESPACE;
+
# opclass OID lookup
my %opcoids;
foreach my $row (@{ $catalog_data{pg_opclass} })
@@ -376,9 +388,11 @@ close $ef;
# Map lookup name to the corresponding hash table.
my %lookup_kind = (
pg_am => \%amoids,
+ pg_authid => \%authidoids,
pg_class => \%classoids,
pg_collation => \%collationoids,
pg_language => \%langoids,
+ pg_namespace => \%namespaceoids,
pg_opclass => \%opcoids,
pg_operator => \%operoids,
pg_opfamily => \%opfoids,
@@ -400,6 +414,9 @@ open my $bki, '>', $bkifile . $tmpext
my $schemafile = $output_path . 'schemapg.h';
open my $schemapg, '>', $schemafile . $tmpext
or die "can't open $schemafile$tmpext: $!";
+my $fk_info_file = $output_path . 'system_fk_info.h';
+open my $fk_info, '>', $fk_info_file . $tmpext
+ or die "can't open $fk_info_file$tmpext: $!";
my $constraints_file = $output_path . 'system_constraints.sql';
open my $constraints, '>', $constraints_file . $tmpext
or die "can't open $constraints_file$tmpext: $!";
@@ -554,18 +571,14 @@ EOM
$GenbkiNextOid++;
}
- # Substitute constant values we acquired above.
- # (It's intentional that this can apply to parts of a field).
- $bki_values{$attname} =~ s/\bPGUID\b/$BOOTSTRAP_SUPERUSERID/g;
- $bki_values{$attname} =~ s/\bPGNSP\b/$PG_CATALOG_NAMESPACE/g;
-
# Replace OID synonyms with OIDs per the appropriate lookup rule.
#
# If the column type is oidvector or _oid, we have to replace
# each element of the array as per the lookup rule.
if ($column->{lookup})
{
- my $lookup = $lookup_kind{ $column->{lookup} };
+ my $lookup = $lookup_kind{ $column->{lookup} };
+ my $lookup_opt = $column->{lookup_opt};
my @lookupnames;
my @lookupoids;
@@ -575,8 +588,9 @@ EOM
if ($atttype eq 'oidvector')
{
@lookupnames = split /\s+/, $bki_values{$attname};
- @lookupoids = lookup_oids($lookup, $catname, \%bki_values,
- @lookupnames);
+ @lookupoids =
+ lookup_oids($lookup, $catname, $attname, $lookup_opt,
+ \%bki_values, @lookupnames);
$bki_values{$attname} = join(' ', @lookupoids);
}
elsif ($atttype eq '_oid')
@@ -586,8 +600,8 @@ EOM
$bki_values{$attname} =~ s/[{}]//g;
@lookupnames = split /,/, $bki_values{$attname};
@lookupoids =
- lookup_oids($lookup, $catname, \%bki_values,
- @lookupnames);
+ lookup_oids($lookup, $catname, $attname,
+ $lookup_opt, \%bki_values, @lookupnames);
$bki_values{$attname} = sprintf "{%s}",
join(',', @lookupoids);
}
@@ -595,8 +609,9 @@ EOM
else
{
$lookupnames[0] = $bki_values{$attname};
- @lookupoids = lookup_oids($lookup, $catname, \%bki_values,
- @lookupnames);
+ @lookupoids =
+ lookup_oids($lookup, $catname, $attname, $lookup_opt,
+ \%bki_values, @lookupnames);
$bki_values{$attname} = $lookupoids[0];
}
}
@@ -706,14 +721,78 @@ foreach my $table_name (@tables_needing_macros)
# Closing boilerplate for schemapg.h
print $schemapg "\n#endif\t\t\t\t\t\t\t/* SCHEMAPG_H */\n";
+# Now generate system_fk_info.h
+
+# Opening boilerplate for system_fk_info.h
+print $fk_info <{foreign_keys} })
+ {
+ my $pktabname = $fkinfo->{pk_table};
+
+ # We use BKI_LOOKUP for encodings, but there's no real catalog there
+ next if $pktabname eq 'encoding';
+
+ printf $fk_info
+ "\t{ /* %s */ %s, /* %s */ %s, \"{%s}\", \"{%s}\", %s, %s},\n",
+ $catname, $catalog->{relation_oid},
+ $pktabname, $catalogs{$pktabname}->{relation_oid},
+ $fkinfo->{fk_cols},
+ $fkinfo->{pk_cols},
+ ($fkinfo->{is_array} ? "true" : "false"),
+ ($fkinfo->{is_opt} ? "true" : "false");
+ }
+}
+
+# Closing boilerplate for system_fk_info.h
+print $fk_info "};\n\n#endif\t\t\t\t\t\t\t/* SYSTEM_FK_INFO_H */\n";
+
# We're done emitting data
close $bki;
close $schemapg;
+close $fk_info;
close $constraints;
# Finally, rename the completed files into place.
Catalog::RenameTempFile($bkifile, $tmpext);
Catalog::RenameTempFile($schemafile, $tmpext);
+Catalog::RenameTempFile($fk_info_file, $tmpext);
Catalog::RenameTempFile($constraints_file, $tmpext);
exit 0;
@@ -948,7 +1027,8 @@ sub morph_row_for_schemapg
# within this genbki.pl run.)
sub lookup_oids
{
- my ($lookup, $catname, $bki_values, @lookupnames) = @_;
+ my ($lookup, $catname, $attname, $lookup_opt, $bki_values, @lookupnames)
+ = @_;
my @lookupoids;
foreach my $lookupname (@lookupnames)
@@ -961,10 +1041,19 @@ sub lookup_oids
else
{
push @lookupoids, $lookupname;
- warn sprintf
- "unresolved OID reference \"%s\" in %s.dat line %s\n",
- $lookupname, $catname, $bki_values->{line_number}
- if $lookupname ne '-' and $lookupname ne '0';
+ if ($lookupname eq '-' or $lookupname eq '0')
+ {
+ warn sprintf
+ "invalid zero OID reference in %s.dat field %s line %s\n",
+ $catname, $attname, $bki_values->{line_number}
+ if !$lookup_opt;
+ }
+ else
+ {
+ warn sprintf
+ "unresolved OID reference \"%s\" in %s.dat field %s line %s\n",
+ $lookupname, $catname, $attname, $bki_values->{line_number};
+ }
}
}
return @lookupoids;
diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c
index 4096faff9a1..634f574d7eb 100644
--- a/src/backend/utils/adt/misc.c
+++ b/src/backend/utils/adt/misc.c
@@ -25,6 +25,7 @@
#include "catalog/catalog.h"
#include "catalog/pg_tablespace.h"
#include "catalog/pg_type.h"
+#include "catalog/system_fk_info.h"
#include "commands/dbcommands.h"
#include "commands/tablespace.h"
#include "common/keywords.h"
@@ -37,6 +38,7 @@
#include "storage/fd.h"
#include "tcop/tcopprot.h"
#include "utils/builtins.h"
+#include "utils/fmgroids.h"
#include "utils/lsyscache.h"
#include "utils/ruleutils.h"
#include "utils/timestamp.h"
@@ -489,6 +491,84 @@ pg_get_keywords(PG_FUNCTION_ARGS)
}
+/* Function to return the list of catalog foreign key relationships */
+Datum
+pg_get_catalog_foreign_keys(PG_FUNCTION_ARGS)
+{
+ FuncCallContext *funcctx;
+ FmgrInfo *arrayinp;
+
+ if (SRF_IS_FIRSTCALL())
+ {
+ MemoryContext oldcontext;
+ TupleDesc tupdesc;
+
+ funcctx = SRF_FIRSTCALL_INIT();
+ oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
+
+ tupdesc = CreateTemplateTupleDesc(6);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 1, "fktable",
+ REGCLASSOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 2, "fkcols",
+ TEXTARRAYOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 3, "pktable",
+ REGCLASSOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 4, "pkcols",
+ TEXTARRAYOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 5, "is_array",
+ BOOLOID, -1, 0);
+ TupleDescInitEntry(tupdesc, (AttrNumber) 6, "is_opt",
+ BOOLOID, -1, 0);
+
+ funcctx->tuple_desc = BlessTupleDesc(tupdesc);
+
+ /*
+ * We use array_in to convert the C strings in sys_fk_relationships[]
+ * to text arrays. But we cannot use DirectFunctionCallN to call
+ * array_in, and it wouldn't be very efficient if we could. Fill an
+ * FmgrInfo to use for the call.
+ */
+ arrayinp = (FmgrInfo *) palloc(sizeof(FmgrInfo));
+ fmgr_info(F_ARRAY_IN, arrayinp);
+ funcctx->user_fctx = arrayinp;
+
+ MemoryContextSwitchTo(oldcontext);
+ }
+
+ funcctx = SRF_PERCALL_SETUP();
+ arrayinp = (FmgrInfo *) funcctx->user_fctx;
+
+ if (funcctx->call_cntr < lengthof(sys_fk_relationships))
+ {
+ const SysFKRelationship *fkrel = &sys_fk_relationships[funcctx->call_cntr];
+ Datum values[6];
+ bool nulls[6];
+ HeapTuple tuple;
+
+ memset(nulls, false, sizeof(nulls));
+
+ values[0] = ObjectIdGetDatum(fkrel->fk_table);
+ values[1] = FunctionCall3(arrayinp,
+ CStringGetDatum(fkrel->fk_columns),
+ ObjectIdGetDatum(TEXTOID),
+ Int32GetDatum(-1));
+ values[2] = ObjectIdGetDatum(fkrel->pk_table);
+ values[3] = FunctionCall3(arrayinp,
+ CStringGetDatum(fkrel->pk_columns),
+ ObjectIdGetDatum(TEXTOID),
+ Int32GetDatum(-1));
+ values[4] = BoolGetDatum(fkrel->is_array);
+ values[5] = BoolGetDatum(fkrel->is_opt);
+
+ tuple = heap_form_tuple(funcctx->tuple_desc, values, nulls);
+
+ SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple));
+ }
+
+ SRF_RETURN_DONE(funcctx);
+}
+
+
/*
* Return the type of the argument.
*/
diff --git a/src/include/Makefile b/src/include/Makefile
index c557375ae31..5f257a958c8 100644
--- a/src/include/Makefile
+++ b/src/include/Makefile
@@ -54,7 +54,7 @@ install: all installdirs
cp $(srcdir)/$$dir/*.h '$(DESTDIR)$(includedir_server)'/$$dir/ || exit; \
done
ifeq ($(vpath_build),yes)
- for file in catalog/schemapg.h catalog/pg_*_d.h parser/gram.h storage/lwlocknames.h utils/probes.h; do \
+ for file in catalog/schemapg.h catalog/system_fk_info.h catalog/pg_*_d.h parser/gram.h storage/lwlocknames.h utils/probes.h; do \
cp $$file '$(DESTDIR)$(includedir_server)'/$$file || exit; \
done
endif
@@ -79,7 +79,8 @@ uninstall:
clean:
rm -f utils/fmgroids.h utils/fmgrprotos.h utils/errcodes.h utils/header-stamp
rm -f parser/gram.h storage/lwlocknames.h utils/probes.h
- rm -f catalog/schemapg.h catalog/pg_*_d.h catalog/header-stamp
+ rm -f catalog/schemapg.h catalog/system_fk_info.h
+ rm -f catalog/pg_*_d.h catalog/header-stamp
distclean maintainer-clean: clean
rm -f pg_config.h pg_config_ext.h pg_config_os.h stamp-h stamp-ext-h
diff --git a/src/include/catalog/.gitignore b/src/include/catalog/.gitignore
index 6c8da5401dd..6b83d4c7e6e 100644
--- a/src/include/catalog/.gitignore
+++ b/src/include/catalog/.gitignore
@@ -1,3 +1,4 @@
/schemapg.h
+/system_fk_info.h
/pg_*_d.h
/header-stamp
diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h
index 133f4ee3094..638830aaac1 100644
--- a/src/include/catalog/catversion.h
+++ b/src/include/catalog/catversion.h
@@ -53,6 +53,6 @@
*/
/* yyyymmddN */
-#define CATALOG_VERSION_NO 202101311
+#define CATALOG_VERSION_NO 202102021
#endif
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index 5d05fafb5da..b1fee54d3c2 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -36,10 +36,15 @@
/* Specifies a default value for auto-generated array types */
#define BKI_ARRAY_DEFAULT(value)
/*
- * Indicates how to perform name lookups, typically for an OID or
- * OID-array field
+ * Indicates that the attribute contains OIDs referencing the named catalog;
+ * can be applied to columns of oid, regproc, oid[], or oidvector type.
+ * genbki.pl uses this to know how to perform name lookups in the initial
+ * data (if any), and it also feeds into regression-test validity checks.
+ * The _OPT suffix indicates that values can be zero instead of
+ * a valid OID reference.
*/
#define BKI_LOOKUP(catalog)
+#define BKI_LOOKUP_OPT(catalog)
/*
* These lines are processed by genbki.pl to create the statements
@@ -75,6 +80,33 @@
#define DECLARE_UNIQUE_INDEX(name,oid,decl) extern int no_such_variable
#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,decl) extern int no_such_variable
+/*
+ * These lines are processed by genbki.pl to create a table for use
+ * by the pg_get_catalog_foreign_keys() function. We do not have any
+ * mechanism that actually enforces foreign-key relationships in the
+ * system catalogs, but it is still useful to record the intended
+ * relationships in a machine-readable form.
+ *
+ * The keyword is DECLARE_FOREIGN_KEY[_OPT] or DECLARE_ARRAY_FOREIGN_KEY[_OPT].
+ * The first argument is a parenthesized list of the referencing columns;
+ * the second, the name of the referenced table; the third, a parenthesized
+ * list of the referenced columns. Use of the ARRAY macros means that the
+ * last referencing column is an array, each of whose elements is supposed
+ * to match some entry in the last referenced column. Use of the OPT suffix
+ * indicates that the referencing column(s) can be zero instead of a valid
+ * reference.
+ *
+ * Columns that are marked with a BKI_LOOKUP rule do not need an explicit
+ * DECLARE_FOREIGN_KEY macro, as genbki.pl can infer the FK relationship
+ * from that. Thus, these macros are only needed in special cases.
+ *
+ * The macro definitions are just to keep the C compiler from spitting up.
+ */
+#define DECLARE_FOREIGN_KEY(cols,reftbl,refcols) extern int no_such_variable
+#define DECLARE_FOREIGN_KEY_OPT(cols,reftbl,refcols) extern int no_such_variable
+#define DECLARE_ARRAY_FOREIGN_KEY(cols,reftbl,refcols) extern int no_such_variable
+#define DECLARE_ARRAY_FOREIGN_KEY_OPT(cols,reftbl,refcols) extern int no_such_variable
+
/* The following are never defined; they are here only for documentation. */
/*
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 8b03cdeea24..25feb41678f 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -44,25 +44,25 @@ CATALOG(pg_aggregate,2600,AggregateRelationId)
regproc aggtransfn BKI_LOOKUP(pg_proc);
/* final function (0 if none) */
- regproc aggfinalfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc aggfinalfn BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* combine function (0 if none) */
- regproc aggcombinefn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc aggcombinefn BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* function to convert transtype to bytea (0 if none) */
- regproc aggserialfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc aggserialfn BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* function to convert bytea to transtype (0 if none) */
- regproc aggdeserialfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc aggdeserialfn BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* forward function for moving-aggregate mode (0 if none) */
- regproc aggmtransfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc aggmtransfn BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* inverse function for moving-aggregate mode (0 if none) */
- regproc aggminvtransfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc aggminvtransfn BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* final function for moving-aggregate mode (0 if none) */
- regproc aggmfinalfn BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc aggmfinalfn BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* true to pass extra dummy arguments to aggfinalfn */
bool aggfinalextra BKI_DEFAULT(f);
@@ -77,7 +77,7 @@ CATALOG(pg_aggregate,2600,AggregateRelationId)
char aggmfinalmodify BKI_DEFAULT(r);
/* associated sort operator (0 if none) */
- Oid aggsortop BKI_DEFAULT(0) BKI_LOOKUP(pg_operator);
+ Oid aggsortop BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_operator);
/* type of aggregate's transition (state) data */
Oid aggtranstype BKI_LOOKUP(pg_type);
@@ -86,7 +86,7 @@ CATALOG(pg_aggregate,2600,AggregateRelationId)
int32 aggtransspace BKI_DEFAULT(0);
/* type of moving-aggregate state data (0 if none) */
- Oid aggmtranstype BKI_DEFAULT(0) BKI_LOOKUP(pg_type);
+ Oid aggmtranstype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
/* estimated size of moving-agg state (0 for default est) */
int32 aggmtransspace BKI_DEFAULT(0);
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index 554fc41497d..e1cca35e312 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -77,7 +77,7 @@ CATALOG(pg_amop,2602,AccessMethodOperatorRelationId)
Oid amopmethod BKI_LOOKUP(pg_am);
/* ordering opfamily OID, or 0 if search op */
- Oid amopsortfamily BKI_DEFAULT(0) BKI_LOOKUP(pg_opfamily);
+ Oid amopsortfamily BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_opfamily);
} FormData_pg_amop;
/* ----------------
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index 03efaaded9c..d689ca20c85 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -30,7 +30,8 @@ CATALOG(pg_attrdef,2604,AttrDefaultRelationId)
{
Oid oid; /* oid */
- Oid adrelid; /* OID of table containing attribute */
+ Oid adrelid BKI_LOOKUP(pg_class); /* OID of table containing
+ * attribute */
int16 adnum; /* attnum of attribute */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
@@ -53,4 +54,6 @@ DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, on pg_attrdef using b
DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, on pg_attrdef using btree(oid oid_ops));
#define AttrDefaultOidIndexId 2657
+DECLARE_FOREIGN_KEY((adrelid, adnum), pg_attribute, (attrelid, attnum));
+
#endif /* PG_ATTRDEF_H */
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index ba0efff08c0..3db42abf087 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -36,7 +36,8 @@
*/
CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,AttributeRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
- Oid attrelid; /* OID of relation containing this attribute */
+ Oid attrelid BKI_LOOKUP(pg_class); /* OID of relation containing
+ * this attribute */
NameData attname; /* name of attribute */
/*
@@ -44,9 +45,12 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
* defines the data type of this attribute (e.g. int4). Information in
* that instance is redundant with the attlen, attbyval, and attalign
* attributes of this instance, so they had better match or Postgres will
- * fail.
+ * fail. In an entry for a dropped column, this field is set to zero
+ * since the pg_type entry may no longer exist; but we rely on attlen,
+ * attbyval, and attalign to still tell us how large the values in the
+ * table are.
*/
- Oid atttypid;
+ Oid atttypid BKI_LOOKUP_OPT(pg_type);
/*
* attstattarget is the target number of statistics datapoints to collect
@@ -153,8 +157,8 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
/* Number of times inherited from direct parent relation(s) */
int32 attinhcount BKI_DEFAULT(0);
- /* attribute's collation */
- Oid attcollation;
+ /* attribute's collation, if any */
+ Oid attcollation BKI_LOOKUP_OPT(pg_collation);
#ifdef CATALOG_VARLEN /* variable-length fields start here */
/* NOTE: The following fields are not present in tuple descriptors. */
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h
index e90c3956408..76ab90c9395 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -29,9 +29,9 @@
*/
CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2843,AuthMemRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
- Oid roleid; /* ID of a role */
- Oid member; /* ID of a member of that role */
- Oid grantor; /* who granted the membership */
+ Oid roleid BKI_LOOKUP(pg_authid); /* ID of a role */
+ Oid member BKI_LOOKUP(pg_authid); /* ID of a member of that role */
+ Oid grantor BKI_LOOKUP(pg_authid); /* who granted the membership */
bool admin_option; /* granted with admin option? */
} FormData_pg_auth_members;
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index 2d36628c201..f64a9df54ce 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -40,7 +40,7 @@ CATALOG(pg_cast,2605,CastRelationId)
Oid casttarget BKI_LOOKUP(pg_type);
/* cast function; 0 = binary coercible */
- Oid castfunc BKI_LOOKUP(pg_proc);
+ Oid castfunc BKI_LOOKUP_OPT(pg_proc);
/* contexts in which cast can be used */
char castcontext;
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index eca306ca98f..bb6938caa23 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -38,26 +38,26 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat
NameData relname;
/* OID of namespace containing this class */
- Oid relnamespace BKI_DEFAULT(PGNSP);
+ Oid relnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
- /* OID of entry in pg_type for table's implicit row type */
- Oid reltype BKI_LOOKUP(pg_type);
+ /* OID of entry in pg_type for relation's implicit row type, if any */
+ Oid reltype BKI_LOOKUP_OPT(pg_type);
- /* OID of entry in pg_type for underlying composite type */
- Oid reloftype BKI_DEFAULT(0) BKI_LOOKUP(pg_type);
+ /* OID of entry in pg_type for underlying composite type, if any */
+ Oid reloftype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
/* class owner */
- Oid relowner BKI_DEFAULT(PGUID);
+ Oid relowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* access method; 0 if not a table / index */
- Oid relam BKI_DEFAULT(heap) BKI_LOOKUP(pg_am);
+ Oid relam BKI_DEFAULT(heap) BKI_LOOKUP_OPT(pg_am);
/* identifier of physical storage file */
/* relfilenode == 0 means it is a "mapped" relation, see relmapper.c */
Oid relfilenode BKI_DEFAULT(0);
/* identifier of table space for relation (0 means default for database) */
- Oid reltablespace BKI_DEFAULT(0) BKI_LOOKUP(pg_tablespace);
+ Oid reltablespace BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_tablespace);
/* # of blocks (not always up-to-date) */
int32 relpages BKI_DEFAULT(0);
@@ -69,7 +69,7 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat
int32 relallvisible BKI_DEFAULT(0);
/* OID of toast table; 0 if none */
- Oid reltoastrelid BKI_DEFAULT(0);
+ Oid reltoastrelid BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class);
/* T if has (or has had) any indexes */
bool relhasindex BKI_DEFAULT(f);
@@ -119,8 +119,8 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat
/* is relation a partition? */
bool relispartition BKI_DEFAULT(f);
- /* heap for rewrite during DDL, link to original rel */
- Oid relrewrite BKI_DEFAULT(0);
+ /* link to original rel during table rewrite; otherwise 0 */
+ Oid relrewrite BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_class);
/* all Xids < this are frozen in this rel */
TransactionId relfrozenxid BKI_DEFAULT(3); /* FirstNormalTransactionId */
diff --git a/src/include/catalog/pg_collation.dat b/src/include/catalog/pg_collation.dat
index ad57b0fa6d1..6e0ab1ab4b8 100644
--- a/src/include/catalog/pg_collation.dat
+++ b/src/include/catalog/pg_collation.dat
@@ -14,18 +14,15 @@
{ oid => '100', oid_symbol => 'DEFAULT_COLLATION_OID',
descr => 'database\'s default collation',
- collname => 'default', collnamespace => 'PGNSP', collowner => 'PGUID',
- collprovider => 'd', collencoding => '-1', collcollate => '',
- collctype => '' },
+ collname => 'default', collprovider => 'd', collencoding => '-1',
+ collcollate => '', collctype => '' },
{ oid => '950', oid_symbol => 'C_COLLATION_OID',
descr => 'standard C collation',
- collname => 'C', collnamespace => 'PGNSP', collowner => 'PGUID',
- collprovider => 'c', collencoding => '-1', collcollate => 'C',
- collctype => 'C' },
+ collname => 'C', collprovider => 'c', collencoding => '-1',
+ collcollate => 'C', collctype => 'C' },
{ oid => '951', oid_symbol => 'POSIX_COLLATION_OID',
descr => 'standard POSIX collation',
- collname => 'POSIX', collnamespace => 'PGNSP', collowner => 'PGUID',
- collprovider => 'c', collencoding => '-1', collcollate => 'POSIX',
- collctype => 'POSIX' },
+ collname => 'POSIX', collprovider => 'c', collencoding => '-1',
+ collcollate => 'POSIX', collctype => 'POSIX' },
]
diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h
index 3c496ea9141..3bd7873c688 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -30,8 +30,9 @@ CATALOG(pg_collation,3456,CollationRelationId)
{
Oid oid; /* oid */
NameData collname; /* collation name */
- Oid collnamespace; /* OID of namespace containing collation */
- Oid collowner; /* owner of collation */
+ Oid collnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace); /* OID of namespace
+ * containing collation */
+ Oid collowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); /* owner of collation */
char collprovider; /* see constants below */
bool collisdeterministic BKI_DEFAULT(t);
int32 collencoding; /* encoding for this collation; -1 = "all" */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 6449937b352..63f0f8bf418 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -46,7 +46,8 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
* conrelid + contypid + conname.
*/
NameData conname; /* name of this constraint */
- Oid connamespace; /* OID of namespace containing constraint */
+ Oid connamespace BKI_LOOKUP(pg_namespace); /* OID of namespace
+ * containing constraint */
char contype; /* constraint type; see codes below */
bool condeferrable; /* deferrable constraint? */
bool condeferred; /* deferred by default? */
@@ -57,7 +58,8 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
* specific relation (this excludes domain constraints and assertions).
* Otherwise conrelid is 0 and conkey is NULL.
*/
- Oid conrelid; /* relation this constraint constrains */
+ Oid conrelid BKI_LOOKUP_OPT(pg_class); /* relation this
+ * constraint constrains */
/*
* contypid links to the pg_type row for a domain if this is a domain
@@ -66,7 +68,8 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
* For SQL-style global ASSERTIONs, both conrelid and contypid would be
* zero. This is not presently supported, however.
*/
- Oid contypid; /* domain this constraint constrains */
+ Oid contypid BKI_LOOKUP_OPT(pg_type); /* domain this constraint
+ * constrains */
/*
* conindid links to the index supporting the constraint, if any;
@@ -76,19 +79,21 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
* columns). Notice that the index is on conrelid in the first case but
* confrelid in the second.
*/
- Oid conindid; /* index supporting this constraint */
+ Oid conindid BKI_LOOKUP_OPT(pg_class); /* index supporting this
+ * constraint */
/*
* If this constraint is on a partition inherited from a partitioned
* table, this is the OID of the corresponding constraint in the parent.
*/
- Oid conparentid;
+ Oid conparentid BKI_LOOKUP_OPT(pg_constraint);
/*
* These fields, plus confkey, are only meaningful for a foreign-key
* constraint. Otherwise confrelid is 0 and the char fields are spaces.
*/
- Oid confrelid; /* relation referenced by foreign key */
+ Oid confrelid BKI_LOOKUP_OPT(pg_class); /* relation referenced by
+ * foreign key */
char confupdtype; /* foreign key's ON UPDATE action */
char confdeltype; /* foreign key's ON DELETE action */
char confmatchtype; /* foreign key's match type */
@@ -119,25 +124,25 @@ CATALOG(pg_constraint,2606,ConstraintRelationId)
* If a foreign key, the OIDs of the PK = FK equality operators for each
* column of the constraint
*/
- Oid conpfeqop[1];
+ Oid conpfeqop[1] BKI_LOOKUP(pg_operator);
/*
* If a foreign key, the OIDs of the PK = PK equality operators for each
* column of the constraint (i.e., equality for the referenced columns)
*/
- Oid conppeqop[1];
+ Oid conppeqop[1] BKI_LOOKUP(pg_operator);
/*
* If a foreign key, the OIDs of the FK = FK equality operators for each
* column of the constraint (i.e., equality for the referencing columns)
*/
- Oid conffeqop[1];
+ Oid conffeqop[1] BKI_LOOKUP(pg_operator);
/*
* If an exclusion constraint, the OIDs of the exclusion operators for
* each column of the constraint
*/
- Oid conexclop[1];
+ Oid conexclop[1] BKI_LOOKUP(pg_operator);
/*
* If a check constraint, nodeToString representation of expression
@@ -166,6 +171,10 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, on pg_constraint using
DECLARE_INDEX(pg_constraint_conparentid_index, 2579, on pg_constraint using btree(conparentid oid_ops));
#define ConstraintParentIndexId 2579
+/* conkey can contain zero (InvalidAttrNumber) if a whole-row Var is used */
+DECLARE_ARRAY_FOREIGN_KEY_OPT((conrelid, conkey), pg_attribute, (attrelid, attnum));
+DECLARE_ARRAY_FOREIGN_KEY((confrelid, confkey), pg_attribute, (attrelid, attnum));
+
#ifdef EXPOSE_TO_CLIENT_CODE
/* Valid values for contype */
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index b02dfe0c3f7..96bb92f251b 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -35,10 +35,10 @@ CATALOG(pg_conversion,2607,ConversionRelationId)
NameData conname;
/* namespace that the conversion belongs to */
- Oid connamespace BKI_DEFAULT(PGNSP);
+ Oid connamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* owner of the conversion */
- Oid conowner BKI_DEFAULT(PGUID);
+ Oid conowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* FOR encoding id */
int32 conforencoding BKI_LOOKUP(encoding);
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index b7a0b6a381b..f0240c58cf1 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -35,7 +35,7 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID
NameData datname;
/* owner of database */
- Oid datdba BKI_DEFAULT(PGUID);
+ Oid datdba BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* character encoding */
int32 encoding;
diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h
index f18819d670c..705f698ae79 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -33,8 +33,11 @@
*/
CATALOG(pg_db_role_setting,2964,DbRoleSettingRelationId) BKI_SHARED_RELATION
{
- Oid setdatabase; /* database */
- Oid setrole; /* role */
+ /* database, or 0 for a role-specific setting */
+ Oid setdatabase BKI_LOOKUP_OPT(pg_database);
+
+ /* role, or 0 for a database-specific setting */
+ Oid setrole BKI_LOOKUP_OPT(pg_authid);
#ifdef CATALOG_VARLEN /* variable-length fields start here */
text setconfig[1]; /* GUC settings to apply at login */
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index bb7db32cd6c..156fc0712da 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -30,8 +30,10 @@
CATALOG(pg_default_acl,826,DefaultAclRelationId)
{
Oid oid; /* oid */
- Oid defaclrole; /* OID of role owning this ACL */
- Oid defaclnamespace; /* OID of namespace, or 0 for all */
+ Oid defaclrole BKI_LOOKUP(pg_authid); /* OID of role owning this
+ * ACL */
+ Oid defaclnamespace BKI_LOOKUP_OPT(pg_namespace); /* OID of namespace, or
+ * 0 for all */
char defaclobjtype; /* see DEFACLOBJ_xxx constants below */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index b0837901806..606a2a8e192 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -45,14 +45,16 @@ CATALOG(pg_depend,2608,DependRelationId)
*
* These fields are all zeroes for a DEPENDENCY_PIN entry.
*/
- Oid classid; /* OID of table containing object */
+ Oid classid BKI_LOOKUP_OPT(pg_class); /* 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 */
+ Oid refclassid BKI_LOOKUP(pg_class); /* 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 ad9de5e0a06..adc06a854d9 100644
--- a/src/include/catalog/pg_description.h
+++ b/src/include/catalog/pg_description.h
@@ -68,4 +68,7 @@ DECLARE_TOAST(pg_description, 2834, 2835);
DECLARE_UNIQUE_INDEX_PKEY(pg_description_o_c_o_index, 2675, on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
#define DescriptionObjIndexId 2675
+/* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */
+DECLARE_FOREIGN_KEY((classoid), pg_class, (oid));
+
#endif /* PG_DESCRIPTION_H */
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index 5eaf70772c7..78a183b27d4 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -31,7 +31,7 @@
CATALOG(pg_enum,3501,EnumRelationId)
{
Oid oid; /* oid */
- Oid enumtypid; /* OID of owning enum type */
+ Oid enumtypid BKI_LOOKUP(pg_type); /* 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 6f0266ed0fa..eeaa6be5184 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -31,8 +31,9 @@ CATALOG(pg_event_trigger,3466,EventTriggerRelationId)
Oid oid; /* oid */
NameData evtname; /* trigger's name */
NameData evtevent; /* trigger's event */
- Oid evtowner; /* trigger's owner */
- Oid evtfoid; /* OID of function to be called */
+ Oid evtowner BKI_LOOKUP(pg_authid); /* trigger's owner */
+ Oid evtfoid BKI_LOOKUP(pg_proc); /* OID of function to be
+ * called */
char evtenabled; /* trigger's firing configuration WRT
* session_replication_role */
diff --git a/src/include/catalog/pg_extension.h b/src/include/catalog/pg_extension.h
index af119bfea7a..2d6ad9fa888 100644
--- a/src/include/catalog/pg_extension.h
+++ b/src/include/catalog/pg_extension.h
@@ -30,14 +30,16 @@ CATALOG(pg_extension,3079,ExtensionRelationId)
{
Oid oid; /* oid */
NameData extname; /* extension name */
- Oid extowner; /* extension owner */
- Oid extnamespace; /* namespace of contained objects */
+ Oid extowner BKI_LOOKUP(pg_authid); /* extension owner */
+ Oid extnamespace BKI_LOOKUP(pg_namespace); /* namespace of
+ * contained objects */
bool extrelocatable; /* if true, allow ALTER EXTENSION SET SCHEMA */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
/* extversion may never be null, but the others can be. */
text extversion BKI_FORCE_NOT_NULL; /* extension version name */
- Oid extconfig[1]; /* dumpable configuration tables */
+ Oid extconfig[1] BKI_LOOKUP(pg_class); /* dumpable configuration
+ * tables */
text extcondition[1]; /* WHERE clauses for config tables */
#endif
} FormData_pg_extension;
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index 0f523a26b9c..f6240d9eb32 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -30,9 +30,12 @@ CATALOG(pg_foreign_data_wrapper,2328,ForeignDataWrapperRelationId)
{
Oid oid; /* oid */
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 */
+ Oid fdwowner BKI_LOOKUP(pg_authid); /* FDW owner */
+ Oid fdwhandler BKI_LOOKUP_OPT(pg_proc); /* handler function, or 0
+ * if none */
+ Oid fdwvalidator BKI_LOOKUP_OPT(pg_proc); /* 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_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index 385b896e970..a173699aef6 100644
--- a/src/include/catalog/pg_foreign_server.h
+++ b/src/include/catalog/pg_foreign_server.h
@@ -29,8 +29,8 @@ CATALOG(pg_foreign_server,1417,ForeignServerRelationId)
{
Oid oid; /* oid */
NameData srvname; /* foreign server name */
- Oid srvowner; /* server owner */
- Oid srvfdw; /* server FDW */
+ Oid srvowner BKI_LOOKUP(pg_authid); /* server owner */
+ Oid srvfdw BKI_LOOKUP(pg_foreign_data_wrapper); /* server FDW */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
text srvtype;
diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h
index 24f7f2998eb..3b6221b0e64 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -27,8 +27,8 @@
*/
CATALOG(pg_foreign_table,3118,ForeignTableRelationId)
{
- Oid ftrelid; /* OID of foreign table */
- Oid ftserver; /* OID of foreign server */
+ Oid ftrelid BKI_LOOKUP(pg_class); /* OID of foreign table */
+ Oid ftserver BKI_LOOKUP(pg_foreign_server); /* OID of foreign server */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
text ftoptions[1]; /* FDW-specific options */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index 1a7aef18ce8..00d0b439f5c 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -28,8 +28,9 @@
*/
CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO
{
- Oid indexrelid; /* OID of the index */
- Oid indrelid; /* OID of the relation it indexes */
+ Oid indexrelid BKI_LOOKUP(pg_class); /* OID of the index */
+ Oid indrelid BKI_LOOKUP(pg_class); /* OID of the relation it
+ * indexes */
int16 indnatts; /* total number of columns in index */
int16 indnkeyatts; /* number of key columns in index */
bool indisunique; /* is this a unique index? */
@@ -48,8 +49,8 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO
* or 0 */
#ifdef CATALOG_VARLEN
- oidvector indcollation BKI_FORCE_NOT_NULL; /* collation identifiers */
- oidvector indclass BKI_FORCE_NOT_NULL; /* opclass identifiers */
+ oidvector indcollation BKI_LOOKUP_OPT(pg_collation) BKI_FORCE_NOT_NULL; /* collation identifiers */
+ oidvector indclass BKI_LOOKUP(pg_opclass) BKI_FORCE_NOT_NULL; /* opclass identifiers */
int2vector indoption BKI_FORCE_NOT_NULL; /* per-column flags
* (AM-specific meanings) */
pg_node_tree indexprs; /* expression trees for index attributes that
@@ -72,6 +73,9 @@ DECLARE_INDEX(pg_index_indrelid_index, 2678, on pg_index using btree(indrelid oi
DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, on pg_index using btree(indexrelid oid_ops));
#define IndexRelidIndexId 2679
+/* indkey can contain zero (InvalidAttrNumber) to represent expressions */
+DECLARE_ARRAY_FOREIGN_KEY_OPT((indrelid, indkey), pg_attribute, (attrelid, attnum));
+
#ifdef EXPOSE_TO_CLIENT_CODE
/*
diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h
index b8147796d85..2b71cad9a2a 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -31,8 +31,8 @@
*/
CATALOG(pg_inherits,2611,InheritsRelationId)
{
- Oid inhrelid;
- Oid inhparent;
+ Oid inhrelid BKI_LOOKUP(pg_class);
+ Oid inhparent BKI_LOOKUP(pg_class);
int32 inhseqno;
} FormData_pg_inherits;
diff --git a/src/include/catalog/pg_init_privs.h b/src/include/catalog/pg_init_privs.h
index 983b1857c0c..4aafeb246d7 100644
--- a/src/include/catalog/pg_init_privs.h
+++ b/src/include/catalog/pg_init_privs.h
@@ -46,7 +46,8 @@
CATALOG(pg_init_privs,3394,InitPrivsRelationId)
{
Oid objoid; /* OID of object itself */
- Oid classoid; /* OID of table containing object */
+ Oid classoid BKI_LOOKUP(pg_class); /* OID of table containing
+ * object */
int32 objsubid; /* column number, or 0 if not used */
char privtype; /* from initdb or extension? */
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index b1dcd0a4f57..e9df9dac09f 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -34,7 +34,7 @@ CATALOG(pg_language,2612,LanguageRelationId)
NameData lanname;
/* Language's owner */
- Oid lanowner BKI_DEFAULT(PGUID);
+ Oid lanowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* Is a procedural language */
bool lanispl BKI_DEFAULT(f);
@@ -43,13 +43,13 @@ CATALOG(pg_language,2612,LanguageRelationId)
bool lanpltrusted BKI_DEFAULT(f);
/* Call handler, if it's a PL */
- Oid lanplcallfoid BKI_DEFAULT(0) BKI_LOOKUP(pg_proc);
+ Oid lanplcallfoid BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_proc);
/* Optional anonymous-block handler function */
- Oid laninline BKI_DEFAULT(0) BKI_LOOKUP(pg_proc);
+ Oid laninline BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_proc);
/* Optional validation function */
- Oid lanvalidator BKI_DEFAULT(0) BKI_LOOKUP(pg_proc);
+ Oid lanvalidator BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_proc);
#ifdef CATALOG_VARLEN /* variable-length fields start here */
/* Access privileges */
diff --git a/src/include/catalog/pg_largeobject.h b/src/include/catalog/pg_largeobject.h
index f453319322a..32225f4de7d 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -28,7 +28,8 @@
*/
CATALOG(pg_largeobject,2613,LargeObjectRelationId)
{
- Oid loid; /* Identifier of large object */
+ Oid loid BKI_LOOKUP(pg_largeobject_metadata); /* Identifier of large
+ * object */
int32 pageno; /* Page number (starting from 0) */
/* data has variable length, but we allow direct access; see inv_api.c */
diff --git a/src/include/catalog/pg_largeobject_metadata.h b/src/include/catalog/pg_largeobject_metadata.h
index 220988b0ad6..9b689bab849 100644
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -31,7 +31,8 @@ CATALOG(pg_largeobject_metadata,2995,LargeObjectMetadataRelationId)
{
Oid oid; /* oid */
- Oid lomowner; /* OID of the largeobject owner */
+ Oid lomowner BKI_LOOKUP(pg_authid); /* OID of the largeobject
+ * owner */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
aclitem lomacl[1]; /* access permissions */
diff --git a/src/include/catalog/pg_namespace.dat b/src/include/catalog/pg_namespace.dat
index 76257e98fcc..2ed136b787e 100644
--- a/src/include/catalog/pg_namespace.dat
+++ b/src/include/catalog/pg_namespace.dat
@@ -14,12 +14,12 @@
{ oid => '11', oid_symbol => 'PG_CATALOG_NAMESPACE',
descr => 'system catalog schema',
- nspname => 'pg_catalog', nspowner => 'PGUID', nspacl => '_null_' },
+ nspname => 'pg_catalog', nspacl => '_null_' },
{ oid => '99', oid_symbol => 'PG_TOAST_NAMESPACE',
descr => 'reserved schema for TOAST tables',
- nspname => 'pg_toast', nspowner => 'PGUID', nspacl => '_null_' },
+ nspname => 'pg_toast', nspacl => '_null_' },
{ oid => '2200', oid_symbol => 'PG_PUBLIC_NAMESPACE',
descr => 'standard public schema',
- nspname => 'public', nspowner => 'PGUID', nspacl => '_null_' },
+ nspname => 'public', nspacl => '_null_' },
]
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index 0a68958b1c4..d920c6cfc64 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -37,7 +37,7 @@ CATALOG(pg_namespace,2615,NamespaceRelationId)
Oid oid; /* oid */
NameData nspname;
- Oid nspowner;
+ Oid nspowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
#ifdef CATALOG_VARLEN /* variable-length fields start here */
aclitem nspacl[1];
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index d132df1f2f7..9f321f2a85c 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -57,10 +57,10 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId)
NameData opcname;
/* namespace of this opclass */
- Oid opcnamespace BKI_DEFAULT(PGNSP);
+ Oid opcnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* opclass owner */
- Oid opcowner BKI_DEFAULT(PGUID);
+ Oid opcowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* containing operator family */
Oid opcfamily BKI_LOOKUP(pg_opfamily);
@@ -71,8 +71,8 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId)
/* T if opclass is default for opcintype */
bool opcdefault BKI_DEFAULT(t);
- /* type of data in index, or InvalidOid */
- Oid opckeytype BKI_DEFAULT(0) BKI_LOOKUP(pg_type);
+ /* type of data in index, or InvalidOid if same as input column type */
+ Oid opckeytype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
} FormData_pg_opclass;
/* ----------------
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index 3ca57e7c1b4..7f06abaeec1 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -36,10 +36,10 @@ CATALOG(pg_operator,2617,OperatorRelationId)
NameData oprname;
/* OID of namespace containing this oper */
- Oid oprnamespace BKI_DEFAULT(PGNSP);
+ Oid oprnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* operator owner */
- Oid oprowner BKI_DEFAULT(PGUID);
+ Oid oprowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* 'l' for prefix or 'b' for infix */
char oprkind BKI_DEFAULT(b);
@@ -51,28 +51,28 @@ CATALOG(pg_operator,2617,OperatorRelationId)
bool oprcanhash BKI_DEFAULT(f);
/* left arg type, or 0 if prefix operator */
- Oid oprleft BKI_LOOKUP(pg_type);
+ Oid oprleft BKI_LOOKUP_OPT(pg_type);
/* right arg type */
Oid oprright BKI_LOOKUP(pg_type);
- /* result datatype */
- Oid oprresult BKI_LOOKUP(pg_type);
+ /* result datatype; can be 0 in a "shell" operator */
+ Oid oprresult BKI_LOOKUP_OPT(pg_type);
/* OID of commutator oper, or 0 if none */
- Oid oprcom BKI_DEFAULT(0) BKI_LOOKUP(pg_operator);
+ Oid oprcom BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_operator);
/* OID of negator oper, or 0 if none */
- Oid oprnegate BKI_DEFAULT(0) BKI_LOOKUP(pg_operator);
+ Oid oprnegate BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_operator);
- /* OID of underlying function */
- regproc oprcode BKI_LOOKUP(pg_proc);
+ /* OID of underlying function; can be 0 in a "shell" operator */
+ regproc oprcode BKI_LOOKUP_OPT(pg_proc);
/* OID of restriction estimator, or 0 */
- regproc oprrest BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc oprrest BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/* OID of join estimator, or 0 */
- regproc oprjoin BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc oprjoin BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
} FormData_pg_operator;
/* ----------------
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 18385a6fd6c..1a723b76f63 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -37,10 +37,10 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId)
NameData opfname;
/* namespace of this opfamily */
- Oid opfnamespace BKI_DEFAULT(PGNSP);
+ Oid opfnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* opfamily owner */
- Oid opfowner BKI_DEFAULT(PGUID);
+ Oid opfowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
} FormData_pg_opfamily;
/* ----------------
diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h
index 038730b0053..48cbaf30ff8 100644
--- a/src/include/catalog/pg_partitioned_table.h
+++ b/src/include/catalog/pg_partitioned_table.h
@@ -29,11 +29,11 @@
*/
CATALOG(pg_partitioned_table,3350,PartitionedRelationId)
{
- Oid partrelid; /* partitioned table oid */
+ Oid partrelid BKI_LOOKUP(pg_class); /* partitioned table oid */
char partstrat; /* partitioning strategy */
int16 partnatts; /* number of partition key columns */
- Oid partdefid; /* default partition oid; InvalidOid if there
- * isn't one */
+ Oid partdefid BKI_LOOKUP_OPT(pg_class); /* default partition oid;
+ * 0 if there isn't one */
/*
* variable-length fields start here, but we allow direct access to
@@ -48,10 +48,10 @@ CATALOG(pg_partitioned_table,3350,PartitionedRelationId)
* an expression */
#ifdef CATALOG_VARLEN
- oidvector partclass BKI_FORCE_NOT_NULL; /* operator class to compare
- * keys */
- oidvector partcollation BKI_FORCE_NOT_NULL; /* user-specified
- * collation for keys */
+ oidvector partclass BKI_LOOKUP(pg_opclass) BKI_FORCE_NOT_NULL; /* operator class to
+ * compare keys */
+ oidvector partcollation BKI_LOOKUP_OPT(pg_collation) BKI_FORCE_NOT_NULL; /* user-specified
+ * collation for keys */
pg_node_tree partexprs; /* list of expressions in the partition key;
* one item for each zero entry in partattrs[] */
#endif
@@ -69,4 +69,7 @@ DECLARE_TOAST(pg_partitioned_table, 4165, 4166);
DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, on pg_partitioned_table using btree(partrelid oid_ops));
#define PartitionedRelidIndexId 3351
+/* partattrs can contain zero (InvalidAttrNumber) to represent expressions */
+DECLARE_ARRAY_FOREIGN_KEY_OPT((partrelid, partattrs), pg_attribute, (attrelid, attnum));
+
#endif /* PG_PARTITIONED_TABLE_H */
diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h
index 44197613e06..645b8fe498c 100644
--- a/src/include/catalog/pg_policy.h
+++ b/src/include/catalog/pg_policy.h
@@ -30,13 +30,14 @@ CATALOG(pg_policy,3256,PolicyRelationId)
{
Oid oid; /* oid */
NameData polname; /* Policy name. */
- Oid polrelid; /* Oid of the relation with policy. */
+ Oid polrelid BKI_LOOKUP(pg_class); /* Oid of the relation with
+ * policy. */
char polcmd; /* One of ACL_*_CHR, or '*' for all */
bool polpermissive; /* restrictive or permissive policy */
#ifdef CATALOG_VARLEN
- Oid polroles[1] BKI_FORCE_NOT_NULL; /* Roles associated with
- * policy */
+ /* Roles to which the policy is applied; zero means PUBLIC */
+ Oid polroles[1] BKI_LOOKUP_OPT(pg_authid) BKI_FORCE_NOT_NULL;
pg_node_tree polqual; /* Policy quals. */
pg_node_tree polwithcheck; /* WITH CHECK quals. */
#endif
diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat
index f8174061ef3..4e0c9be58c3 100644
--- a/src/include/catalog/pg_proc.dat
+++ b/src/include/catalog/pg_proc.dat
@@ -2405,7 +2405,7 @@
{ oid => '1215', descr => 'get description for object id and catalog name',
proname => 'obj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid name',
- prosrc => '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' },
+ prosrc => 'select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = \'pg_catalog\'::pg_catalog.regnamespace) and objsubid = 0' },
{ oid => '1216', descr => 'get description for table column',
proname => 'col_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid int4',
@@ -2414,7 +2414,7 @@
descr => 'get description for object id and shared catalog name',
proname => 'shobj_description', prolang => 'sql', procost => '100',
provolatile => 's', prorettype => 'text', proargtypes => 'oid name',
- prosrc => '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)' },
+ prosrc => 'select description from pg_catalog.pg_shdescription where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = \'pg_catalog\'::pg_catalog.regnamespace)' },
{ oid => '1217',
descr => 'truncate timestamp with time zone to specified units',
@@ -3698,6 +3698,14 @@
proargnames => '{word,catcode,barelabel,catdesc,baredesc}',
prosrc => 'pg_get_keywords' },
+{ oid => '8103', descr => 'list of catalog foreign key relationships',
+ proname => 'pg_get_catalog_foreign_keys', procost => '10', prorows => '250',
+ proretset => 't', provolatile => 's', prorettype => 'record',
+ proargtypes => '', proallargtypes => '{regclass,_text,regclass,_text,bool,bool}',
+ proargmodes => '{o,o,o,o,o,o}',
+ proargnames => '{fktable,fkcols,pktable,pkcols,is_array,is_opt}',
+ prosrc => 'pg_get_catalog_foreign_keys' },
+
{ oid => '2289', descr => 'convert generic options array to name/value table',
proname => 'pg_options_to_table', prorows => '3', proretset => 't',
provolatile => 's', prorettype => 'record', proargtypes => '_text',
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 03c8bef4227..2f54aa171ed 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -35,10 +35,10 @@ CATALOG(pg_proc,1255,ProcedureRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81,Proce
NameData proname;
/* OID of namespace containing this proc */
- Oid pronamespace BKI_DEFAULT(PGNSP);
+ Oid pronamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* procedure owner */
- Oid proowner BKI_DEFAULT(PGUID);
+ Oid proowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* OID of pg_language entry */
Oid prolang BKI_DEFAULT(internal) BKI_LOOKUP(pg_language);
@@ -49,11 +49,11 @@ CATALOG(pg_proc,1255,ProcedureRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81,Proce
/* estimated # of rows out (if proretset) */
float4 prorows BKI_DEFAULT(0);
- /* element type of variadic array, or 0 */
- Oid provariadic BKI_DEFAULT(0) BKI_LOOKUP(pg_type);
+ /* element type of variadic array, or 0 if not variadic */
+ Oid provariadic BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
/* planner support function for this function, or 0 if none */
- regproc prosupport BKI_DEFAULT(0) BKI_LOOKUP(pg_proc);
+ regproc prosupport BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_proc);
/* see PROKIND_ categories below */
char prokind BKI_DEFAULT(f);
@@ -109,7 +109,7 @@ CATALOG(pg_proc,1255,ProcedureRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81,Proce
pg_node_tree proargdefaults BKI_DEFAULT(_null_);
/* types for which to apply transforms */
- Oid protrftypes[1] BKI_DEFAULT(_null_);
+ Oid protrftypes[1] BKI_DEFAULT(_null_) BKI_LOOKUP(pg_type);
/* procedure source text */
text prosrc BKI_FORCE_NOT_NULL;
diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h
index 4127611f5a6..1b31fee9e3c 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -32,7 +32,7 @@ CATALOG(pg_publication,6104,PublicationRelationId)
NameData pubname; /* name of the publication */
- Oid pubowner; /* publication owner */
+ Oid pubowner BKI_LOOKUP(pg_authid); /* publication owner */
/*
* indicates that this is special publication which should encompass all
diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h
index c79b7fb4874..aecf53b3b39 100644
--- a/src/include/catalog/pg_publication_rel.h
+++ b/src/include/catalog/pg_publication_rel.h
@@ -29,8 +29,8 @@
CATALOG(pg_publication_rel,6106,PublicationRelRelationId)
{
Oid oid; /* oid */
- Oid prpubid; /* Oid of the publication */
- Oid prrelid; /* Oid of the relation */
+ Oid prpubid BKI_LOOKUP(pg_publication); /* Oid of the publication */
+ Oid prrelid BKI_LOOKUP(pg_class); /* Oid of the relation */
} FormData_pg_publication_rel;
/* ----------------
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index 2ec6a4b126b..5dfa4eef8ba 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -38,16 +38,16 @@ CATALOG(pg_range,3541,RangeRelationId)
Oid rngmultitypid BKI_LOOKUP(pg_type);
/* collation for this range type, or 0 */
- Oid rngcollation BKI_DEFAULT(0);
+ Oid rngcollation BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_collation);
/* subtype's btree opclass */
Oid rngsubopc BKI_LOOKUP(pg_opclass);
/* canonicalize range, or 0 */
- regproc rngcanonical BKI_LOOKUP(pg_proc);
+ regproc rngcanonical BKI_LOOKUP_OPT(pg_proc);
/* subtype difference as a float8, or 0 */
- regproc rngsubdiff BKI_LOOKUP(pg_proc);
+ regproc rngsubdiff BKI_LOOKUP_OPT(pg_proc);
} FormData_pg_range;
/* ----------------
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index 36f92b1cf13..89c72545d0b 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -33,7 +33,7 @@ CATALOG(pg_rewrite,2618,RewriteRelationId)
{
Oid oid; /* oid */
NameData rulename;
- Oid ev_class;
+ Oid ev_class BKI_LOOKUP(pg_class);
char ev_type;
char ev_enabled;
bool is_instead;
diff --git a/src/include/catalog/pg_seclabel.h b/src/include/catalog/pg_seclabel.h
index b14fd7febe8..0a12225eb70 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -28,7 +28,8 @@
CATALOG(pg_seclabel,3596,SecLabelRelationId)
{
Oid objoid; /* OID of the object itself */
- Oid classoid; /* OID of table containing the object */
+ Oid classoid BKI_LOOKUP(pg_class); /* 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_sequence.h b/src/include/catalog/pg_sequence.h
index addf21abce9..8d0a00baf69 100644
--- a/src/include/catalog/pg_sequence.h
+++ b/src/include/catalog/pg_sequence.h
@@ -22,8 +22,8 @@
CATALOG(pg_sequence,2224,SequenceRelationId)
{
- Oid seqrelid;
- Oid seqtypid;
+ Oid seqrelid BKI_LOOKUP(pg_class);
+ Oid seqtypid BKI_LOOKUP(pg_type);
int64 seqstart;
int64 seqincrement;
int64 seqmax;
diff --git a/src/include/catalog/pg_shdepend.h b/src/include/catalog/pg_shdepend.h
index f5863954e9f..4faa95794db 100644
--- a/src/include/catalog/pg_shdepend.h
+++ b/src/include/catalog/pg_shdepend.h
@@ -42,8 +42,10 @@ CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION
* These fields are all zeroes for a DEPENDENCY_PIN entry. Also, dbid can
* be zero to denote a shared object.
*/
- Oid dbid; /* OID of database containing object */
- Oid classid; /* OID of table containing object */
+ Oid dbid BKI_LOOKUP_OPT(pg_database); /* OID of database
+ * containing object */
+ Oid classid BKI_LOOKUP_OPT(pg_class); /* OID of table containing
+ * object */
Oid objid; /* OID of object itself */
int32 objsubid; /* column number, or 0 if not used */
@@ -52,7 +54,8 @@ CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION
* 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 */
+ Oid refclassid BKI_LOOKUP(pg_class); /* 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 a37db4fa0b4..543e216710b 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -62,4 +62,7 @@ DECLARE_TOAST(pg_shdescription, 2846, 2847);
DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops));
#define SharedDescriptionObjIndexId 2397
+/* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */
+DECLARE_FOREIGN_KEY((classoid), pg_class, (oid));
+
#endif /* PG_SHDESCRIPTION_H */
diff --git a/src/include/catalog/pg_shseclabel.h b/src/include/catalog/pg_shseclabel.h
index 406f5328a70..5d6864cf8cf 100644
--- a/src/include/catalog/pg_shseclabel.h
+++ b/src/include/catalog/pg_shseclabel.h
@@ -28,7 +28,8 @@
CATALOG(pg_shseclabel,3592,SharedSecLabelRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID(4066,SharedSecLabelRelation_Rowtype_Id) BKI_SCHEMA_MACRO
{
Oid objoid; /* OID of the shared object itself */
- Oid classoid; /* OID of table containing the shared object */
+ Oid classoid BKI_LOOKUP(pg_class); /* OID of table containing the
+ * shared object */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
text provider BKI_FORCE_NOT_NULL; /* name of label provider */
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 4a66bda879c..d1827858e2d 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -29,7 +29,8 @@
CATALOG(pg_statistic,2619,StatisticRelationId)
{
/* These fields form the unique key for the entry: */
- Oid starelid; /* relation containing attribute */
+ Oid starelid BKI_LOOKUP(pg_class); /* relation containing
+ * attribute */
int16 staattnum; /* attribute (column) stats are for */
bool stainherit; /* true if inheritance children are included */
@@ -90,17 +91,17 @@ CATALOG(pg_statistic,2619,StatisticRelationId)
int16 stakind4;
int16 stakind5;
- Oid staop1;
- Oid staop2;
- Oid staop3;
- Oid staop4;
- Oid staop5;
+ Oid staop1 BKI_LOOKUP_OPT(pg_operator);
+ Oid staop2 BKI_LOOKUP_OPT(pg_operator);
+ Oid staop3 BKI_LOOKUP_OPT(pg_operator);
+ Oid staop4 BKI_LOOKUP_OPT(pg_operator);
+ Oid staop5 BKI_LOOKUP_OPT(pg_operator);
- Oid stacoll1;
- Oid stacoll2;
- Oid stacoll3;
- Oid stacoll4;
- Oid stacoll5;
+ Oid stacoll1 BKI_LOOKUP_OPT(pg_collation);
+ Oid stacoll2 BKI_LOOKUP_OPT(pg_collation);
+ Oid stacoll3 BKI_LOOKUP_OPT(pg_collation);
+ Oid stacoll4 BKI_LOOKUP_OPT(pg_collation);
+ Oid stacoll5 BKI_LOOKUP_OPT(pg_collation);
#ifdef CATALOG_VARLEN /* variable-length fields start here */
float4 stanumbers1[1];
@@ -138,6 +139,8 @@ DECLARE_TOAST(pg_statistic, 2840, 2841);
DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
#define StatisticRelidAttnumInhIndexId 2696
+DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum));
+
#ifdef EXPOSE_TO_CLIENT_CODE
/*
diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h
index 10f52f912cb..29649f58143 100644
--- a/src/include/catalog/pg_statistic_ext.h
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -34,13 +34,15 @@ CATALOG(pg_statistic_ext,3381,StatisticExtRelationId)
{
Oid oid; /* oid */
- Oid stxrelid; /* relation containing attributes */
+ Oid stxrelid BKI_LOOKUP(pg_class); /* relation containing
+ * attributes */
/* These two fields form the unique key for the entry: */
NameData stxname; /* statistics object name */
- Oid stxnamespace; /* OID of statistics object's namespace */
+ Oid stxnamespace BKI_LOOKUP(pg_namespace); /* OID of statistics
+ * object's namespace */
- Oid stxowner; /* statistics object's owner */
+ Oid stxowner BKI_LOOKUP(pg_authid); /* statistics object's owner */
int32 stxstattarget BKI_DEFAULT(-1); /* statistics target */
/*
@@ -72,6 +74,8 @@ DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, on pg_statistic_ext usin
DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, on pg_statistic_ext using btree(stxrelid oid_ops));
#define StatisticExtRelidIndexId 3379
+DECLARE_ARRAY_FOREIGN_KEY((stxrelid, stxkeys), pg_attribute, (attrelid, attnum));
+
#ifdef EXPOSE_TO_CLIENT_CODE
#define STATS_EXT_NDISTINCT 'd'
diff --git a/src/include/catalog/pg_statistic_ext_data.h b/src/include/catalog/pg_statistic_ext_data.h
index 6f7a36c1418..2f2577c2188 100644
--- a/src/include/catalog/pg_statistic_ext_data.h
+++ b/src/include/catalog/pg_statistic_ext_data.h
@@ -30,7 +30,8 @@
*/
CATALOG(pg_statistic_ext_data,3429,StatisticExtDataRelationId)
{
- Oid stxoid; /* statistics object this data is for */
+ Oid stxoid BKI_LOOKUP(pg_statistic_ext); /* statistics object
+ * this data is for */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h
index 4e44c291496..a5d6efdf205 100644
--- a/src/include/catalog/pg_subscription.h
+++ b/src/include/catalog/pg_subscription.h
@@ -40,10 +40,11 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW
{
Oid oid; /* oid */
- Oid subdbid; /* Database the subscription is in. */
+ Oid subdbid BKI_LOOKUP(pg_database); /* Database the
+ * subscription is in. */
NameData subname; /* Name of the subscription */
- Oid subowner; /* Owner of the subscription */
+ Oid subowner BKI_LOOKUP(pg_authid); /* Owner of the subscription */
bool subenabled; /* True if the subscription is enabled (the
* worker should be running) */
diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h
index ab1202cf9bf..2bea2c52aa7 100644
--- a/src/include/catalog/pg_subscription_rel.h
+++ b/src/include/catalog/pg_subscription_rel.h
@@ -30,8 +30,8 @@
*/
CATALOG(pg_subscription_rel,6102,SubscriptionRelRelationId)
{
- Oid srsubid; /* Oid of subscription */
- Oid srrelid; /* Oid of relation */
+ Oid srsubid BKI_LOOKUP(pg_subscription); /* Oid of subscription */
+ Oid srrelid BKI_LOOKUP(pg_class); /* Oid of relation */
char srsubstate; /* state of the relation in subscription */
/*
diff --git a/src/include/catalog/pg_tablespace.dat b/src/include/catalog/pg_tablespace.dat
index 212a0ad07fb..bf0d81d3061 100644
--- a/src/include/catalog/pg_tablespace.dat
+++ b/src/include/catalog/pg_tablespace.dat
@@ -13,10 +13,8 @@
[
{ oid => '1663', oid_symbol => 'DEFAULTTABLESPACE_OID',
- spcname => 'pg_default', spcowner => 'PGUID', spcacl => '_null_',
- spcoptions => '_null_' },
+ spcname => 'pg_default', spcacl => '_null_', spcoptions => '_null_' },
{ oid => '1664', oid_symbol => 'GLOBALTABLESPACE_OID',
- spcname => 'pg_global', spcowner => 'PGUID', spcacl => '_null_',
- spcoptions => '_null_' },
+ spcname => 'pg_global', spcacl => '_null_', spcoptions => '_null_' },
]
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index 6a6c66a61c8..ed38e6950dd 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -30,7 +30,7 @@ CATALOG(pg_tablespace,1213,TableSpaceRelationId) BKI_SHARED_RELATION
{
Oid oid; /* oid */
NameData spcname; /* tablespace name */
- Oid spcowner; /* owner of tablespace */
+ Oid spcowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid); /* owner of tablespace */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
aclitem spcacl[1]; /* access permissions */
diff --git a/src/include/catalog/pg_transform.h b/src/include/catalog/pg_transform.h
index ad25db18411..d6032461385 100644
--- a/src/include/catalog/pg_transform.h
+++ b/src/include/catalog/pg_transform.h
@@ -29,10 +29,10 @@
CATALOG(pg_transform,3576,TransformRelationId)
{
Oid oid; /* oid */
- Oid trftype;
- Oid trflang;
- regproc trffromsql;
- regproc trftosql;
+ Oid trftype BKI_LOOKUP(pg_type);
+ Oid trflang BKI_LOOKUP(pg_language);
+ regproc trffromsql BKI_LOOKUP_OPT(pg_proc);
+ regproc trftosql BKI_LOOKUP_OPT(pg_proc);
} FormData_pg_transform;
/* ----------------
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index 55111ed864e..2e3d2338763 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -34,18 +34,25 @@
CATALOG(pg_trigger,2620,TriggerRelationId)
{
Oid oid; /* oid */
- Oid tgrelid; /* relation trigger is attached to */
- Oid tgparentid; /* OID of parent trigger, if any */
+ Oid tgrelid BKI_LOOKUP(pg_class); /* relation trigger is
+ * attached to */
+ Oid tgparentid BKI_LOOKUP_OPT(pg_trigger); /* OID of parent
+ * trigger, if any */
NameData tgname; /* trigger's name */
- Oid tgfoid; /* OID of function to be called */
+ Oid tgfoid BKI_LOOKUP(pg_proc); /* 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 */
- Oid tgconstraint; /* associated pg_constraint entry, if any */
+ Oid tgconstrrelid BKI_LOOKUP_OPT(pg_class); /* constraint's FROM
+ * table, if any */
+ Oid tgconstrindid BKI_LOOKUP_OPT(pg_class); /* constraint's
+ * supporting index, if
+ * any */
+ Oid tgconstraint BKI_LOOKUP_OPT(pg_constraint); /* associated
+ * pg_constraint entry,
+ * if any */
bool tgdeferrable; /* constraint trigger is deferrable */
bool tginitdeferred; /* constraint trigger is deferred initially */
int16 tgnargs; /* # of extra arguments in tgargs */
@@ -81,6 +88,8 @@ DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, on pg_trigger using
DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, on pg_trigger using btree(oid oid_ops));
#define TriggerOidIndexId 2702
+DECLARE_ARRAY_FOREIGN_KEY((tgrelid, tgattr), pg_attribute, (attrelid, attnum));
+
#ifdef EXPOSE_TO_CLIENT_CODE
/* Bits within tgtype */
diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h
index 02ef1a15544..e705899b179 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -36,10 +36,10 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId)
NameData cfgname;
/* name space */
- Oid cfgnamespace BKI_DEFAULT(PGNSP);
+ Oid cfgnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* owner */
- Oid cfgowner BKI_DEFAULT(PGUID);
+ Oid cfgowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* OID of parser */
Oid cfgparser BKI_LOOKUP(pg_ts_parser);
diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h
index bfe3378ff89..57f626e7b59 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -35,10 +35,10 @@ CATALOG(pg_ts_dict,3600,TSDictionaryRelationId)
NameData dictname;
/* name space */
- Oid dictnamespace BKI_DEFAULT(PGNSP);
+ Oid dictnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* owner */
- Oid dictowner BKI_DEFAULT(PGUID);
+ Oid dictowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/* dictionary's template */
Oid dicttemplate BKI_LOOKUP(pg_ts_template);
diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h
index f9f22716fd4..e0d705fd9ae 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -34,7 +34,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId)
NameData prsname;
/* name space */
- Oid prsnamespace BKI_DEFAULT(PGNSP);
+ Oid prsnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* init parsing session */
regproc prsstart BKI_LOOKUP(pg_proc);
@@ -46,7 +46,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId)
regproc prsend BKI_LOOKUP(pg_proc);
/* return data for headline creation */
- regproc prsheadline BKI_LOOKUP(pg_proc);
+ regproc prsheadline BKI_LOOKUP_OPT(pg_proc);
/* return descriptions of lexeme's types */
regproc prslextype BKI_LOOKUP(pg_proc);
diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h
index ae919226889..2ee1ae4e85f 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -34,10 +34,10 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId)
NameData tmplname;
/* name space */
- Oid tmplnamespace BKI_DEFAULT(PGNSP);
+ Oid tmplnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* initialization method of dict (may be 0) */
- regproc tmplinit BKI_LOOKUP(pg_proc);
+ regproc tmplinit BKI_LOOKUP_OPT(pg_proc);
/* base method of dictionary */
regproc tmpllexize BKI_LOOKUP(pg_proc);
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 0d6981bc879..1ec86067038 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -41,10 +41,10 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati
NameData typname;
/* OID of namespace containing this type */
- Oid typnamespace BKI_DEFAULT(PGNSP);
+ Oid typnamespace BKI_DEFAULT(PGNSP) BKI_LOOKUP(pg_namespace);
/* type owner */
- Oid typowner BKI_DEFAULT(PGUID);
+ Oid typowner BKI_DEFAULT(PGUID) BKI_LOOKUP(pg_authid);
/*
* For a fixed-size type, typlen is the number of bytes we use to
@@ -98,7 +98,7 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati
char typdelim BKI_DEFAULT(',');
/* associated pg_class OID if a composite type, else 0 */
- Oid typrelid BKI_DEFAULT(0) BKI_ARRAY_DEFAULT(0) BKI_LOOKUP(pg_class);
+ Oid typrelid BKI_DEFAULT(0) BKI_ARRAY_DEFAULT(0) BKI_LOOKUP_OPT(pg_class);
/*
* Type-specific subscripting handler. If typsubscript is 0, it means
@@ -106,7 +106,7 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati
* of the system deem types to be "true" array types only if their
* typsubscript is array_subscript_handler.
*/
- regproc typsubscript BKI_DEFAULT(-) BKI_ARRAY_DEFAULT(array_subscript_handler) BKI_LOOKUP(pg_proc);
+ regproc typsubscript BKI_DEFAULT(-) BKI_ARRAY_DEFAULT(array_subscript_handler) BKI_LOOKUP_OPT(pg_proc);
/*
* If typelem is not 0 then it identifies another row in pg_type, defining
@@ -117,13 +117,13 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati
* of the element type in this type; so DDL changes on the element type
* might be restricted by the presence of this type.
*/
- Oid typelem BKI_DEFAULT(0) BKI_LOOKUP(pg_type);
+ Oid typelem BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
/*
* 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 BKI_DEFAULT(0) BKI_ARRAY_DEFAULT(0) BKI_LOOKUP(pg_type);
+ Oid typarray BKI_DEFAULT(0) BKI_ARRAY_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
/*
* I/O conversion procedures for the datatype.
@@ -134,19 +134,19 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati
regproc typoutput BKI_ARRAY_DEFAULT(array_out) BKI_LOOKUP(pg_proc);
/* binary format (optional) */
- regproc typreceive BKI_ARRAY_DEFAULT(array_recv) BKI_LOOKUP(pg_proc);
- regproc typsend BKI_ARRAY_DEFAULT(array_send) BKI_LOOKUP(pg_proc);
+ regproc typreceive BKI_ARRAY_DEFAULT(array_recv) BKI_LOOKUP_OPT(pg_proc);
+ regproc typsend BKI_ARRAY_DEFAULT(array_send) BKI_LOOKUP_OPT(pg_proc);
/*
* I/O functions for optional type modifiers.
*/
- regproc typmodin BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
- regproc typmodout BKI_DEFAULT(-) BKI_LOOKUP(pg_proc);
+ regproc typmodin BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
+ regproc typmodout BKI_DEFAULT(-) BKI_LOOKUP_OPT(pg_proc);
/*
* Custom ANALYZE procedure for the datatype (0 selects the default).
*/
- regproc typanalyze BKI_DEFAULT(-) BKI_ARRAY_DEFAULT(array_typanalyze) BKI_LOOKUP(pg_proc);
+ regproc typanalyze BKI_DEFAULT(-) BKI_ARRAY_DEFAULT(array_typanalyze) BKI_LOOKUP_OPT(pg_proc);
/* ----------------
* typalign is the alignment required when storing a value of this
@@ -205,7 +205,7 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati
* 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 BKI_DEFAULT(0);
+ Oid typbasetype BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_type);
/*
* Domains use typtypmod to record the typmod to be applied to their base
@@ -225,7 +225,7 @@ CATALOG(pg_type,1247,TypeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71,TypeRelati
* DEFAULT_COLLATION_OID) for collatable base types, possibly some other
* OID for domains over collatable types
*/
- Oid typcollation BKI_DEFAULT(0) BKI_LOOKUP(pg_collation);
+ Oid typcollation BKI_DEFAULT(0) BKI_LOOKUP_OPT(pg_collation);
#ifdef CATALOG_VARLEN /* variable-length fields start here */
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index cabca048a92..d440c67da19 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -29,9 +29,11 @@ CATALOG(pg_user_mapping,1418,UserMappingRelationId)
{
Oid oid; /* oid */
- Oid umuser; /* Id of the user, InvalidOid if PUBLIC is
- * wanted */
- Oid umserver; /* server of this mapping */
+ Oid umuser BKI_LOOKUP_OPT(pg_authid); /* Id of the user,
+ * InvalidOid if PUBLIC is
+ * wanted */
+ Oid umserver BKI_LOOKUP(pg_foreign_server); /* server of this
+ * mapping */
#ifdef CATALOG_VARLEN /* variable-length fields start here */
text umoptions[1]; /* user mapping options */
diff --git a/src/test/regress/expected/oidjoins.out b/src/test/regress/expected/oidjoins.out
index 4731dacfbf4..50d046d3ef1 100644
--- a/src/test/regress/expected/oidjoins.out
+++ b/src/test/regress/expected/oidjoins.out
@@ -1,1451 +1,266 @@
--
--- This is created by pgsql/src/tools/findoidjoins/make_oidjoins_check
+-- Verify system catalog foreign key relationships
--
-SELECT ctid, aggfnoid
-FROM pg_catalog.pg_aggregate fk
-WHERE aggfnoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggfnoid);
- ctid | aggfnoid
-------+----------
-(0 rows)
-
-SELECT ctid, aggtransfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggtransfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggtransfn);
- ctid | aggtransfn
-------+------------
-(0 rows)
-
-SELECT ctid, aggfinalfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggfinalfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggfinalfn);
- ctid | aggfinalfn
-------+------------
-(0 rows)
-
-SELECT ctid, aggcombinefn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggcombinefn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggcombinefn);
- ctid | aggcombinefn
-------+--------------
-(0 rows)
-
-SELECT ctid, aggserialfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggserialfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggserialfn);
- ctid | aggserialfn
-------+-------------
-(0 rows)
-
-SELECT ctid, aggdeserialfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggdeserialfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggdeserialfn);
- ctid | aggdeserialfn
-------+---------------
-(0 rows)
-
-SELECT ctid, aggmtransfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggmtransfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggmtransfn);
- ctid | aggmtransfn
-------+-------------
-(0 rows)
-
-SELECT ctid, aggminvtransfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggminvtransfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggminvtransfn);
- ctid | aggminvtransfn
-------+----------------
-(0 rows)
-
-SELECT ctid, aggmfinalfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggmfinalfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggmfinalfn);
- ctid | aggmfinalfn
-------+-------------
-(0 rows)
-
-SELECT ctid, aggsortop
-FROM pg_catalog.pg_aggregate fk
-WHERE aggsortop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.aggsortop);
- ctid | aggsortop
-------+-----------
-(0 rows)
-
-SELECT ctid, aggtranstype
-FROM pg_catalog.pg_aggregate fk
-WHERE aggtranstype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.aggtranstype);
- ctid | aggtranstype
-------+--------------
-(0 rows)
-
-SELECT ctid, aggmtranstype
-FROM pg_catalog.pg_aggregate fk
-WHERE aggmtranstype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.aggmtranstype);
- ctid | aggmtranstype
-------+---------------
-(0 rows)
-
-SELECT ctid, amhandler
-FROM pg_catalog.pg_am fk
-WHERE amhandler != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.amhandler);
- ctid | amhandler
-------+-----------
-(0 rows)
-
-SELECT ctid, amopfamily
-FROM pg_catalog.pg_amop fk
-WHERE amopfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.amopfamily);
- ctid | amopfamily
-------+------------
-(0 rows)
-
-SELECT ctid, amoplefttype
-FROM pg_catalog.pg_amop fk
-WHERE amoplefttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amoplefttype);
- ctid | amoplefttype
-------+--------------
-(0 rows)
-
-SELECT ctid, amoprighttype
-FROM pg_catalog.pg_amop fk
-WHERE amoprighttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amoprighttype);
- ctid | amoprighttype
-------+---------------
-(0 rows)
-
-SELECT ctid, amopopr
-FROM pg_catalog.pg_amop fk
-WHERE amopopr != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.amopopr);
- ctid | amopopr
-------+---------
-(0 rows)
-
-SELECT ctid, amopmethod
-FROM pg_catalog.pg_amop fk
-WHERE amopmethod != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.amopmethod);
- ctid | amopmethod
-------+------------
-(0 rows)
-
-SELECT ctid, amopsortfamily
-FROM pg_catalog.pg_amop fk
-WHERE amopsortfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.amopsortfamily);
- ctid | amopsortfamily
-------+----------------
-(0 rows)
-
-SELECT ctid, amprocfamily
-FROM pg_catalog.pg_amproc fk
-WHERE amprocfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.amprocfamily);
- ctid | amprocfamily
-------+--------------
-(0 rows)
-
-SELECT ctid, amproclefttype
-FROM pg_catalog.pg_amproc fk
-WHERE amproclefttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amproclefttype);
- ctid | amproclefttype
-------+----------------
-(0 rows)
-
-SELECT ctid, amprocrighttype
-FROM pg_catalog.pg_amproc fk
-WHERE amprocrighttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amprocrighttype);
- ctid | amprocrighttype
-------+-----------------
-(0 rows)
-
-SELECT ctid, amproc
-FROM pg_catalog.pg_amproc fk
-WHERE amproc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.amproc);
- ctid | amproc
-------+--------
-(0 rows)
-
-SELECT ctid, adrelid
-FROM pg_catalog.pg_attrdef fk
-WHERE adrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.adrelid);
- ctid | adrelid
-------+---------
-(0 rows)
-
-SELECT ctid, attrelid
-FROM pg_catalog.pg_attribute fk
-WHERE attrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.attrelid);
- ctid | attrelid
-------+----------
-(0 rows)
-
-SELECT ctid, atttypid
-FROM pg_catalog.pg_attribute fk
-WHERE atttypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.atttypid);
- ctid | atttypid
-------+----------
-(0 rows)
-
-SELECT ctid, attcollation
-FROM pg_catalog.pg_attribute fk
-WHERE attcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.attcollation);
- ctid | attcollation
-------+--------------
-(0 rows)
-
-SELECT ctid, roleid
-FROM pg_catalog.pg_auth_members fk
-WHERE roleid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.roleid);
- ctid | roleid
-------+--------
-(0 rows)
-
-SELECT ctid, member
-FROM pg_catalog.pg_auth_members fk
-WHERE member != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.member);
- ctid | member
-------+--------
-(0 rows)
-
-SELECT ctid, grantor
-FROM pg_catalog.pg_auth_members fk
-WHERE grantor != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.grantor);
- ctid | grantor
-------+---------
-(0 rows)
-
-SELECT ctid, castsource
-FROM pg_catalog.pg_cast fk
-WHERE castsource != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.castsource);
- ctid | castsource
-------+------------
-(0 rows)
-
-SELECT ctid, casttarget
-FROM pg_catalog.pg_cast fk
-WHERE casttarget != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.casttarget);
- ctid | casttarget
-------+------------
-(0 rows)
-
-SELECT ctid, castfunc
-FROM pg_catalog.pg_cast fk
-WHERE castfunc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.castfunc);
- ctid | castfunc
-------+----------
-(0 rows)
-
-SELECT ctid, relnamespace
-FROM pg_catalog.pg_class fk
-WHERE relnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.relnamespace);
- ctid | relnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, reltype
-FROM pg_catalog.pg_class fk
-WHERE reltype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.reltype);
- ctid | reltype
-------+---------
-(0 rows)
-
-SELECT ctid, reloftype
-FROM pg_catalog.pg_class fk
-WHERE reloftype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.reloftype);
- ctid | reloftype
-------+-----------
-(0 rows)
-
-SELECT ctid, relowner
-FROM pg_catalog.pg_class fk
-WHERE relowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.relowner);
- ctid | relowner
-------+----------
-(0 rows)
-
-SELECT ctid, relam
-FROM pg_catalog.pg_class fk
-WHERE relam != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.relam);
- ctid | relam
-------+-------
-(0 rows)
-
-SELECT ctid, reltablespace
-FROM pg_catalog.pg_class fk
-WHERE reltablespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_tablespace pk WHERE pk.oid = fk.reltablespace);
- ctid | reltablespace
-------+---------------
-(0 rows)
-
-SELECT ctid, reltoastrelid
-FROM pg_catalog.pg_class fk
-WHERE reltoastrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.reltoastrelid);
- ctid | reltoastrelid
-------+---------------
-(0 rows)
-
-SELECT ctid, collnamespace
-FROM pg_catalog.pg_collation fk
-WHERE collnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.collnamespace);
- ctid | collnamespace
-------+---------------
-(0 rows)
-
-SELECT ctid, collowner
-FROM pg_catalog.pg_collation fk
-WHERE collowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.collowner);
- ctid | collowner
-------+-----------
-(0 rows)
-
-SELECT ctid, connamespace
-FROM pg_catalog.pg_constraint fk
-WHERE connamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.connamespace);
- ctid | connamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, conrelid
-FROM pg_catalog.pg_constraint fk
-WHERE conrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.conrelid);
- ctid | conrelid
-------+----------
-(0 rows)
-
-SELECT ctid, contypid
-FROM pg_catalog.pg_constraint fk
-WHERE contypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.contypid);
- ctid | contypid
-------+----------
-(0 rows)
-
-SELECT ctid, conindid
-FROM pg_catalog.pg_constraint fk
-WHERE conindid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.conindid);
- ctid | conindid
-------+----------
-(0 rows)
-
-SELECT ctid, conparentid
-FROM pg_catalog.pg_constraint fk
-WHERE conparentid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_constraint pk WHERE pk.oid = fk.conparentid);
- ctid | conparentid
-------+-------------
-(0 rows)
-
-SELECT ctid, confrelid
-FROM pg_catalog.pg_constraint fk
-WHERE confrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.confrelid);
- ctid | confrelid
-------+-----------
-(0 rows)
-
-SELECT ctid, connamespace
-FROM pg_catalog.pg_conversion fk
-WHERE connamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.connamespace);
- ctid | connamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, conowner
-FROM pg_catalog.pg_conversion fk
-WHERE conowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.conowner);
- ctid | conowner
-------+----------
-(0 rows)
-
-SELECT ctid, conproc
-FROM pg_catalog.pg_conversion fk
-WHERE conproc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.conproc);
- ctid | conproc
-------+---------
-(0 rows)
-
-SELECT ctid, datdba
-FROM pg_catalog.pg_database fk
-WHERE datdba != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.datdba);
- ctid | datdba
-------+--------
-(0 rows)
-
-SELECT ctid, dattablespace
-FROM pg_catalog.pg_database fk
-WHERE dattablespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_tablespace pk WHERE pk.oid = fk.dattablespace);
- ctid | dattablespace
-------+---------------
-(0 rows)
-
-SELECT ctid, setdatabase
-FROM pg_catalog.pg_db_role_setting fk
-WHERE setdatabase != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_database pk WHERE pk.oid = fk.setdatabase);
- ctid | setdatabase
-------+-------------
-(0 rows)
-
-SELECT ctid, classid
-FROM pg_catalog.pg_depend fk
-WHERE classid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classid);
- ctid | classid
-------+---------
-(0 rows)
-
-SELECT ctid, refclassid
-FROM pg_catalog.pg_depend fk
-WHERE refclassid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.refclassid);
- ctid | refclassid
-------+------------
-(0 rows)
-
-SELECT ctid, classoid
-FROM pg_catalog.pg_description fk
-WHERE classoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classoid);
- ctid | classoid
-------+----------
-(0 rows)
-
-SELECT ctid, enumtypid
-FROM pg_catalog.pg_enum fk
-WHERE enumtypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.enumtypid);
- ctid | enumtypid
-------+-----------
-(0 rows)
-
-SELECT ctid, extowner
-FROM pg_catalog.pg_extension fk
-WHERE extowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.extowner);
- ctid | extowner
-------+----------
-(0 rows)
-
-SELECT ctid, extnamespace
-FROM pg_catalog.pg_extension fk
-WHERE extnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.extnamespace);
- ctid | extnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, fdwowner
-FROM pg_catalog.pg_foreign_data_wrapper fk
-WHERE fdwowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.fdwowner);
- ctid | fdwowner
-------+----------
-(0 rows)
-
-SELECT ctid, srvowner
-FROM pg_catalog.pg_foreign_server fk
-WHERE srvowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.srvowner);
- ctid | srvowner
-------+----------
-(0 rows)
-
-SELECT ctid, srvfdw
-FROM pg_catalog.pg_foreign_server fk
-WHERE srvfdw != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_foreign_data_wrapper pk WHERE pk.oid = fk.srvfdw);
- ctid | srvfdw
-------+--------
-(0 rows)
-
-SELECT ctid, indexrelid
-FROM pg_catalog.pg_index fk
-WHERE indexrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.indexrelid);
- ctid | indexrelid
-------+------------
-(0 rows)
-
-SELECT ctid, indrelid
-FROM pg_catalog.pg_index fk
-WHERE indrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.indrelid);
- ctid | indrelid
-------+----------
-(0 rows)
-
-SELECT ctid, inhrelid
-FROM pg_catalog.pg_inherits fk
-WHERE inhrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.inhrelid);
- ctid | inhrelid
-------+----------
-(0 rows)
-
-SELECT ctid, inhparent
-FROM pg_catalog.pg_inherits fk
-WHERE inhparent != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.inhparent);
- ctid | inhparent
-------+-----------
-(0 rows)
-
-SELECT ctid, classoid
-FROM pg_catalog.pg_init_privs fk
-WHERE classoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classoid);
- ctid | classoid
-------+----------
-(0 rows)
-
-SELECT ctid, lanowner
-FROM pg_catalog.pg_language fk
-WHERE lanowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.lanowner);
- ctid | lanowner
-------+----------
-(0 rows)
-
-SELECT ctid, lanplcallfoid
-FROM pg_catalog.pg_language fk
-WHERE lanplcallfoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.lanplcallfoid);
- ctid | lanplcallfoid
-------+---------------
-(0 rows)
-
-SELECT ctid, laninline
-FROM pg_catalog.pg_language fk
-WHERE laninline != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.laninline);
- ctid | laninline
-------+-----------
-(0 rows)
-
-SELECT ctid, lanvalidator
-FROM pg_catalog.pg_language fk
-WHERE lanvalidator != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.lanvalidator);
- ctid | lanvalidator
-------+--------------
-(0 rows)
-
-SELECT ctid, loid
-FROM pg_catalog.pg_largeobject fk
-WHERE loid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_largeobject_metadata pk WHERE pk.oid = fk.loid);
- ctid | loid
-------+------
-(0 rows)
-
-SELECT ctid, lomowner
-FROM pg_catalog.pg_largeobject_metadata fk
-WHERE lomowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.lomowner);
- ctid | lomowner
-------+----------
-(0 rows)
-
-SELECT ctid, nspowner
-FROM pg_catalog.pg_namespace fk
-WHERE nspowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.nspowner);
- ctid | nspowner
-------+----------
-(0 rows)
-
-SELECT ctid, opcmethod
-FROM pg_catalog.pg_opclass fk
-WHERE opcmethod != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.opcmethod);
- ctid | opcmethod
-------+-----------
-(0 rows)
-
-SELECT ctid, opcnamespace
-FROM pg_catalog.pg_opclass fk
-WHERE opcnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.opcnamespace);
- ctid | opcnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, opcowner
-FROM pg_catalog.pg_opclass fk
-WHERE opcowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.opcowner);
- ctid | opcowner
-------+----------
-(0 rows)
-
-SELECT ctid, opcfamily
-FROM pg_catalog.pg_opclass fk
-WHERE opcfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.opcfamily);
- ctid | opcfamily
-------+-----------
-(0 rows)
-
-SELECT ctid, opcintype
-FROM pg_catalog.pg_opclass fk
-WHERE opcintype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.opcintype);
- ctid | opcintype
-------+-----------
-(0 rows)
-
-SELECT ctid, opckeytype
-FROM pg_catalog.pg_opclass fk
-WHERE opckeytype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.opckeytype);
- ctid | opckeytype
-------+------------
-(0 rows)
-
-SELECT ctid, oprnamespace
-FROM pg_catalog.pg_operator fk
-WHERE oprnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.oprnamespace);
- ctid | oprnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, oprowner
-FROM pg_catalog.pg_operator fk
-WHERE oprowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.oprowner);
- ctid | oprowner
-------+----------
-(0 rows)
-
-SELECT ctid, oprleft
-FROM pg_catalog.pg_operator fk
-WHERE oprleft != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.oprleft);
- ctid | oprleft
-------+---------
-(0 rows)
-
-SELECT ctid, oprright
-FROM pg_catalog.pg_operator fk
-WHERE oprright != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.oprright);
- ctid | oprright
-------+----------
-(0 rows)
-
-SELECT ctid, oprresult
-FROM pg_catalog.pg_operator fk
-WHERE oprresult != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.oprresult);
- ctid | oprresult
-------+-----------
-(0 rows)
-
-SELECT ctid, oprcom
-FROM pg_catalog.pg_operator fk
-WHERE oprcom != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprcom);
- ctid | oprcom
-------+--------
-(0 rows)
-
-SELECT ctid, oprnegate
-FROM pg_catalog.pg_operator fk
-WHERE oprnegate != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprnegate);
- ctid | oprnegate
-------+-----------
-(0 rows)
-
-SELECT ctid, oprcode
-FROM pg_catalog.pg_operator fk
-WHERE oprcode != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.oprcode);
- ctid | oprcode
-------+---------
-(0 rows)
-
-SELECT ctid, oprrest
-FROM pg_catalog.pg_operator fk
-WHERE oprrest != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.oprrest);
- ctid | oprrest
-------+---------
-(0 rows)
-
-SELECT ctid, oprjoin
-FROM pg_catalog.pg_operator fk
-WHERE oprjoin != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.oprjoin);
- ctid | oprjoin
-------+---------
-(0 rows)
-
-SELECT ctid, opfmethod
-FROM pg_catalog.pg_opfamily fk
-WHERE opfmethod != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.opfmethod);
- ctid | opfmethod
-------+-----------
-(0 rows)
-
-SELECT ctid, opfnamespace
-FROM pg_catalog.pg_opfamily fk
-WHERE opfnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.opfnamespace);
- ctid | opfnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, opfowner
-FROM pg_catalog.pg_opfamily fk
-WHERE opfowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.opfowner);
- ctid | opfowner
-------+----------
-(0 rows)
-
-SELECT ctid, partrelid
-FROM pg_catalog.pg_partitioned_table fk
-WHERE partrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.partrelid);
- ctid | partrelid
-------+-----------
-(0 rows)
-
-SELECT ctid, partdefid
-FROM pg_catalog.pg_partitioned_table fk
-WHERE partdefid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.partdefid);
- ctid | partdefid
-------+-----------
-(0 rows)
-
-SELECT ctid, polrelid
-FROM pg_catalog.pg_policy fk
-WHERE polrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.polrelid);
- ctid | polrelid
-------+----------
-(0 rows)
-
-SELECT ctid, pronamespace
-FROM pg_catalog.pg_proc fk
-WHERE pronamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.pronamespace);
- ctid | pronamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, proowner
-FROM pg_catalog.pg_proc fk
-WHERE proowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.proowner);
- ctid | proowner
-------+----------
-(0 rows)
-
-SELECT ctid, prolang
-FROM pg_catalog.pg_proc fk
-WHERE prolang != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_language pk WHERE pk.oid = fk.prolang);
- ctid | prolang
-------+---------
-(0 rows)
-
-SELECT ctid, provariadic
-FROM pg_catalog.pg_proc fk
-WHERE provariadic != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.provariadic);
- ctid | provariadic
-------+-------------
-(0 rows)
-
-SELECT ctid, prosupport
-FROM pg_catalog.pg_proc fk
-WHERE prosupport != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prosupport);
- ctid | prosupport
-------+------------
-(0 rows)
-
-SELECT ctid, prorettype
-FROM pg_catalog.pg_proc fk
-WHERE prorettype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.prorettype);
- ctid | prorettype
-------+------------
-(0 rows)
-
-SELECT ctid, rngtypid
-FROM pg_catalog.pg_range fk
-WHERE rngtypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.rngtypid);
- ctid | rngtypid
-------+----------
-(0 rows)
-
-SELECT ctid, rngsubtype
-FROM pg_catalog.pg_range fk
-WHERE rngsubtype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.rngsubtype);
- ctid | rngsubtype
-------+------------
-(0 rows)
-
-SELECT ctid, rngcollation
-FROM pg_catalog.pg_range fk
-WHERE rngcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.rngcollation);
- ctid | rngcollation
-------+--------------
-(0 rows)
-
-SELECT ctid, rngsubopc
-FROM pg_catalog.pg_range fk
-WHERE rngsubopc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opclass pk WHERE pk.oid = fk.rngsubopc);
- ctid | rngsubopc
-------+-----------
-(0 rows)
-
-SELECT ctid, rngcanonical
-FROM pg_catalog.pg_range fk
-WHERE rngcanonical != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.rngcanonical);
- ctid | rngcanonical
-------+--------------
-(0 rows)
-
-SELECT ctid, rngsubdiff
-FROM pg_catalog.pg_range fk
-WHERE rngsubdiff != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.rngsubdiff);
- ctid | rngsubdiff
-------+------------
-(0 rows)
-
-SELECT ctid, ev_class
-FROM pg_catalog.pg_rewrite fk
-WHERE ev_class != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.ev_class);
- ctid | ev_class
-------+----------
-(0 rows)
-
-SELECT ctid, seqrelid
-FROM pg_catalog.pg_sequence fk
-WHERE seqrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.seqrelid);
- ctid | seqrelid
-------+----------
-(0 rows)
-
-SELECT ctid, seqtypid
-FROM pg_catalog.pg_sequence fk
-WHERE seqtypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.seqtypid);
- ctid | seqtypid
-------+----------
-(0 rows)
-
-SELECT ctid, refclassid
-FROM pg_catalog.pg_shdepend fk
-WHERE refclassid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.refclassid);
- ctid | refclassid
-------+------------
-(0 rows)
-
-SELECT ctid, classoid
-FROM pg_catalog.pg_shdescription fk
-WHERE classoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classoid);
- ctid | classoid
-------+----------
-(0 rows)
-
-SELECT ctid, starelid
-FROM pg_catalog.pg_statistic fk
-WHERE starelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.starelid);
- ctid | starelid
-------+----------
-(0 rows)
-
-SELECT ctid, staop1
-FROM pg_catalog.pg_statistic fk
-WHERE staop1 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop1);
- ctid | staop1
-------+--------
-(0 rows)
-
-SELECT ctid, staop2
-FROM pg_catalog.pg_statistic fk
-WHERE staop2 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop2);
- ctid | staop2
-------+--------
-(0 rows)
-
-SELECT ctid, staop3
-FROM pg_catalog.pg_statistic fk
-WHERE staop3 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop3);
- ctid | staop3
-------+--------
-(0 rows)
-
-SELECT ctid, staop4
-FROM pg_catalog.pg_statistic fk
-WHERE staop4 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop4);
- ctid | staop4
-------+--------
-(0 rows)
-
-SELECT ctid, staop5
-FROM pg_catalog.pg_statistic fk
-WHERE staop5 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop5);
- ctid | staop5
-------+--------
-(0 rows)
-
-SELECT ctid, stacoll1
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll1 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll1);
- ctid | stacoll1
-------+----------
-(0 rows)
-
-SELECT ctid, stacoll2
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll2 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll2);
- ctid | stacoll2
-------+----------
-(0 rows)
-
-SELECT ctid, stacoll3
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll3 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll3);
- ctid | stacoll3
-------+----------
-(0 rows)
-
-SELECT ctid, stacoll4
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll4 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll4);
- ctid | stacoll4
-------+----------
-(0 rows)
-
-SELECT ctid, stacoll5
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll5 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll5);
- ctid | stacoll5
-------+----------
-(0 rows)
-
-SELECT ctid, stxrelid
-FROM pg_catalog.pg_statistic_ext fk
-WHERE stxrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.stxrelid);
- ctid | stxrelid
-------+----------
-(0 rows)
-
-SELECT ctid, stxnamespace
-FROM pg_catalog.pg_statistic_ext fk
-WHERE stxnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.stxnamespace);
- ctid | stxnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, stxowner
-FROM pg_catalog.pg_statistic_ext fk
-WHERE stxowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.stxowner);
- ctid | stxowner
-------+----------
-(0 rows)
-
-SELECT ctid, stxoid
-FROM pg_catalog.pg_statistic_ext_data fk
-WHERE stxoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_statistic_ext pk WHERE pk.oid = fk.stxoid);
- ctid | stxoid
-------+--------
-(0 rows)
-
-SELECT ctid, spcowner
-FROM pg_catalog.pg_tablespace fk
-WHERE spcowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.spcowner);
- ctid | spcowner
-------+----------
-(0 rows)
-
-SELECT ctid, trftype
-FROM pg_catalog.pg_transform fk
-WHERE trftype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.trftype);
- ctid | trftype
-------+---------
-(0 rows)
-
-SELECT ctid, trflang
-FROM pg_catalog.pg_transform fk
-WHERE trflang != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_language pk WHERE pk.oid = fk.trflang);
- ctid | trflang
-------+---------
-(0 rows)
-
-SELECT ctid, trffromsql
-FROM pg_catalog.pg_transform fk
-WHERE trffromsql != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.trffromsql);
- ctid | trffromsql
-------+------------
-(0 rows)
-
-SELECT ctid, trftosql
-FROM pg_catalog.pg_transform fk
-WHERE trftosql != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.trftosql);
- ctid | trftosql
-------+----------
-(0 rows)
-
-SELECT ctid, tgrelid
-FROM pg_catalog.pg_trigger fk
-WHERE tgrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.tgrelid);
- ctid | tgrelid
-------+---------
-(0 rows)
-
-SELECT ctid, tgparentid
-FROM pg_catalog.pg_trigger fk
-WHERE tgparentid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_trigger pk WHERE pk.oid = fk.tgparentid);
- ctid | tgparentid
-------+------------
-(0 rows)
-
-SELECT ctid, tgfoid
-FROM pg_catalog.pg_trigger fk
-WHERE tgfoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.tgfoid);
- ctid | tgfoid
-------+--------
-(0 rows)
-
-SELECT ctid, tgconstrrelid
-FROM pg_catalog.pg_trigger fk
-WHERE tgconstrrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.tgconstrrelid);
- ctid | tgconstrrelid
-------+---------------
-(0 rows)
-
-SELECT ctid, tgconstrindid
-FROM pg_catalog.pg_trigger fk
-WHERE tgconstrindid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.tgconstrindid);
- ctid | tgconstrindid
-------+---------------
-(0 rows)
-
-SELECT ctid, tgconstraint
-FROM pg_catalog.pg_trigger fk
-WHERE tgconstraint != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_constraint pk WHERE pk.oid = fk.tgconstraint);
- ctid | tgconstraint
-------+--------------
-(0 rows)
-
-SELECT ctid, cfgnamespace
-FROM pg_catalog.pg_ts_config fk
-WHERE cfgnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.cfgnamespace);
- ctid | cfgnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, cfgowner
-FROM pg_catalog.pg_ts_config fk
-WHERE cfgowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.cfgowner);
- ctid | cfgowner
-------+----------
-(0 rows)
-
-SELECT ctid, cfgparser
-FROM pg_catalog.pg_ts_config fk
-WHERE cfgparser != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_parser pk WHERE pk.oid = fk.cfgparser);
- ctid | cfgparser
-------+-----------
-(0 rows)
-
-SELECT ctid, mapcfg
-FROM pg_catalog.pg_ts_config_map fk
-WHERE mapcfg != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_config pk WHERE pk.oid = fk.mapcfg);
- ctid | mapcfg
-------+--------
-(0 rows)
-
-SELECT ctid, mapdict
-FROM pg_catalog.pg_ts_config_map fk
-WHERE mapdict != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_dict pk WHERE pk.oid = fk.mapdict);
- ctid | mapdict
-------+---------
-(0 rows)
-
-SELECT ctid, dictnamespace
-FROM pg_catalog.pg_ts_dict fk
-WHERE dictnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.dictnamespace);
- ctid | dictnamespace
-------+---------------
-(0 rows)
-
-SELECT ctid, dictowner
-FROM pg_catalog.pg_ts_dict fk
-WHERE dictowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.dictowner);
- ctid | dictowner
-------+-----------
-(0 rows)
-
-SELECT ctid, dicttemplate
-FROM pg_catalog.pg_ts_dict fk
-WHERE dicttemplate != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_template pk WHERE pk.oid = fk.dicttemplate);
- ctid | dicttemplate
-------+--------------
-(0 rows)
-
-SELECT ctid, prsnamespace
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.prsnamespace);
- ctid | prsnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, prsstart
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsstart != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prsstart);
- ctid | prsstart
-------+----------
-(0 rows)
-
-SELECT ctid, prstoken
-FROM pg_catalog.pg_ts_parser fk
-WHERE prstoken != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prstoken);
- ctid | prstoken
-------+----------
-(0 rows)
-
-SELECT ctid, prsend
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsend != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prsend);
- ctid | prsend
-------+--------
-(0 rows)
-
-SELECT ctid, prsheadline
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsheadline != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prsheadline);
- ctid | prsheadline
-------+-------------
-(0 rows)
-
-SELECT ctid, prslextype
-FROM pg_catalog.pg_ts_parser fk
-WHERE prslextype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prslextype);
- ctid | prslextype
-------+------------
-(0 rows)
-
-SELECT ctid, tmplnamespace
-FROM pg_catalog.pg_ts_template fk
-WHERE tmplnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.tmplnamespace);
- ctid | tmplnamespace
-------+---------------
-(0 rows)
-
-SELECT ctid, tmplinit
-FROM pg_catalog.pg_ts_template fk
-WHERE tmplinit != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.tmplinit);
- ctid | tmplinit
-------+----------
-(0 rows)
-
-SELECT ctid, tmpllexize
-FROM pg_catalog.pg_ts_template fk
-WHERE tmpllexize != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.tmpllexize);
- ctid | tmpllexize
-------+------------
-(0 rows)
-
-SELECT ctid, typnamespace
-FROM pg_catalog.pg_type fk
-WHERE typnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.typnamespace);
- ctid | typnamespace
-------+--------------
-(0 rows)
-
-SELECT ctid, typowner
-FROM pg_catalog.pg_type fk
-WHERE typowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.typowner);
- ctid | typowner
-------+----------
-(0 rows)
-
-SELECT ctid, typrelid
-FROM pg_catalog.pg_type fk
-WHERE typrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.typrelid);
- ctid | typrelid
-------+----------
-(0 rows)
-
-SELECT ctid, typelem
-FROM pg_catalog.pg_type fk
-WHERE typelem != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.typelem);
- ctid | typelem
-------+---------
-(0 rows)
-
-SELECT ctid, typarray
-FROM pg_catalog.pg_type fk
-WHERE typarray != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.typarray);
- ctid | typarray
-------+----------
-(0 rows)
-
-SELECT ctid, typinput
-FROM pg_catalog.pg_type fk
-WHERE typinput != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typinput);
- ctid | typinput
-------+----------
-(0 rows)
-
-SELECT ctid, typoutput
-FROM pg_catalog.pg_type fk
-WHERE typoutput != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typoutput);
- ctid | typoutput
-------+-----------
-(0 rows)
-
-SELECT ctid, typreceive
-FROM pg_catalog.pg_type fk
-WHERE typreceive != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typreceive);
- ctid | typreceive
-------+------------
-(0 rows)
-
-SELECT ctid, typsend
-FROM pg_catalog.pg_type fk
-WHERE typsend != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typsend);
- ctid | typsend
-------+---------
-(0 rows)
-
-SELECT ctid, typmodin
-FROM pg_catalog.pg_type fk
-WHERE typmodin != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typmodin);
- ctid | typmodin
-------+----------
-(0 rows)
-
-SELECT ctid, typmodout
-FROM pg_catalog.pg_type fk
-WHERE typmodout != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typmodout);
- ctid | typmodout
-------+-----------
-(0 rows)
-
-SELECT ctid, typanalyze
-FROM pg_catalog.pg_type fk
-WHERE typanalyze != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typanalyze);
- ctid | typanalyze
-------+------------
-(0 rows)
-
-SELECT ctid, typbasetype
-FROM pg_catalog.pg_type fk
-WHERE typbasetype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.typbasetype);
- ctid | typbasetype
-------+-------------
-(0 rows)
-
-SELECT ctid, typcollation
-FROM pg_catalog.pg_type fk
-WHERE typcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.typcollation);
- ctid | typcollation
-------+--------------
-(0 rows)
-
-SELECT ctid, conpfeqop
-FROM (SELECT ctid, unnest(conpfeqop) AS conpfeqop FROM pg_catalog.pg_constraint) fk
-WHERE conpfeqop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conpfeqop);
- ctid | conpfeqop
-------+-----------
-(0 rows)
-
-SELECT ctid, conppeqop
-FROM (SELECT ctid, unnest(conppeqop) AS conppeqop FROM pg_catalog.pg_constraint) fk
-WHERE conppeqop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conppeqop);
- ctid | conppeqop
-------+-----------
-(0 rows)
-
-SELECT ctid, conffeqop
-FROM (SELECT ctid, unnest(conffeqop) AS conffeqop FROM pg_catalog.pg_constraint) fk
-WHERE conffeqop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conffeqop);
- ctid | conffeqop
-------+-----------
-(0 rows)
-
-SELECT ctid, conexclop
-FROM (SELECT ctid, unnest(conexclop) AS conexclop FROM pg_catalog.pg_constraint) fk
-WHERE conexclop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conexclop);
- ctid | conexclop
-------+-----------
-(0 rows)
-
-SELECT ctid, indcollation
-FROM (SELECT ctid, unnest(indcollation) AS indcollation FROM pg_catalog.pg_index) fk
-WHERE indcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.indcollation);
- ctid | indcollation
-------+--------------
-(0 rows)
-
-SELECT ctid, indclass
-FROM (SELECT ctid, unnest(indclass) AS indclass FROM pg_catalog.pg_index) fk
-WHERE indclass != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opclass pk WHERE pk.oid = fk.indclass);
- ctid | indclass
-------+----------
-(0 rows)
-
-SELECT ctid, partclass
-FROM (SELECT ctid, unnest(partclass) AS partclass FROM pg_catalog.pg_partitioned_table) fk
-WHERE partclass != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opclass pk WHERE pk.oid = fk.partclass);
- ctid | partclass
-------+-----------
-(0 rows)
-
-SELECT ctid, partcollation
-FROM (SELECT ctid, unnest(partcollation) AS partcollation FROM pg_catalog.pg_partitioned_table) fk
-WHERE partcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.partcollation);
- ctid | partcollation
-------+---------------
-(0 rows)
-
-SELECT ctid, proargtypes
-FROM (SELECT ctid, unnest(proargtypes) AS proargtypes FROM pg_catalog.pg_proc) fk
-WHERE proargtypes != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.proargtypes);
- ctid | proargtypes
-------+-------------
-(0 rows)
-
-SELECT ctid, proallargtypes
-FROM (SELECT ctid, unnest(proallargtypes) AS proallargtypes FROM pg_catalog.pg_proc) fk
-WHERE proallargtypes != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.proallargtypes);
- ctid | proallargtypes
-------+----------------
-(0 rows)
-
+DO $doblock$
+declare
+ fk record;
+ nkeys integer;
+ cmd text;
+ err record;
+begin
+ for fk in select * from pg_get_catalog_foreign_keys()
+ loop
+ raise notice 'checking % % => % %',
+ fk.fktable, fk.fkcols, fk.pktable, fk.pkcols;
+ nkeys := array_length(fk.fkcols, 1);
+ cmd := 'SELECT ctid';
+ for i in 1 .. nkeys loop
+ cmd := cmd || ', ' || quote_ident(fk.fkcols[i]);
+ end loop;
+ if fk.is_array then
+ cmd := cmd || ' FROM (SELECT ctid';
+ for i in 1 .. nkeys-1 loop
+ cmd := cmd || ', ' || quote_ident(fk.fkcols[i]);
+ end loop;
+ cmd := cmd || ', unnest(' || quote_ident(fk.fkcols[nkeys]);
+ cmd := cmd || ') as ' || quote_ident(fk.fkcols[nkeys]);
+ cmd := cmd || ' FROM ' || fk.fktable::text || ') fk WHERE ';
+ else
+ cmd := cmd || ' FROM ' || fk.fktable::text || ' fk WHERE ';
+ end if;
+ if fk.is_opt then
+ for i in 1 .. nkeys loop
+ cmd := cmd || quote_ident(fk.fkcols[i]) || ' != 0 AND ';
+ end loop;
+ end if;
+ cmd := cmd || 'NOT EXISTS(SELECT 1 FROM ' || fk.pktable::text || ' pk WHERE ';
+ for i in 1 .. nkeys loop
+ if i > 1 then cmd := cmd || ' AND '; end if;
+ cmd := cmd || 'pk.' || quote_ident(fk.pkcols[i]);
+ cmd := cmd || ' = fk.' || quote_ident(fk.fkcols[i]);
+ end loop;
+ cmd := cmd || ')';
+ -- raise notice 'cmd = %', cmd;
+ for err in execute cmd loop
+ raise warning 'FK VIOLATION IN %(%): %', fk.fktable, fk.fkcols, err;
+ end loop;
+ end loop;
+end
+$doblock$;
+NOTICE: checking pg_proc {pronamespace} => pg_namespace {oid}
+NOTICE: checking pg_proc {proowner} => pg_authid {oid}
+NOTICE: checking pg_proc {prolang} => pg_language {oid}
+NOTICE: checking pg_proc {provariadic} => pg_type {oid}
+NOTICE: checking pg_proc {prosupport} => pg_proc {oid}
+NOTICE: checking pg_proc {prorettype} => pg_type {oid}
+NOTICE: checking pg_proc {proargtypes} => pg_type {oid}
+NOTICE: checking pg_proc {proallargtypes} => pg_type {oid}
+NOTICE: checking pg_proc {protrftypes} => pg_type {oid}
+NOTICE: checking pg_type {typnamespace} => pg_namespace {oid}
+NOTICE: checking pg_type {typowner} => pg_authid {oid}
+NOTICE: checking pg_type {typrelid} => pg_class {oid}
+NOTICE: checking pg_type {typsubscript} => pg_proc {oid}
+NOTICE: checking pg_type {typelem} => pg_type {oid}
+NOTICE: checking pg_type {typarray} => pg_type {oid}
+NOTICE: checking pg_type {typinput} => pg_proc {oid}
+NOTICE: checking pg_type {typoutput} => pg_proc {oid}
+NOTICE: checking pg_type {typreceive} => pg_proc {oid}
+NOTICE: checking pg_type {typsend} => pg_proc {oid}
+NOTICE: checking pg_type {typmodin} => pg_proc {oid}
+NOTICE: checking pg_type {typmodout} => pg_proc {oid}
+NOTICE: checking pg_type {typanalyze} => pg_proc {oid}
+NOTICE: checking pg_type {typbasetype} => pg_type {oid}
+NOTICE: checking pg_type {typcollation} => pg_collation {oid}
+NOTICE: checking pg_attribute {attrelid} => pg_class {oid}
+NOTICE: checking pg_attribute {atttypid} => pg_type {oid}
+NOTICE: checking pg_attribute {attcollation} => pg_collation {oid}
+NOTICE: checking pg_class {relnamespace} => pg_namespace {oid}
+NOTICE: checking pg_class {reltype} => pg_type {oid}
+NOTICE: checking pg_class {reloftype} => pg_type {oid}
+NOTICE: checking pg_class {relowner} => pg_authid {oid}
+NOTICE: checking pg_class {relam} => pg_am {oid}
+NOTICE: checking pg_class {reltablespace} => pg_tablespace {oid}
+NOTICE: checking pg_class {reltoastrelid} => pg_class {oid}
+NOTICE: checking pg_class {relrewrite} => pg_class {oid}
+NOTICE: checking pg_attrdef {adrelid} => pg_class {oid}
+NOTICE: checking pg_attrdef {adrelid,adnum} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_constraint {connamespace} => pg_namespace {oid}
+NOTICE: checking pg_constraint {conrelid} => pg_class {oid}
+NOTICE: checking pg_constraint {contypid} => pg_type {oid}
+NOTICE: checking pg_constraint {conindid} => pg_class {oid}
+NOTICE: checking pg_constraint {conparentid} => pg_constraint {oid}
+NOTICE: checking pg_constraint {confrelid} => pg_class {oid}
+NOTICE: checking pg_constraint {conpfeqop} => pg_operator {oid}
+NOTICE: checking pg_constraint {conppeqop} => pg_operator {oid}
+NOTICE: checking pg_constraint {conffeqop} => pg_operator {oid}
+NOTICE: checking pg_constraint {conexclop} => pg_operator {oid}
+NOTICE: checking pg_constraint {conrelid,conkey} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_constraint {confrelid,confkey} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_inherits {inhrelid} => pg_class {oid}
+NOTICE: checking pg_inherits {inhparent} => pg_class {oid}
+NOTICE: checking pg_index {indexrelid} => pg_class {oid}
+NOTICE: checking pg_index {indrelid} => pg_class {oid}
+NOTICE: checking pg_index {indcollation} => pg_collation {oid}
+NOTICE: checking pg_index {indclass} => pg_opclass {oid}
+NOTICE: checking pg_index {indrelid,indkey} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_operator {oprnamespace} => pg_namespace {oid}
+NOTICE: checking pg_operator {oprowner} => pg_authid {oid}
+NOTICE: checking pg_operator {oprleft} => pg_type {oid}
+NOTICE: checking pg_operator {oprright} => pg_type {oid}
+NOTICE: checking pg_operator {oprresult} => pg_type {oid}
+NOTICE: checking pg_operator {oprcom} => pg_operator {oid}
+NOTICE: checking pg_operator {oprnegate} => pg_operator {oid}
+NOTICE: checking pg_operator {oprcode} => pg_proc {oid}
+NOTICE: checking pg_operator {oprrest} => pg_proc {oid}
+NOTICE: checking pg_operator {oprjoin} => pg_proc {oid}
+NOTICE: checking pg_opfamily {opfmethod} => pg_am {oid}
+NOTICE: checking pg_opfamily {opfnamespace} => pg_namespace {oid}
+NOTICE: checking pg_opfamily {opfowner} => pg_authid {oid}
+NOTICE: checking pg_opclass {opcmethod} => pg_am {oid}
+NOTICE: checking pg_opclass {opcnamespace} => pg_namespace {oid}
+NOTICE: checking pg_opclass {opcowner} => pg_authid {oid}
+NOTICE: checking pg_opclass {opcfamily} => pg_opfamily {oid}
+NOTICE: checking pg_opclass {opcintype} => pg_type {oid}
+NOTICE: checking pg_opclass {opckeytype} => pg_type {oid}
+NOTICE: checking pg_am {amhandler} => pg_proc {oid}
+NOTICE: checking pg_amop {amopfamily} => pg_opfamily {oid}
+NOTICE: checking pg_amop {amoplefttype} => pg_type {oid}
+NOTICE: checking pg_amop {amoprighttype} => pg_type {oid}
+NOTICE: checking pg_amop {amopopr} => pg_operator {oid}
+NOTICE: checking pg_amop {amopmethod} => pg_am {oid}
+NOTICE: checking pg_amop {amopsortfamily} => pg_opfamily {oid}
+NOTICE: checking pg_amproc {amprocfamily} => pg_opfamily {oid}
+NOTICE: checking pg_amproc {amproclefttype} => pg_type {oid}
+NOTICE: checking pg_amproc {amprocrighttype} => pg_type {oid}
+NOTICE: checking pg_amproc {amproc} => pg_proc {oid}
+NOTICE: checking pg_language {lanowner} => pg_authid {oid}
+NOTICE: checking pg_language {lanplcallfoid} => pg_proc {oid}
+NOTICE: checking pg_language {laninline} => pg_proc {oid}
+NOTICE: checking pg_language {lanvalidator} => pg_proc {oid}
+NOTICE: checking pg_largeobject_metadata {lomowner} => pg_authid {oid}
+NOTICE: checking pg_largeobject {loid} => pg_largeobject_metadata {oid}
+NOTICE: checking pg_aggregate {aggfnoid} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggtransfn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggfinalfn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggcombinefn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggserialfn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggdeserialfn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggmtransfn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggminvtransfn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggmfinalfn} => pg_proc {oid}
+NOTICE: checking pg_aggregate {aggsortop} => pg_operator {oid}
+NOTICE: checking pg_aggregate {aggtranstype} => pg_type {oid}
+NOTICE: checking pg_aggregate {aggmtranstype} => pg_type {oid}
+NOTICE: checking pg_statistic_ext {stxrelid} => pg_class {oid}
+NOTICE: checking pg_statistic_ext {stxnamespace} => pg_namespace {oid}
+NOTICE: checking pg_statistic_ext {stxowner} => pg_authid {oid}
+NOTICE: checking pg_statistic_ext {stxrelid,stxkeys} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_statistic_ext_data {stxoid} => pg_statistic_ext {oid}
+NOTICE: checking pg_statistic {starelid} => pg_class {oid}
+NOTICE: checking pg_statistic {staop1} => pg_operator {oid}
+NOTICE: checking pg_statistic {staop2} => pg_operator {oid}
+NOTICE: checking pg_statistic {staop3} => pg_operator {oid}
+NOTICE: checking pg_statistic {staop4} => pg_operator {oid}
+NOTICE: checking pg_statistic {staop5} => pg_operator {oid}
+NOTICE: checking pg_statistic {stacoll1} => pg_collation {oid}
+NOTICE: checking pg_statistic {stacoll2} => pg_collation {oid}
+NOTICE: checking pg_statistic {stacoll3} => pg_collation {oid}
+NOTICE: checking pg_statistic {stacoll4} => pg_collation {oid}
+NOTICE: checking pg_statistic {stacoll5} => pg_collation {oid}
+NOTICE: checking pg_statistic {starelid,staattnum} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_rewrite {ev_class} => pg_class {oid}
+NOTICE: checking pg_trigger {tgrelid} => pg_class {oid}
+NOTICE: checking pg_trigger {tgparentid} => pg_trigger {oid}
+NOTICE: checking pg_trigger {tgfoid} => pg_proc {oid}
+NOTICE: checking pg_trigger {tgconstrrelid} => pg_class {oid}
+NOTICE: checking pg_trigger {tgconstrindid} => pg_class {oid}
+NOTICE: checking pg_trigger {tgconstraint} => pg_constraint {oid}
+NOTICE: checking pg_trigger {tgrelid,tgattr} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_event_trigger {evtowner} => pg_authid {oid}
+NOTICE: checking pg_event_trigger {evtfoid} => pg_proc {oid}
+NOTICE: checking pg_description {classoid} => pg_class {oid}
+NOTICE: checking pg_cast {castsource} => pg_type {oid}
+NOTICE: checking pg_cast {casttarget} => pg_type {oid}
+NOTICE: checking pg_cast {castfunc} => pg_proc {oid}
+NOTICE: checking pg_enum {enumtypid} => pg_type {oid}
+NOTICE: checking pg_namespace {nspowner} => pg_authid {oid}
+NOTICE: checking pg_conversion {connamespace} => pg_namespace {oid}
+NOTICE: checking pg_conversion {conowner} => pg_authid {oid}
+NOTICE: checking pg_conversion {conproc} => pg_proc {oid}
+NOTICE: checking pg_depend {classid} => pg_class {oid}
+NOTICE: checking pg_depend {refclassid} => pg_class {oid}
+NOTICE: checking pg_database {datdba} => pg_authid {oid}
+NOTICE: checking pg_database {dattablespace} => pg_tablespace {oid}
+NOTICE: checking pg_db_role_setting {setdatabase} => pg_database {oid}
+NOTICE: checking pg_db_role_setting {setrole} => pg_authid {oid}
+NOTICE: checking pg_tablespace {spcowner} => pg_authid {oid}
+NOTICE: checking pg_auth_members {roleid} => pg_authid {oid}
+NOTICE: checking pg_auth_members {member} => pg_authid {oid}
+NOTICE: checking pg_auth_members {grantor} => pg_authid {oid}
+NOTICE: checking pg_shdepend {dbid} => pg_database {oid}
+NOTICE: checking pg_shdepend {classid} => pg_class {oid}
+NOTICE: checking pg_shdepend {refclassid} => pg_class {oid}
+NOTICE: checking pg_shdescription {classoid} => pg_class {oid}
+NOTICE: checking pg_ts_config {cfgnamespace} => pg_namespace {oid}
+NOTICE: checking pg_ts_config {cfgowner} => pg_authid {oid}
+NOTICE: checking pg_ts_config {cfgparser} => pg_ts_parser {oid}
+NOTICE: checking pg_ts_config_map {mapcfg} => pg_ts_config {oid}
+NOTICE: checking pg_ts_config_map {mapdict} => pg_ts_dict {oid}
+NOTICE: checking pg_ts_dict {dictnamespace} => pg_namespace {oid}
+NOTICE: checking pg_ts_dict {dictowner} => pg_authid {oid}
+NOTICE: checking pg_ts_dict {dicttemplate} => pg_ts_template {oid}
+NOTICE: checking pg_ts_parser {prsnamespace} => pg_namespace {oid}
+NOTICE: checking pg_ts_parser {prsstart} => pg_proc {oid}
+NOTICE: checking pg_ts_parser {prstoken} => pg_proc {oid}
+NOTICE: checking pg_ts_parser {prsend} => pg_proc {oid}
+NOTICE: checking pg_ts_parser {prsheadline} => pg_proc {oid}
+NOTICE: checking pg_ts_parser {prslextype} => pg_proc {oid}
+NOTICE: checking pg_ts_template {tmplnamespace} => pg_namespace {oid}
+NOTICE: checking pg_ts_template {tmplinit} => pg_proc {oid}
+NOTICE: checking pg_ts_template {tmpllexize} => pg_proc {oid}
+NOTICE: checking pg_extension {extowner} => pg_authid {oid}
+NOTICE: checking pg_extension {extnamespace} => pg_namespace {oid}
+NOTICE: checking pg_extension {extconfig} => pg_class {oid}
+NOTICE: checking pg_foreign_data_wrapper {fdwowner} => pg_authid {oid}
+NOTICE: checking pg_foreign_data_wrapper {fdwhandler} => pg_proc {oid}
+NOTICE: checking pg_foreign_data_wrapper {fdwvalidator} => pg_proc {oid}
+NOTICE: checking pg_foreign_server {srvowner} => pg_authid {oid}
+NOTICE: checking pg_foreign_server {srvfdw} => pg_foreign_data_wrapper {oid}
+NOTICE: checking pg_user_mapping {umuser} => pg_authid {oid}
+NOTICE: checking pg_user_mapping {umserver} => pg_foreign_server {oid}
+NOTICE: checking pg_foreign_table {ftrelid} => pg_class {oid}
+NOTICE: checking pg_foreign_table {ftserver} => pg_foreign_server {oid}
+NOTICE: checking pg_policy {polrelid} => pg_class {oid}
+NOTICE: checking pg_policy {polroles} => pg_authid {oid}
+NOTICE: checking pg_default_acl {defaclrole} => pg_authid {oid}
+NOTICE: checking pg_default_acl {defaclnamespace} => pg_namespace {oid}
+NOTICE: checking pg_init_privs {classoid} => pg_class {oid}
+NOTICE: checking pg_seclabel {classoid} => pg_class {oid}
+NOTICE: checking pg_shseclabel {classoid} => pg_class {oid}
+NOTICE: checking pg_collation {collnamespace} => pg_namespace {oid}
+NOTICE: checking pg_collation {collowner} => pg_authid {oid}
+NOTICE: checking pg_partitioned_table {partrelid} => pg_class {oid}
+NOTICE: checking pg_partitioned_table {partdefid} => pg_class {oid}
+NOTICE: checking pg_partitioned_table {partclass} => pg_opclass {oid}
+NOTICE: checking pg_partitioned_table {partcollation} => pg_collation {oid}
+NOTICE: checking pg_partitioned_table {partrelid,partattrs} => pg_attribute {attrelid,attnum}
+NOTICE: checking pg_range {rngtypid} => pg_type {oid}
+NOTICE: checking pg_range {rngsubtype} => pg_type {oid}
+NOTICE: checking pg_range {rngmultitypid} => pg_type {oid}
+NOTICE: checking pg_range {rngcollation} => pg_collation {oid}
+NOTICE: checking pg_range {rngsubopc} => pg_opclass {oid}
+NOTICE: checking pg_range {rngcanonical} => pg_proc {oid}
+NOTICE: checking pg_range {rngsubdiff} => pg_proc {oid}
+NOTICE: checking pg_transform {trftype} => pg_type {oid}
+NOTICE: checking pg_transform {trflang} => pg_language {oid}
+NOTICE: checking pg_transform {trffromsql} => pg_proc {oid}
+NOTICE: checking pg_transform {trftosql} => pg_proc {oid}
+NOTICE: checking pg_sequence {seqrelid} => pg_class {oid}
+NOTICE: checking pg_sequence {seqtypid} => pg_type {oid}
+NOTICE: checking pg_publication {pubowner} => pg_authid {oid}
+NOTICE: checking pg_publication_rel {prpubid} => pg_publication {oid}
+NOTICE: checking pg_publication_rel {prrelid} => pg_class {oid}
+NOTICE: checking pg_subscription {subdbid} => pg_database {oid}
+NOTICE: checking pg_subscription {subowner} => pg_authid {oid}
+NOTICE: checking pg_subscription_rel {srsubid} => pg_subscription {oid}
+NOTICE: checking pg_subscription_rel {srrelid} => pg_class {oid}
diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule
index e0e1ef71dd7..12bb67e4911 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -29,7 +29,7 @@ test: strings numerology point lseg line box path polygon circle date time timet
# geometry depends on point, lseg, box, path, polygon and circle
# horology depends on interval, timetz, timestamp, timestamptz
# ----------
-test: geometry horology regex oidjoins type_sanity opr_sanity misc_sanity comments expressions unicode xid
+test: geometry horology regex type_sanity opr_sanity misc_sanity comments expressions unicode xid
# ----------
# These four each depend on the previous one
@@ -117,7 +117,8 @@ test: plancache limit plpgsql copy2 temp domain rangefuncs prepare conversion tr
test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain
# event triggers cannot run concurrently with any test that runs DDL
-test: event_trigger
+# oidjoins is read-only, though, and should run late for best coverage
+test: event_trigger oidjoins
# this test also uses event triggers, so likewise run it by itself
test: fast_default
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 081fce32e75..59b416fd80c 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -45,7 +45,6 @@ test: tstypes
test: geometry
test: horology
test: regex
-test: oidjoins
test: type_sanity
test: opr_sanity
test: misc_sanity
@@ -201,5 +200,6 @@ test: partition_info
test: tuplesort
test: explain
test: event_trigger
+test: oidjoins
test: fast_default
test: stats
diff --git a/src/test/regress/sql/oidjoins.sql b/src/test/regress/sql/oidjoins.sql
index f6d2d3c68c3..8b22e6d10c5 100644
--- a/src/test/regress/sql/oidjoins.sql
+++ b/src/test/regress/sql/oidjoins.sql
@@ -1,727 +1,49 @@
--
--- This is created by pgsql/src/tools/findoidjoins/make_oidjoins_check
+-- Verify system catalog foreign key relationships
--
-SELECT ctid, aggfnoid
-FROM pg_catalog.pg_aggregate fk
-WHERE aggfnoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggfnoid);
-SELECT ctid, aggtransfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggtransfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggtransfn);
-SELECT ctid, aggfinalfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggfinalfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggfinalfn);
-SELECT ctid, aggcombinefn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggcombinefn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggcombinefn);
-SELECT ctid, aggserialfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggserialfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggserialfn);
-SELECT ctid, aggdeserialfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggdeserialfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggdeserialfn);
-SELECT ctid, aggmtransfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggmtransfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggmtransfn);
-SELECT ctid, aggminvtransfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggminvtransfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggminvtransfn);
-SELECT ctid, aggmfinalfn
-FROM pg_catalog.pg_aggregate fk
-WHERE aggmfinalfn != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.aggmfinalfn);
-SELECT ctid, aggsortop
-FROM pg_catalog.pg_aggregate fk
-WHERE aggsortop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.aggsortop);
-SELECT ctid, aggtranstype
-FROM pg_catalog.pg_aggregate fk
-WHERE aggtranstype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.aggtranstype);
-SELECT ctid, aggmtranstype
-FROM pg_catalog.pg_aggregate fk
-WHERE aggmtranstype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.aggmtranstype);
-SELECT ctid, amhandler
-FROM pg_catalog.pg_am fk
-WHERE amhandler != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.amhandler);
-SELECT ctid, amopfamily
-FROM pg_catalog.pg_amop fk
-WHERE amopfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.amopfamily);
-SELECT ctid, amoplefttype
-FROM pg_catalog.pg_amop fk
-WHERE amoplefttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amoplefttype);
-SELECT ctid, amoprighttype
-FROM pg_catalog.pg_amop fk
-WHERE amoprighttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amoprighttype);
-SELECT ctid, amopopr
-FROM pg_catalog.pg_amop fk
-WHERE amopopr != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.amopopr);
-SELECT ctid, amopmethod
-FROM pg_catalog.pg_amop fk
-WHERE amopmethod != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.amopmethod);
-SELECT ctid, amopsortfamily
-FROM pg_catalog.pg_amop fk
-WHERE amopsortfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.amopsortfamily);
-SELECT ctid, amprocfamily
-FROM pg_catalog.pg_amproc fk
-WHERE amprocfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.amprocfamily);
-SELECT ctid, amproclefttype
-FROM pg_catalog.pg_amproc fk
-WHERE amproclefttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amproclefttype);
-SELECT ctid, amprocrighttype
-FROM pg_catalog.pg_amproc fk
-WHERE amprocrighttype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.amprocrighttype);
-SELECT ctid, amproc
-FROM pg_catalog.pg_amproc fk
-WHERE amproc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.amproc);
-SELECT ctid, adrelid
-FROM pg_catalog.pg_attrdef fk
-WHERE adrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.adrelid);
-SELECT ctid, attrelid
-FROM pg_catalog.pg_attribute fk
-WHERE attrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.attrelid);
-SELECT ctid, atttypid
-FROM pg_catalog.pg_attribute fk
-WHERE atttypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.atttypid);
-SELECT ctid, attcollation
-FROM pg_catalog.pg_attribute fk
-WHERE attcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.attcollation);
-SELECT ctid, roleid
-FROM pg_catalog.pg_auth_members fk
-WHERE roleid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.roleid);
-SELECT ctid, member
-FROM pg_catalog.pg_auth_members fk
-WHERE member != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.member);
-SELECT ctid, grantor
-FROM pg_catalog.pg_auth_members fk
-WHERE grantor != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.grantor);
-SELECT ctid, castsource
-FROM pg_catalog.pg_cast fk
-WHERE castsource != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.castsource);
-SELECT ctid, casttarget
-FROM pg_catalog.pg_cast fk
-WHERE casttarget != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.casttarget);
-SELECT ctid, castfunc
-FROM pg_catalog.pg_cast fk
-WHERE castfunc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.castfunc);
-SELECT ctid, relnamespace
-FROM pg_catalog.pg_class fk
-WHERE relnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.relnamespace);
-SELECT ctid, reltype
-FROM pg_catalog.pg_class fk
-WHERE reltype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.reltype);
-SELECT ctid, reloftype
-FROM pg_catalog.pg_class fk
-WHERE reloftype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.reloftype);
-SELECT ctid, relowner
-FROM pg_catalog.pg_class fk
-WHERE relowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.relowner);
-SELECT ctid, relam
-FROM pg_catalog.pg_class fk
-WHERE relam != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.relam);
-SELECT ctid, reltablespace
-FROM pg_catalog.pg_class fk
-WHERE reltablespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_tablespace pk WHERE pk.oid = fk.reltablespace);
-SELECT ctid, reltoastrelid
-FROM pg_catalog.pg_class fk
-WHERE reltoastrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.reltoastrelid);
-SELECT ctid, collnamespace
-FROM pg_catalog.pg_collation fk
-WHERE collnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.collnamespace);
-SELECT ctid, collowner
-FROM pg_catalog.pg_collation fk
-WHERE collowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.collowner);
-SELECT ctid, connamespace
-FROM pg_catalog.pg_constraint fk
-WHERE connamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.connamespace);
-SELECT ctid, conrelid
-FROM pg_catalog.pg_constraint fk
-WHERE conrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.conrelid);
-SELECT ctid, contypid
-FROM pg_catalog.pg_constraint fk
-WHERE contypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.contypid);
-SELECT ctid, conindid
-FROM pg_catalog.pg_constraint fk
-WHERE conindid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.conindid);
-SELECT ctid, conparentid
-FROM pg_catalog.pg_constraint fk
-WHERE conparentid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_constraint pk WHERE pk.oid = fk.conparentid);
-SELECT ctid, confrelid
-FROM pg_catalog.pg_constraint fk
-WHERE confrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.confrelid);
-SELECT ctid, connamespace
-FROM pg_catalog.pg_conversion fk
-WHERE connamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.connamespace);
-SELECT ctid, conowner
-FROM pg_catalog.pg_conversion fk
-WHERE conowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.conowner);
-SELECT ctid, conproc
-FROM pg_catalog.pg_conversion fk
-WHERE conproc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.conproc);
-SELECT ctid, datdba
-FROM pg_catalog.pg_database fk
-WHERE datdba != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.datdba);
-SELECT ctid, dattablespace
-FROM pg_catalog.pg_database fk
-WHERE dattablespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_tablespace pk WHERE pk.oid = fk.dattablespace);
-SELECT ctid, setdatabase
-FROM pg_catalog.pg_db_role_setting fk
-WHERE setdatabase != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_database pk WHERE pk.oid = fk.setdatabase);
-SELECT ctid, classid
-FROM pg_catalog.pg_depend fk
-WHERE classid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classid);
-SELECT ctid, refclassid
-FROM pg_catalog.pg_depend fk
-WHERE refclassid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.refclassid);
-SELECT ctid, classoid
-FROM pg_catalog.pg_description fk
-WHERE classoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classoid);
-SELECT ctid, enumtypid
-FROM pg_catalog.pg_enum fk
-WHERE enumtypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.enumtypid);
-SELECT ctid, extowner
-FROM pg_catalog.pg_extension fk
-WHERE extowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.extowner);
-SELECT ctid, extnamespace
-FROM pg_catalog.pg_extension fk
-WHERE extnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.extnamespace);
-SELECT ctid, fdwowner
-FROM pg_catalog.pg_foreign_data_wrapper fk
-WHERE fdwowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.fdwowner);
-SELECT ctid, srvowner
-FROM pg_catalog.pg_foreign_server fk
-WHERE srvowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.srvowner);
-SELECT ctid, srvfdw
-FROM pg_catalog.pg_foreign_server fk
-WHERE srvfdw != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_foreign_data_wrapper pk WHERE pk.oid = fk.srvfdw);
-SELECT ctid, indexrelid
-FROM pg_catalog.pg_index fk
-WHERE indexrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.indexrelid);
-SELECT ctid, indrelid
-FROM pg_catalog.pg_index fk
-WHERE indrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.indrelid);
-SELECT ctid, inhrelid
-FROM pg_catalog.pg_inherits fk
-WHERE inhrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.inhrelid);
-SELECT ctid, inhparent
-FROM pg_catalog.pg_inherits fk
-WHERE inhparent != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.inhparent);
-SELECT ctid, classoid
-FROM pg_catalog.pg_init_privs fk
-WHERE classoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classoid);
-SELECT ctid, lanowner
-FROM pg_catalog.pg_language fk
-WHERE lanowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.lanowner);
-SELECT ctid, lanplcallfoid
-FROM pg_catalog.pg_language fk
-WHERE lanplcallfoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.lanplcallfoid);
-SELECT ctid, laninline
-FROM pg_catalog.pg_language fk
-WHERE laninline != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.laninline);
-SELECT ctid, lanvalidator
-FROM pg_catalog.pg_language fk
-WHERE lanvalidator != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.lanvalidator);
-SELECT ctid, loid
-FROM pg_catalog.pg_largeobject fk
-WHERE loid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_largeobject_metadata pk WHERE pk.oid = fk.loid);
-SELECT ctid, lomowner
-FROM pg_catalog.pg_largeobject_metadata fk
-WHERE lomowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.lomowner);
-SELECT ctid, nspowner
-FROM pg_catalog.pg_namespace fk
-WHERE nspowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.nspowner);
-SELECT ctid, opcmethod
-FROM pg_catalog.pg_opclass fk
-WHERE opcmethod != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.opcmethod);
-SELECT ctid, opcnamespace
-FROM pg_catalog.pg_opclass fk
-WHERE opcnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.opcnamespace);
-SELECT ctid, opcowner
-FROM pg_catalog.pg_opclass fk
-WHERE opcowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.opcowner);
-SELECT ctid, opcfamily
-FROM pg_catalog.pg_opclass fk
-WHERE opcfamily != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opfamily pk WHERE pk.oid = fk.opcfamily);
-SELECT ctid, opcintype
-FROM pg_catalog.pg_opclass fk
-WHERE opcintype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.opcintype);
-SELECT ctid, opckeytype
-FROM pg_catalog.pg_opclass fk
-WHERE opckeytype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.opckeytype);
-SELECT ctid, oprnamespace
-FROM pg_catalog.pg_operator fk
-WHERE oprnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.oprnamespace);
-SELECT ctid, oprowner
-FROM pg_catalog.pg_operator fk
-WHERE oprowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.oprowner);
-SELECT ctid, oprleft
-FROM pg_catalog.pg_operator fk
-WHERE oprleft != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.oprleft);
-SELECT ctid, oprright
-FROM pg_catalog.pg_operator fk
-WHERE oprright != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.oprright);
-SELECT ctid, oprresult
-FROM pg_catalog.pg_operator fk
-WHERE oprresult != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.oprresult);
-SELECT ctid, oprcom
-FROM pg_catalog.pg_operator fk
-WHERE oprcom != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprcom);
-SELECT ctid, oprnegate
-FROM pg_catalog.pg_operator fk
-WHERE oprnegate != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.oprnegate);
-SELECT ctid, oprcode
-FROM pg_catalog.pg_operator fk
-WHERE oprcode != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.oprcode);
-SELECT ctid, oprrest
-FROM pg_catalog.pg_operator fk
-WHERE oprrest != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.oprrest);
-SELECT ctid, oprjoin
-FROM pg_catalog.pg_operator fk
-WHERE oprjoin != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.oprjoin);
-SELECT ctid, opfmethod
-FROM pg_catalog.pg_opfamily fk
-WHERE opfmethod != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_am pk WHERE pk.oid = fk.opfmethod);
-SELECT ctid, opfnamespace
-FROM pg_catalog.pg_opfamily fk
-WHERE opfnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.opfnamespace);
-SELECT ctid, opfowner
-FROM pg_catalog.pg_opfamily fk
-WHERE opfowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.opfowner);
-SELECT ctid, partrelid
-FROM pg_catalog.pg_partitioned_table fk
-WHERE partrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.partrelid);
-SELECT ctid, partdefid
-FROM pg_catalog.pg_partitioned_table fk
-WHERE partdefid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.partdefid);
-SELECT ctid, polrelid
-FROM pg_catalog.pg_policy fk
-WHERE polrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.polrelid);
-SELECT ctid, pronamespace
-FROM pg_catalog.pg_proc fk
-WHERE pronamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.pronamespace);
-SELECT ctid, proowner
-FROM pg_catalog.pg_proc fk
-WHERE proowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.proowner);
-SELECT ctid, prolang
-FROM pg_catalog.pg_proc fk
-WHERE prolang != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_language pk WHERE pk.oid = fk.prolang);
-SELECT ctid, provariadic
-FROM pg_catalog.pg_proc fk
-WHERE provariadic != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.provariadic);
-SELECT ctid, prosupport
-FROM pg_catalog.pg_proc fk
-WHERE prosupport != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prosupport);
-SELECT ctid, prorettype
-FROM pg_catalog.pg_proc fk
-WHERE prorettype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.prorettype);
-SELECT ctid, rngtypid
-FROM pg_catalog.pg_range fk
-WHERE rngtypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.rngtypid);
-SELECT ctid, rngsubtype
-FROM pg_catalog.pg_range fk
-WHERE rngsubtype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.rngsubtype);
-SELECT ctid, rngcollation
-FROM pg_catalog.pg_range fk
-WHERE rngcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.rngcollation);
-SELECT ctid, rngsubopc
-FROM pg_catalog.pg_range fk
-WHERE rngsubopc != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opclass pk WHERE pk.oid = fk.rngsubopc);
-SELECT ctid, rngcanonical
-FROM pg_catalog.pg_range fk
-WHERE rngcanonical != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.rngcanonical);
-SELECT ctid, rngsubdiff
-FROM pg_catalog.pg_range fk
-WHERE rngsubdiff != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.rngsubdiff);
-SELECT ctid, ev_class
-FROM pg_catalog.pg_rewrite fk
-WHERE ev_class != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.ev_class);
-SELECT ctid, seqrelid
-FROM pg_catalog.pg_sequence fk
-WHERE seqrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.seqrelid);
-SELECT ctid, seqtypid
-FROM pg_catalog.pg_sequence fk
-WHERE seqtypid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.seqtypid);
-SELECT ctid, refclassid
-FROM pg_catalog.pg_shdepend fk
-WHERE refclassid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.refclassid);
-SELECT ctid, classoid
-FROM pg_catalog.pg_shdescription fk
-WHERE classoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.classoid);
-SELECT ctid, starelid
-FROM pg_catalog.pg_statistic fk
-WHERE starelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.starelid);
-SELECT ctid, staop1
-FROM pg_catalog.pg_statistic fk
-WHERE staop1 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop1);
-SELECT ctid, staop2
-FROM pg_catalog.pg_statistic fk
-WHERE staop2 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop2);
-SELECT ctid, staop3
-FROM pg_catalog.pg_statistic fk
-WHERE staop3 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop3);
-SELECT ctid, staop4
-FROM pg_catalog.pg_statistic fk
-WHERE staop4 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop4);
-SELECT ctid, staop5
-FROM pg_catalog.pg_statistic fk
-WHERE staop5 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.staop5);
-SELECT ctid, stacoll1
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll1 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll1);
-SELECT ctid, stacoll2
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll2 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll2);
-SELECT ctid, stacoll3
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll3 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll3);
-SELECT ctid, stacoll4
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll4 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll4);
-SELECT ctid, stacoll5
-FROM pg_catalog.pg_statistic fk
-WHERE stacoll5 != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.stacoll5);
-SELECT ctid, stxrelid
-FROM pg_catalog.pg_statistic_ext fk
-WHERE stxrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.stxrelid);
-SELECT ctid, stxnamespace
-FROM pg_catalog.pg_statistic_ext fk
-WHERE stxnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.stxnamespace);
-SELECT ctid, stxowner
-FROM pg_catalog.pg_statistic_ext fk
-WHERE stxowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.stxowner);
-SELECT ctid, stxoid
-FROM pg_catalog.pg_statistic_ext_data fk
-WHERE stxoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_statistic_ext pk WHERE pk.oid = fk.stxoid);
-SELECT ctid, spcowner
-FROM pg_catalog.pg_tablespace fk
-WHERE spcowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.spcowner);
-SELECT ctid, trftype
-FROM pg_catalog.pg_transform fk
-WHERE trftype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.trftype);
-SELECT ctid, trflang
-FROM pg_catalog.pg_transform fk
-WHERE trflang != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_language pk WHERE pk.oid = fk.trflang);
-SELECT ctid, trffromsql
-FROM pg_catalog.pg_transform fk
-WHERE trffromsql != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.trffromsql);
-SELECT ctid, trftosql
-FROM pg_catalog.pg_transform fk
-WHERE trftosql != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.trftosql);
-SELECT ctid, tgrelid
-FROM pg_catalog.pg_trigger fk
-WHERE tgrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.tgrelid);
-SELECT ctid, tgparentid
-FROM pg_catalog.pg_trigger fk
-WHERE tgparentid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_trigger pk WHERE pk.oid = fk.tgparentid);
-SELECT ctid, tgfoid
-FROM pg_catalog.pg_trigger fk
-WHERE tgfoid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.tgfoid);
-SELECT ctid, tgconstrrelid
-FROM pg_catalog.pg_trigger fk
-WHERE tgconstrrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.tgconstrrelid);
-SELECT ctid, tgconstrindid
-FROM pg_catalog.pg_trigger fk
-WHERE tgconstrindid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.tgconstrindid);
-SELECT ctid, tgconstraint
-FROM pg_catalog.pg_trigger fk
-WHERE tgconstraint != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_constraint pk WHERE pk.oid = fk.tgconstraint);
-SELECT ctid, cfgnamespace
-FROM pg_catalog.pg_ts_config fk
-WHERE cfgnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.cfgnamespace);
-SELECT ctid, cfgowner
-FROM pg_catalog.pg_ts_config fk
-WHERE cfgowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.cfgowner);
-SELECT ctid, cfgparser
-FROM pg_catalog.pg_ts_config fk
-WHERE cfgparser != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_parser pk WHERE pk.oid = fk.cfgparser);
-SELECT ctid, mapcfg
-FROM pg_catalog.pg_ts_config_map fk
-WHERE mapcfg != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_config pk WHERE pk.oid = fk.mapcfg);
-SELECT ctid, mapdict
-FROM pg_catalog.pg_ts_config_map fk
-WHERE mapdict != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_dict pk WHERE pk.oid = fk.mapdict);
-SELECT ctid, dictnamespace
-FROM pg_catalog.pg_ts_dict fk
-WHERE dictnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.dictnamespace);
-SELECT ctid, dictowner
-FROM pg_catalog.pg_ts_dict fk
-WHERE dictowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.dictowner);
-SELECT ctid, dicttemplate
-FROM pg_catalog.pg_ts_dict fk
-WHERE dicttemplate != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_ts_template pk WHERE pk.oid = fk.dicttemplate);
-SELECT ctid, prsnamespace
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.prsnamespace);
-SELECT ctid, prsstart
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsstart != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prsstart);
-SELECT ctid, prstoken
-FROM pg_catalog.pg_ts_parser fk
-WHERE prstoken != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prstoken);
-SELECT ctid, prsend
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsend != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prsend);
-SELECT ctid, prsheadline
-FROM pg_catalog.pg_ts_parser fk
-WHERE prsheadline != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prsheadline);
-SELECT ctid, prslextype
-FROM pg_catalog.pg_ts_parser fk
-WHERE prslextype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.prslextype);
-SELECT ctid, tmplnamespace
-FROM pg_catalog.pg_ts_template fk
-WHERE tmplnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.tmplnamespace);
-SELECT ctid, tmplinit
-FROM pg_catalog.pg_ts_template fk
-WHERE tmplinit != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.tmplinit);
-SELECT ctid, tmpllexize
-FROM pg_catalog.pg_ts_template fk
-WHERE tmpllexize != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.tmpllexize);
-SELECT ctid, typnamespace
-FROM pg_catalog.pg_type fk
-WHERE typnamespace != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_namespace pk WHERE pk.oid = fk.typnamespace);
-SELECT ctid, typowner
-FROM pg_catalog.pg_type fk
-WHERE typowner != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_authid pk WHERE pk.oid = fk.typowner);
-SELECT ctid, typrelid
-FROM pg_catalog.pg_type fk
-WHERE typrelid != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_class pk WHERE pk.oid = fk.typrelid);
-SELECT ctid, typelem
-FROM pg_catalog.pg_type fk
-WHERE typelem != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.typelem);
-SELECT ctid, typarray
-FROM pg_catalog.pg_type fk
-WHERE typarray != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.typarray);
-SELECT ctid, typinput
-FROM pg_catalog.pg_type fk
-WHERE typinput != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typinput);
-SELECT ctid, typoutput
-FROM pg_catalog.pg_type fk
-WHERE typoutput != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typoutput);
-SELECT ctid, typreceive
-FROM pg_catalog.pg_type fk
-WHERE typreceive != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typreceive);
-SELECT ctid, typsend
-FROM pg_catalog.pg_type fk
-WHERE typsend != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typsend);
-SELECT ctid, typmodin
-FROM pg_catalog.pg_type fk
-WHERE typmodin != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typmodin);
-SELECT ctid, typmodout
-FROM pg_catalog.pg_type fk
-WHERE typmodout != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typmodout);
-SELECT ctid, typanalyze
-FROM pg_catalog.pg_type fk
-WHERE typanalyze != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_proc pk WHERE pk.oid = fk.typanalyze);
-SELECT ctid, typbasetype
-FROM pg_catalog.pg_type fk
-WHERE typbasetype != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.typbasetype);
-SELECT ctid, typcollation
-FROM pg_catalog.pg_type fk
-WHERE typcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.typcollation);
-SELECT ctid, conpfeqop
-FROM (SELECT ctid, unnest(conpfeqop) AS conpfeqop FROM pg_catalog.pg_constraint) fk
-WHERE conpfeqop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conpfeqop);
-SELECT ctid, conppeqop
-FROM (SELECT ctid, unnest(conppeqop) AS conppeqop FROM pg_catalog.pg_constraint) fk
-WHERE conppeqop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conppeqop);
-SELECT ctid, conffeqop
-FROM (SELECT ctid, unnest(conffeqop) AS conffeqop FROM pg_catalog.pg_constraint) fk
-WHERE conffeqop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conffeqop);
-SELECT ctid, conexclop
-FROM (SELECT ctid, unnest(conexclop) AS conexclop FROM pg_catalog.pg_constraint) fk
-WHERE conexclop != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_operator pk WHERE pk.oid = fk.conexclop);
-SELECT ctid, indcollation
-FROM (SELECT ctid, unnest(indcollation) AS indcollation FROM pg_catalog.pg_index) fk
-WHERE indcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.indcollation);
-SELECT ctid, indclass
-FROM (SELECT ctid, unnest(indclass) AS indclass FROM pg_catalog.pg_index) fk
-WHERE indclass != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opclass pk WHERE pk.oid = fk.indclass);
-SELECT ctid, partclass
-FROM (SELECT ctid, unnest(partclass) AS partclass FROM pg_catalog.pg_partitioned_table) fk
-WHERE partclass != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_opclass pk WHERE pk.oid = fk.partclass);
-SELECT ctid, partcollation
-FROM (SELECT ctid, unnest(partcollation) AS partcollation FROM pg_catalog.pg_partitioned_table) fk
-WHERE partcollation != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_collation pk WHERE pk.oid = fk.partcollation);
-SELECT ctid, proargtypes
-FROM (SELECT ctid, unnest(proargtypes) AS proargtypes FROM pg_catalog.pg_proc) fk
-WHERE proargtypes != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.proargtypes);
-SELECT ctid, proallargtypes
-FROM (SELECT ctid, unnest(proallargtypes) AS proallargtypes FROM pg_catalog.pg_proc) fk
-WHERE proallargtypes != 0 AND
- NOT EXISTS(SELECT 1 FROM pg_catalog.pg_type pk WHERE pk.oid = fk.proallargtypes);
+DO $doblock$
+declare
+ fk record;
+ nkeys integer;
+ cmd text;
+ err record;
+begin
+ for fk in select * from pg_get_catalog_foreign_keys()
+ loop
+ raise notice 'checking % % => % %',
+ fk.fktable, fk.fkcols, fk.pktable, fk.pkcols;
+ nkeys := array_length(fk.fkcols, 1);
+ cmd := 'SELECT ctid';
+ for i in 1 .. nkeys loop
+ cmd := cmd || ', ' || quote_ident(fk.fkcols[i]);
+ end loop;
+ if fk.is_array then
+ cmd := cmd || ' FROM (SELECT ctid';
+ for i in 1 .. nkeys-1 loop
+ cmd := cmd || ', ' || quote_ident(fk.fkcols[i]);
+ end loop;
+ cmd := cmd || ', unnest(' || quote_ident(fk.fkcols[nkeys]);
+ cmd := cmd || ') as ' || quote_ident(fk.fkcols[nkeys]);
+ cmd := cmd || ' FROM ' || fk.fktable::text || ') fk WHERE ';
+ else
+ cmd := cmd || ' FROM ' || fk.fktable::text || ' fk WHERE ';
+ end if;
+ if fk.is_opt then
+ for i in 1 .. nkeys loop
+ cmd := cmd || quote_ident(fk.fkcols[i]) || ' != 0 AND ';
+ end loop;
+ end if;
+ cmd := cmd || 'NOT EXISTS(SELECT 1 FROM ' || fk.pktable::text || ' pk WHERE ';
+ for i in 1 .. nkeys loop
+ if i > 1 then cmd := cmd || ' AND '; end if;
+ cmd := cmd || 'pk.' || quote_ident(fk.pkcols[i]);
+ cmd := cmd || ' = fk.' || quote_ident(fk.fkcols[i]);
+ end loop;
+ cmd := cmd || ')';
+ -- raise notice 'cmd = %', cmd;
+ for err in execute cmd loop
+ raise warning 'FK VIOLATION IN %(%): %', fk.fktable, fk.fkcols, err;
+ end loop;
+ end loop;
+end
+$doblock$;
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 1c0c92fcd2c..2aa062b2c9e 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -818,6 +818,9 @@ EOF
copyFile(
'src/backend/catalog/schemapg.h',
'src/include/catalog/schemapg.h');
+ copyFile(
+ 'src/backend/catalog/system_fk_info.h',
+ 'src/include/catalog/system_fk_info.h');
open(my $chs, '>', 'src/include/catalog/header-stamp')
|| confess "Could not touch header-stamp";
close($chs);
diff --git a/src/tools/msvc/clean.bat b/src/tools/msvc/clean.bat
index 4575e3f95f6..d0d79a09325 100755
--- a/src/tools/msvc/clean.bat
+++ b/src/tools/msvc/clean.bat
@@ -47,6 +47,7 @@ if exist src\include\utils\fmgrprotos.h del /q src\include\utils\fmgrprotos.h
if exist src\include\storage\lwlocknames.h del /q src\include\storage\lwlocknames.h
if exist src\include\utils\probes.h del /q src\include\utils\probes.h
if exist src\include\catalog\schemapg.h del /q src\include\catalog\schemapg.h
+if exist src\include\catalog\system_fk_info.h del /q src\include\catalog\system_fk_info.h
if exist src\include\catalog\pg_*_d.h del /q src\include\catalog\pg_*_d.h
if exist src\include\catalog\header-stamp del /q src\include\catalog\header-stamp
if exist doc\src\sgml\version.sgml del /q doc\src\sgml\version.sgml
@@ -73,6 +74,7 @@ if %DIST%==1 if exist src\interfaces\ecpg\preproc\preproc.y del /q src\interface
if %DIST%==1 if exist src\backend\catalog\postgres.bki del /q src\backend\catalog\postgres.bki
if %DIST%==1 if exist src\backend\catalog\system_constraints.sql del /q src\backend\catalog\system_constraints.sql
if %DIST%==1 if exist src\backend\catalog\schemapg.h del /q src\backend\catalog\schemapg.h
+if %DIST%==1 if exist src\backend\catalog\system_fk_info.h del /q src\backend\catalog\system_fk_info.h
if %DIST%==1 if exist src\backend\catalog\pg_*_d.h del /q src\backend\catalog\pg_*_d.h
if %DIST%==1 if exist src\backend\catalog\bki-stamp del /q src\backend\catalog\bki-stamp
if %DIST%==1 if exist src\backend\parser\scan.c del /q src\backend\parser\scan.c