On 2021-01-17 23:07, Tom Lane wrote:
I've reviewed this patch.  It looks pretty solid to me, with a couple
trivial nits as mentioned below, and one bigger thing that's perhaps
in the category of bikeshedding.  Namely, do we really want to prefer
using the OID indexes as the primary keys?  In most cases there's some
other index that seems to me to be what a user would think of as the
pkey, for example pg_class_relname_nsp_index for pg_class or
pg_proc_proname_args_nsp_index for pg_proc.  Preferring OID where it
exists is a nice simple rule, which has some attractiveness, but the
OID indexes seem to me like a lookup aid rather than the "real" object
identity.

I chose this because the notional foreign keys point to the OID.

If you design some basic business database with customer IDs, product IDs, etc., you'd also usually make the ID the primary key, even if you have, say, a unique constraint on the product name. But this is of course a matter of taste to some degree.

system_constraints.sql should be removed by the maintainer-clean target
in src/backend/catalog/Makefile; perhaps also mention it in the comment
for the clean target.  Also I suppose src/tools/msvc/clean.bat needs to
remove it, like it does postgres.bki.

done

The contents of system_constraints.sql seem pretty randomly ordered,
and I bet the order isn't stable across machines.  It would be wise
to sort the entries by name to ensure we don't get inconsistencies
between different builds.  (If nothing else, that could complicate
validating tarballs.)

They follow the order in which the catalogs are processed byt genbki.pl. This is the same order in which the catalog data and indexes are created in postgres.bki. The Perl code to handle each of these is conceptually the same, so that seems solid. We could order them differently, but there is also value in keeping the catalog processing order globally consistent.

I don't follow why the pg_seclabel, pg_shseclabel indexes aren't made
into pkeys?  There's a comment claiming they "use a nondefault operator
class", but that's untrue AFAICS.

When I started the patch, it was text_pattern_ops, but that was a long time ago. ;-) Fixed now.

--
Peter Eisentraut
2ndQuadrant, an EDB company
https://www.2ndquadrant.com/
From d6e15c6ac1903af5dbe424a34e7ea9ad776517ff Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Thu, 21 Jan 2021 09:47:42 +0100
Subject: [PATCH v3] Add primary keys and unique constraints to system catalogs

For those system catalogs that have a unique indexes, make a primary
key and unique constraint, using ALTER TABLE ... PRIMARY KEY/UNIQUE
USING INDEX.

This can be helpful for GUI tools that look for a primary key, and it
might in the future allow declaring foreign keys, for making schema
diagrams.

The constraint creation statements are automatically created by
genbki.pl from DECLARE_UNIQUE_INDEX directives.  To specify which one
of the available unique indexes is the primary key, use the new
directive DECLARE_UNIQUE_INDEX_PKEY instead.

Discussion: 
https://www.postgresql.org/message-id/flat/dc5f44d9-5ec1-a596-0251-dadadcded...@2ndquadrant.com
---
 src/backend/catalog/.gitignore                |  1 +
 src/backend/catalog/Catalog.pm                | 11 ++--
 src/backend/catalog/Makefile                  |  9 +--
 src/backend/catalog/genbki.pl                 | 21 +++++++
 src/bin/initdb/initdb.c                       | 60 +++++--------------
 src/include/catalog/genbki.h                  |  3 +-
 src/include/catalog/pg_aggregate.h            |  2 +-
 src/include/catalog/pg_am.h                   |  2 +-
 src/include/catalog/pg_amop.h                 |  2 +-
 src/include/catalog/pg_amproc.h               |  2 +-
 src/include/catalog/pg_attrdef.h              |  2 +-
 src/include/catalog/pg_attribute.h            |  2 +-
 src/include/catalog/pg_auth_members.h         |  2 +-
 src/include/catalog/pg_authid.h               |  2 +-
 src/include/catalog/pg_cast.h                 |  2 +-
 src/include/catalog/pg_class.h                |  2 +-
 src/include/catalog/pg_collation.h            |  2 +-
 src/include/catalog/pg_constraint.h           |  2 +-
 src/include/catalog/pg_conversion.h           |  2 +-
 src/include/catalog/pg_database.h             |  2 +-
 src/include/catalog/pg_db_role_setting.h      |  2 +-
 src/include/catalog/pg_default_acl.h          |  2 +-
 src/include/catalog/pg_description.h          |  2 +-
 src/include/catalog/pg_enum.h                 |  2 +-
 src/include/catalog/pg_event_trigger.h        |  2 +-
 src/include/catalog/pg_extension.h            |  2 +-
 src/include/catalog/pg_foreign_data_wrapper.h |  2 +-
 src/include/catalog/pg_foreign_server.h       |  2 +-
 src/include/catalog/pg_foreign_table.h        |  2 +-
 src/include/catalog/pg_index.h                |  2 +-
 src/include/catalog/pg_inherits.h             |  2 +-
 src/include/catalog/pg_init_privs.h           |  2 +-
 src/include/catalog/pg_language.h             |  2 +-
 src/include/catalog/pg_largeobject.h          |  2 +-
 src/include/catalog/pg_largeobject_metadata.h |  2 +-
 src/include/catalog/pg_namespace.h            |  2 +-
 src/include/catalog/pg_opclass.h              |  2 +-
 src/include/catalog/pg_operator.h             |  2 +-
 src/include/catalog/pg_opfamily.h             |  2 +-
 src/include/catalog/pg_partitioned_table.h    |  2 +-
 src/include/catalog/pg_policy.h               |  2 +-
 src/include/catalog/pg_proc.h                 |  2 +-
 src/include/catalog/pg_publication.h          |  2 +-
 src/include/catalog/pg_publication_rel.h      |  2 +-
 src/include/catalog/pg_range.h                |  2 +-
 src/include/catalog/pg_replication_origin.h   |  2 +-
 src/include/catalog/pg_rewrite.h              |  2 +-
 src/include/catalog/pg_seclabel.h             |  2 +-
 src/include/catalog/pg_sequence.h             |  2 +-
 src/include/catalog/pg_shdescription.h        |  2 +-
 src/include/catalog/pg_shseclabel.h           |  2 +-
 src/include/catalog/pg_statistic.h            |  2 +-
 src/include/catalog/pg_statistic_ext.h        |  2 +-
 src/include/catalog/pg_statistic_ext_data.h   |  2 +-
 src/include/catalog/pg_subscription.h         |  2 +-
 src/include/catalog/pg_subscription_rel.h     |  2 +-
 src/include/catalog/pg_tablespace.h           |  2 +-
 src/include/catalog/pg_transform.h            |  2 +-
 src/include/catalog/pg_trigger.h              |  2 +-
 src/include/catalog/pg_ts_config.h            |  2 +-
 src/include/catalog/pg_ts_config_map.h        |  2 +-
 src/include/catalog/pg_ts_dict.h              |  2 +-
 src/include/catalog/pg_ts_parser.h            |  2 +-
 src/include/catalog/pg_ts_template.h          |  2 +-
 src/include/catalog/pg_type.h                 |  2 +-
 src/include/catalog/pg_user_mapping.h         |  2 +-
 .../expected/alter_system_table.out           |  6 +-
 .../unsafe_tests/sql/alter_system_table.sql   |  5 +-
 src/test/regress/expected/misc_sanity.out     | 28 ++++++++-
 src/test/regress/sql/misc_sanity.sql          | 21 +++++++
 src/tools/msvc/clean.bat                      |  1 +
 71 files changed, 163 insertions(+), 123 deletions(-)

diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore
index 11e2e52023..4bd3ee9d7f 100644
--- a/src/backend/catalog/.gitignore
+++ b/src/backend/catalog/.gitignore
@@ -1,4 +1,5 @@
 /postgres.bki
 /schemapg.h
+/system_constraints.sql
 /pg_*_d.h
 /bki-stamp
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index a37c327122..061f3d8c21 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -94,14 +94,15 @@ sub ParseHeader
                        push @{ $catalog{toasting} },
                          { parent_table => $1, toast_oid => $2, 
toast_index_oid => $3 };
                }
-               elsif (/^DECLARE_(UNIQUE_)?INDEX\(\s*(\w+),\s*(\d+),\s*(.+)\)/)
+               elsif 
(/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(.+)\)/)
                {
                        push @{ $catalog{indexing} },
-                         {
+                       {
                                is_unique => $1 ? 1 : 0,
-                               index_name => $2,
-                               index_oid  => $3,
-                               index_decl => $4
+                               is_pkey => $2 ? 1 : 0,
+                               index_name => $3,
+                               index_oid  => $4,
+                               index_decl => $5
                          };
                }
                elsif (/^CATALOG\((\w+),(\d+),(\w+)\)/)
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index c85f0ca7b6..995ddf1285 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -121,6 +121,7 @@ $(top_builddir)/src/include/catalog/header-stamp: bki-stamp
 .PHONY: install-data
 install-data: bki-stamp installdirs
        $(INSTALL_DATA) $(call vpathsearch,postgres.bki) 
'$(DESTDIR)$(datadir)/postgres.bki'
+       $(INSTALL_DATA) $(call vpathsearch,system_constraints.sql) 
'$(DESTDIR)$(datadir)/system_constraints.sql'
        $(INSTALL_DATA) $(srcdir)/system_views.sql 
'$(DESTDIR)$(datadir)/system_views.sql'
        $(INSTALL_DATA) $(srcdir)/information_schema.sql 
'$(DESTDIR)$(datadir)/information_schema.sql'
        $(INSTALL_DATA) $(srcdir)/sql_features.txt 
'$(DESTDIR)$(datadir)/sql_features.txt'
@@ -130,11 +131,11 @@ installdirs:
 
 .PHONY: uninstall-data
 uninstall-data:
-       rm -f $(addprefix '$(DESTDIR)$(datadir)'/, postgres.bki 
system_views.sql information_schema.sql sql_features.txt)
+       rm -f $(addprefix '$(DESTDIR)$(datadir)'/, postgres.bki 
system_constraints.sql system_views.sql information_schema.sql sql_features.txt)
 
-# postgres.bki and the generated headers are in the distribution tarball,
-# so they are not cleaned here.
+# postgres.bki, system_constraints.sql, and the generated headers are
+# in the distribution tarball, so they are not cleaned here.
 clean:
 
 maintainer-clean: clean
-       rm -f bki-stamp postgres.bki $(GENERATED_HEADERS)
+       rm -f bki-stamp postgres.bki system_constraints.sql $(GENERATED_HEADERS)
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 009e215da1..6747996ce3 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -55,6 +55,7 @@
 my @toast_decls;
 my @index_decls;
 my %oidcounts;
+my @system_constraints;
 
 foreach my $header (@ARGV)
 {
@@ -137,6 +138,17 @@
                  $index->{index_name}, $index->{index_oid},
                  $index->{index_decl};
                $oidcounts{ $index->{index_oid} }++;
+
+               if ($index->{is_unique})
+               {
+                       $index->{index_decl} =~ /on (\w+) using/;
+                       my $tblname = $1;
+                       push @system_constraints,
+                         sprintf "ALTER TABLE %s ADD %s USING INDEX %s;",
+                         $tblname,
+                         $index->{is_pkey} ? "PRIMARY KEY" : "UNIQUE",
+                         $index->{index_name};
+               }
        }
 }
 
@@ -388,6 +400,9 @@
 my $schemafile = $output_path . 'schemapg.h';
 open my $schemapg, '>', $schemafile . $tmpext
   or die "can't open $schemafile$tmpext: $!";
+my $constraints_file = $output_path . 'system_constraints.sql';
+open my $constraints, '>', $constraints_file . $tmpext
+  or die "can't open $constraints_file$tmpext: $!";
 
 # Generate postgres.bki and pg_*_d.h headers.
 
@@ -648,6 +663,10 @@
   "genbki OID counter reached $GenbkiNextOid, overrunning 
FirstBootstrapObjectId\n"
   if $GenbkiNextOid > $FirstBootstrapObjectId;
 
+foreach my $c (@system_constraints)
+{
+       print $constraints $c, "\n";
+}
 
 # Now generate schemapg.h
 
@@ -688,10 +707,12 @@
 # We're done emitting data
 close $bki;
 close $schemapg;
+close $constraints;
 
 # Finally, rename the completed files into place.
 Catalog::RenameTempFile($bkifile,    $tmpext);
 Catalog::RenameTempFile($schemafile, $tmpext);
+Catalog::RenameTempFile($constraints_file, $tmpext);
 
 exit 0;
 
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index e242a4a5b5..62540a1b37 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -159,6 +159,7 @@ static char *conf_file;
 static char *dictionary_file;
 static char *info_schema_file;
 static char *features_file;
+static char *system_constraints_file;
 static char *system_views_file;
 static bool success = false;
 static bool made_new_pgdata = false;
@@ -251,10 +252,9 @@ static void bootstrap_template1(void);
 static void setup_auth(FILE *cmdfd);
 static void get_su_pwd(void);
 static void setup_depend(FILE *cmdfd);
-static void setup_sysviews(FILE *cmdfd);
+static void setup_run_file(FILE *cmdfd, const char *filename);
 static void setup_description(FILE *cmdfd);
 static void setup_collation(FILE *cmdfd);
-static void setup_dictionary(FILE *cmdfd);
 static void setup_privileges(FILE *cmdfd);
 static void set_info_version(void);
 static void setup_schema(FILE *cmdfd);
@@ -1600,17 +1600,16 @@ setup_depend(FILE *cmdfd)
 }
 
 /*
- * set up system views
+ * Run external file
  */
 static void
-setup_sysviews(FILE *cmdfd)
+setup_run_file(FILE *cmdfd, const char *filename)
 {
-       char      **line;
-       char      **sysviews_setup;
+       char      **lines;
 
-       sysviews_setup = readfile(system_views_file);
+       lines = readfile(filename);
 
-       for (line = sysviews_setup; *line != NULL; line++)
+       for (char **line = lines; *line != NULL; line++)
        {
                PG_CMD_PUTS(*line);
                free(*line);
@@ -1618,7 +1617,7 @@ setup_sysviews(FILE *cmdfd)
 
        PG_CMD_PUTS("\n\n");
 
-       free(sysviews_setup);
+       free(lines);
 }
 
 /*
@@ -1661,27 +1660,6 @@ setup_collation(FILE *cmdfd)
        PG_CMD_PUTS("SELECT pg_import_system_collations('pg_catalog');\n\n");
 }
 
-/*
- * load extra dictionaries (Snowball stemmers)
- */
-static void
-setup_dictionary(FILE *cmdfd)
-{
-       char      **line;
-       char      **conv_lines;
-
-       conv_lines = readfile(dictionary_file);
-       for (line = conv_lines; *line != NULL; line++)
-       {
-               PG_CMD_PUTS(*line);
-               free(*line);
-       }
-
-       PG_CMD_PUTS("\n\n");
-
-       free(conv_lines);
-}
-
 /*
  * Set up privileges
  *
@@ -1882,20 +1860,7 @@ set_info_version(void)
 static void
 setup_schema(FILE *cmdfd)
 {
-       char      **line;
-       char      **lines;
-
-       lines = readfile(info_schema_file);
-
-       for (line = lines; *line != NULL; line++)
-       {
-               PG_CMD_PUTS(*line);
-               free(*line);
-       }
-
-       PG_CMD_PUTS("\n\n");
-
-       free(lines);
+       setup_run_file(cmdfd, info_schema_file);
 
        PG_CMD_PRINTF("UPDATE information_schema.sql_implementation_info "
                                  "  SET character_value = '%s' "
@@ -2534,6 +2499,7 @@ setup_data_file_paths(void)
        set_input(&dictionary_file, "snowball_create.sql");
        set_input(&info_schema_file, "information_schema.sql");
        set_input(&features_file, "sql_features.txt");
+       set_input(&system_constraints_file, "system_constraints.sql");
        set_input(&system_views_file, "system_views.sql");
 
        if (show_setting || debug)
@@ -2895,6 +2861,8 @@ initialize_data_directory(void)
 
        setup_auth(cmdfd);
 
+       setup_run_file(cmdfd, system_constraints_file);
+
        setup_depend(cmdfd);
 
        /*
@@ -2902,13 +2870,13 @@ initialize_data_directory(void)
         * They are all droppable at the whim of the DBA.
         */
 
-       setup_sysviews(cmdfd);
+       setup_run_file(cmdfd, system_views_file);
 
        setup_description(cmdfd);
 
        setup_collation(cmdfd);
 
-       setup_dictionary(cmdfd);
+       setup_run_file(cmdfd, dictionary_file);
 
        setup_privileges(cmdfd);
 
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index e26bde6d09..296765d987 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -58,7 +58,7 @@
  * These lines processed by genbki.pl to create the statements
  * the bootstrap parser will turn into DefineIndex calls.
  *
- * The keyword is DECLARE_INDEX or DECLARE_UNIQUE_INDEX.  The first two
+ * The keyword is DECLARE_INDEX or DECLARE_UNIQUE_INDEX or 
DECLARE_UNIQUE_INDEX_PKEY.  The first two
  * arguments are the index name and OID, the rest is much like a standard
  * 'create index' SQL command.
  *
@@ -70,6 +70,7 @@
  */
 #define DECLARE_INDEX(name,oid,decl) extern int no_such_variable
 #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
 
 /* 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 e90c3f847e..8b03cdeea2 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -110,7 +110,7 @@ typedef FormData_pg_aggregate *Form_pg_aggregate;
 
 DECLARE_TOAST(pg_aggregate, 4159, 4160);
 
-DECLARE_UNIQUE_INDEX(pg_aggregate_fnoid_index, 2650, on pg_aggregate using 
btree(aggfnoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, on pg_aggregate 
using btree(aggfnoid oid_ops));
 #define AggregateFnoidIndexId  2650
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index 358f5aac8f..ced86faef8 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -49,7 +49,7 @@ typedef FormData_pg_am *Form_pg_am;
 
 DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, on pg_am using btree(amname 
name_ops));
 #define AmNameIndexId  2651
-DECLARE_UNIQUE_INDEX(pg_am_oid_index, 2652, on pg_am using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, on pg_am using btree(oid 
oid_ops));
 #define AmOidIndexId  2652
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index 3ccd75f67b..554fc41497 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -91,7 +91,7 @@ DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, on 
pg_amop using btree(amopf
 #define AccessMethodStrategyIndexId  2653
 DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, on pg_amop using 
btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
 #define AccessMethodOperatorIndexId  2654
-DECLARE_UNIQUE_INDEX(pg_amop_oid_index, 2756, on pg_amop using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, on pg_amop using btree(oid 
oid_ops));
 #define AccessMethodOperatorOidIndexId 2756
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 86f1f25d17..8a727c359a 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -69,7 +69,7 @@ typedef FormData_pg_amproc *Form_pg_amproc;
 
 DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, on pg_amproc using 
btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, 
amprocnum int2_ops));
 #define AccessMethodProcedureIndexId  2655
-DECLARE_UNIQUE_INDEX(pg_amproc_oid_index, 2757, on pg_amproc using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, on pg_amproc using 
btree(oid oid_ops));
 #define AccessMethodProcedureOidIndexId  2757
 
 #endif                                                 /* PG_AMPROC_H */
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index fe3aa28992..03efaaded9 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -50,7 +50,7 @@ DECLARE_TOAST(pg_attrdef, 2830, 2831);
 
 DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, on pg_attrdef using 
btree(adrelid oid_ops, adnum int2_ops));
 #define AttrDefaultIndexId     2656
-DECLARE_UNIQUE_INDEX(pg_attrdef_oid_index, 2657, on pg_attrdef using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, on pg_attrdef using 
btree(oid oid_ops));
 #define AttrDefaultOidIndexId  2657
 
 #endif                                                 /* PG_ATTRDEF_H */
diff --git a/src/include/catalog/pg_attribute.h 
b/src/include/catalog/pg_attribute.h
index 059dec3647..ba0efff08c 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -194,7 +194,7 @@ typedef FormData_pg_attribute *Form_pg_attribute;
 
 DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, on pg_attribute 
using btree(attrelid oid_ops, attname name_ops));
 #define AttributeRelidNameIndexId  2658
-DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnum_index, 2659, on pg_attribute 
using btree(attrelid oid_ops, attnum int2_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, on 
pg_attribute using btree(attrelid oid_ops, attnum int2_ops));
 #define AttributeRelidNumIndexId  2659
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_auth_members.h 
b/src/include/catalog/pg_auth_members.h
index fc5a2dced7..e90c395640 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -42,7 +42,7 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) 
BKI_SHARED_RELATION BKI_ROWTYPE_
  */
 typedef FormData_pg_auth_members *Form_pg_auth_members;
 
-DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, on 
pg_auth_members using btree(roleid oid_ops, member oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_role_member_index, 2694, on 
pg_auth_members using btree(roleid oid_ops, member oid_ops));
 #define AuthMemRoleMemIndexId  2694
 DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, on 
pg_auth_members using btree(member oid_ops, roleid oid_ops));
 #define AuthMemMemRoleIndexId  2695
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index 4063072cc9..1a5c7a73c7 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -61,7 +61,7 @@ DECLARE_TOAST(pg_authid, 4175, 4176);
 
 DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, on pg_authid using 
btree(rolname name_ops));
 #define AuthIdRolnameIndexId   2676
-DECLARE_UNIQUE_INDEX(pg_authid_oid_index, 2677, on pg_authid using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, on pg_authid using 
btree(oid oid_ops));
 #define AuthIdOidIndexId       2677
 
 #endif                                                 /* PG_AUTHID_H */
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index 03ad900a49..2d36628c20 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -56,7 +56,7 @@ CATALOG(pg_cast,2605,CastRelationId)
  */
 typedef FormData_pg_cast *Form_pg_cast;
 
-DECLARE_UNIQUE_INDEX(pg_cast_oid_index, 2660, on pg_cast using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, on pg_cast using btree(oid 
oid_ops));
 #define CastOidIndexId 2660
 DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, on pg_cast using 
btree(castsource oid_ops, casttarget oid_ops));
 #define CastSourceTargetIndexId  2661
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index e8dcd15a55..eca306ca98 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -152,7 +152,7 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP 
BKI_ROWTYPE_OID(83,Relat
  */
 typedef FormData_pg_class *Form_pg_class;
 
-DECLARE_UNIQUE_INDEX(pg_class_oid_index, 2662, on pg_class using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, on pg_class using 
btree(oid oid_ops));
 #define ClassOidIndexId  2662
 DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, on pg_class using 
btree(relname name_ops, relnamespace oid_ops));
 #define ClassNameNspIndexId  2663
diff --git a/src/include/catalog/pg_collation.h 
b/src/include/catalog/pg_collation.h
index 251c2b9ada..3c496ea914 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -48,7 +48,7 @@ typedef FormData_pg_collation *Form_pg_collation;
 
 DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, on pg_collation 
using btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));
 #define CollationNameEncNspIndexId 3164
-DECLARE_UNIQUE_INDEX(pg_collation_oid_index, 3085, on pg_collation using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, on pg_collation using 
btree(oid oid_ops));
 #define CollationOidIndexId  3085
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_constraint.h 
b/src/include/catalog/pg_constraint.h
index f3c3df390f..6449937b35 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -161,7 +161,7 @@ 
DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, on pg_
 #define ConstraintRelidTypidNameIndexId        2665
 DECLARE_INDEX(pg_constraint_contypid_index, 2666, on pg_constraint using 
btree(contypid oid_ops));
 #define ConstraintTypidIndexId 2666
-DECLARE_UNIQUE_INDEX(pg_constraint_oid_index, 2667, on pg_constraint using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, on pg_constraint 
using btree(oid oid_ops));
 #define ConstraintOidIndexId  2667
 DECLARE_INDEX(pg_constraint_conparentid_index, 2579, on pg_constraint using 
btree(conparentid oid_ops));
 #define ConstraintParentIndexId        2579
diff --git a/src/include/catalog/pg_conversion.h 
b/src/include/catalog/pg_conversion.h
index 93dcc35840..b02dfe0c3f 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -64,7 +64,7 @@ DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, on 
pg_conversion using b
 #define ConversionDefaultIndexId  2668
 DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, on pg_conversion 
using btree(conname name_ops, connamespace oid_ops));
 #define ConversionNameNspIndexId  2669
-DECLARE_UNIQUE_INDEX(pg_conversion_oid_index, 2670, on pg_conversion using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, on pg_conversion 
using btree(oid oid_ops));
 #define ConversionOidIndexId  2670
 
 
diff --git a/src/include/catalog/pg_database.h 
b/src/include/catalog/pg_database.h
index 97691127bf..b7a0b6a381 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -86,7 +86,7 @@ DECLARE_TOAST(pg_database, 4177, 4178);
 
 DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, on pg_database using 
btree(datname name_ops));
 #define DatabaseNameIndexId  2671
-DECLARE_UNIQUE_INDEX(pg_database_oid_index, 2672, on pg_database using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, on pg_database using 
btree(oid oid_ops));
 #define DatabaseOidIndexId     2672
 
 #endif                                                 /* PG_DATABASE_H */
diff --git a/src/include/catalog/pg_db_role_setting.h 
b/src/include/catalog/pg_db_role_setting.h
index d3c006d754..f18819d670 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -47,7 +47,7 @@ DECLARE_TOAST(pg_db_role_setting, 2966, 2967);
 #define PgDbRoleSettingToastTable 2966
 #define PgDbRoleSettingToastIndex 2967
 
-DECLARE_UNIQUE_INDEX(pg_db_role_setting_databaseid_rol_index, 2965, on 
pg_db_role_setting using btree(setdatabase oid_ops, setrole oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_db_role_setting_databaseid_rol_index, 2965, on 
pg_db_role_setting using btree(setdatabase oid_ops, setrole oid_ops));
 #define DbRoleSettingDatidRolidIndexId 2965
 
 /*
diff --git a/src/include/catalog/pg_default_acl.h 
b/src/include/catalog/pg_default_acl.h
index 0f3974c32c..bb7db32cd6 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -51,7 +51,7 @@ DECLARE_TOAST(pg_default_acl, 4143, 4144);
 
 DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, on pg_default_acl 
using btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype 
char_ops));
 #define DefaultAclRoleNspObjIndexId 827
-DECLARE_UNIQUE_INDEX(pg_default_acl_oid_index, 828, on pg_default_acl using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, on pg_default_acl 
using btree(oid oid_ops));
 #define DefaultAclOidIndexId   828
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_description.h 
b/src/include/catalog/pg_description.h
index 0002643a76..ad9de5e0a0 100644
--- a/src/include/catalog/pg_description.h
+++ b/src/include/catalog/pg_description.h
@@ -65,7 +65,7 @@ typedef FormData_pg_description * Form_pg_description;
 
 DECLARE_TOAST(pg_description, 2834, 2835);
 
-DECLARE_UNIQUE_INDEX(pg_description_o_c_o_index, 2675, on pg_description using 
btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
+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
 
 #endif                                                 /* PG_DESCRIPTION_H */
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index 3ae7a03d4e..5eaf70772c 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -43,7 +43,7 @@ CATALOG(pg_enum,3501,EnumRelationId)
  */
 typedef FormData_pg_enum *Form_pg_enum;
 
-DECLARE_UNIQUE_INDEX(pg_enum_oid_index, 3502, on pg_enum using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, on pg_enum using btree(oid 
oid_ops));
 #define EnumOidIndexId 3502
 DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, on pg_enum using 
btree(enumtypid oid_ops, enumlabel name_ops));
 #define EnumTypIdLabelIndexId 3503
diff --git a/src/include/catalog/pg_event_trigger.h 
b/src/include/catalog/pg_event_trigger.h
index 4011654969..6f0266ed0f 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -52,7 +52,7 @@ DECLARE_TOAST(pg_event_trigger, 4145, 4146);
 
 DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, on pg_event_trigger 
using btree(evtname name_ops));
 #define EventTriggerNameIndexId  3467
-DECLARE_UNIQUE_INDEX(pg_event_trigger_oid_index, 3468, on pg_event_trigger 
using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, on 
pg_event_trigger using btree(oid oid_ops));
 #define EventTriggerOidIndexId 3468
 
 #endif                                                 /* PG_EVENT_TRIGGER_H */
diff --git a/src/include/catalog/pg_extension.h 
b/src/include/catalog/pg_extension.h
index f7d640fac6..af119bfea7 100644
--- a/src/include/catalog/pg_extension.h
+++ b/src/include/catalog/pg_extension.h
@@ -51,7 +51,7 @@ typedef FormData_pg_extension *Form_pg_extension;
 
 DECLARE_TOAST(pg_extension, 4147, 4148);
 
-DECLARE_UNIQUE_INDEX(pg_extension_oid_index, 3080, on pg_extension using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, on pg_extension using 
btree(oid oid_ops));
 #define ExtensionOidIndexId 3080
 DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, on pg_extension using 
btree(extname name_ops));
 #define ExtensionNameIndexId 3081
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h 
b/src/include/catalog/pg_foreign_data_wrapper.h
index ca73dc280c..0f523a26b9 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -49,7 +49,7 @@ typedef FormData_pg_foreign_data_wrapper 
*Form_pg_foreign_data_wrapper;
 
 DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150);
 
-DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_oid_index, 112, on 
pg_foreign_data_wrapper using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, on 
pg_foreign_data_wrapper using btree(oid oid_ops));
 #define ForeignDataWrapperOidIndexId   112
 DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, on 
pg_foreign_data_wrapper using btree(fdwname name_ops));
 #define ForeignDataWrapperNameIndexId  548
diff --git a/src/include/catalog/pg_foreign_server.h 
b/src/include/catalog/pg_foreign_server.h
index 3a68f444e7..385b896e97 100644
--- a/src/include/catalog/pg_foreign_server.h
+++ b/src/include/catalog/pg_foreign_server.h
@@ -49,7 +49,7 @@ typedef FormData_pg_foreign_server *Form_pg_foreign_server;
 
 DECLARE_TOAST(pg_foreign_server, 4151, 4152);
 
-DECLARE_UNIQUE_INDEX(pg_foreign_server_oid_index, 113, on pg_foreign_server 
using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, on 
pg_foreign_server using btree(oid oid_ops));
 #define ForeignServerOidIndexId 113
 DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, on pg_foreign_server 
using btree(srvname name_ops));
 #define ForeignServerNameIndexId       549
diff --git a/src/include/catalog/pg_foreign_table.h 
b/src/include/catalog/pg_foreign_table.h
index c761852bb9..24f7f2998e 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -44,7 +44,7 @@ typedef FormData_pg_foreign_table *Form_pg_foreign_table;
 
 DECLARE_TOAST(pg_foreign_table, 4153, 4154);
 
-DECLARE_UNIQUE_INDEX(pg_foreign_table_relid_index, 3119, on pg_foreign_table 
using btree(ftrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, on 
pg_foreign_table using btree(ftrelid oid_ops));
 #define ForeignTableRelidIndexId 3119
 
 #endif                                                 /* PG_FOREIGN_TABLE_H */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index b6d7ebec55..1a7aef18ce 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -69,7 +69,7 @@ typedef FormData_pg_index *Form_pg_index;
 
 DECLARE_INDEX(pg_index_indrelid_index, 2678, on pg_index using btree(indrelid 
oid_ops));
 #define IndexIndrelidIndexId  2678
-DECLARE_UNIQUE_INDEX(pg_index_indexrelid_index, 2679, on pg_index using 
btree(indexrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, on pg_index using 
btree(indexrelid oid_ops));
 #define IndexRelidIndexId  2679
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_inherits.h 
b/src/include/catalog/pg_inherits.h
index a0f2ec4e0b..b8147796d8 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -43,7 +43,7 @@ CATALOG(pg_inherits,2611,InheritsRelationId)
  */
 typedef FormData_pg_inherits *Form_pg_inherits;
 
-DECLARE_UNIQUE_INDEX(pg_inherits_relid_seqno_index, 2680, on pg_inherits using 
btree(inhrelid oid_ops, inhseqno int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, on pg_inherits 
using btree(inhrelid oid_ops, inhseqno int4_ops));
 #define InheritsRelidSeqnoIndexId  2680
 DECLARE_INDEX(pg_inherits_parent_index, 2187, on pg_inherits using 
btree(inhparent oid_ops));
 #define InheritsParentIndexId  2187
diff --git a/src/include/catalog/pg_init_privs.h 
b/src/include/catalog/pg_init_privs.h
index da1fa5b279..983b1857c0 100644
--- a/src/include/catalog/pg_init_privs.h
+++ b/src/include/catalog/pg_init_privs.h
@@ -64,7 +64,7 @@ typedef FormData_pg_init_privs * Form_pg_init_privs;
 
 DECLARE_TOAST(pg_init_privs, 4155, 4156);
 
-DECLARE_UNIQUE_INDEX(pg_init_privs_o_c_o_index, 3395, on pg_init_privs using 
btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, on pg_init_privs 
using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
 #define InitPrivsObjIndexId  3395
 
 /*
diff --git a/src/include/catalog/pg_language.h 
b/src/include/catalog/pg_language.h
index ffab93eb6a..b1dcd0a4f5 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -68,7 +68,7 @@ DECLARE_TOAST(pg_language, 4157, 4158);
 
 DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, on pg_language using 
btree(lanname name_ops));
 #define LanguageNameIndexId  2681
-DECLARE_UNIQUE_INDEX(pg_language_oid_index, 2682, on pg_language using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, on pg_language using 
btree(oid oid_ops));
 #define LanguageOidIndexId     2682
 
 #endif                                                 /* PG_LANGUAGE_H */
diff --git a/src/include/catalog/pg_largeobject.h 
b/src/include/catalog/pg_largeobject.h
index 80b1cbae83..f453319322 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -43,7 +43,7 @@ CATALOG(pg_largeobject,2613,LargeObjectRelationId)
  */
 typedef FormData_pg_largeobject *Form_pg_largeobject;
 
-DECLARE_UNIQUE_INDEX(pg_largeobject_loid_pn_index, 2683, on pg_largeobject 
using btree(loid oid_ops, pageno int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, on 
pg_largeobject using btree(loid oid_ops, pageno int4_ops));
 #define LargeObjectLOidPNIndexId  2683
 
 extern Oid     LargeObjectCreate(Oid loid);
diff --git a/src/include/catalog/pg_largeobject_metadata.h 
b/src/include/catalog/pg_largeobject_metadata.h
index b1504a22fa..220988b0ad 100644
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -45,7 +45,7 @@ 
CATALOG(pg_largeobject_metadata,2995,LargeObjectMetadataRelationId)
  */
 typedef FormData_pg_largeobject_metadata *Form_pg_largeobject_metadata;
 
-DECLARE_UNIQUE_INDEX(pg_largeobject_metadata_oid_index, 2996, on 
pg_largeobject_metadata using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, on 
pg_largeobject_metadata using btree(oid oid_ops));
 #define LargeObjectMetadataOidIndexId  2996
 
 #endif                                                 /* 
PG_LARGEOBJECT_METADATA_H */
diff --git a/src/include/catalog/pg_namespace.h 
b/src/include/catalog/pg_namespace.h
index 5710c37d78..0a68958b1c 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -55,7 +55,7 @@ DECLARE_TOAST(pg_namespace, 4163, 4164);
 
 DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, on pg_namespace using 
btree(nspname name_ops));
 #define NamespaceNameIndexId  2684
-DECLARE_UNIQUE_INDEX(pg_namespace_oid_index, 2685, on pg_namespace using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, on pg_namespace using 
btree(oid oid_ops));
 #define NamespaceOidIndexId  2685
 
 /*
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index 7836d56c3f..d132df1f2f 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -84,7 +84,7 @@ typedef FormData_pg_opclass *Form_pg_opclass;
 
 DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, on pg_opclass using 
btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
 #define OpclassAmNameNspIndexId  2686
-DECLARE_UNIQUE_INDEX(pg_opclass_oid_index, 2687, on pg_opclass using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, on pg_opclass using 
btree(oid oid_ops));
 #define OpclassOidIndexId  2687
 
 #endif                                                 /* PG_OPCLASS_H */
diff --git a/src/include/catalog/pg_operator.h 
b/src/include/catalog/pg_operator.h
index 05a3fe1815..3ca57e7c1b 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -82,7 +82,7 @@ CATALOG(pg_operator,2617,OperatorRelationId)
  */
 typedef FormData_pg_operator *Form_pg_operator;
 
-DECLARE_UNIQUE_INDEX(pg_operator_oid_index, 2688, on pg_operator using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, on pg_operator using 
btree(oid oid_ops));
 #define OperatorOidIndexId     2688
 DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, on pg_operator 
using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace 
oid_ops));
 #define OperatorNameNspIndexId 2689
diff --git a/src/include/catalog/pg_opfamily.h 
b/src/include/catalog/pg_opfamily.h
index c00eda0785..18385a6fd6 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -52,7 +52,7 @@ typedef FormData_pg_opfamily *Form_pg_opfamily;
 
 DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, on pg_opfamily using 
btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));
 #define OpfamilyAmNameNspIndexId  2754
-DECLARE_UNIQUE_INDEX(pg_opfamily_oid_index, 2755, on pg_opfamily using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, on pg_opfamily using 
btree(oid oid_ops));
 #define OpfamilyOidIndexId     2755
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_partitioned_table.h 
b/src/include/catalog/pg_partitioned_table.h
index f51d7e16bf..038730b005 100644
--- a/src/include/catalog/pg_partitioned_table.h
+++ b/src/include/catalog/pg_partitioned_table.h
@@ -66,7 +66,7 @@ typedef FormData_pg_partitioned_table 
*Form_pg_partitioned_table;
 
 DECLARE_TOAST(pg_partitioned_table, 4165, 4166);
 
-DECLARE_UNIQUE_INDEX(pg_partitioned_table_partrelid_index, 3351, on 
pg_partitioned_table using btree(partrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, on 
pg_partitioned_table using btree(partrelid oid_ops));
 #define PartitionedRelidIndexId                         3351
 
 #endif                                                 /* 
PG_PARTITIONED_TABLE_H */
diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h
index a5af6eb352..44197613e0 100644
--- a/src/include/catalog/pg_policy.h
+++ b/src/include/catalog/pg_policy.h
@@ -51,7 +51,7 @@ typedef FormData_pg_policy *Form_pg_policy;
 
 DECLARE_TOAST(pg_policy, 4167, 4168);
 
-DECLARE_UNIQUE_INDEX(pg_policy_oid_index, 3257, on pg_policy using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, on pg_policy using 
btree(oid oid_ops));
 #define PolicyOidIndexId                               3257
 DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, on pg_policy 
using btree(polrelid oid_ops, polname name_ops));
 #define PolicyPolrelidPolnameIndexId                           3258
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 1c2551c932..03c8bef422 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -134,7 +134,7 @@ typedef FormData_pg_proc *Form_pg_proc;
 
 DECLARE_TOAST(pg_proc, 2836, 2837);
 
-DECLARE_UNIQUE_INDEX(pg_proc_oid_index, 2690, on pg_proc using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, on pg_proc using btree(oid 
oid_ops));
 #define ProcedureOidIndexId  2690
 DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, on pg_proc using 
btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
 #define ProcedureNameArgsNspIndexId  2691
diff --git a/src/include/catalog/pg_publication.h 
b/src/include/catalog/pg_publication.h
index 0dd50fe428..4127611f5a 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -63,7 +63,7 @@ CATALOG(pg_publication,6104,PublicationRelationId)
  */
 typedef FormData_pg_publication *Form_pg_publication;
 
-DECLARE_UNIQUE_INDEX(pg_publication_oid_index, 6110, on pg_publication using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, on pg_publication 
using btree(oid oid_ops));
 #define PublicationObjectIndexId 6110
 DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, on pg_publication 
using btree(pubname name_ops));
 #define PublicationNameIndexId 6111
diff --git a/src/include/catalog/pg_publication_rel.h 
b/src/include/catalog/pg_publication_rel.h
index 6e6ec6444d..c79b7fb487 100644
--- a/src/include/catalog/pg_publication_rel.h
+++ b/src/include/catalog/pg_publication_rel.h
@@ -40,7 +40,7 @@ CATALOG(pg_publication_rel,6106,PublicationRelRelationId)
  */
 typedef FormData_pg_publication_rel *Form_pg_publication_rel;
 
-DECLARE_UNIQUE_INDEX(pg_publication_rel_oid_index, 6112, on pg_publication_rel 
using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, on 
pg_publication_rel using btree(oid oid_ops));
 #define PublicationRelObjectIndexId 6112
 DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, on 
pg_publication_rel using btree(prrelid oid_ops, prpubid oid_ops));
 #define PublicationRelPrrelidPrpubidIndexId 6113
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index f0c3897184..2ec6a4b126 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -57,7 +57,7 @@ CATALOG(pg_range,3541,RangeRelationId)
  */
 typedef FormData_pg_range *Form_pg_range;
 
-DECLARE_UNIQUE_INDEX(pg_range_rngtypid_index, 3542, on pg_range using 
btree(rngtypid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, on pg_range using 
btree(rngtypid oid_ops));
 #define RangeTypidIndexId                                      3542
 
 DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, on pg_range using 
btree(rngmultitypid oid_ops));
diff --git a/src/include/catalog/pg_replication_origin.h 
b/src/include/catalog/pg_replication_origin.h
index bd44968f88..184f2403ce 100644
--- a/src/include/catalog/pg_replication_origin.h
+++ b/src/include/catalog/pg_replication_origin.h
@@ -58,7 +58,7 @@ DECLARE_TOAST(pg_replication_origin, 4181, 4182);
 #define PgReplicationOriginToastTable 4181
 #define PgReplicationOriginToastIndex 4182
 
-DECLARE_UNIQUE_INDEX(pg_replication_origin_roiident_index, 6001, on 
pg_replication_origin using btree(roident oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, on 
pg_replication_origin using btree(roident oid_ops));
 #define ReplicationOriginIdentIndex 6001
 DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, on 
pg_replication_origin using btree(roname text_ops));
 #define ReplicationOriginNameIndex 6002
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index 61615cea21..36f92b1cf1 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -53,7 +53,7 @@ typedef FormData_pg_rewrite *Form_pg_rewrite;
 
 DECLARE_TOAST(pg_rewrite, 2838, 2839);
 
-DECLARE_UNIQUE_INDEX(pg_rewrite_oid_index, 2692, on pg_rewrite using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, on pg_rewrite using 
btree(oid oid_ops));
 #define RewriteOidIndexId  2692
 DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, on pg_rewrite using 
btree(ev_class oid_ops, rulename name_ops));
 #define RewriteRelRulenameIndexId  2693
diff --git a/src/include/catalog/pg_seclabel.h 
b/src/include/catalog/pg_seclabel.h
index caf67ab760..b14fd7febe 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -39,7 +39,7 @@ CATALOG(pg_seclabel,3596,SecLabelRelationId)
 
 DECLARE_TOAST(pg_seclabel, 3598, 3599);
 
-DECLARE_UNIQUE_INDEX(pg_seclabel_object_index, 3597, on pg_seclabel using 
btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_seclabel_object_index, 3597, on pg_seclabel using 
btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops));
 #define SecLabelObjectIndexId                          3597
 
 #endif                                                 /* PG_SECLABEL_H */
diff --git a/src/include/catalog/pg_sequence.h 
b/src/include/catalog/pg_sequence.h
index 61fe5a1930..addf21abce 100644
--- a/src/include/catalog/pg_sequence.h
+++ b/src/include/catalog/pg_sequence.h
@@ -39,7 +39,7 @@ CATALOG(pg_sequence,2224,SequenceRelationId)
  */
 typedef FormData_pg_sequence *Form_pg_sequence;
 
-DECLARE_UNIQUE_INDEX(pg_sequence_seqrelid_index, 5002, on pg_sequence using 
btree(seqrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, on pg_sequence 
using btree(seqrelid oid_ops));
 #define SequenceRelidIndexId   5002
 
 #endif                                                 /* PG_SEQUENCE_H */
diff --git a/src/include/catalog/pg_shdescription.h 
b/src/include/catalog/pg_shdescription.h
index 5ecb95c00c..a37db4fa0b 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -59,7 +59,7 @@ DECLARE_TOAST(pg_shdescription, 2846, 2847);
 #define PgShdescriptionToastTable 2846
 #define PgShdescriptionToastIndex 2847
 
-DECLARE_UNIQUE_INDEX(pg_shdescription_o_c_index, 2397, on pg_shdescription 
using btree(objoid oid_ops, classoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, on 
pg_shdescription using btree(objoid oid_ops, classoid oid_ops));
 #define SharedDescriptionObjIndexId 2397
 
 #endif                                                 /* PG_SHDESCRIPTION_H */
diff --git a/src/include/catalog/pg_shseclabel.h 
b/src/include/catalog/pg_shseclabel.h
index dd89003169..406f5328a7 100644
--- a/src/include/catalog/pg_shseclabel.h
+++ b/src/include/catalog/pg_shseclabel.h
@@ -42,7 +42,7 @@ DECLARE_TOAST(pg_shseclabel, 4060, 4061);
 #define PgShseclabelToastTable 4060
 #define PgShseclabelToastIndex 4061
 
-DECLARE_UNIQUE_INDEX(pg_shseclabel_object_index, 3593, on pg_shseclabel using 
btree(objoid oid_ops, classoid oid_ops, provider text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, on pg_shseclabel 
using btree(objoid oid_ops, classoid oid_ops, provider text_ops));
 #define SharedSecLabelObjectIndexId                    3593
 
 #endif                                                 /* PG_SHSECLABEL_H */
diff --git a/src/include/catalog/pg_statistic.h 
b/src/include/catalog/pg_statistic.h
index 3f1534c29a..4a66bda879 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -135,7 +135,7 @@ typedef FormData_pg_statistic *Form_pg_statistic;
 
 DECLARE_TOAST(pg_statistic, 2840, 2841);
 
-DECLARE_UNIQUE_INDEX(pg_statistic_relid_att_inh_index, 2696, on pg_statistic 
using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
+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
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_statistic_ext.h 
b/src/include/catalog/pg_statistic_ext.h
index 99f6cea0a5..10f52f912c 100644
--- a/src/include/catalog/pg_statistic_ext.h
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -65,7 +65,7 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext;
 
 DECLARE_TOAST(pg_statistic_ext, 3439, 3440);
 
-DECLARE_UNIQUE_INDEX(pg_statistic_ext_oid_index, 3380, on pg_statistic_ext 
using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, on 
pg_statistic_ext using btree(oid oid_ops));
 #define StatisticExtOidIndexId 3380
 DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, on pg_statistic_ext 
using btree(stxname name_ops, stxnamespace oid_ops));
 #define StatisticExtNameIndexId 3997
diff --git a/src/include/catalog/pg_statistic_ext_data.h 
b/src/include/catalog/pg_statistic_ext_data.h
index e0aa152f7b..6f7a36c141 100644
--- a/src/include/catalog/pg_statistic_ext_data.h
+++ b/src/include/catalog/pg_statistic_ext_data.h
@@ -51,7 +51,7 @@ typedef FormData_pg_statistic_ext_data * 
Form_pg_statistic_ext_data;
 
 DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431);
 
-DECLARE_UNIQUE_INDEX(pg_statistic_ext_data_stxoid_index, 3433, on 
pg_statistic_ext_data using btree(stxoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_index, 3433, on 
pg_statistic_ext_data using btree(stxoid oid_ops));
 #define StatisticExtDataStxoidIndexId 3433
 
 #endif                                                 /* 
PG_STATISTIC_EXT_DATA_H */
diff --git a/src/include/catalog/pg_subscription.h 
b/src/include/catalog/pg_subscription.h
index e3618028f7..4e44c29149 100644
--- a/src/include/catalog/pg_subscription.h
+++ b/src/include/catalog/pg_subscription.h
@@ -74,7 +74,7 @@ DECLARE_TOAST(pg_subscription, 4183, 4184);
 #define PgSubscriptionToastTable 4183
 #define PgSubscriptionToastIndex 4184
 
-DECLARE_UNIQUE_INDEX(pg_subscription_oid_index, 6114, on pg_subscription using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, on pg_subscription 
using btree(oid oid_ops));
 #define SubscriptionObjectIndexId 6114
 DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, on pg_subscription 
using btree(subdbid oid_ops, subname name_ops));
 #define SubscriptionNameIndexId 6115
diff --git a/src/include/catalog/pg_subscription_rel.h 
b/src/include/catalog/pg_subscription_rel.h
index 06663b9f16..ab1202cf9b 100644
--- a/src/include/catalog/pg_subscription_rel.h
+++ b/src/include/catalog/pg_subscription_rel.h
@@ -49,7 +49,7 @@ CATALOG(pg_subscription_rel,6102,SubscriptionRelRelationId)
 
 typedef FormData_pg_subscription_rel *Form_pg_subscription_rel;
 
-DECLARE_UNIQUE_INDEX(pg_subscription_rel_srrelid_srsubid_index, 6117, on 
pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, on 
pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops));
 #define SubscriptionRelSrrelidSrsubidIndexId 6117
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_tablespace.h 
b/src/include/catalog/pg_tablespace.h
index ff92e20c5b..6a6c66a61c 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -49,7 +49,7 @@ DECLARE_TOAST(pg_tablespace, 4185, 4186);
 #define PgTablespaceToastTable 4185
 #define PgTablespaceToastIndex 4186
 
-DECLARE_UNIQUE_INDEX(pg_tablespace_oid_index, 2697, on pg_tablespace using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, on pg_tablespace 
using btree(oid oid_ops));
 #define TablespaceOidIndexId  2697
 DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, on pg_tablespace using 
btree(spcname name_ops));
 #define TablespaceNameIndexId  2698
diff --git a/src/include/catalog/pg_transform.h 
b/src/include/catalog/pg_transform.h
index 474baf3547..ad25db1841 100644
--- a/src/include/catalog/pg_transform.h
+++ b/src/include/catalog/pg_transform.h
@@ -42,7 +42,7 @@ CATALOG(pg_transform,3576,TransformRelationId)
  */
 typedef FormData_pg_transform *Form_pg_transform;
 
-DECLARE_UNIQUE_INDEX(pg_transform_oid_index, 3574, on pg_transform using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, on pg_transform using 
btree(oid oid_ops));
 #define TransformOidIndexId 3574
 DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, on pg_transform using 
btree(trftype oid_ops, trflang oid_ops));
 #define TransformTypeLangIndexId  3575
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index 9afea78900..55111ed864 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -78,7 +78,7 @@ DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, on 
pg_trigger using btree(tgc
 #define TriggerConstraintIndexId  2699
 DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, on pg_trigger 
using btree(tgrelid oid_ops, tgname name_ops));
 #define TriggerRelidNameIndexId  2701
-DECLARE_UNIQUE_INDEX(pg_trigger_oid_index, 2702, on pg_trigger using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, on pg_trigger using 
btree(oid oid_ops));
 #define TriggerOidIndexId  2702
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_ts_config.h 
b/src/include/catalog/pg_ts_config.h
index aef7da0f76..02ef1a1554 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -49,7 +49,7 @@ typedef FormData_pg_ts_config *Form_pg_ts_config;
 
 DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, on pg_ts_config using 
btree(cfgname name_ops, cfgnamespace oid_ops));
 #define TSConfigNameNspIndexId 3608
-DECLARE_UNIQUE_INDEX(pg_ts_config_oid_index, 3712, on pg_ts_config using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, on pg_ts_config using 
btree(oid oid_ops));
 #define TSConfigOidIndexId     3712
 
 #endif                                                 /* PG_TS_CONFIG_H */
diff --git a/src/include/catalog/pg_ts_config_map.h 
b/src/include/catalog/pg_ts_config_map.h
index 95901a9406..f39d14fd79 100644
--- a/src/include/catalog/pg_ts_config_map.h
+++ b/src/include/catalog/pg_ts_config_map.h
@@ -44,7 +44,7 @@ CATALOG(pg_ts_config_map,3603,TSConfigMapRelationId)
 
 typedef FormData_pg_ts_config_map *Form_pg_ts_config_map;
 
-DECLARE_UNIQUE_INDEX(pg_ts_config_map_index, 3609, on pg_ts_config_map using 
btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, on pg_ts_config_map 
using btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops));
 #define TSConfigMapIndexId     3609
 
 #endif                                                 /* PG_TS_CONFIG_MAP_H */
diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h
index 814d0d4407..bfe3378ff8 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -55,7 +55,7 @@ DECLARE_TOAST(pg_ts_dict, 4169, 4170);
 
 DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, on pg_ts_dict using 
btree(dictname name_ops, dictnamespace oid_ops));
 #define TSDictionaryNameNspIndexId     3604
-DECLARE_UNIQUE_INDEX(pg_ts_dict_oid_index, 3605, on pg_ts_dict using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, on pg_ts_dict using 
btree(oid oid_ops));
 #define TSDictionaryOidIndexId 3605
 
 #endif                                                 /* PG_TS_DICT_H */
diff --git a/src/include/catalog/pg_ts_parser.h 
b/src/include/catalog/pg_ts_parser.h
index 57480ebfaf..f9f22716fd 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -56,7 +56,7 @@ typedef FormData_pg_ts_parser *Form_pg_ts_parser;
 
 DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, on pg_ts_parser using 
btree(prsname name_ops, prsnamespace oid_ops));
 #define TSParserNameNspIndexId 3606
-DECLARE_UNIQUE_INDEX(pg_ts_parser_oid_index, 3607, on pg_ts_parser using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, on pg_ts_parser using 
btree(oid oid_ops));
 #define TSParserOidIndexId     3607
 
 #endif                                                 /* PG_TS_PARSER_H */
diff --git a/src/include/catalog/pg_ts_template.h 
b/src/include/catalog/pg_ts_template.h
index c1c7fedbe7..ae91922688 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -47,7 +47,7 @@ typedef FormData_pg_ts_template *Form_pg_ts_template;
 
 DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, on pg_ts_template 
using btree(tmplname name_ops, tmplnamespace oid_ops));
 #define TSTemplateNameNspIndexId       3766
-DECLARE_UNIQUE_INDEX(pg_ts_template_oid_index, 3767, on pg_ts_template using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, on pg_ts_template 
using btree(oid oid_ops));
 #define TSTemplateOidIndexId   3767
 
 #endif                                                 /* PG_TS_TEMPLATE_H */
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 37345bec00..0d6981bc87 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -262,7 +262,7 @@ typedef FormData_pg_type *Form_pg_type;
 
 DECLARE_TOAST(pg_type, 4171, 4172);
 
-DECLARE_UNIQUE_INDEX(pg_type_oid_index, 2703, on pg_type using btree(oid 
oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, on pg_type using btree(oid 
oid_ops));
 #define TypeOidIndexId 2703
 DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, on pg_type using 
btree(typname name_ops, typnamespace oid_ops));
 #define TypeNameNspIndexId     2704
diff --git a/src/include/catalog/pg_user_mapping.h 
b/src/include/catalog/pg_user_mapping.h
index 3589125015..cabca048a9 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -47,7 +47,7 @@ typedef FormData_pg_user_mapping *Form_pg_user_mapping;
 
 DECLARE_TOAST(pg_user_mapping, 4173, 4174);
 
-DECLARE_UNIQUE_INDEX(pg_user_mapping_oid_index, 174, on pg_user_mapping using 
btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, on pg_user_mapping 
using btree(oid oid_ops));
 #define UserMappingOidIndexId  174
 DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, on 
pg_user_mapping using btree(umuser oid_ops, umserver oid_ops));
 #define UserMappingUserServerIndexId   175
diff --git a/src/test/modules/unsafe_tests/expected/alter_system_table.out 
b/src/test/modules/unsafe_tests/expected/alter_system_table.out
index ecd1505cdc..4b2f63a95e 100644
--- a/src/test/modules/unsafe_tests/expected/alter_system_table.out
+++ b/src/test/modules/unsafe_tests/expected/alter_system_table.out
@@ -16,7 +16,7 @@ DETAIL:  System catalog modifications are currently 
disallowed.
 CREATE TABLE t1x (a int, b anyarray);
 ERROR:  column "b" has pseudo-type anyarray
 -- index on system catalog
-ALTER TABLE pg_namespace ADD UNIQUE USING INDEX pg_namespace_oid_index;
+ALTER TABLE pg_namespace ADD CONSTRAINT foo UNIQUE USING INDEX 
pg_namespace_nspname_index;
 ERROR:  permission denied: "pg_namespace" is a system catalog
 -- write to system catalog table as superuser
 -- (allowed even without allow_system_table_mods)
@@ -102,7 +102,8 @@ CREATE TABLE t1 (a int, b anyarray);
 ROLLBACK;
 -- index on system catalog
 BEGIN;
-ALTER TABLE pg_namespace ADD UNIQUE USING INDEX pg_namespace_oid_index;
+ALTER TABLE pg_namespace ADD CONSTRAINT foo UNIQUE USING INDEX 
pg_namespace_nspname_index;
+NOTICE:  ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index 
"pg_namespace_nspname_index" to "foo"
 ROLLBACK;
 -- write to system catalog table as superuser
 BEGIN;
@@ -146,7 +147,6 @@ ALTER TABLE pg_description ALTER COLUMN description SET 
STATISTICS -1;
 ROLLBACK;
 -- foreign key referencing catalog
 BEGIN;
-ALTER TABLE pg_description ADD PRIMARY KEY USING INDEX 
pg_description_o_c_o_index;
 CREATE TABLE foo (a oid, b oid, c int, FOREIGN KEY (a, b, c) REFERENCES 
pg_description);
 ROLLBACK;
 -- RangeVarCallbackOwnsRelation()
diff --git a/src/test/modules/unsafe_tests/sql/alter_system_table.sql 
b/src/test/modules/unsafe_tests/sql/alter_system_table.sql
index 5663570d31..6bfc896ef9 100644
--- a/src/test/modules/unsafe_tests/sql/alter_system_table.sql
+++ b/src/test/modules/unsafe_tests/sql/alter_system_table.sql
@@ -18,7 +18,7 @@ CREATE TABLE pg_catalog.test (a int);
 CREATE TABLE t1x (a int, b anyarray);
 
 -- index on system catalog
-ALTER TABLE pg_namespace ADD UNIQUE USING INDEX pg_namespace_oid_index;
+ALTER TABLE pg_namespace ADD CONSTRAINT foo UNIQUE USING INDEX 
pg_namespace_nspname_index;
 
 -- write to system catalog table as superuser
 -- (allowed even without allow_system_table_mods)
@@ -104,7 +104,7 @@ CREATE TABLE t1 (a int, b anyarray);
 
 -- index on system catalog
 BEGIN;
-ALTER TABLE pg_namespace ADD UNIQUE USING INDEX pg_namespace_oid_index;
+ALTER TABLE pg_namespace ADD CONSTRAINT foo UNIQUE USING INDEX 
pg_namespace_nspname_index;
 ROLLBACK;
 
 -- write to system catalog table as superuser
@@ -156,7 +156,6 @@ CREATE SCHEMA pg_foo;
 
 -- foreign key referencing catalog
 BEGIN;
-ALTER TABLE pg_description ADD PRIMARY KEY USING INDEX 
pg_description_o_c_o_index;
 CREATE TABLE foo (a oid, b oid, c int, FOREIGN KEY (a, b, c) REFERENCES 
pg_description);
 ROLLBACK;
 
diff --git a/src/test/regress/expected/misc_sanity.out 
b/src/test/regress/expected/misc_sanity.out
index d40afeef78..ae85817c61 100644
--- a/src/test/regress/expected/misc_sanity.out
+++ b/src/test/regress/expected/misc_sanity.out
@@ -73,7 +73,6 @@ loop
   end if;
 end loop;
 end$$;
-NOTICE:  pg_constraint contains unpinned initdb-created object(s)
 NOTICE:  pg_database contains unpinned initdb-created object(s)
 NOTICE:  pg_extension contains unpinned initdb-created object(s)
 NOTICE:  pg_rewrite contains unpinned initdb-created object(s)
@@ -109,3 +108,30 @@ ORDER BY 1, 2;
  pg_largeobject_metadata | lomacl        | aclitem[]
 (11 rows)
 
+-- system catalogs without primary keys
+--
+-- Current exceptions:
+-- * pg_depend, pg_shdepend don't have a unique key
+SELECT relname
+FROM pg_class
+WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'r'
+      AND pg_class.oid NOT IN (SELECT indrelid FROM pg_index WHERE 
indisprimary)
+ORDER BY 1;
+   relname   
+-------------
+ pg_depend
+ pg_shdepend
+(2 rows)
+
+-- system catalog unique indexes not wrapped in a constraint
+-- (There should be none.)
+SELECT relname
+FROM pg_class c JOIN pg_index i ON c.oid = i.indexrelid
+WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'i'
+      AND i.indisunique
+      AND c.oid NOT IN (SELECT conindid FROM pg_constraint)
+ORDER BY 1;
+ relname 
+---------
+(0 rows)
+
diff --git a/src/test/regress/sql/misc_sanity.sql 
b/src/test/regress/sql/misc_sanity.sql
index 3ce32e4725..ea80cf1f10 100644
--- a/src/test/regress/sql/misc_sanity.sql
+++ b/src/test/regress/sql/misc_sanity.sql
@@ -94,3 +94,24 @@
       relkind = 'r' AND
       attstorage != 'p'
 ORDER BY 1, 2;
+
+
+-- system catalogs without primary keys
+--
+-- Current exceptions:
+-- * pg_depend, pg_shdepend don't have a unique key
+SELECT relname
+FROM pg_class
+WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'r'
+      AND pg_class.oid NOT IN (SELECT indrelid FROM pg_index WHERE 
indisprimary)
+ORDER BY 1;
+
+
+-- system catalog unique indexes not wrapped in a constraint
+-- (There should be none.)
+SELECT relname
+FROM pg_class c JOIN pg_index i ON c.oid = i.indexrelid
+WHERE relnamespace = 'pg_catalog'::regnamespace AND relkind = 'i'
+      AND i.indisunique
+      AND c.oid NOT IN (SELECT conindid FROM pg_constraint)
+ORDER BY 1;
diff --git a/src/tools/msvc/clean.bat b/src/tools/msvc/clean.bat
index 672bb2d650..4575e3f95f 100755
--- a/src/tools/msvc/clean.bat
+++ b/src/tools/msvc/clean.bat
@@ -71,6 +71,7 @@ if %DIST%==1 if exist 
src\interfaces\ecpg\preproc\c_kwlist_d.h del /q src\interf
 if %DIST%==1 if exist src\interfaces\ecpg\preproc\ecpg_kwlist_d.h del /q 
src\interfaces\ecpg\preproc\ecpg_kwlist_d.h
 if %DIST%==1 if exist src\interfaces\ecpg\preproc\preproc.y del /q 
src\interfaces\ecpg\preproc\preproc.y
 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\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

base-commit: 920f853dc948b98a5dc96580c4ee011a302e33e4
-- 
2.30.0

Reply via email to