On 2020-10-03 08:40, Peter Eisentraut wrote:
Since we have ADD PRIMARY KEY USING INDEX, we can declare a primary key
for an existing index.  So this doesn't have to affect the low-level
early bootstrapping.  The attached patch adds those commands manually.
Another option might be to have the catalog generation Perl tooling
create those declarations automatically from some marker in the catalog
files.  That would also allow declaring unique constraints for the
unique indexes that don't end up being the primary key.

I have reworked my patch like this. Now, the primary key is identified by using DECLARE_UNIQUE_INDEX_PKEY() instead of DECLARE_UNIQUE_INDEX() in the catalog pg_*.h files. This automatically generates the required ALTER TABLE commands in a new file system_constraints.sql. initdb is ordered so that that file is run before dependency processing, so the system constraints also end up pinned (as was requested during previous discussion).

Note, this needs the get_constraint_index() patch I just posted separately. The old implementation of get_constraint_index() does not handle pinned constraints.

There is something strange going on in the misc_sanity test, as seen by the test output change

-NOTICE:  pg_constraint contains unpinned initdb-created object(s)

This previously detected some constraints from the information schema, so it was correct to point those out. But since it looks for the min(oid) of a catalog, this will now find one of the new pinned constraints, so it won't detect this case anymore. I think that test is not written correctly.

--
Peter Eisentraut
2ndQuadrant, an EDB company
https://www.2ndquadrant.com/
From 90bee9c99aa7347861a5a7651922cc7116d9f54b Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Mon, 7 Dec 2020 11:11:24 +0100
Subject: [PATCH v2] 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.
---
 src/backend/catalog/.gitignore                |  1 +
 src/backend/catalog/Catalog.pm                | 11 ++--
 src/backend/catalog/Makefile                  |  3 +-
 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_sequence.h             |  2 +-
 src/include/catalog/pg_shdescription.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     | 31 +++++++++-
 src/test/regress/sql/misc_sanity.sql          | 22 +++++++
 68 files changed, 161 insertions(+), 118 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 dd39a086ce..20b121c551 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 2519771210..2c1b8185d5 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,7 +131,7 @@ 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.
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 66fdaf67b1..711a864115 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 ee3bfa82f4..f5ab22d5cd 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -158,6 +158,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;
@@ -250,10 +251,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);
@@ -1599,17 +1599,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);
@@ -1617,7 +1616,7 @@ setup_sysviews(FILE *cmdfd)
 
        PG_CMD_PUTS("\n\n");
 
-       free(sysviews_setup);
+       free(lines);
 }
 
 /*
@@ -1660,27 +1659,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
  *
@@ -1881,20 +1859,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' "
@@ -2530,6 +2495,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)
@@ -2891,6 +2857,8 @@ initialize_data_directory(void)
 
        setup_auth(cmdfd);
 
+       setup_run_file(cmdfd, system_constraints_file);
+
        setup_depend(cmdfd);
 
        /*
@@ -2898,13 +2866,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 92eea9d345..a35181a3b1 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 7e94d604b9..18e2a973ad 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 bc73e88a1a..1630b7fe87 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 c5215cdaaf..1aa014613d 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 cd422d5ad7..f337efd558 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 9d5426be97..d48fc402b5 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 cdf75a2380..064d66d0cf 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 d1f609da50..13831b7691 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 664b3910f5..6866e0e9ed 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 0a38ec00bc..8aafb95052 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 bb5e72ca43..e56e704934 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 e59b1484aa..b19e05f9aa 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 8580887519..e8fe5569e7 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 0536c4a544..8f52702581 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 47bcf40346..fe5f43b589 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 6f8ea02485..f95d8dc44d 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 a8771dfaa9..ac31162536 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 0686ff7ada..7058121e60 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 39e47fd1a0..f1e1810a0e 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 dda54a8649..0f86d91e17 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 dc23fd59d0..ed0deecb13 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 0506a25461..934d935c13 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 b076d4c2be..3d84722354 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 ff01cc6c14..d75dc26693 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 0af6617b13..35580612d4 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 63ee9a75e8..87283c040e 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 048556418a..7d56b2e461 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 df17d332d2..f27bbc984e 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 064b2468ac..308555e223 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 0d33f5bd19..6b85da15e9 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 9c3d126644..d5da72bb54 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 446ae52c2e..2d9113f243 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 bdcd7fcde8..6c2107aa60 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 56fd5d0e6b..5a71e6b249 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 45d613d4ec..3fa86d693a 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 b06580a155..7d80344173 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 f8e6dea22d..c957199d39 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 309d102d7d..45012273c8 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 652cbcd6cb..40256f129f 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 c28bb57b6c..39ad0d3714 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -54,7 +54,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
 
 /*
diff --git a/src/include/catalog/pg_replication_origin.h 
b/src/include/catalog/pg_replication_origin.h
index 4c7d9a1765..668653595d 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 9b1d8a375a..d86ce1fb1a 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_sequence.h 
b/src/include/catalog/pg_sequence.h
index 4ee91cd7e3..b000cb73b1 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 81abd8debf..d4d5ee93d3 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_statistic.h 
b/src/include/catalog/pg_statistic.h
index fb819734a1..e2191e9ff4 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 61d402c600..44e0d20b8b 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 c9515df117..cfe1fc9423 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 3fa02af703..1632a2670a 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 acc29265b2..e591a8e9bd 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 9787c75986..3456cef029 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 8efba2f7e2..e07cc69882 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 abd4bee75f..736365a21e 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 3d83de2e0c..ba4076b3c3 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 caa4571095..303a3c223f 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 9af090f4bd..40aab6ad7b 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 54e57c0db6..6687481379 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 548e4c2088..572fedce9e 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 6099e5f57c..09b2e9e111 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -256,7 +256,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 c71d8cdd2a..ef72a09e86 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..379c526249 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,33 @@ 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
+-- * pg_seclabel, pg_shseclabel use a nondefault operator class
+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_seclabel
+ pg_shdepend
+ pg_shseclabel
+(4 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..d3add6a729 100644
--- a/src/test/regress/sql/misc_sanity.sql
+++ b/src/test/regress/sql/misc_sanity.sql
@@ -94,3 +94,25 @@
       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
+-- * pg_seclabel, pg_shseclabel use a nondefault operator class
+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;
-- 
2.29.2

Reply via email to