public inbox for [email protected]  
help / color / mirror / Atom feed
From: Peter Eisentraut <[email protected]>
To: pgsql-hackers <[email protected]>
Subject: generate syscache info automatically
Date: Tue, 30 May 2023 17:57:53 -0400
Message-ID: <[email protected]> (raw)

I want to report on my on-the-plane-to-PGCon project.

The idea was mentioned in [0].  genbki.pl already knows everything about 
system catalog indexes.  If we add a "please also make a syscache for 
this one" flag to the catalog metadata, we can have genbki.pl produce 
the tables in syscache.c and syscache.h automatically.

Aside from avoiding the cumbersome editing of those tables, I think this 
layout is also conceptually cleaner, as you can more easily see which 
system catalog indexes have syscaches and maybe ask questions about why 
or why not.

As a possible follow-up, I have also started work on generating the 
ObjectProperty structure in objectaddress.c.  One of the things you need 
for that is making genbki.pl aware of the syscache information.  There 
is some more work to be done there, but it's looking promising.


[0]: 
https://www.postgresql.org/message-id/flat/CA%2BhUKGKdpDjKL2jgC-GpoL4DGZU1YPqnOFHbDqFkfRQcPaR5DQ%40m...
From 27fbebc06378c97b9918e899564532146d618558 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Tue, 30 May 2023 08:27:56 -0400
Subject: [PATCH 1/5] Update DECLARE_INDEX documentation

should have been updated in 6a6389a08b
---
 src/include/catalog/genbki.h | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index 50518cbbf5..c42ba0cea5 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -71,12 +71,13 @@
  * DECLARE_UNIQUE_INDEX_PKEY.  ("PKEY" marks the index as being the catalog's
  * primary key; currently this is only cosmetically different from a regular
  * unique index.  By convention, we usually make a catalog's OID column its
- * pkey, if it has one.)  The first two arguments are the index's name and
- * OID, the rest is much like a standard 'create index' SQL command.
+ * pkey, if it has one.)
  *
- * For each index, we also provide a #define for its OID.  References to
- * the index in the C code should always use these #defines, not the actual
- * index name (much less the numeric OID).
+ * The first two arguments are the index's name and OID.  The third argument
+ * is the name of a #define to generate for its OID.  References to the index
+ * in the C code should always use these #defines, not the actual index name
+ * (much less the numeric OID).  The rest is much like a standard 'create
+ * index' SQL command.
  *
  * The macro definitions are just to keep the C compiler from spitting up.
  */

base-commit: 0bcb3ca3b95b2b94de0b337a73aef333e0346c44
-- 
2.40.1


From 8f47e5c37dad09a3011f678a859aaa1677ce5603 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 17:12:28 +0200
Subject: [PATCH 2/5] Restructure DECLARE_INDEX arguments

Separate the table name from the index declaration.  We need that
anyway later for the ALTER TABLE / USING INDEX commands, so we might
as well structure the declarations like that to begin with.
---
 src/backend/catalog/Catalog.pm                 |  5 +++--
 src/backend/catalog/genbki.pl                  |  7 +++----
 src/include/catalog/genbki.h                   | 10 +++++-----
 src/include/catalog/pg_aggregate.h             |  2 +-
 src/include/catalog/pg_am.h                    |  4 ++--
 src/include/catalog/pg_amop.h                  |  6 +++---
 src/include/catalog/pg_amproc.h                |  4 ++--
 src/include/catalog/pg_attrdef.h               |  4 ++--
 src/include/catalog/pg_attribute.h             |  4 ++--
 src/include/catalog/pg_auth_members.h          |  8 ++++----
 src/include/catalog/pg_authid.h                |  4 ++--
 src/include/catalog/pg_cast.h                  |  4 ++--
 src/include/catalog/pg_class.h                 |  6 +++---
 src/include/catalog/pg_collation.h             |  4 ++--
 src/include/catalog/pg_constraint.h            | 10 +++++-----
 src/include/catalog/pg_conversion.h            |  6 +++---
 src/include/catalog/pg_database.h              |  4 ++--
 src/include/catalog/pg_db_role_setting.h       |  2 +-
 src/include/catalog/pg_default_acl.h           |  4 ++--
 src/include/catalog/pg_depend.h                |  4 ++--
 src/include/catalog/pg_description.h           |  2 +-
 src/include/catalog/pg_enum.h                  |  6 +++---
 src/include/catalog/pg_event_trigger.h         |  4 ++--
 src/include/catalog/pg_extension.h             |  4 ++--
 src/include/catalog/pg_foreign_data_wrapper.h  |  4 ++--
 src/include/catalog/pg_foreign_server.h        |  4 ++--
 src/include/catalog/pg_foreign_table.h         |  2 +-
 src/include/catalog/pg_index.h                 |  4 ++--
 src/include/catalog/pg_inherits.h              |  4 ++--
 src/include/catalog/pg_init_privs.h            |  2 +-
 src/include/catalog/pg_language.h              |  4 ++--
 src/include/catalog/pg_largeobject.h           |  2 +-
 src/include/catalog/pg_largeobject_metadata.h  |  2 +-
 src/include/catalog/pg_namespace.h             |  4 ++--
 src/include/catalog/pg_opclass.h               |  4 ++--
 src/include/catalog/pg_operator.h              |  4 ++--
 src/include/catalog/pg_opfamily.h              |  4 ++--
 src/include/catalog/pg_parameter_acl.h         |  4 ++--
 src/include/catalog/pg_partitioned_table.h     |  2 +-
 src/include/catalog/pg_policy.h                |  4 ++--
 src/include/catalog/pg_proc.h                  |  4 ++--
 src/include/catalog/pg_publication.h           |  4 ++--
 src/include/catalog/pg_publication_namespace.h |  4 ++--
 src/include/catalog/pg_publication_rel.h       |  6 +++---
 src/include/catalog/pg_range.h                 |  4 ++--
 src/include/catalog/pg_replication_origin.h    |  4 ++--
 src/include/catalog/pg_rewrite.h               |  4 ++--
 src/include/catalog/pg_seclabel.h              |  2 +-
 src/include/catalog/pg_sequence.h              |  2 +-
 src/include/catalog/pg_shdepend.h              |  4 ++--
 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         |  6 +++---
 src/include/catalog/pg_statistic_ext_data.h    |  2 +-
 src/include/catalog/pg_subscription.h          |  4 ++--
 src/include/catalog/pg_subscription_rel.h      |  2 +-
 src/include/catalog/pg_tablespace.h            |  4 ++--
 src/include/catalog/pg_transform.h             |  4 ++--
 src/include/catalog/pg_trigger.h               |  6 +++---
 src/include/catalog/pg_ts_config.h             |  4 ++--
 src/include/catalog/pg_ts_config_map.h         |  2 +-
 src/include/catalog/pg_ts_dict.h               |  4 ++--
 src/include/catalog/pg_ts_parser.h             |  4 ++--
 src/include/catalog/pg_ts_template.h           |  4 ++--
 src/include/catalog/pg_type.h                  |  4 ++--
 src/include/catalog/pg_user_mapping.h          |  4 ++--
 67 files changed, 135 insertions(+), 135 deletions(-)

diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index 84aaeb002a..a727d692b7 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -110,7 +110,7 @@ sub ParseHeader
 			  };
 		}
 		elsif (
-			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(.+)\)/
+			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(\w+),\s*(.+)\)/
 		  )
 		{
 			push @{ $catalog{indexing} },
@@ -120,7 +120,8 @@ sub ParseHeader
 				index_name => $3,
 				index_oid => $4,
 				index_oid_macro => $5,
-				index_decl => $6
+				table_name => $6,
+				index_decl => $7
 			  };
 		}
 		elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/)
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 4a7205472c..c7657cc47c 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -135,19 +135,18 @@
 	foreach my $index (@{ $catalog->{indexing} })
 	{
 		push @index_decls,
-		  sprintf "declare %sindex %s %s %s\n",
+		  sprintf "declare %sindex %s %s on %s using %s\n",
 		  $index->{is_unique} ? 'unique ' : '',
 		  $index->{index_name}, $index->{index_oid},
+		  $index->{table_name},
 		  $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->{table_name},
 			  $index->{is_pkey} ? "PRIMARY KEY" : "UNIQUE",
 			  $index->{index_name};
 		}
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index c42ba0cea5..e22a6902fb 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -76,14 +76,14 @@
  * The first two arguments are the index's name and OID.  The third argument
  * is the name of a #define to generate for its OID.  References to the index
  * in the C code should always use these #defines, not the actual index name
- * (much less the numeric OID).  The rest is much like a standard 'create
- * index' SQL command.
+ * (much less the numeric OID).  The fourth argument is the table name.  The
+ * rest is much like a standard 'create index' SQL command.
  *
  * The macro definitions are just to keep the C compiler from spitting up.
  */
-#define DECLARE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,decl) extern int no_such_variable
+#define DECLARE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,tblname,decl) extern int no_such_variable
 
 /*
  * These lines inform genbki.pl about manually-assigned OIDs that do not
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 3112881193..085149e258 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_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, on pg_aggregate using btree(aggfnoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, pg_aggregate, btree(aggfnoid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index dab54be130..d5314bb38b 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -47,8 +47,8 @@ CATALOG(pg_am,2601,AccessMethodRelationId)
  */
 typedef FormData_pg_am *Form_pg_am;
 
-DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, on pg_am using btree(amname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, on pg_am using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, pg_am, btree(amname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, pg_am, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index 4ca7321409..c9bb7b4787 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -87,9 +87,9 @@ CATALOG(pg_amop,2602,AccessMethodOperatorRelationId)
  */
 typedef FormData_pg_amop *Form_pg_amop;
 
-DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, on pg_amop using btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));
-DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, on pg_amop using btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, on pg_amop using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, pg_amop, btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));
+DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, pg_amop, btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, pg_amop, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 3307d5c844..5acf4efab9 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -67,7 +67,7 @@ CATALOG(pg_amproc,2603,AccessMethodProcedureRelationId)
  */
 typedef FormData_pg_amproc *Form_pg_amproc;
 
-DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, on pg_amproc using btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, on pg_amproc using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, pg_amproc, btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, pg_amproc, btree(oid oid_ops));
 
 #endif							/* PG_AMPROC_H */
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index 9dc318ff93..04c5725045 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -50,8 +50,8 @@ typedef FormData_pg_attrdef *Form_pg_attrdef;
 
 DECLARE_TOAST(pg_attrdef, 2830, 2831);
 
-DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, AttrDefaultIndexId, on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, on pg_attrdef using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, AttrDefaultIndexId, pg_attrdef, btree(adrelid oid_ops, adnum int2_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, pg_attrdef, btree(oid oid_ops));
 
 DECLARE_FOREIGN_KEY((adrelid, adnum), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index f8b4861b94..f0d6de7c1f 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -208,8 +208,8 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
  */
 typedef FormData_pg_attribute *Form_pg_attribute;
 
-DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, on pg_attribute using btree(attrelid oid_ops, attname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, on pg_attribute using btree(attrelid oid_ops, attnum int2_ops));
+DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h
index df2b8b29e0..4ab8a9f7b7 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -45,9 +45,9 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_
  */
 typedef FormData_pg_auth_members *Form_pg_auth_members;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, on pg_auth_members using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, on pg_auth_members using btree(roleid oid_ops, member oid_ops, grantor oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, on pg_auth_members using btree(member oid_ops, roleid oid_ops, grantor oid_ops));
-DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, on pg_auth_members using btree(grantor oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, pg_auth_members, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, pg_auth_members, btree(roleid oid_ops, member oid_ops, grantor oid_ops));
+DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, pg_auth_members, btree(member oid_ops, roleid oid_ops, grantor oid_ops));
+DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, pg_auth_members, btree(grantor oid_ops));
 
 #endif							/* PG_AUTH_MEMBERS_H */
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index c70baf7887..0e7ddc56ea 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -57,7 +57,7 @@ typedef FormData_pg_authid *Form_pg_authid;
 
 DECLARE_TOAST_WITH_MACRO(pg_authid, 4175, 4176, PgAuthidToastTable, PgAuthidToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, on pg_authid using btree(rolname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, on pg_authid using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops));
 
 #endif							/* PG_AUTHID_H */
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index 9ec2b5785b..a2518388b3 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -56,8 +56,8 @@ CATALOG(pg_cast,2605,CastRelationId)
  */
 typedef FormData_pg_cast *Form_pg_cast;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, on pg_cast using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, on pg_cast using btree(castsource oid_ops, casttarget oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, pg_cast, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, pg_cast, btree(castsource oid_ops, casttarget oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 2d1bb7af3a..55dcd54100 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -152,9 +152,9 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat
  */
 typedef FormData_pg_class *Form_pg_class;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, on pg_class using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, on pg_class using btree(relname name_ops, relnamespace oid_ops));
-DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, pg_class, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, pg_class, btree(relname name_ops, relnamespace oid_ops));
+DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, pg_class, btree(reltablespace oid_ops, relfilenode oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h
index bfa3568451..2d7dcde183 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -59,8 +59,8 @@ typedef FormData_pg_collation *Form_pg_collation;
 
 DECLARE_TOAST(pg_collation, 6175, 6176);
 
-DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, on pg_collation using btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, on pg_collation using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, pg_collation, btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, pg_collation, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 16bf5f5576..0d47c9b589 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -166,11 +166,11 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 
 DECLARE_TOAST(pg_constraint, 2832, 2833);
 
-DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, on pg_constraint using btree(conname name_ops, connamespace oid_ops));
-DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, on pg_constraint using btree(conrelid oid_ops, contypid oid_ops, conname name_ops));
-DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, on pg_constraint using btree(contypid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, on pg_constraint using btree(oid oid_ops));
-DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, on pg_constraint using btree(conparentid oid_ops));
+DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, pg_constraint, btree(conname name_ops, connamespace oid_ops));
+DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, pg_constraint, btree(conrelid oid_ops, contypid oid_ops, conname name_ops));
+DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, pg_constraint, btree(contypid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, pg_constraint, btree(oid oid_ops));
+DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, pg_constraint, btree(conparentid oid_ops));
 
 /* conkey can contain zero (InvalidAttrNumber) if a whole-row Var is used */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((conrelid, conkey), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index de40909dd3..42847fdf12 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -60,9 +60,9 @@ CATALOG(pg_conversion,2607,ConversionRelationId)
  */
 typedef FormData_pg_conversion *Form_pg_conversion;
 
-DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, on pg_conversion using btree(conname name_ops, connamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, on pg_conversion using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, pg_conversion, btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, pg_conversion, btree(conname name_ops, connamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, pg_conversion, btree(oid oid_ops));
 
 
 extern ObjectAddress ConversionCreate(const char *conname, Oid connamespace,
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index d004f4dc8a..44e2ed73cf 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -91,8 +91,8 @@ typedef FormData_pg_database *Form_pg_database;
 
 DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDatabaseToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, on pg_database using btree(datname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, on pg_database using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, pg_database, btree(datname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, pg_database, btree(oid oid_ops));
 
 /*
  * pg_database.dat contains an entry for template1, but not for the template0
diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h
index 4ba0d69e76..af025cc608 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -48,7 +48,7 @@ typedef FormData_pg_db_role_setting * Form_pg_db_role_setting;
 
 DECLARE_TOAST_WITH_MACRO(pg_db_role_setting, 2966, 2967, PgDbRoleSettingToastTable, PgDbRoleSettingToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_db_role_setting_databaseid_rol_index, 2965, DbRoleSettingDatidRolidIndexId, 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, DbRoleSettingDatidRolidIndexId, pg_db_role_setting, btree(setdatabase oid_ops, setrole oid_ops));
 
 /*
  * prototypes for functions in pg_db_role_setting.c
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index d6d0a03f0c..803ce3eab8 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -51,8 +51,8 @@ typedef FormData_pg_default_acl *Form_pg_default_acl;
 
 DECLARE_TOAST(pg_default_acl, 4143, 4144);
 
-DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, on pg_default_acl using btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, on pg_default_acl using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, pg_default_acl, btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, pg_default_acl, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index 30dde6f8aa..67ea968beb 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -71,7 +71,7 @@ CATALOG(pg_depend,2608,DependRelationId)
  */
 typedef FormData_pg_depend *Form_pg_depend;
 
-DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops));
-DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));
+DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, pg_depend, btree(classid oid_ops, objid oid_ops, objsubid int4_ops));
+DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, pg_depend, btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));
 
 #endif							/* PG_DEPEND_H */
diff --git a/src/include/catalog/pg_description.h b/src/include/catalog/pg_description.h
index 7545b92a15..10026152e7 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_PKEY(pg_description_o_c_o_index, 2675, DescriptionObjIndexId, 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, DescriptionObjIndexId, pg_description, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
 
 /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */
 DECLARE_FOREIGN_KEY((classoid), pg_class, (oid));
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index 83a0668233..c483cb1042 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -43,9 +43,9 @@ CATALOG(pg_enum,3501,EnumRelationId)
  */
 typedef FormData_pg_enum *Form_pg_enum;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, on pg_enum using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, on pg_enum using btree(enumtypid oid_ops, enumlabel name_ops));
-DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, on pg_enum using btree(enumtypid oid_ops, enumsortorder float4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, pg_enum, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, pg_enum, btree(enumtypid oid_ops, enumlabel name_ops));
+DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, pg_enum, btree(enumtypid oid_ops, enumsortorder float4_ops));
 
 /*
  * prototypes for functions in pg_enum.c
diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h
index e30550f6e1..0ec42edff6 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -51,7 +51,7 @@ typedef FormData_pg_event_trigger *Form_pg_event_trigger;
 
 DECLARE_TOAST(pg_event_trigger, 4145, 4146);
 
-DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, on pg_event_trigger using btree(evtname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, on pg_event_trigger using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, pg_event_trigger, btree(evtname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, pg_event_trigger, btree(oid oid_ops));
 
 #endif							/* PG_EVENT_TRIGGER_H */
diff --git a/src/include/catalog/pg_extension.h b/src/include/catalog/pg_extension.h
index 799c8ed9d0..8c7174e23c 100644
--- a/src/include/catalog/pg_extension.h
+++ b/src/include/catalog/pg_extension.h
@@ -53,7 +53,7 @@ typedef FormData_pg_extension *Form_pg_extension;
 
 DECLARE_TOAST(pg_extension, 4147, 4148);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, on pg_extension using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, on pg_extension using btree(extname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, pg_extension, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, pg_extension, btree(extname name_ops));
 
 #endif							/* PG_EXTENSION_H */
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index e7833ec883..37387f9355 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -52,7 +52,7 @@ typedef FormData_pg_foreign_data_wrapper *Form_pg_foreign_data_wrapper;
 
 DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, on pg_foreign_data_wrapper using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, on pg_foreign_data_wrapper using btree(fdwname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, pg_foreign_data_wrapper, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, pg_foreign_data_wrapper, btree(fdwname name_ops));
 
 #endif							/* PG_FOREIGN_DATA_WRAPPER_H */
diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index 2a14871d74..5993967c6e 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_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, on pg_foreign_server using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, on pg_foreign_server using btree(srvname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, pg_foreign_server, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, pg_foreign_server, btree(srvname name_ops));
 
 #endif							/* PG_FOREIGN_SERVER_H */
diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h
index cfa570a88c..2420e23401 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -44,6 +44,6 @@ typedef FormData_pg_foreign_table *Form_pg_foreign_table;
 
 DECLARE_TOAST(pg_foreign_table, 4153, 4154);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, on pg_foreign_table using btree(ftrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, pg_foreign_table, btree(ftrelid oid_ops));
 
 #endif							/* PG_FOREIGN_TABLE_H */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index b0592571da..32930411b6 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -69,8 +69,8 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO
  */
 typedef FormData_pg_index *Form_pg_index;
 
-DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, on pg_index using btree(indrelid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, on pg_index using btree(indexrelid oid_ops));
+DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, pg_index, btree(indrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, pg_index, btree(indexrelid oid_ops));
 
 /* indkey can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((indrelid, indkey), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h
index ce154ab943..65562b8c3e 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -44,8 +44,8 @@ CATALOG(pg_inherits,2611,InheritsRelationId)
  */
 typedef FormData_pg_inherits *Form_pg_inherits;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, InheritsRelidSeqnoIndexId, on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops));
-DECLARE_INDEX(pg_inherits_parent_index, 2187, InheritsParentIndexId, on pg_inherits using btree(inhparent oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, InheritsRelidSeqnoIndexId, pg_inherits, btree(inhrelid oid_ops, inhseqno int4_ops));
+DECLARE_INDEX(pg_inherits_parent_index, 2187, InheritsParentIndexId, pg_inherits, btree(inhparent oid_ops));
 
 
 extern List *find_inheritance_children(Oid parentrelId, LOCKMODE lockmode);
diff --git a/src/include/catalog/pg_init_privs.h b/src/include/catalog/pg_init_privs.h
index 34fe2b4d0e..3f3df954a8 100644
--- a/src/include/catalog/pg_init_privs.h
+++ b/src/include/catalog/pg_init_privs.h
@@ -65,7 +65,7 @@ typedef FormData_pg_init_privs * Form_pg_init_privs;
 
 DECLARE_TOAST(pg_init_privs, 4155, 4156);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, InitPrivsObjIndexId, 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, InitPrivsObjIndexId, pg_init_privs, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
 
 /*
  * It is important to know if the initial privileges are from initdb or from an
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index 02003b4627..d666ea2044 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -66,7 +66,7 @@ typedef FormData_pg_language *Form_pg_language;
 
 DECLARE_TOAST(pg_language, 4157, 4158);
 
-DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, on pg_language using btree(lanname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, on pg_language using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, pg_language, btree(lanname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, pg_language, btree(oid oid_ops));
 
 #endif							/* PG_LANGUAGE_H */
diff --git a/src/include/catalog/pg_largeobject.h b/src/include/catalog/pg_largeobject.h
index 95471073a8..c073e10e40 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -44,7 +44,7 @@ CATALOG(pg_largeobject,2613,LargeObjectRelationId)
  */
 typedef FormData_pg_largeobject *Form_pg_largeobject;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNIndexId, on pg_largeobject using btree(loid oid_ops, pageno int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNIndexId, pg_largeobject, btree(loid oid_ops, pageno int4_ops));
 
 extern Oid	LargeObjectCreate(Oid loid);
 extern void LargeObjectDrop(Oid loid);
diff --git a/src/include/catalog/pg_largeobject_metadata.h b/src/include/catalog/pg_largeobject_metadata.h
index 80db926079..0481244845 100644
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -46,6 +46,6 @@ CATALOG(pg_largeobject_metadata,2995,LargeObjectMetadataRelationId)
  */
 typedef FormData_pg_largeobject_metadata *Form_pg_largeobject_metadata;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, LargeObjectMetadataOidIndexId, on pg_largeobject_metadata using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, LargeObjectMetadataOidIndexId, pg_largeobject_metadata, btree(oid oid_ops));
 
 #endif							/* PG_LARGEOBJECT_METADATA_H */
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index 2b0c243178..fc74a14c37 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -53,8 +53,8 @@ typedef FormData_pg_namespace *Form_pg_namespace;
 
 DECLARE_TOAST(pg_namespace, 4163, 4164);
 
-DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, on pg_namespace using btree(nspname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, on pg_namespace using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, pg_namespace, btree(nspname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, pg_namespace, btree(oid oid_ops));
 
 /*
  * prototypes for functions in pg_namespace.c
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index b4b6325c06..a5d09faf1f 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -82,7 +82,7 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId)
  */
 typedef FormData_pg_opclass *Form_pg_opclass;
 
-DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, on pg_opclass using btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, on pg_opclass using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, pg_opclass, btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, pg_opclass, btree(oid oid_ops));
 
 #endif							/* PG_OPCLASS_H */
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index e60cf782a6..aff372b4bb 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -82,8 +82,8 @@ CATALOG(pg_operator,2617,OperatorRelationId)
  */
 typedef FormData_pg_operator *Form_pg_operator;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, on pg_operator using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, pg_operator, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, pg_operator, btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
 
 
 extern ObjectAddress OperatorCreate(const char *operatorName,
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 39b8d7c219..88940de916 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -50,8 +50,8 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId)
  */
 typedef FormData_pg_opfamily *Form_pg_opfamily;
 
-DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, on pg_opfamily using btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, on pg_opfamily using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, pg_opfamily, btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, pg_opfamily, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h
index 1612cebd0e..f46cdd1524 100644
--- a/src/include/catalog/pg_parameter_acl.h
+++ b/src/include/catalog/pg_parameter_acl.h
@@ -50,8 +50,8 @@ typedef FormData_pg_parameter_acl * Form_pg_parameter_acl;
 
 DECLARE_TOAST_WITH_MACRO(pg_parameter_acl, 6244, 6245, PgParameterAclToastTable, PgParameterAclToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, on pg_parameter_acl using btree(parname text_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, on pg_parameter_acl using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, pg_parameter_acl, btree(parname text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, pg_parameter_acl, btree(oid oid_ops));
 
 
 extern Oid	ParameterAclLookup(const char *parameter, bool missing_ok);
diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h
index eb867ad62b..0cf512e1c8 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_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, on pg_partitioned_table using btree(partrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, pg_partitioned_table, btree(partrelid oid_ops));
 
 /* partattrs can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((partrelid, partattrs), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h
index c9525ece74..feaeedbbe6 100644
--- a/src/include/catalog/pg_policy.h
+++ b/src/include/catalog/pg_policy.h
@@ -52,7 +52,7 @@ typedef FormData_pg_policy *Form_pg_policy;
 
 DECLARE_TOAST(pg_policy, 4167, 4168);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, PolicyOidIndexId, on pg_policy using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, PolicyPolrelidPolnameIndexId, on pg_policy using btree(polrelid oid_ops, polname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, PolicyOidIndexId, pg_policy, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, PolicyPolrelidPolnameIndexId, pg_policy, btree(polrelid oid_ops, polname name_ops));
 
 #endif							/* PG_POLICY_H */
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index e7abe0b497..fdb39d4001 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -137,8 +137,8 @@ typedef FormData_pg_proc *Form_pg_proc;
 
 DECLARE_TOAST(pg_proc, 2836, 2837);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, on pg_proc using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, pg_proc, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, pg_proc, btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h
index 6ecaa2a01e..d929c9a188 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -63,8 +63,8 @@ CATALOG(pg_publication,6104,PublicationRelationId)
  */
 typedef FormData_pg_publication *Form_pg_publication;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, on pg_publication using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, on pg_publication using btree(pubname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops));
 
 typedef struct PublicationActions
 {
diff --git a/src/include/catalog/pg_publication_namespace.h b/src/include/catalog/pg_publication_namespace.h
index f1abcb9f16..b361c8ab5e 100644
--- a/src/include/catalog/pg_publication_namespace.h
+++ b/src/include/catalog/pg_publication_namespace.h
@@ -41,7 +41,7 @@ CATALOG(pg_publication_namespace,6237,PublicationNamespaceRelationId)
  */
 typedef FormData_pg_publication_namespace *Form_pg_publication_namespace;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, on pg_publication_namespace using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, pg_publication_namespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, pg_publication_namespace, btree(pnnspid oid_ops, pnpubid oid_ops));
 
 #endif							/* PG_PUBLICATION_NAMESPACE_H */
diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h
index 613e9747c2..bef508764a 100644
--- a/src/include/catalog/pg_publication_rel.h
+++ b/src/include/catalog/pg_publication_rel.h
@@ -47,8 +47,8 @@ typedef FormData_pg_publication_rel *Form_pg_publication_rel;
 
 DECLARE_TOAST(pg_publication_rel, 6228, 6229);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, on pg_publication_rel using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, on pg_publication_rel using btree(prrelid oid_ops, prpubid oid_ops));
-DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, on pg_publication_rel using btree(prpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, pg_publication_rel, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, pg_publication_rel, btree(prrelid oid_ops, prpubid oid_ops));
+DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, pg_publication_rel, btree(prpubid oid_ops));
 
 #endif							/* PG_PUBLICATION_REL_H */
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index d03ef18851..1247fa7c77 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -57,8 +57,8 @@ CATALOG(pg_range,3541,RangeRelationId)
  */
 typedef FormData_pg_range *Form_pg_range;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, on pg_range using btree(rngtypid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, on pg_range using btree(rngmultitypid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, pg_range, btree(rngtypid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, pg_range, btree(rngmultitypid oid_ops));
 
 /*
  * prototypes for functions in pg_range.c
diff --git a/src/include/catalog/pg_replication_origin.h b/src/include/catalog/pg_replication_origin.h
index fa54f120e6..83ff36dcba 100644
--- a/src/include/catalog/pg_replication_origin.h
+++ b/src/include/catalog/pg_replication_origin.h
@@ -56,7 +56,7 @@ typedef FormData_pg_replication_origin *Form_pg_replication_origin;
 
 DECLARE_TOAST_WITH_MACRO(pg_replication_origin, 4181, 4182, PgReplicationOriginToastTable, PgReplicationOriginToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, on pg_replication_origin using btree(roident oid_ops));
-DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, on pg_replication_origin using btree(roname text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, pg_replication_origin, btree(roident oid_ops));
+DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, pg_replication_origin, btree(roname text_ops));
 
 #endif							/* PG_REPLICATION_ORIGIN_H */
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index 21f24e6d7e..60d642b595 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_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, on pg_rewrite using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, pg_rewrite, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, pg_rewrite, btree(ev_class oid_ops, rulename name_ops));
 
 #endif							/* PG_REWRITE_H */
diff --git a/src/include/catalog/pg_seclabel.h b/src/include/catalog/pg_seclabel.h
index 74299cf85d..a3a601f6fe 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -40,6 +40,6 @@ CATALOG(pg_seclabel,3596,SecLabelRelationId)
 
 DECLARE_TOAST(pg_seclabel, 3598, 3599);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_seclabel_object_index, 3597, SecLabelObjectIndexId, 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, SecLabelObjectIndexId, pg_seclabel, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops));
 
 #endif							/* PG_SECLABEL_H */
diff --git a/src/include/catalog/pg_sequence.h b/src/include/catalog/pg_sequence.h
index d528c9122f..fdfc27bbd9 100644
--- a/src/include/catalog/pg_sequence.h
+++ b/src/include/catalog/pg_sequence.h
@@ -39,6 +39,6 @@ CATALOG(pg_sequence,2224,SequenceRelationId)
  */
 typedef FormData_pg_sequence *Form_pg_sequence;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, on pg_sequence using btree(seqrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, pg_sequence, btree(seqrelid oid_ops));
 
 #endif							/* PG_SEQUENCE_H */
diff --git a/src/include/catalog/pg_shdepend.h b/src/include/catalog/pg_shdepend.h
index 35ba911a22..3834d07f78 100644
--- a/src/include/catalog/pg_shdepend.h
+++ b/src/include/catalog/pg_shdepend.h
@@ -72,7 +72,7 @@ CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION
  */
 typedef FormData_pg_shdepend *Form_pg_shdepend;
 
-DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops));
-DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops));
+DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, pg_shdepend, btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops));
+DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, pg_shdepend, btree(refclassid oid_ops, refobjid oid_ops));
 
 #endif							/* PG_SHDEPEND_H */
diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h
index 7b66c12224..c7b66d95d5 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -57,7 +57,7 @@ typedef FormData_pg_shdescription * Form_pg_shdescription;
 
 DECLARE_TOAST_WITH_MACRO(pg_shdescription, 2846, 2847, PgShdescriptionToastTable, PgShdescriptionToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, pg_shdescription, btree(objoid oid_ops, classoid oid_ops));
 
 /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */
 DECLARE_FOREIGN_KEY((classoid), pg_class, (oid));
diff --git a/src/include/catalog/pg_shseclabel.h b/src/include/catalog/pg_shseclabel.h
index 32b03de952..e252b75688 100644
--- a/src/include/catalog/pg_shseclabel.h
+++ b/src/include/catalog/pg_shseclabel.h
@@ -41,6 +41,6 @@ typedef FormData_pg_shseclabel * Form_pg_shseclabel;
 
 DECLARE_TOAST_WITH_MACRO(pg_shseclabel, 4060, 4061, PgShseclabelToastTable, PgShseclabelToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, on pg_shseclabel using btree(objoid oid_ops, classoid oid_ops, provider text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, pg_shseclabel, btree(objoid oid_ops, classoid oid_ops, provider text_ops));
 
 #endif							/* PG_SHSECLABEL_H */
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 8770c5b4c6..864cb54a51 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -136,7 +136,7 @@ typedef FormData_pg_statistic *Form_pg_statistic;
 
 DECLARE_TOAST(pg_statistic, 2840, 2841);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, 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, StatisticRelidAttnumInhIndexId, pg_statistic, btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
 
 DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h
index 53eec9025a..85e56feb80 100644
--- a/src/include/catalog/pg_statistic_ext.h
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -70,9 +70,9 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext;
 
 DECLARE_TOAST(pg_statistic_ext, 3439, 3440);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, on pg_statistic_ext using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops));
-DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, on pg_statistic_ext using btree(stxrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, pg_statistic_ext, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, pg_statistic_ext, btree(stxname name_ops, stxnamespace oid_ops));
+DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, pg_statistic_ext, btree(stxrelid oid_ops));
 
 DECLARE_ARRAY_FOREIGN_KEY((stxrelid, stxkeys), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_statistic_ext_data.h b/src/include/catalog/pg_statistic_ext_data.h
index 64d11a9c58..19a00705e6 100644
--- a/src/include/catalog/pg_statistic_ext_data.h
+++ b/src/include/catalog/pg_statistic_ext_data.h
@@ -54,7 +54,7 @@ typedef FormData_pg_statistic_ext_data *Form_pg_statistic_ext_data;
 
 DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, on pg_statistic_ext_data using btree(stxoid oid_ops, stxdinherit bool_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, pg_statistic_ext_data, btree(stxoid oid_ops, stxdinherit bool_ops));
 
 
 #endif							/* PG_STATISTIC_EXT_DATA_H */
diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h
index 1d40eebc78..be36c4a820 100644
--- a/src/include/catalog/pg_subscription.h
+++ b/src/include/catalog/pg_subscription.h
@@ -115,8 +115,8 @@ typedef FormData_pg_subscription *Form_pg_subscription;
 
 DECLARE_TOAST_WITH_MACRO(pg_subscription, 4183, 4184, PgSubscriptionToastTable, PgSubscriptionToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, on pg_subscription using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, on pg_subscription using btree(subdbid oid_ops, subname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, pg_subscription, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, pg_subscription, btree(subdbid oid_ops, subname name_ops));
 
 typedef struct Subscription
 {
diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h
index 60a2bcca23..f5324b710d 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_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, pg_subscription_rel, btree(srrelid oid_ops, srsubid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index ea1593d874..ea8665e83a 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -49,7 +49,7 @@ typedef FormData_pg_tablespace *Form_pg_tablespace;
 
 DECLARE_TOAST_WITH_MACRO(pg_tablespace, 4185, 4186, PgTablespaceToastTable, PgTablespaceToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, on pg_tablespace using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, on pg_tablespace using btree(spcname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, pg_tablespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, pg_tablespace, btree(spcname name_ops));
 
 #endif							/* PG_TABLESPACE_H */
diff --git a/src/include/catalog/pg_transform.h b/src/include/catalog/pg_transform.h
index 6273b0a491..8eb189784d 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_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, on pg_transform using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, on pg_transform using btree(trftype oid_ops, trflang oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, pg_transform, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, pg_transform, btree(trftype oid_ops, trflang oid_ops));
 
 #endif							/* PG_TRANSFORM_H */
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index 3679b0395f..61c9353fff 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -81,9 +81,9 @@ typedef FormData_pg_trigger *Form_pg_trigger;
 
 DECLARE_TOAST(pg_trigger, 2336, 2337);
 
-DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, TriggerConstraintIndexId, on pg_trigger using btree(tgconstraint oid_ops));
-DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, TriggerRelidNameIndexId, on pg_trigger using btree(tgrelid oid_ops, tgname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, TriggerOidIndexId, on pg_trigger using btree(oid oid_ops));
+DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, TriggerConstraintIndexId, pg_trigger, btree(tgconstraint oid_ops));
+DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, TriggerRelidNameIndexId, pg_trigger, btree(tgrelid oid_ops, tgname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, TriggerOidIndexId, pg_trigger, btree(oid oid_ops));
 
 DECLARE_ARRAY_FOREIGN_KEY((tgrelid, tgattr), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h
index aee0bf71af..e52720387d 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -47,7 +47,7 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId)
 
 typedef FormData_pg_ts_config *Form_pg_ts_config;
 
-DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, on pg_ts_config using btree(cfgname name_ops, cfgnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, on pg_ts_config using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, pg_ts_config, btree(cfgname name_ops, cfgnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, pg_ts_config, btree(oid oid_ops));
 
 #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 359368ecd6..91f092ca48 100644
--- a/src/include/catalog/pg_ts_config_map.h
+++ b/src/include/catalog/pg_ts_config_map.h
@@ -44,6 +44,6 @@ CATALOG(pg_ts_config_map,3603,TSConfigMapRelationId)
 
 typedef FormData_pg_ts_config_map *Form_pg_ts_config_map;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, 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, TSConfigMapIndexId, pg_ts_config_map, btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops));
 
 #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 476325f010..10a6490213 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -53,7 +53,7 @@ typedef FormData_pg_ts_dict *Form_pg_ts_dict;
 
 DECLARE_TOAST(pg_ts_dict, 4169, 4170);
 
-DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, on pg_ts_dict using btree(dictname name_ops, dictnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, on pg_ts_dict using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, pg_ts_dict, btree(dictname name_ops, dictnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, pg_ts_dict, btree(oid oid_ops));
 
 #endif							/* PG_TS_DICT_H */
diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h
index 283de252b4..57d9e8428a 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -54,7 +54,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId)
 
 typedef FormData_pg_ts_parser *Form_pg_ts_parser;
 
-DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, on pg_ts_parser using btree(prsname name_ops, prsnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, on pg_ts_parser using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, pg_ts_parser, btree(prsname name_ops, prsnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, pg_ts_parser, btree(oid oid_ops));
 
 #endif							/* PG_TS_PARSER_H */
diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h
index f4e510c8f9..f3bdc7b200 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -45,7 +45,7 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId)
 
 typedef FormData_pg_ts_template *Form_pg_ts_template;
 
-DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, on pg_ts_template using btree(tmplname name_ops, tmplnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, on pg_ts_template using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, pg_ts_template, btree(tmplname name_ops, tmplnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, pg_ts_template, btree(oid oid_ops));
 
 #endif							/* PG_TS_TEMPLATE_H */
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 519e570c8c..508ba7b0f7 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -262,8 +262,8 @@ typedef FormData_pg_type *Form_pg_type;
 
 DECLARE_TOAST(pg_type, 4171, 4172);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, on pg_type using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, on pg_type using btree(typname name_ops, typnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, pg_type, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, pg_type, btree(typname name_ops, typnamespace oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index 528c94a7c4..eca33f4cb4 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -49,7 +49,7 @@ typedef FormData_pg_user_mapping *Form_pg_user_mapping;
 
 DECLARE_TOAST(pg_user_mapping, 4173, 4174);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, on pg_user_mapping using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, on pg_user_mapping using btree(umuser oid_ops, umserver oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, pg_user_mapping, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, pg_user_mapping, btree(umuser oid_ops, umserver oid_ops));
 
 #endif							/* PG_USER_MAPPING_H */
-- 
2.40.1


From 2fffa7e60cd46c820b2b8be90eeb1d3dc54eddc1 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 20:11:18 +0200
Subject: [PATCH 3/5] genbki.pl: Factor out boilerplate generation

---
 src/backend/catalog/genbki.pl | 84 ++++++++++++-----------------------
 1 file changed, 29 insertions(+), 55 deletions(-)

diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index c7657cc47c..851bae14f0 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -439,25 +439,8 @@
 	open my $def, '>', $def_file . $tmpext
 	  or die "can't open $def_file$tmpext: $!";
 
-	# Opening boilerplate for pg_*_d.h
-	printf $def <<EOM, $catname, $catname, uc $catname, uc $catname;
-/*-------------------------------------------------------------------------
- *
- * %s_d.h
- *    Macro definitions for %s
- *
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *  ******************************
- *  *** DO NOT EDIT THIS FILE! ***
- *  ******************************
- *
- *  It has been GENERATED by src/backend/catalog/genbki.pl
- *
- *-------------------------------------------------------------------------
- */
+	print_boilerplate($def, "${catname}_d.h", "Macro definitions for $catname");
+	printf $def <<EOM, uc $catname, uc $catname;
 #ifndef %s_D_H
 #define %s_D_H
 
@@ -705,25 +688,8 @@
 
 # Now generate schemapg.h
 
-# Opening boilerplate for schemapg.h
+print_boilerplate($schemapg, "schemapg.h", "Schema_pg_xxx macros for use by relcache.c");
 print $schemapg <<EOM;
-/*-------------------------------------------------------------------------
- *
- * schemapg.h
- *    Schema_pg_xxx macros for use by relcache.c
- *
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *  ******************************
- *  *** DO NOT EDIT THIS FILE! ***
- *  ******************************
- *
- *  It has been GENERATED by src/backend/catalog/genbki.pl
- *
- *-------------------------------------------------------------------------
- */
 #ifndef SCHEMAPG_H
 #define SCHEMAPG_H
 EOM
@@ -741,25 +707,9 @@
 
 # Now generate system_fk_info.h
 
-# Opening boilerplate for system_fk_info.h
+print_boilerplate($fk_info, "system_fk_info.h",
+	"Data about the foreign-key relationships in the system catalogs");
 print $fk_info <<EOM;
-/*-------------------------------------------------------------------------
- *
- * system_fk_info.h
- *    Data about the foreign-key relationships in the system catalogs
- *
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *  ******************************
- *  *** DO NOT EDIT THIS FILE! ***
- *  ******************************
- *
- *  It has been GENERATED by src/backend/catalog/genbki.pl
- *
- *-------------------------------------------------------------------------
- */
 #ifndef SYSTEM_FK_INFO_H
 #define SYSTEM_FK_INFO_H
 
@@ -1121,6 +1071,30 @@ sub assign_next_oid
 	return $result;
 }
 
+sub print_boilerplate
+{
+	my ($fh, $fname, $descr) = @_;
+	printf $fh <<EOM, $fname, $descr;
+/*-------------------------------------------------------------------------
+ *
+ * %s
+ *    %s
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ *  ******************************
+ *  *** DO NOT EDIT THIS FILE! ***
+ *  ******************************
+ *
+ *  It has been GENERATED by src/backend/catalog/genbki.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+EOM
+}
+
 sub usage
 {
 	die <<EOM;
-- 
2.40.1


From d75a13dd8c32951f537966cf8efa93dcdc0a8bda Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 20:19:57 +0200
Subject: [PATCH 4/5] Generate syscache info from catalog files

DECLARE_UNIQUE_INDEX gets two additional arguments with the syscache
ID macro and the number of buckets.  From that, we can generate the
existing tables in syscache.h and syscache.c via genbki.pl.
---
 src/backend/catalog/.gitignore                |   2 +
 src/backend/catalog/Catalog.pm                |   6 +-
 src/backend/catalog/Makefile                  |   2 +-
 src/backend/catalog/genbki.pl                 |  55 ++
 src/backend/utils/cache/syscache.c            | 572 +-----------------
 src/include/catalog/.gitignore                |   2 +
 src/include/catalog/genbki.h                  |   7 +-
 src/include/catalog/meson.build               |  18 +-
 src/include/catalog/pg_aggregate.h            |   2 +-
 src/include/catalog/pg_am.h                   |   4 +-
 src/include/catalog/pg_amop.h                 |   4 +-
 src/include/catalog/pg_amproc.h               |   2 +-
 src/include/catalog/pg_attribute.h            |   4 +-
 src/include/catalog/pg_auth_members.h         |   4 +-
 src/include/catalog/pg_authid.h               |   4 +-
 src/include/catalog/pg_cast.h                 |   2 +-
 src/include/catalog/pg_class.h                |   4 +-
 src/include/catalog/pg_collation.h            |   4 +-
 src/include/catalog/pg_constraint.h           |   2 +-
 src/include/catalog/pg_conversion.h           |   6 +-
 src/include/catalog/pg_database.h             |   2 +-
 src/include/catalog/pg_default_acl.h          |   2 +-
 src/include/catalog/pg_enum.h                 |   4 +-
 src/include/catalog/pg_event_trigger.h        |   4 +-
 src/include/catalog/pg_foreign_data_wrapper.h |   4 +-
 src/include/catalog/pg_foreign_server.h       |   4 +-
 src/include/catalog/pg_foreign_table.h        |   2 +-
 src/include/catalog/pg_index.h                |   2 +-
 src/include/catalog/pg_language.h             |   4 +-
 src/include/catalog/pg_namespace.h            |   4 +-
 src/include/catalog/pg_opclass.h              |   4 +-
 src/include/catalog/pg_operator.h             |   4 +-
 src/include/catalog/pg_opfamily.h             |   4 +-
 src/include/catalog/pg_parameter_acl.h        |   4 +-
 src/include/catalog/pg_partitioned_table.h    |   2 +-
 src/include/catalog/pg_proc.h                 |   4 +-
 src/include/catalog/pg_publication.h          |   4 +-
 .../catalog/pg_publication_namespace.h        |   4 +-
 src/include/catalog/pg_publication_rel.h      |   4 +-
 src/include/catalog/pg_range.h                |   4 +-
 src/include/catalog/pg_replication_origin.h   |   4 +-
 src/include/catalog/pg_rewrite.h              |   2 +-
 src/include/catalog/pg_sequence.h             |   2 +-
 src/include/catalog/pg_statistic.h            |   2 +-
 src/include/catalog/pg_statistic_ext.h        |   4 +-
 src/include/catalog/pg_statistic_ext_data.h   |   2 +-
 src/include/catalog/pg_subscription.h         |   4 +-
 src/include/catalog/pg_subscription_rel.h     |   2 +-
 src/include/catalog/pg_tablespace.h           |   2 +-
 src/include/catalog/pg_transform.h            |   4 +-
 src/include/catalog/pg_ts_config.h            |   4 +-
 src/include/catalog/pg_ts_config_map.h        |   2 +-
 src/include/catalog/pg_ts_dict.h              |   4 +-
 src/include/catalog/pg_ts_parser.h            |   4 +-
 src/include/catalog/pg_ts_template.h          |   4 +-
 src/include/catalog/pg_type.h                 |   4 +-
 src/include/catalog/pg_user_mapping.h         |   4 +-
 src/include/utils/syscache.h                  |  98 +--
 src/tools/pginclude/cpluspluscheck            |   5 +
 src/tools/pginclude/headerscheck              |   5 +
 60 files changed, 186 insertions(+), 752 deletions(-)

diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore
index 237ff54165..ff65560379 100644
--- a/src/backend/catalog/.gitignore
+++ b/src/backend/catalog/.gitignore
@@ -1,5 +1,7 @@
 /postgres.bki
 /schemapg.h
+/syscache_info.c.h
+/syscache_info.h
 /system_fk_info.h
 /system_constraints.sql
 /pg_*_d.h
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index a727d692b7..89c2a0a7b8 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -110,7 +110,7 @@ sub ParseHeader
 			  };
 		}
 		elsif (
-			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(\w+),\s*(.+)\)/
+			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(\w+),\s*(\w+\s*\([\w\s,]+\))(?:,\s*(\w+),\s*(\w+))?\)/
 		  )
 		{
 			push @{ $catalog{indexing} },
@@ -121,7 +121,9 @@ sub ParseHeader
 				index_oid => $4,
 				index_oid_macro => $5,
 				table_name => $6,
-				index_decl => $7
+				index_decl => $7,
+				syscache_name => $8,
+				syscache_nbuckets => $9,
 			  };
 		}
 		elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/)
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index a60107bf94..0dfefae28e 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -74,7 +74,7 @@ CATALOG_HEADERS := \
 	pg_sequence.h pg_publication.h pg_publication_namespace.h \
 	pg_publication_rel.h pg_subscription.h pg_subscription_rel.h
 
-GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h system_fk_info.h
+GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h syscache_info.h syscache_info.c.h system_fk_info.h
 
 POSTGRES_BKI_SRCS := $(addprefix $(top_srcdir)/src/include/catalog/, $(CATALOG_HEADERS))
 
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 851bae14f0..80a7828d6c 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -56,6 +56,7 @@
 my %catalog_data;
 my @toast_decls;
 my @index_decls;
+my %syscaches;
 my %oidcounts;
 my @system_constraints;
 
@@ -150,6 +151,21 @@
 			  $index->{is_pkey} ? "PRIMARY KEY" : "UNIQUE",
 			  $index->{index_name};
 		}
+
+		if ($index->{syscache_name})
+		{
+			my $tbl = $index->{table_name};
+			my $key = $index->{index_decl};
+			$key =~ s/^\w+\(//;
+			$key =~ s/\)$//;
+			$key =~ s/(\w+)\s+\w+/Anum_${tbl}_$1/g;
+			$syscaches{$index->{syscache_name}} = {
+				table_oid_macro => $catalogs{$tbl}->{relation_oid_macro},
+				index_oid_macro => $index->{index_oid_macro},
+				key => $key,
+				nbuckets => $index->{syscache_nbuckets},
+			};
+		}
 	}
 }
 
@@ -419,6 +435,12 @@
 my $constraints_file = $output_path . 'system_constraints.sql';
 open my $constraints, '>', $constraints_file . $tmpext
   or die "can't open $constraints_file$tmpext: $!";
+my $syscache_info_h = $output_path . 'syscache_info.h';
+open my $syscache_info_h_fh, '>', $syscache_info_h . $tmpext
+  or die "can't open $syscache_info_h$tmpext: $!";
+my $syscache_info_c = $output_path . 'syscache_info.c.h';
+open my $syscache_info_c_fh, '>', $syscache_info_c . $tmpext
+  or die "can't open $syscache_info_c$tmpext: $!";
 
 # Generate postgres.bki and pg_*_d.h headers.
 
@@ -751,17 +773,50 @@
 # Closing boilerplate for system_fk_info.h
 print $fk_info "};\n\n#endif\t\t\t\t\t\t\t/* SYSTEM_FK_INFO_H */\n";
 
+# Now generate syscache_info
+
+print_boilerplate($syscache_info_h_fh, "syscache_info.h", "SysCache identifiers");
+print $syscache_info_h_fh "enum SysCacheIdentifier
+{
+";
+
+print_boilerplate($syscache_info_c_fh, "syscache_info.c.h", "SysCache definitions");
+print $syscache_info_c_fh "static const struct cachedesc cacheinfo[] = {\n";
+
+my $last_syscache;
+foreach my $syscache (sort keys %syscaches)
+{
+	print $syscache_info_h_fh "\t$syscache,\n";
+	$last_syscache = $syscache;
+
+	print $syscache_info_c_fh "\t[$syscache] = {\n";
+	print $syscache_info_c_fh "\t\t", $syscaches{$syscache}{table_oid_macro}, ",\n";
+	print $syscache_info_c_fh "\t\t", $syscaches{$syscache}{index_oid_macro}, ",\n";
+	print $syscache_info_c_fh "\t\tKEY(", $syscaches{$syscache}{key}, "),\n";
+	print $syscache_info_c_fh "\t\t", $syscaches{$syscache}{nbuckets}, "\n";
+	print $syscache_info_c_fh "\t},\n";
+}
+
+print $syscache_info_h_fh "};\n";
+print $syscache_info_h_fh "#define SysCacheSize ($last_syscache + 1)\n";
+
+print $syscache_info_c_fh "};\n";
+
 # We're done emitting data
 close $bki;
 close $schemapg;
 close $fk_info;
 close $constraints;
+close $syscache_info_h_fh;
+close $syscache_info_c_fh;
 
 # Finally, rename the completed files into place.
 Catalog::RenameTempFile($bkifile, $tmpext);
 Catalog::RenameTempFile($schemafile, $tmpext);
 Catalog::RenameTempFile($fk_info_file, $tmpext);
 Catalog::RenameTempFile($constraints_file, $tmpext);
+Catalog::RenameTempFile($syscache_info_h, $tmpext);
+Catalog::RenameTempFile($syscache_info_c, $tmpext);
 
 exit($num_errors != 0 ? 1 : 0);
 
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
index 4e4a34bde8..6daa81ca83 100644
--- a/src/backend/utils/cache/syscache.c
+++ b/src/backend/utils/cache/syscache.c
@@ -85,18 +85,6 @@
 
 	Adding system caches:
 
-	Add your new cache to the list in include/utils/syscache.h.
-	Keep the list sorted alphabetically.
-
-	Add your entry to the cacheinfo[] array below. All cache lists are
-	alphabetical, so add it in the proper place.  Specify the relation OID,
-	index OID, number of keys, key attribute numbers, and initial number of
-	hash buckets.
-
-	The number of hash buckets must be a power of 2.  It's reasonable to
-	set this to the number of entries that might be in the particular cache
-	in a medium-size database.
-
 	There must be a unique index underlying each syscache (ie, an index
 	whose key is the same as that of the cache).  If there is not one
 	already, add the definition for it to include/catalog/pg_*.h using
@@ -104,6 +92,13 @@
 	(Adding an index requires a catversion.h update, while simply
 	adding/deleting caches only requires a recompile.)
 
+	Then add the name of your name cache and the initial number of hash
+	buckets as arguments of DECLARE_UNIQUE_INDEX.
+
+	The number of hash buckets must be a power of 2.  It's reasonable to
+	set this to the number of entries that might be in the particular cache
+	in a medium-size database.
+
 	Finally, any place your relation gets heap_insert() or
 	heap_update() calls, use CatalogTupleInsert() or CatalogTupleUpdate()
 	instead, which also update indexes.  The heap_* calls do not do that.
@@ -126,558 +121,7 @@ struct cachedesc
 /* Macro to provide nkeys and key array with convenient syntax. */
 #define KEY(...) VA_ARGS_NARGS(__VA_ARGS__), { __VA_ARGS__ }
 
-static const struct cachedesc cacheinfo[] = {
-	[AGGFNOID] = {
-		AggregateRelationId,
-		AggregateFnoidIndexId,
-		KEY(Anum_pg_aggregate_aggfnoid),
-		16
-	},
-	[AMNAME] = {
-		AccessMethodRelationId,
-		AmNameIndexId,
-		KEY(Anum_pg_am_amname),
-		4
-	},
-	[AMOID] = {
-		AccessMethodRelationId,
-		AmOidIndexId,
-		KEY(Anum_pg_am_oid),
-		4
-	},
-	[AMOPOPID] = {
-		AccessMethodOperatorRelationId,
-		AccessMethodOperatorIndexId,
-		KEY(Anum_pg_amop_amopopr,
-			Anum_pg_amop_amoppurpose,
-			Anum_pg_amop_amopfamily),
-		64
-	},
-	[AMOPSTRATEGY] = {
-		AccessMethodOperatorRelationId,
-		AccessMethodStrategyIndexId,
-		KEY(Anum_pg_amop_amopfamily,
-			Anum_pg_amop_amoplefttype,
-			Anum_pg_amop_amoprighttype,
-			Anum_pg_amop_amopstrategy),
-		64
-	},
-	[AMPROCNUM] = {
-		AccessMethodProcedureRelationId,
-		AccessMethodProcedureIndexId,
-		KEY(Anum_pg_amproc_amprocfamily,
-			Anum_pg_amproc_amproclefttype,
-			Anum_pg_amproc_amprocrighttype,
-			Anum_pg_amproc_amprocnum),
-		16
-	},
-	[ATTNAME] = {
-		AttributeRelationId,
-		AttributeRelidNameIndexId,
-		KEY(Anum_pg_attribute_attrelid,
-			Anum_pg_attribute_attname),
-		32
-	},
-	[ATTNUM] = {
-		AttributeRelationId,
-		AttributeRelidNumIndexId,
-		KEY(Anum_pg_attribute_attrelid,
-			Anum_pg_attribute_attnum),
-		128
-	},
-	[AUTHMEMMEMROLE] = {
-		AuthMemRelationId,
-		AuthMemMemRoleIndexId,
-		KEY(Anum_pg_auth_members_member,
-			Anum_pg_auth_members_roleid,
-			Anum_pg_auth_members_grantor),
-		8
-	},
-	[AUTHMEMROLEMEM] = {
-		AuthMemRelationId,
-		AuthMemRoleMemIndexId,
-		KEY(Anum_pg_auth_members_roleid,
-			Anum_pg_auth_members_member,
-			Anum_pg_auth_members_grantor),
-		8
-	},
-	[AUTHNAME] = {
-		AuthIdRelationId,
-		AuthIdRolnameIndexId,
-		KEY(Anum_pg_authid_rolname),
-		8
-	},
-	[AUTHOID] = {
-		AuthIdRelationId,
-		AuthIdOidIndexId,
-		KEY(Anum_pg_authid_oid),
-		8
-	},
-	[CASTSOURCETARGET] = {
-		CastRelationId,
-		CastSourceTargetIndexId,
-		KEY(Anum_pg_cast_castsource,
-			Anum_pg_cast_casttarget),
-		256
-	},
-	[CLAAMNAMENSP] = {
-		OperatorClassRelationId,
-		OpclassAmNameNspIndexId,
-		KEY(Anum_pg_opclass_opcmethod,
-			Anum_pg_opclass_opcname,
-			Anum_pg_opclass_opcnamespace),
-		8
-	},
-	[CLAOID] = {
-		OperatorClassRelationId,
-		OpclassOidIndexId,
-		KEY(Anum_pg_opclass_oid),
-		8
-	},
-	[COLLNAMEENCNSP] = {
-		CollationRelationId,
-		CollationNameEncNspIndexId,
-		KEY(Anum_pg_collation_collname,
-			Anum_pg_collation_collencoding,
-			Anum_pg_collation_collnamespace),
-		8
-	},
-	[COLLOID] = {
-		CollationRelationId,
-		CollationOidIndexId,
-		KEY(Anum_pg_collation_oid),
-		8
-	},
-	[CONDEFAULT] = {
-		ConversionRelationId,
-		ConversionDefaultIndexId,
-		KEY(Anum_pg_conversion_connamespace,
-			Anum_pg_conversion_conforencoding,
-			Anum_pg_conversion_contoencoding,
-			Anum_pg_conversion_oid),
-		8
-	},
-	[CONNAMENSP] = {
-		ConversionRelationId,
-		ConversionNameNspIndexId,
-		KEY(Anum_pg_conversion_conname,
-			Anum_pg_conversion_connamespace),
-		8
-	},
-	[CONSTROID] = {
-		ConstraintRelationId,
-		ConstraintOidIndexId,
-		KEY(Anum_pg_constraint_oid),
-		16
-	},
-	[CONVOID] = {
-		ConversionRelationId,
-		ConversionOidIndexId,
-		KEY(Anum_pg_conversion_oid),
-		8
-	},
-	[DATABASEOID] = {
-		DatabaseRelationId,
-		DatabaseOidIndexId,
-		KEY(Anum_pg_database_oid),
-		4
-	},
-	[DEFACLROLENSPOBJ] = {
-		DefaultAclRelationId,
-		DefaultAclRoleNspObjIndexId,
-		KEY(Anum_pg_default_acl_defaclrole,
-			Anum_pg_default_acl_defaclnamespace,
-			Anum_pg_default_acl_defaclobjtype),
-		8
-	},
-	[ENUMOID] = {
-		EnumRelationId,
-		EnumOidIndexId,
-		KEY(Anum_pg_enum_oid),
-		8
-	},
-	[ENUMTYPOIDNAME] = {
-		EnumRelationId,
-		EnumTypIdLabelIndexId,
-		KEY(Anum_pg_enum_enumtypid,
-			Anum_pg_enum_enumlabel),
-		8
-	},
-	[EVENTTRIGGERNAME] = {
-		EventTriggerRelationId,
-		EventTriggerNameIndexId,
-		KEY(Anum_pg_event_trigger_evtname),
-		8
-	},
-	[EVENTTRIGGEROID] = {
-		EventTriggerRelationId,
-		EventTriggerOidIndexId,
-		KEY(Anum_pg_event_trigger_oid),
-		8
-	},
-	[FOREIGNDATAWRAPPERNAME] = {
-		ForeignDataWrapperRelationId,
-		ForeignDataWrapperNameIndexId,
-		KEY(Anum_pg_foreign_data_wrapper_fdwname),
-		2
-	},
-	[FOREIGNDATAWRAPPEROID] = {
-		ForeignDataWrapperRelationId,
-		ForeignDataWrapperOidIndexId,
-		KEY(Anum_pg_foreign_data_wrapper_oid),
-		2
-	},
-	[FOREIGNSERVERNAME] = {
-		ForeignServerRelationId,
-		ForeignServerNameIndexId,
-		KEY(Anum_pg_foreign_server_srvname),
-		2
-	},
-	[FOREIGNSERVEROID] = {
-		ForeignServerRelationId,
-		ForeignServerOidIndexId,
-		KEY(Anum_pg_foreign_server_oid),
-		2
-	},
-	[FOREIGNTABLEREL] = {
-		ForeignTableRelationId,
-		ForeignTableRelidIndexId,
-		KEY(Anum_pg_foreign_table_ftrelid),
-		4
-	},
-	[INDEXRELID] = {
-		IndexRelationId,
-		IndexRelidIndexId,
-		KEY(Anum_pg_index_indexrelid),
-		64
-	},
-	[LANGNAME] = {
-		LanguageRelationId,
-		LanguageNameIndexId,
-		KEY(Anum_pg_language_lanname),
-		4
-	},
-	[LANGOID] = {
-		LanguageRelationId,
-		LanguageOidIndexId,
-		KEY(Anum_pg_language_oid),
-		4
-	},
-	[NAMESPACENAME] = {
-		NamespaceRelationId,
-		NamespaceNameIndexId,
-		KEY(Anum_pg_namespace_nspname),
-		4
-	},
-	[NAMESPACEOID] = {
-		NamespaceRelationId,
-		NamespaceOidIndexId,
-		KEY(Anum_pg_namespace_oid),
-		16
-	},
-	[OPERNAMENSP] = {
-		OperatorRelationId,
-		OperatorNameNspIndexId,
-		KEY(Anum_pg_operator_oprname,
-			Anum_pg_operator_oprleft,
-			Anum_pg_operator_oprright,
-			Anum_pg_operator_oprnamespace),
-		256
-	},
-	[OPEROID] = {
-		OperatorRelationId,
-		OperatorOidIndexId,
-		KEY(Anum_pg_operator_oid),
-		32
-	},
-	[OPFAMILYAMNAMENSP] = {
-		OperatorFamilyRelationId,
-		OpfamilyAmNameNspIndexId,
-		KEY(Anum_pg_opfamily_opfmethod,
-			Anum_pg_opfamily_opfname,
-			Anum_pg_opfamily_opfnamespace),
-		8
-	},
-	[OPFAMILYOID] = {
-		OperatorFamilyRelationId,
-		OpfamilyOidIndexId,
-		KEY(Anum_pg_opfamily_oid),
-		8
-	},
-	[PARAMETERACLNAME] = {
-		ParameterAclRelationId,
-		ParameterAclParnameIndexId,
-		KEY(Anum_pg_parameter_acl_parname),
-		4
-	},
-	[PARAMETERACLOID] = {
-		ParameterAclRelationId,
-		ParameterAclOidIndexId,
-		KEY(Anum_pg_parameter_acl_oid),
-		4
-	},
-	[PARTRELID] = {
-		PartitionedRelationId,
-		PartitionedRelidIndexId,
-		KEY(Anum_pg_partitioned_table_partrelid),
-		32
-	},
-	[PROCNAMEARGSNSP] = {
-		ProcedureRelationId,
-		ProcedureNameArgsNspIndexId,
-		KEY(Anum_pg_proc_proname,
-			Anum_pg_proc_proargtypes,
-			Anum_pg_proc_pronamespace),
-		128
-	},
-	[PROCOID] = {
-		ProcedureRelationId,
-		ProcedureOidIndexId,
-		KEY(Anum_pg_proc_oid),
-		128
-	},
-	[PUBLICATIONNAME] = {
-		PublicationRelationId,
-		PublicationNameIndexId,
-		KEY(Anum_pg_publication_pubname),
-		8
-	},
-	[PUBLICATIONNAMESPACE] = {
-		PublicationNamespaceRelationId,
-		PublicationNamespaceObjectIndexId,
-		KEY(Anum_pg_publication_namespace_oid),
-		64
-	},
-	[PUBLICATIONNAMESPACEMAP] = {
-		PublicationNamespaceRelationId,
-		PublicationNamespacePnnspidPnpubidIndexId,
-		KEY(Anum_pg_publication_namespace_pnnspid,
-			Anum_pg_publication_namespace_pnpubid),
-		64
-	},
-	[PUBLICATIONOID] = {
-		PublicationRelationId,
-		PublicationObjectIndexId,
-		KEY(Anum_pg_publication_oid),
-		8
-	},
-	[PUBLICATIONREL] = {
-		PublicationRelRelationId,
-		PublicationRelObjectIndexId,
-		KEY(Anum_pg_publication_rel_oid),
-		64
-	},
-	[PUBLICATIONRELMAP] = {
-		PublicationRelRelationId,
-		PublicationRelPrrelidPrpubidIndexId,
-		KEY(Anum_pg_publication_rel_prrelid,
-			Anum_pg_publication_rel_prpubid),
-		64
-	},
-	[RANGEMULTIRANGE] = {
-		RangeRelationId,
-		RangeMultirangeTypidIndexId,
-		KEY(Anum_pg_range_rngmultitypid),
-		4
-	},
-	[RANGETYPE] = {
-		RangeRelationId,
-		RangeTypidIndexId,
-		KEY(Anum_pg_range_rngtypid),
-		4
-	},
-	[RELNAMENSP] = {
-		RelationRelationId,
-		ClassNameNspIndexId,
-		KEY(Anum_pg_class_relname,
-			Anum_pg_class_relnamespace),
-		128
-	},
-	[RELOID] = {
-		RelationRelationId,
-		ClassOidIndexId,
-		KEY(Anum_pg_class_oid),
-		128
-	},
-	[REPLORIGIDENT] = {
-		ReplicationOriginRelationId,
-		ReplicationOriginIdentIndex,
-		KEY(Anum_pg_replication_origin_roident),
-		16
-	},
-	[REPLORIGNAME] = {
-		ReplicationOriginRelationId,
-		ReplicationOriginNameIndex,
-		KEY(Anum_pg_replication_origin_roname),
-		16
-	},
-	[RULERELNAME] = {
-		RewriteRelationId,
-		RewriteRelRulenameIndexId,
-		KEY(Anum_pg_rewrite_ev_class,
-			Anum_pg_rewrite_rulename),
-		8
-	},
-	[SEQRELID] = {
-		SequenceRelationId,
-		SequenceRelidIndexId,
-		KEY(Anum_pg_sequence_seqrelid),
-		32
-	},
-	[STATEXTDATASTXOID] = {
-		StatisticExtDataRelationId,
-		StatisticExtDataStxoidInhIndexId,
-		KEY(Anum_pg_statistic_ext_data_stxoid,
-			Anum_pg_statistic_ext_data_stxdinherit),
-		4
-	},
-	[STATEXTNAMENSP] = {
-		StatisticExtRelationId,
-		StatisticExtNameIndexId,
-		KEY(Anum_pg_statistic_ext_stxname,
-			Anum_pg_statistic_ext_stxnamespace),
-		4
-	},
-	[STATEXTOID] = {
-		StatisticExtRelationId,
-		StatisticExtOidIndexId,
-		KEY(Anum_pg_statistic_ext_oid),
-		4
-	},
-	[STATRELATTINH] = {
-		StatisticRelationId,
-		StatisticRelidAttnumInhIndexId,
-		KEY(Anum_pg_statistic_starelid,
-			Anum_pg_statistic_staattnum,
-			Anum_pg_statistic_stainherit),
-		128
-	},
-	[SUBSCRIPTIONNAME] = {
-		SubscriptionRelationId,
-		SubscriptionNameIndexId,
-		KEY(Anum_pg_subscription_subdbid,
-			Anum_pg_subscription_subname),
-		4
-	},
-	[SUBSCRIPTIONOID] = {
-		SubscriptionRelationId,
-		SubscriptionObjectIndexId,
-		KEY(Anum_pg_subscription_oid),
-		4
-	},
-	[SUBSCRIPTIONRELMAP] = {
-		SubscriptionRelRelationId,
-		SubscriptionRelSrrelidSrsubidIndexId,
-		KEY(Anum_pg_subscription_rel_srrelid,
-			Anum_pg_subscription_rel_srsubid),
-		64
-	},
-	[TABLESPACEOID] = {
-		TableSpaceRelationId,
-		TablespaceOidIndexId,
-		KEY(Anum_pg_tablespace_oid),
-		4
-	},
-	[TRFOID] = {
-		TransformRelationId,
-		TransformOidIndexId,
-		KEY(Anum_pg_transform_oid),
-		16
-	},
-	[TRFTYPELANG] = {
-		TransformRelationId,
-		TransformTypeLangIndexId,
-		KEY(Anum_pg_transform_trftype,
-			Anum_pg_transform_trflang),
-		16
-	},
-	[TSCONFIGMAP] = {
-		TSConfigMapRelationId,
-		TSConfigMapIndexId,
-		KEY(Anum_pg_ts_config_map_mapcfg,
-			Anum_pg_ts_config_map_maptokentype,
-			Anum_pg_ts_config_map_mapseqno),
-		2
-	},
-	[TSCONFIGNAMENSP] = {
-		TSConfigRelationId,
-		TSConfigNameNspIndexId,
-		KEY(Anum_pg_ts_config_cfgname,
-			Anum_pg_ts_config_cfgnamespace),
-		2
-	},
-	[TSCONFIGOID] = {
-		TSConfigRelationId,
-		TSConfigOidIndexId,
-		KEY(Anum_pg_ts_config_oid),
-		2
-	},
-	[TSDICTNAMENSP] = {
-		TSDictionaryRelationId,
-		TSDictionaryNameNspIndexId,
-		KEY(Anum_pg_ts_dict_dictname,
-			Anum_pg_ts_dict_dictnamespace),
-		2
-	},
-	[TSDICTOID] = {
-		TSDictionaryRelationId,
-		TSDictionaryOidIndexId,
-		KEY(Anum_pg_ts_dict_oid),
-		2
-	},
-	[TSPARSERNAMENSP] = {
-		TSParserRelationId,
-		TSParserNameNspIndexId,
-		KEY(Anum_pg_ts_parser_prsname,
-			Anum_pg_ts_parser_prsnamespace),
-		2
-	},
-	[TSPARSEROID] = {
-		TSParserRelationId,
-		TSParserOidIndexId,
-		KEY(Anum_pg_ts_parser_oid),
-		2
-	},
-	[TSTEMPLATENAMENSP] = {
-		TSTemplateRelationId,
-		TSTemplateNameNspIndexId,
-		KEY(Anum_pg_ts_template_tmplname,
-			Anum_pg_ts_template_tmplnamespace),
-		2
-	},
-	[TSTEMPLATEOID] = {
-		TSTemplateRelationId,
-		TSTemplateOidIndexId,
-		KEY(Anum_pg_ts_template_oid),
-		2
-	},
-	[TYPENAMENSP] = {
-		TypeRelationId,
-		TypeNameNspIndexId,
-		KEY(Anum_pg_type_typname,
-			Anum_pg_type_typnamespace),
-		64
-	},
-	[TYPEOID] = {
-		TypeRelationId,
-		TypeOidIndexId,
-		KEY(Anum_pg_type_oid),
-		64
-	},
-	[USERMAPPINGOID] = {
-		UserMappingRelationId,
-		UserMappingOidIndexId,
-		KEY(Anum_pg_user_mapping_oid),
-		2
-	},
-	[USERMAPPINGUSERSERVER] = {
-		UserMappingRelationId,
-		UserMappingUserServerIndexId,
-		KEY(Anum_pg_user_mapping_umuser,
-			Anum_pg_user_mapping_umserver),
-		2
-	}
-};
+#include "catalog/syscache_info.c.h"
 
 StaticAssertDecl(lengthof(cacheinfo) == SysCacheSize,
 				 "SysCacheSize does not match syscache.c's array");
diff --git a/src/include/catalog/.gitignore b/src/include/catalog/.gitignore
index 6b83d4c7e6..f7ddf2554b 100644
--- a/src/include/catalog/.gitignore
+++ b/src/include/catalog/.gitignore
@@ -1,4 +1,6 @@
 /schemapg.h
+/syscache_info.c.h
+/syscache_info.h
 /system_fk_info.h
 /pg_*_d.h
 /header-stamp
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index e22a6902fb..2d5bd38cde 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -77,13 +77,14 @@
  * is the name of a #define to generate for its OID.  References to the index
  * in the C code should always use these #defines, not the actual index name
  * (much less the numeric OID).  The fourth argument is the table name.  The
- * rest is much like a standard 'create index' SQL command.
+ * decl argument is much like a standard 'create index' SQL command.
+ * Optionally, specify the syscache ID and bucket size.
  *
  * The macro definitions are just to keep the C compiler from spitting up.
  */
 #define DECLARE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,tblname,decl) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,tblname,decl,...) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,tblname,decl,...) extern int no_such_variable
 
 /*
  * These lines inform genbki.pl about manually-assigned OIDs that do not
diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
index 3179be09d3..1fa22d925d 100644
--- a/src/include/catalog/meson.build
+++ b/src/include/catalog/meson.build
@@ -97,8 +97,22 @@ bki_data_f = files(bki_data)
 
 
 input = []
-output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
-output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+output_files = [
+  'postgres.bki',
+  'system_constraints.sql',
+  'schemapg.h',
+  'syscache_info.c.h',
+  'syscache_info.h',
+  'system_fk_info.h',
+]
+output_install = [
+  dir_data,
+  dir_data,
+  dir_include_server / 'catalog',
+  false,
+  dir_include_server / 'catalog',
+  dir_include_server / 'catalog',
+]
 
 foreach h : catalog_headers
   fname = h.split('.h')[0] + '_d.h'
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 085149e258..e6f6f4ccb5 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_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, pg_aggregate, btree(aggfnoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, pg_aggregate, btree(aggfnoid oid_ops), AGGFNOID, 16);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index d5314bb38b..e3a1313e6c 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -47,8 +47,8 @@ CATALOG(pg_am,2601,AccessMethodRelationId)
  */
 typedef FormData_pg_am *Form_pg_am;
 
-DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, pg_am, btree(amname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, pg_am, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, pg_am, btree(amname name_ops), AMNAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, pg_am, btree(oid oid_ops), AMOID, 4);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index c9bb7b4787..3449166507 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -87,8 +87,8 @@ CATALOG(pg_amop,2602,AccessMethodOperatorRelationId)
  */
 typedef FormData_pg_amop *Form_pg_amop;
 
-DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, pg_amop, btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));
-DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, pg_amop, btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
+DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, pg_amop, btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops), AMOPSTRATEGY, 64);
+DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, pg_amop, btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops), AMOPOPID, 64);
 DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, pg_amop, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 5acf4efab9..31e67be344 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -67,7 +67,7 @@ CATALOG(pg_amproc,2603,AccessMethodProcedureRelationId)
  */
 typedef FormData_pg_amproc *Form_pg_amproc;
 
-DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, pg_amproc, btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops));
+DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, pg_amproc, btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops), AMPROCNUM, 16);
 DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, pg_amproc, btree(oid oid_ops));
 
 #endif							/* PG_AMPROC_H */
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index f0d6de7c1f..9e99237f56 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -208,8 +208,8 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
  */
 typedef FormData_pg_attribute *Form_pg_attribute;
 
-DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops));
+DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops), ATTNAME, 32);
+DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops), ATTNUM, 128);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h
index 4ab8a9f7b7..37104cf20f 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -46,8 +46,8 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_
 typedef FormData_pg_auth_members *Form_pg_auth_members;
 
 DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, pg_auth_members, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, pg_auth_members, btree(roleid oid_ops, member oid_ops, grantor oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, pg_auth_members, btree(member oid_ops, roleid oid_ops, grantor oid_ops));
+DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, pg_auth_members, btree(roleid oid_ops, member oid_ops, grantor oid_ops), AUTHMEMROLEMEM, 8);
+DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, pg_auth_members, btree(member oid_ops, roleid oid_ops, grantor oid_ops), AUTHMEMMEMROLE, 8);
 DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, pg_auth_members, btree(grantor oid_ops));
 
 #endif							/* PG_AUTH_MEMBERS_H */
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index 0e7ddc56ea..748ab95fad 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -57,7 +57,7 @@ typedef FormData_pg_authid *Form_pg_authid;
 
 DECLARE_TOAST_WITH_MACRO(pg_authid, 4175, 4176, PgAuthidToastTable, PgAuthidToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops), AUTHNAME, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops), AUTHOID, 8);
 
 #endif							/* PG_AUTHID_H */
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index a2518388b3..32235776ce 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -57,7 +57,7 @@ CATALOG(pg_cast,2605,CastRelationId)
 typedef FormData_pg_cast *Form_pg_cast;
 
 DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, pg_cast, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, pg_cast, btree(castsource oid_ops, casttarget oid_ops));
+DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, pg_cast, btree(castsource oid_ops, casttarget oid_ops), CASTSOURCETARGET, 256);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 55dcd54100..52edbf0229 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -152,8 +152,8 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat
  */
 typedef FormData_pg_class *Form_pg_class;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, pg_class, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, pg_class, btree(relname name_ops, relnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, pg_class, btree(oid oid_ops), RELOID, 128);
+DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, pg_class, btree(relname name_ops, relnamespace oid_ops), RELNAMENSP, 128);
 DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, pg_class, btree(reltablespace oid_ops, relfilenode oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h
index 2d7dcde183..6cf59f479a 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -59,8 +59,8 @@ typedef FormData_pg_collation *Form_pg_collation;
 
 DECLARE_TOAST(pg_collation, 6175, 6176);
 
-DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, pg_collation, btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, pg_collation, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, pg_collation, btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops), COLLNAMEENCNSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, pg_collation, btree(oid oid_ops), COLLOID, 8);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 0d47c9b589..de1b7bcd57 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -169,7 +169,7 @@ DECLARE_TOAST(pg_constraint, 2832, 2833);
 DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, pg_constraint, btree(conname name_ops, connamespace oid_ops));
 DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, pg_constraint, btree(conrelid oid_ops, contypid oid_ops, conname name_ops));
 DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, pg_constraint, btree(contypid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, pg_constraint, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, pg_constraint, btree(oid oid_ops), CONSTROID, 16);
 DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, pg_constraint, btree(conparentid oid_ops));
 
 /* conkey can contain zero (InvalidAttrNumber) if a whole-row Var is used */
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index 42847fdf12..acd944a4ae 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -60,9 +60,9 @@ CATALOG(pg_conversion,2607,ConversionRelationId)
  */
 typedef FormData_pg_conversion *Form_pg_conversion;
 
-DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, pg_conversion, btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, pg_conversion, btree(conname name_ops, connamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, pg_conversion, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, pg_conversion, btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops), CONDEFAULT, 8);
+DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, pg_conversion, btree(conname name_ops, connamespace oid_ops), CONNAMENSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, pg_conversion, btree(oid oid_ops), CONVOID, 8);
 
 
 extern ObjectAddress ConversionCreate(const char *conname, Oid connamespace,
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index 44e2ed73cf..1eceb52174 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -92,7 +92,7 @@ typedef FormData_pg_database *Form_pg_database;
 DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDatabaseToastIndex);
 
 DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, pg_database, btree(datname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, pg_database, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, pg_database, btree(oid oid_ops), DATABASEOID, 4);
 
 /*
  * pg_database.dat contains an entry for template1, but not for the template0
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index 803ce3eab8..b526af26a6 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -51,7 +51,7 @@ typedef FormData_pg_default_acl *Form_pg_default_acl;
 
 DECLARE_TOAST(pg_default_acl, 4143, 4144);
 
-DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, pg_default_acl, btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops));
+DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, pg_default_acl, btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops), DEFACLROLENSPOBJ, 8);
 DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, pg_default_acl, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index c483cb1042..4ea20aeabe 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -43,8 +43,8 @@ CATALOG(pg_enum,3501,EnumRelationId)
  */
 typedef FormData_pg_enum *Form_pg_enum;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, pg_enum, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, pg_enum, btree(enumtypid oid_ops, enumlabel name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, pg_enum, btree(oid oid_ops), ENUMOID, 8);
+DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, pg_enum, btree(enumtypid oid_ops, enumlabel name_ops), ENUMTYPOIDNAME, 8);
 DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, pg_enum, btree(enumtypid oid_ops, enumsortorder float4_ops));
 
 /*
diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h
index 0ec42edff6..ca1c5bd728 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -51,7 +51,7 @@ typedef FormData_pg_event_trigger *Form_pg_event_trigger;
 
 DECLARE_TOAST(pg_event_trigger, 4145, 4146);
 
-DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, pg_event_trigger, btree(evtname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, pg_event_trigger, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, pg_event_trigger, btree(evtname name_ops), EVENTTRIGGERNAME, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, pg_event_trigger, btree(oid oid_ops), EVENTTRIGGEROID, 8);
 
 #endif							/* PG_EVENT_TRIGGER_H */
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index 37387f9355..8674eb261a 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -52,7 +52,7 @@ typedef FormData_pg_foreign_data_wrapper *Form_pg_foreign_data_wrapper;
 
 DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, pg_foreign_data_wrapper, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, pg_foreign_data_wrapper, btree(fdwname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, pg_foreign_data_wrapper, btree(oid oid_ops), FOREIGNDATAWRAPPEROID, 2);
+DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, pg_foreign_data_wrapper, btree(fdwname name_ops), FOREIGNDATAWRAPPERNAME, 2);
 
 #endif							/* PG_FOREIGN_DATA_WRAPPER_H */
diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index 5993967c6e..fb77abe36f 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_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, pg_foreign_server, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, pg_foreign_server, btree(srvname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, pg_foreign_server, btree(oid oid_ops), FOREIGNSERVEROID, 2);
+DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, pg_foreign_server, btree(srvname name_ops), FOREIGNSERVERNAME, 2);
 
 #endif							/* PG_FOREIGN_SERVER_H */
diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h
index 2420e23401..8a10130cc0 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -44,6 +44,6 @@ typedef FormData_pg_foreign_table *Form_pg_foreign_table;
 
 DECLARE_TOAST(pg_foreign_table, 4153, 4154);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, pg_foreign_table, btree(ftrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, pg_foreign_table, btree(ftrelid oid_ops), FOREIGNTABLEREL, 4);
 
 #endif							/* PG_FOREIGN_TABLE_H */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index 32930411b6..9352d8a9ed 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -70,7 +70,7 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO
 typedef FormData_pg_index *Form_pg_index;
 
 DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, pg_index, btree(indrelid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, pg_index, btree(indexrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, pg_index, btree(indexrelid oid_ops), INDEXRELID, 64);
 
 /* indkey can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((indrelid, indkey), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index d666ea2044..070094edb8 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -66,7 +66,7 @@ typedef FormData_pg_language *Form_pg_language;
 
 DECLARE_TOAST(pg_language, 4157, 4158);
 
-DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, pg_language, btree(lanname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, pg_language, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, pg_language, btree(lanname name_ops), LANGNAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, pg_language, btree(oid oid_ops), LANGOID, 4);
 
 #endif							/* PG_LANGUAGE_H */
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index fc74a14c37..b70073d456 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -53,8 +53,8 @@ typedef FormData_pg_namespace *Form_pg_namespace;
 
 DECLARE_TOAST(pg_namespace, 4163, 4164);
 
-DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, pg_namespace, btree(nspname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, pg_namespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, pg_namespace, btree(nspname name_ops), NAMESPACENAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, pg_namespace, btree(oid oid_ops), NAMESPACEOID, 16);
 
 /*
  * prototypes for functions in pg_namespace.c
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index a5d09faf1f..18ecd56ada 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -82,7 +82,7 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId)
  */
 typedef FormData_pg_opclass *Form_pg_opclass;
 
-DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, pg_opclass, btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, pg_opclass, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, pg_opclass, btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops), CLAAMNAMENSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, pg_opclass, btree(oid oid_ops), CLAOID, 8);
 
 #endif							/* PG_OPCLASS_H */
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index aff372b4bb..3daa79cfae 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -82,8 +82,8 @@ CATALOG(pg_operator,2617,OperatorRelationId)
  */
 typedef FormData_pg_operator *Form_pg_operator;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, pg_operator, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, pg_operator, btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, pg_operator, btree(oid oid_ops), OPEROID, 32);
+DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, pg_operator, btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops), OPERNAMENSP, 256);
 
 
 extern ObjectAddress OperatorCreate(const char *operatorName,
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 88940de916..fe2b5c60c4 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -50,8 +50,8 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId)
  */
 typedef FormData_pg_opfamily *Form_pg_opfamily;
 
-DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, pg_opfamily, btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, pg_opfamily, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, pg_opfamily, btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops), OPFAMILYAMNAMENSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, pg_opfamily, btree(oid oid_ops), OPFAMILYOID, 8);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h
index f46cdd1524..aef18ff4a7 100644
--- a/src/include/catalog/pg_parameter_acl.h
+++ b/src/include/catalog/pg_parameter_acl.h
@@ -50,8 +50,8 @@ typedef FormData_pg_parameter_acl * Form_pg_parameter_acl;
 
 DECLARE_TOAST_WITH_MACRO(pg_parameter_acl, 6244, 6245, PgParameterAclToastTable, PgParameterAclToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, pg_parameter_acl, btree(parname text_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, pg_parameter_acl, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, pg_parameter_acl, btree(parname text_ops), PARAMETERACLNAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, pg_parameter_acl, btree(oid oid_ops), PARAMETERACLOID, 4);
 
 
 extern Oid	ParameterAclLookup(const char *parameter, bool missing_ok);
diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h
index 0cf512e1c8..a137f031f7 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_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, pg_partitioned_table, btree(partrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, pg_partitioned_table, btree(partrelid oid_ops), PARTRELID, 32);
 
 /* partattrs can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((partrelid, partattrs), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index fdb39d4001..29ef344cc2 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -137,8 +137,8 @@ typedef FormData_pg_proc *Form_pg_proc;
 
 DECLARE_TOAST(pg_proc, 2836, 2837);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, pg_proc, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, pg_proc, btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, pg_proc, btree(oid oid_ops), PROCOID, 128);
+DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, pg_proc, btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops), PROCNAMEARGSNSP, 128);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h
index d929c9a188..c17be5ed88 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -63,8 +63,8 @@ CATALOG(pg_publication,6104,PublicationRelationId)
  */
 typedef FormData_pg_publication *Form_pg_publication;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops), PUBLICATIONOID, 8);
+DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops), PUBLICATIONNAME, 8);
 
 typedef struct PublicationActions
 {
diff --git a/src/include/catalog/pg_publication_namespace.h b/src/include/catalog/pg_publication_namespace.h
index b361c8ab5e..b6326c7730 100644
--- a/src/include/catalog/pg_publication_namespace.h
+++ b/src/include/catalog/pg_publication_namespace.h
@@ -41,7 +41,7 @@ CATALOG(pg_publication_namespace,6237,PublicationNamespaceRelationId)
  */
 typedef FormData_pg_publication_namespace *Form_pg_publication_namespace;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, pg_publication_namespace, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, pg_publication_namespace, btree(pnnspid oid_ops, pnpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, pg_publication_namespace, btree(oid oid_ops), PUBLICATIONNAMESPACE, 64);
+DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, pg_publication_namespace, btree(pnnspid oid_ops, pnpubid oid_ops), PUBLICATIONNAMESPACEMAP, 64);
 
 #endif							/* PG_PUBLICATION_NAMESPACE_H */
diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h
index bef508764a..19cad0a344 100644
--- a/src/include/catalog/pg_publication_rel.h
+++ b/src/include/catalog/pg_publication_rel.h
@@ -47,8 +47,8 @@ typedef FormData_pg_publication_rel *Form_pg_publication_rel;
 
 DECLARE_TOAST(pg_publication_rel, 6228, 6229);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, pg_publication_rel, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, pg_publication_rel, btree(prrelid oid_ops, prpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, pg_publication_rel, btree(oid oid_ops), PUBLICATIONREL, 64);
+DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, pg_publication_rel, btree(prrelid oid_ops, prpubid oid_ops), PUBLICATIONRELMAP, 64);
 DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, pg_publication_rel, btree(prpubid oid_ops));
 
 #endif							/* PG_PUBLICATION_REL_H */
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index 1247fa7c77..ce662c6a03 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -57,8 +57,8 @@ CATALOG(pg_range,3541,RangeRelationId)
  */
 typedef FormData_pg_range *Form_pg_range;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, pg_range, btree(rngtypid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, pg_range, btree(rngmultitypid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, pg_range, btree(rngtypid oid_ops), RANGETYPE, 4);
+DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, pg_range, btree(rngmultitypid oid_ops), RANGEMULTIRANGE, 4);
 
 /*
  * prototypes for functions in pg_range.c
diff --git a/src/include/catalog/pg_replication_origin.h b/src/include/catalog/pg_replication_origin.h
index 83ff36dcba..49824dbc07 100644
--- a/src/include/catalog/pg_replication_origin.h
+++ b/src/include/catalog/pg_replication_origin.h
@@ -56,7 +56,7 @@ typedef FormData_pg_replication_origin *Form_pg_replication_origin;
 
 DECLARE_TOAST_WITH_MACRO(pg_replication_origin, 4181, 4182, PgReplicationOriginToastTable, PgReplicationOriginToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, pg_replication_origin, btree(roident oid_ops));
-DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, pg_replication_origin, btree(roname text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, pg_replication_origin, btree(roident oid_ops), REPLORIGIDENT, 16);
+DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, pg_replication_origin, btree(roname text_ops), REPLORIGNAME, 16);
 
 #endif							/* PG_REPLICATION_ORIGIN_H */
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index 60d642b595..8148e3568b 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -54,6 +54,6 @@ typedef FormData_pg_rewrite *Form_pg_rewrite;
 DECLARE_TOAST(pg_rewrite, 2838, 2839);
 
 DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, pg_rewrite, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, pg_rewrite, btree(ev_class oid_ops, rulename name_ops));
+DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, pg_rewrite, btree(ev_class oid_ops, rulename name_ops), RULERELNAME, 8);
 
 #endif							/* PG_REWRITE_H */
diff --git a/src/include/catalog/pg_sequence.h b/src/include/catalog/pg_sequence.h
index fdfc27bbd9..efd441c339 100644
--- a/src/include/catalog/pg_sequence.h
+++ b/src/include/catalog/pg_sequence.h
@@ -39,6 +39,6 @@ CATALOG(pg_sequence,2224,SequenceRelationId)
  */
 typedef FormData_pg_sequence *Form_pg_sequence;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, pg_sequence, btree(seqrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, pg_sequence, btree(seqrelid oid_ops), SEQRELID, 32);
 
 #endif							/* PG_SEQUENCE_H */
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 864cb54a51..53bb3d1936 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -136,7 +136,7 @@ typedef FormData_pg_statistic *Form_pg_statistic;
 
 DECLARE_TOAST(pg_statistic, 2840, 2841);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, pg_statistic, btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, pg_statistic, btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops), STATRELATTINH, 128);
 
 DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h
index 85e56feb80..cb16044e08 100644
--- a/src/include/catalog/pg_statistic_ext.h
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -70,8 +70,8 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext;
 
 DECLARE_TOAST(pg_statistic_ext, 3439, 3440);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, pg_statistic_ext, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, pg_statistic_ext, btree(stxname name_ops, stxnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, pg_statistic_ext, btree(oid oid_ops), STATEXTOID, 4);
+DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, pg_statistic_ext, btree(stxname name_ops, stxnamespace oid_ops), STATEXTNAMENSP, 4);
 DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, pg_statistic_ext, btree(stxrelid oid_ops));
 
 DECLARE_ARRAY_FOREIGN_KEY((stxrelid, stxkeys), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_statistic_ext_data.h b/src/include/catalog/pg_statistic_ext_data.h
index 19a00705e6..0f09883e12 100644
--- a/src/include/catalog/pg_statistic_ext_data.h
+++ b/src/include/catalog/pg_statistic_ext_data.h
@@ -54,7 +54,7 @@ typedef FormData_pg_statistic_ext_data *Form_pg_statistic_ext_data;
 
 DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, pg_statistic_ext_data, btree(stxoid oid_ops, stxdinherit bool_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, pg_statistic_ext_data, btree(stxoid oid_ops, stxdinherit bool_ops), STATEXTDATASTXOID, 4);
 
 
 #endif							/* PG_STATISTIC_EXT_DATA_H */
diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h
index be36c4a820..fff35ebf83 100644
--- a/src/include/catalog/pg_subscription.h
+++ b/src/include/catalog/pg_subscription.h
@@ -115,8 +115,8 @@ typedef FormData_pg_subscription *Form_pg_subscription;
 
 DECLARE_TOAST_WITH_MACRO(pg_subscription, 4183, 4184, PgSubscriptionToastTable, PgSubscriptionToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, pg_subscription, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, pg_subscription, btree(subdbid oid_ops, subname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, pg_subscription, btree(oid oid_ops), SUBSCRIPTIONOID, 4);
+DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, pg_subscription, btree(subdbid oid_ops, subname name_ops), SUBSCRIPTIONNAME, 4);
 
 typedef struct Subscription
 {
diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h
index f5324b710d..638f0d5447 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_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, pg_subscription_rel, btree(srrelid oid_ops, srsubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, pg_subscription_rel, btree(srrelid oid_ops, srsubid oid_ops), SUBSCRIPTIONRELMAP, 64);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index ea8665e83a..8910fe362c 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -49,7 +49,7 @@ typedef FormData_pg_tablespace *Form_pg_tablespace;
 
 DECLARE_TOAST_WITH_MACRO(pg_tablespace, 4185, 4186, PgTablespaceToastTable, PgTablespaceToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, pg_tablespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, pg_tablespace, btree(oid oid_ops), TABLESPACEOID, 4);
 DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, pg_tablespace, btree(spcname name_ops));
 
 #endif							/* PG_TABLESPACE_H */
diff --git a/src/include/catalog/pg_transform.h b/src/include/catalog/pg_transform.h
index 8eb189784d..2660d7a706 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_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, pg_transform, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, pg_transform, btree(trftype oid_ops, trflang oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, pg_transform, btree(oid oid_ops), TRFOID, 16);
+DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, pg_transform, btree(trftype oid_ops, trflang oid_ops), TRFTYPELANG, 16);
 
 #endif							/* PG_TRANSFORM_H */
diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h
index e52720387d..3699551f0f 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -47,7 +47,7 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId)
 
 typedef FormData_pg_ts_config *Form_pg_ts_config;
 
-DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, pg_ts_config, btree(cfgname name_ops, cfgnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, pg_ts_config, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, pg_ts_config, btree(cfgname name_ops, cfgnamespace oid_ops), TSCONFIGNAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, pg_ts_config, btree(oid oid_ops), TSCONFIGOID, 2);
 
 #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 91f092ca48..437b34a20c 100644
--- a/src/include/catalog/pg_ts_config_map.h
+++ b/src/include/catalog/pg_ts_config_map.h
@@ -44,6 +44,6 @@ CATALOG(pg_ts_config_map,3603,TSConfigMapRelationId)
 
 typedef FormData_pg_ts_config_map *Form_pg_ts_config_map;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, pg_ts_config_map, btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, pg_ts_config_map, btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops), TSCONFIGMAP, 2);
 
 #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 10a6490213..34e22d9434 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -53,7 +53,7 @@ typedef FormData_pg_ts_dict *Form_pg_ts_dict;
 
 DECLARE_TOAST(pg_ts_dict, 4169, 4170);
 
-DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, pg_ts_dict, btree(dictname name_ops, dictnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, pg_ts_dict, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, pg_ts_dict, btree(dictname name_ops, dictnamespace oid_ops), TSDICTNAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, pg_ts_dict, btree(oid oid_ops), TSDICTOID, 2);
 
 #endif							/* PG_TS_DICT_H */
diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h
index 57d9e8428a..7885c2555e 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -54,7 +54,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId)
 
 typedef FormData_pg_ts_parser *Form_pg_ts_parser;
 
-DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, pg_ts_parser, btree(prsname name_ops, prsnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, pg_ts_parser, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, pg_ts_parser, btree(prsname name_ops, prsnamespace oid_ops), TSPARSERNAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, pg_ts_parser, btree(oid oid_ops), TSPARSEROID, 2);
 
 #endif							/* PG_TS_PARSER_H */
diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h
index f3bdc7b200..cd569a700e 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -45,7 +45,7 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId)
 
 typedef FormData_pg_ts_template *Form_pg_ts_template;
 
-DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, pg_ts_template, btree(tmplname name_ops, tmplnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, pg_ts_template, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, pg_ts_template, btree(tmplname name_ops, tmplnamespace oid_ops), TSTEMPLATENAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, pg_ts_template, btree(oid oid_ops), TSTEMPLATEOID, 2);
 
 #endif							/* PG_TS_TEMPLATE_H */
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 508ba7b0f7..9d00be8dbb 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -262,8 +262,8 @@ typedef FormData_pg_type *Form_pg_type;
 
 DECLARE_TOAST(pg_type, 4171, 4172);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, pg_type, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, pg_type, btree(typname name_ops, typnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, pg_type, btree(oid oid_ops), TYPEOID, 64);
+DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, pg_type, btree(typname name_ops, typnamespace oid_ops), TYPENAMENSP, 64);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index eca33f4cb4..94bc93a83f 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -49,7 +49,7 @@ typedef FormData_pg_user_mapping *Form_pg_user_mapping;
 
 DECLARE_TOAST(pg_user_mapping, 4173, 4174);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, pg_user_mapping, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, pg_user_mapping, btree(umuser oid_ops, umserver oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, pg_user_mapping, btree(oid oid_ops), USERMAPPINGOID, 2);
+DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, pg_user_mapping, btree(umuser oid_ops, umserver oid_ops), USERMAPPINGUSERSERVER, 2);
 
 #endif							/* PG_USER_MAPPING_H */
diff --git a/src/include/utils/syscache.h b/src/include/utils/syscache.h
index 67ea6e4945..68827fba50 100644
--- a/src/include/utils/syscache.h
+++ b/src/include/utils/syscache.h
@@ -20,103 +20,7 @@
 #include "access/htup.h"
 /* we intentionally do not include utils/catcache.h here */
 
-/*
- *		SysCache identifiers.
- *
- *		The order of these identifiers must match the order
- *		of the entries in the array cacheinfo[] in syscache.c.
- *		Keep them in alphabetical order (renumbering only costs a
- *		backend rebuild).
- */
-
-enum SysCacheIdentifier
-{
-	AGGFNOID = 0,
-	AMNAME,
-	AMOID,
-	AMOPOPID,
-	AMOPSTRATEGY,
-	AMPROCNUM,
-	ATTNAME,
-	ATTNUM,
-	AUTHMEMMEMROLE,
-	AUTHMEMROLEMEM,
-	AUTHNAME,
-	AUTHOID,
-	CASTSOURCETARGET,
-	CLAAMNAMENSP,
-	CLAOID,
-	COLLNAMEENCNSP,
-	COLLOID,
-	CONDEFAULT,
-	CONNAMENSP,
-	CONSTROID,
-	CONVOID,
-	DATABASEOID,
-	DEFACLROLENSPOBJ,
-	ENUMOID,
-	ENUMTYPOIDNAME,
-	EVENTTRIGGERNAME,
-	EVENTTRIGGEROID,
-	FOREIGNDATAWRAPPERNAME,
-	FOREIGNDATAWRAPPEROID,
-	FOREIGNSERVERNAME,
-	FOREIGNSERVEROID,
-	FOREIGNTABLEREL,
-	INDEXRELID,
-	LANGNAME,
-	LANGOID,
-	NAMESPACENAME,
-	NAMESPACEOID,
-	OPERNAMENSP,
-	OPEROID,
-	OPFAMILYAMNAMENSP,
-	OPFAMILYOID,
-	PARAMETERACLNAME,
-	PARAMETERACLOID,
-	PARTRELID,
-	PROCNAMEARGSNSP,
-	PROCOID,
-	PUBLICATIONNAME,
-	PUBLICATIONNAMESPACE,
-	PUBLICATIONNAMESPACEMAP,
-	PUBLICATIONOID,
-	PUBLICATIONREL,
-	PUBLICATIONRELMAP,
-	RANGEMULTIRANGE,
-	RANGETYPE,
-	RELNAMENSP,
-	RELOID,
-	REPLORIGIDENT,
-	REPLORIGNAME,
-	RULERELNAME,
-	SEQRELID,
-	STATEXTDATASTXOID,
-	STATEXTNAMENSP,
-	STATEXTOID,
-	STATRELATTINH,
-	SUBSCRIPTIONNAME,
-	SUBSCRIPTIONOID,
-	SUBSCRIPTIONRELMAP,
-	TABLESPACEOID,
-	TRFOID,
-	TRFTYPELANG,
-	TSCONFIGMAP,
-	TSCONFIGNAMENSP,
-	TSCONFIGOID,
-	TSDICTNAMENSP,
-	TSDICTOID,
-	TSPARSERNAMENSP,
-	TSPARSEROID,
-	TSTEMPLATENAMENSP,
-	TSTEMPLATEOID,
-	TYPENAMENSP,
-	TYPEOID,
-	USERMAPPINGOID,
-	USERMAPPINGUSERSERVER
-
-#define SysCacheSize (USERMAPPINGUSERSERVER + 1)
-};
+#include "catalog/syscache_info.h"
 
 extern void InitCatalogCache(void);
 extern void InitCatalogCachePhase2(void);
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index 4e09c4686b..56ed423567 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -119,6 +119,11 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/syscache_info.c.h && continue
+	test "$f" = src/backend/catalog/syscache_info.h && continue
+	test "$f" = src/include/catalog/syscache_info.c.h && continue
+	test "$f" = src/include/catalog/syscache_info.h && continue
+
 	# We can't make these Bison output files compilable standalone
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 8dee1b5670..477e4dd7e6 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -114,6 +114,11 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/syscache_info.c.h && continue
+	test "$f" = src/backend/catalog/syscache_info.h && continue
+	test "$f" = src/include/catalog/syscache_info.c.h && continue
+	test "$f" = src/include/catalog/syscache_info.h && continue
+
 	# We can't make these Bison output files compilable standalone
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
-- 
2.40.1


From 881e9f1254376c0877ad562f98ee112eab47ac33 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 19:56:31 -0400
Subject: [PATCH 5/5] WIP: Generate ObjectProperty from catalog files

---
 src/backend/catalog/.gitignore     |  1 +
 src/backend/catalog/genbki.pl      | 81 ++++++++++++++++++++++++++++++
 src/tools/pginclude/cpluspluscheck |  3 ++
 src/tools/pginclude/headerscheck   |  3 ++
 4 files changed, 88 insertions(+)

diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore
index ff65560379..d817798dc0 100644
--- a/src/backend/catalog/.gitignore
+++ b/src/backend/catalog/.gitignore
@@ -1,3 +1,4 @@
+/objectproperty_info.c.h
 /postgres.bki
 /schemapg.h
 /syscache_info.c.h
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 80a7828d6c..e0813d1286 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -19,8 +19,10 @@
 
 use FindBin;
 use lib $FindBin::RealBin;
+use lib "$FindBin::RealBin/../../tools";
 
 use Catalog;
+use PerfectHash;
 
 my $output_path = '';
 my $major_version;
@@ -59,6 +61,7 @@
 my %syscaches;
 my %oidcounts;
 my @system_constraints;
+my @object_properties;
 
 foreach my $header (@ARGV)
 {
@@ -133,6 +136,7 @@
 		$oidcounts{ $toast->{toast_oid} }++;
 		$oidcounts{ $toast->{toast_index_oid} }++;
 	}
+	my ($oid_index, $oid_syscache, $name_syscache, $is_nsp_name_unique);
 	foreach my $index (@{ $catalog->{indexing} })
 	{
 		push @index_decls,
@@ -142,6 +146,7 @@
 		  $index->{table_name},
 		  $index->{index_decl};
 		$oidcounts{ $index->{index_oid} }++;
+		$oid_index = $index->{index_oid_macro} if $index->{index_decl} eq 'btree(oid oid_ops)';
 
 		if ($index->{is_unique})
 		{
@@ -152,6 +157,11 @@
 			  $index->{index_name};
 		}
 
+		if ($index->{is_unique} && $index->{index_decl} =~ /\(\w+name name_ops, \w+namespace oid_ops\)/)
+		{
+			$is_nsp_name_unique = 1;
+		}
+
 		if ($index->{syscache_name})
 		{
 			my $tbl = $index->{table_name};
@@ -165,8 +175,51 @@
 				key => $key,
 				nbuckets => $index->{syscache_nbuckets},
 			};
+
+			$oid_syscache = $index->{syscache_name} if $index->{index_decl} eq 'btree(oid oid_ops)';
+			$name_syscache = $index->{syscache_name} if $index->{index_decl} =~ /^btree\(\w+name name_ops\)$/;
+		}
+	}
+
+	my ($attnum_oid, $attnum_name, $attnum_namespace, $attnum_owner, $attnum_acl);
+	foreach my $att (@$schema)
+	{
+		if ($att->{name} eq 'oid' && $att->{type} eq 'oid')
+		{
+			$attnum_oid = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /name$/ && $att->{type} eq 'name')
+		{
+			$attnum_name = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /namespace$/ && $att->{type} eq 'oid')
+		{
+			$attnum_namespace = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /owner$/ && $att->{type} eq 'oid')
+		{
+			$attnum_owner = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /acl$/ && $att->{type} eq '_aclitem')
+		{
+			$attnum_acl = "Anum_${catname}_" . $att->{name};
 		}
 	}
+	push @object_properties, {
+		#class_descr => q{"TODO"},
+		class_oid => $catalog->{relation_oid_macro},
+		_class_oid => $catalog->{relation_oid},
+		oid_index_oid => $oid_index,
+		oid_catcache_id => $oid_syscache || '-1',
+		name_catcache_id => $name_syscache || '-1',
+		attnum_oid => $attnum_oid,
+		attnum_name => $attnum_name,
+		attnum_namespace => $attnum_namespace,
+		attnum_owner => $attnum_owner,
+		attnum_acl => $attnum_acl,
+		#objtype => TODO,
+		is_nsp_name_unique => $is_nsp_name_unique ? 'true' : 'false',
+	};
 }
 
 # Complain and exit if we found any duplicate OIDs.
@@ -441,6 +494,9 @@
 my $syscache_info_c = $output_path . 'syscache_info.c.h';
 open my $syscache_info_c_fh, '>', $syscache_info_c . $tmpext
   or die "can't open $syscache_info_c$tmpext: $!";
+my $objectproperty_info = $output_path . 'objectproperty_info.c.h';
+open my $objectproperty_info_fh, '>', $objectproperty_info . $tmpext
+  or die "can't open $objectproperty_info$tmpext: $!";
 
 # Generate postgres.bki and pg_*_d.h headers.
 
@@ -802,6 +858,29 @@
 
 print $syscache_info_c_fh "};\n";
 
+# Now generate objectproperty_info
+
+print_boilerplate($objectproperty_info_fh, "objectproperty_info.h", "object property data");
+print $objectproperty_info_fh "static const ObjectPropertyType ObjectProperty[] =
+{
+";
+
+my @class_oids;
+foreach my $op (@object_properties)
+{
+	print $objectproperty_info_fh "\t{\n";
+	foreach my $p (sort keys %{$op})
+	{
+		printf $objectproperty_info_fh "\t\t%s = %s,\n", $p, ${$op}{$p} if $p !~ /^_/ && ${$op}{$p};
+	}
+	push @class_oids, pack('N', ${$op}{_class_oid});
+	print $objectproperty_info_fh "\t},\n";
+}
+
+print $objectproperty_info_fh "};\n";
+
+print $objectproperty_info_fh "\nstatic " . PerfectHash::generate_hash_function(\@class_oids, 'objectproperty_hash_func', fixed_key_length => 4);
+
 # We're done emitting data
 close $bki;
 close $schemapg;
@@ -809,6 +888,7 @@
 close $constraints;
 close $syscache_info_h_fh;
 close $syscache_info_c_fh;
+close $objectproperty_info_fh;
 
 # Finally, rename the completed files into place.
 Catalog::RenameTempFile($bkifile, $tmpext);
@@ -817,6 +897,7 @@
 Catalog::RenameTempFile($constraints_file, $tmpext);
 Catalog::RenameTempFile($syscache_info_h, $tmpext);
 Catalog::RenameTempFile($syscache_info_c, $tmpext);
+Catalog::RenameTempFile($objectproperty_info, $tmpext);
 
 exit($num_errors != 0 ? 1 : 0);
 
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index 56ed423567..49e3ca7a7b 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -119,6 +119,9 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/objectproperty_info.c.h && continue
+	test "$f" = src/include/catalog/objectproperty_info.c.h && continue
+
 	test "$f" = src/backend/catalog/syscache_info.c.h && continue
 	test "$f" = src/backend/catalog/syscache_info.h && continue
 	test "$f" = src/include/catalog/syscache_info.c.h && continue
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 477e4dd7e6..a1ea2ef692 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -114,6 +114,9 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/objectproperty_info.c.h && continue
+	test "$f" = src/include/catalog/objectproperty_info.c.h && continue
+
 	test "$f" = src/backend/catalog/syscache_info.c.h && continue
 	test "$f" = src/backend/catalog/syscache_info.h && continue
 	test "$f" = src/include/catalog/syscache_info.c.h && continue
-- 
2.40.1



Attachments:

  [text/plain] 0001-Update-DECLARE_INDEX-documentation.patch (1.6K, ../[email protected]/2-0001-Update-DECLARE_INDEX-documentation.patch)
  download | inline diff:
From 27fbebc06378c97b9918e899564532146d618558 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Tue, 30 May 2023 08:27:56 -0400
Subject: [PATCH 1/5] Update DECLARE_INDEX documentation

should have been updated in 6a6389a08b
---
 src/include/catalog/genbki.h | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index 50518cbbf5..c42ba0cea5 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -71,12 +71,13 @@
  * DECLARE_UNIQUE_INDEX_PKEY.  ("PKEY" marks the index as being the catalog's
  * primary key; currently this is only cosmetically different from a regular
  * unique index.  By convention, we usually make a catalog's OID column its
- * pkey, if it has one.)  The first two arguments are the index's name and
- * OID, the rest is much like a standard 'create index' SQL command.
+ * pkey, if it has one.)
  *
- * For each index, we also provide a #define for its OID.  References to
- * the index in the C code should always use these #defines, not the actual
- * index name (much less the numeric OID).
+ * The first two arguments are the index's name and OID.  The third argument
+ * is the name of a #define to generate for its OID.  References to the index
+ * in the C code should always use these #defines, not the actual index name
+ * (much less the numeric OID).  The rest is much like a standard 'create
+ * index' SQL command.
  *
  * The macro definitions are just to keep the C compiler from spitting up.
  */

base-commit: 0bcb3ca3b95b2b94de0b337a73aef333e0346c44
-- 
2.40.1



  [text/plain] 0002-Restructure-DECLARE_INDEX-arguments.patch (65.4K, ../[email protected]/3-0002-Restructure-DECLARE_INDEX-arguments.patch)
  download | inline diff:
From 8f47e5c37dad09a3011f678a859aaa1677ce5603 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 17:12:28 +0200
Subject: [PATCH 2/5] Restructure DECLARE_INDEX arguments

Separate the table name from the index declaration.  We need that
anyway later for the ALTER TABLE / USING INDEX commands, so we might
as well structure the declarations like that to begin with.
---
 src/backend/catalog/Catalog.pm                 |  5 +++--
 src/backend/catalog/genbki.pl                  |  7 +++----
 src/include/catalog/genbki.h                   | 10 +++++-----
 src/include/catalog/pg_aggregate.h             |  2 +-
 src/include/catalog/pg_am.h                    |  4 ++--
 src/include/catalog/pg_amop.h                  |  6 +++---
 src/include/catalog/pg_amproc.h                |  4 ++--
 src/include/catalog/pg_attrdef.h               |  4 ++--
 src/include/catalog/pg_attribute.h             |  4 ++--
 src/include/catalog/pg_auth_members.h          |  8 ++++----
 src/include/catalog/pg_authid.h                |  4 ++--
 src/include/catalog/pg_cast.h                  |  4 ++--
 src/include/catalog/pg_class.h                 |  6 +++---
 src/include/catalog/pg_collation.h             |  4 ++--
 src/include/catalog/pg_constraint.h            | 10 +++++-----
 src/include/catalog/pg_conversion.h            |  6 +++---
 src/include/catalog/pg_database.h              |  4 ++--
 src/include/catalog/pg_db_role_setting.h       |  2 +-
 src/include/catalog/pg_default_acl.h           |  4 ++--
 src/include/catalog/pg_depend.h                |  4 ++--
 src/include/catalog/pg_description.h           |  2 +-
 src/include/catalog/pg_enum.h                  |  6 +++---
 src/include/catalog/pg_event_trigger.h         |  4 ++--
 src/include/catalog/pg_extension.h             |  4 ++--
 src/include/catalog/pg_foreign_data_wrapper.h  |  4 ++--
 src/include/catalog/pg_foreign_server.h        |  4 ++--
 src/include/catalog/pg_foreign_table.h         |  2 +-
 src/include/catalog/pg_index.h                 |  4 ++--
 src/include/catalog/pg_inherits.h              |  4 ++--
 src/include/catalog/pg_init_privs.h            |  2 +-
 src/include/catalog/pg_language.h              |  4 ++--
 src/include/catalog/pg_largeobject.h           |  2 +-
 src/include/catalog/pg_largeobject_metadata.h  |  2 +-
 src/include/catalog/pg_namespace.h             |  4 ++--
 src/include/catalog/pg_opclass.h               |  4 ++--
 src/include/catalog/pg_operator.h              |  4 ++--
 src/include/catalog/pg_opfamily.h              |  4 ++--
 src/include/catalog/pg_parameter_acl.h         |  4 ++--
 src/include/catalog/pg_partitioned_table.h     |  2 +-
 src/include/catalog/pg_policy.h                |  4 ++--
 src/include/catalog/pg_proc.h                  |  4 ++--
 src/include/catalog/pg_publication.h           |  4 ++--
 src/include/catalog/pg_publication_namespace.h |  4 ++--
 src/include/catalog/pg_publication_rel.h       |  6 +++---
 src/include/catalog/pg_range.h                 |  4 ++--
 src/include/catalog/pg_replication_origin.h    |  4 ++--
 src/include/catalog/pg_rewrite.h               |  4 ++--
 src/include/catalog/pg_seclabel.h              |  2 +-
 src/include/catalog/pg_sequence.h              |  2 +-
 src/include/catalog/pg_shdepend.h              |  4 ++--
 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         |  6 +++---
 src/include/catalog/pg_statistic_ext_data.h    |  2 +-
 src/include/catalog/pg_subscription.h          |  4 ++--
 src/include/catalog/pg_subscription_rel.h      |  2 +-
 src/include/catalog/pg_tablespace.h            |  4 ++--
 src/include/catalog/pg_transform.h             |  4 ++--
 src/include/catalog/pg_trigger.h               |  6 +++---
 src/include/catalog/pg_ts_config.h             |  4 ++--
 src/include/catalog/pg_ts_config_map.h         |  2 +-
 src/include/catalog/pg_ts_dict.h               |  4 ++--
 src/include/catalog/pg_ts_parser.h             |  4 ++--
 src/include/catalog/pg_ts_template.h           |  4 ++--
 src/include/catalog/pg_type.h                  |  4 ++--
 src/include/catalog/pg_user_mapping.h          |  4 ++--
 67 files changed, 135 insertions(+), 135 deletions(-)

diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index 84aaeb002a..a727d692b7 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -110,7 +110,7 @@ sub ParseHeader
 			  };
 		}
 		elsif (
-			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(.+)\)/
+			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(\w+),\s*(.+)\)/
 		  )
 		{
 			push @{ $catalog{indexing} },
@@ -120,7 +120,8 @@ sub ParseHeader
 				index_name => $3,
 				index_oid => $4,
 				index_oid_macro => $5,
-				index_decl => $6
+				table_name => $6,
+				index_decl => $7
 			  };
 		}
 		elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/)
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 4a7205472c..c7657cc47c 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -135,19 +135,18 @@
 	foreach my $index (@{ $catalog->{indexing} })
 	{
 		push @index_decls,
-		  sprintf "declare %sindex %s %s %s\n",
+		  sprintf "declare %sindex %s %s on %s using %s\n",
 		  $index->{is_unique} ? 'unique ' : '',
 		  $index->{index_name}, $index->{index_oid},
+		  $index->{table_name},
 		  $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->{table_name},
 			  $index->{is_pkey} ? "PRIMARY KEY" : "UNIQUE",
 			  $index->{index_name};
 		}
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index c42ba0cea5..e22a6902fb 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -76,14 +76,14 @@
  * The first two arguments are the index's name and OID.  The third argument
  * is the name of a #define to generate for its OID.  References to the index
  * in the C code should always use these #defines, not the actual index name
- * (much less the numeric OID).  The rest is much like a standard 'create
- * index' SQL command.
+ * (much less the numeric OID).  The fourth argument is the table name.  The
+ * rest is much like a standard 'create index' SQL command.
  *
  * The macro definitions are just to keep the C compiler from spitting up.
  */
-#define DECLARE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,decl) extern int no_such_variable
+#define DECLARE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,tblname,decl) extern int no_such_variable
 
 /*
  * These lines inform genbki.pl about manually-assigned OIDs that do not
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 3112881193..085149e258 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_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, on pg_aggregate using btree(aggfnoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, pg_aggregate, btree(aggfnoid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index dab54be130..d5314bb38b 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -47,8 +47,8 @@ CATALOG(pg_am,2601,AccessMethodRelationId)
  */
 typedef FormData_pg_am *Form_pg_am;
 
-DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, on pg_am using btree(amname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, on pg_am using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, pg_am, btree(amname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, pg_am, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index 4ca7321409..c9bb7b4787 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -87,9 +87,9 @@ CATALOG(pg_amop,2602,AccessMethodOperatorRelationId)
  */
 typedef FormData_pg_amop *Form_pg_amop;
 
-DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, on pg_amop using btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));
-DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, on pg_amop using btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, on pg_amop using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, pg_amop, btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));
+DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, pg_amop, btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, pg_amop, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 3307d5c844..5acf4efab9 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -67,7 +67,7 @@ CATALOG(pg_amproc,2603,AccessMethodProcedureRelationId)
  */
 typedef FormData_pg_amproc *Form_pg_amproc;
 
-DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, on pg_amproc using btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, on pg_amproc using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, pg_amproc, btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, pg_amproc, btree(oid oid_ops));
 
 #endif							/* PG_AMPROC_H */
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index 9dc318ff93..04c5725045 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -50,8 +50,8 @@ typedef FormData_pg_attrdef *Form_pg_attrdef;
 
 DECLARE_TOAST(pg_attrdef, 2830, 2831);
 
-DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, AttrDefaultIndexId, on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, on pg_attrdef using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, AttrDefaultIndexId, pg_attrdef, btree(adrelid oid_ops, adnum int2_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, pg_attrdef, btree(oid oid_ops));
 
 DECLARE_FOREIGN_KEY((adrelid, adnum), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index f8b4861b94..f0d6de7c1f 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -208,8 +208,8 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
  */
 typedef FormData_pg_attribute *Form_pg_attribute;
 
-DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, on pg_attribute using btree(attrelid oid_ops, attname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, on pg_attribute using btree(attrelid oid_ops, attnum int2_ops));
+DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h
index df2b8b29e0..4ab8a9f7b7 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -45,9 +45,9 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_
  */
 typedef FormData_pg_auth_members *Form_pg_auth_members;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, on pg_auth_members using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, on pg_auth_members using btree(roleid oid_ops, member oid_ops, grantor oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, on pg_auth_members using btree(member oid_ops, roleid oid_ops, grantor oid_ops));
-DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, on pg_auth_members using btree(grantor oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, pg_auth_members, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, pg_auth_members, btree(roleid oid_ops, member oid_ops, grantor oid_ops));
+DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, pg_auth_members, btree(member oid_ops, roleid oid_ops, grantor oid_ops));
+DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, pg_auth_members, btree(grantor oid_ops));
 
 #endif							/* PG_AUTH_MEMBERS_H */
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index c70baf7887..0e7ddc56ea 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -57,7 +57,7 @@ typedef FormData_pg_authid *Form_pg_authid;
 
 DECLARE_TOAST_WITH_MACRO(pg_authid, 4175, 4176, PgAuthidToastTable, PgAuthidToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, on pg_authid using btree(rolname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, on pg_authid using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops));
 
 #endif							/* PG_AUTHID_H */
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index 9ec2b5785b..a2518388b3 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -56,8 +56,8 @@ CATALOG(pg_cast,2605,CastRelationId)
  */
 typedef FormData_pg_cast *Form_pg_cast;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, on pg_cast using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, on pg_cast using btree(castsource oid_ops, casttarget oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, pg_cast, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, pg_cast, btree(castsource oid_ops, casttarget oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 2d1bb7af3a..55dcd54100 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -152,9 +152,9 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat
  */
 typedef FormData_pg_class *Form_pg_class;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, on pg_class using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, on pg_class using btree(relname name_ops, relnamespace oid_ops));
-DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, pg_class, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, pg_class, btree(relname name_ops, relnamespace oid_ops));
+DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, pg_class, btree(reltablespace oid_ops, relfilenode oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h
index bfa3568451..2d7dcde183 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -59,8 +59,8 @@ typedef FormData_pg_collation *Form_pg_collation;
 
 DECLARE_TOAST(pg_collation, 6175, 6176);
 
-DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, on pg_collation using btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, on pg_collation using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, pg_collation, btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, pg_collation, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 16bf5f5576..0d47c9b589 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -166,11 +166,11 @@ typedef FormData_pg_constraint *Form_pg_constraint;
 
 DECLARE_TOAST(pg_constraint, 2832, 2833);
 
-DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, on pg_constraint using btree(conname name_ops, connamespace oid_ops));
-DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, on pg_constraint using btree(conrelid oid_ops, contypid oid_ops, conname name_ops));
-DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, on pg_constraint using btree(contypid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, on pg_constraint using btree(oid oid_ops));
-DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, on pg_constraint using btree(conparentid oid_ops));
+DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, pg_constraint, btree(conname name_ops, connamespace oid_ops));
+DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, pg_constraint, btree(conrelid oid_ops, contypid oid_ops, conname name_ops));
+DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, pg_constraint, btree(contypid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, pg_constraint, btree(oid oid_ops));
+DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, pg_constraint, btree(conparentid oid_ops));
 
 /* conkey can contain zero (InvalidAttrNumber) if a whole-row Var is used */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((conrelid, conkey), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index de40909dd3..42847fdf12 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -60,9 +60,9 @@ CATALOG(pg_conversion,2607,ConversionRelationId)
  */
 typedef FormData_pg_conversion *Form_pg_conversion;
 
-DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, on pg_conversion using btree(conname name_ops, connamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, on pg_conversion using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, pg_conversion, btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, pg_conversion, btree(conname name_ops, connamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, pg_conversion, btree(oid oid_ops));
 
 
 extern ObjectAddress ConversionCreate(const char *conname, Oid connamespace,
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index d004f4dc8a..44e2ed73cf 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -91,8 +91,8 @@ typedef FormData_pg_database *Form_pg_database;
 
 DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDatabaseToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, on pg_database using btree(datname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, on pg_database using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, pg_database, btree(datname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, pg_database, btree(oid oid_ops));
 
 /*
  * pg_database.dat contains an entry for template1, but not for the template0
diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h
index 4ba0d69e76..af025cc608 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -48,7 +48,7 @@ typedef FormData_pg_db_role_setting * Form_pg_db_role_setting;
 
 DECLARE_TOAST_WITH_MACRO(pg_db_role_setting, 2966, 2967, PgDbRoleSettingToastTable, PgDbRoleSettingToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_db_role_setting_databaseid_rol_index, 2965, DbRoleSettingDatidRolidIndexId, 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, DbRoleSettingDatidRolidIndexId, pg_db_role_setting, btree(setdatabase oid_ops, setrole oid_ops));
 
 /*
  * prototypes for functions in pg_db_role_setting.c
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index d6d0a03f0c..803ce3eab8 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -51,8 +51,8 @@ typedef FormData_pg_default_acl *Form_pg_default_acl;
 
 DECLARE_TOAST(pg_default_acl, 4143, 4144);
 
-DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, on pg_default_acl using btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, on pg_default_acl using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, pg_default_acl, btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, pg_default_acl, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index 30dde6f8aa..67ea968beb 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -71,7 +71,7 @@ CATALOG(pg_depend,2608,DependRelationId)
  */
 typedef FormData_pg_depend *Form_pg_depend;
 
-DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops));
-DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));
+DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, pg_depend, btree(classid oid_ops, objid oid_ops, objsubid int4_ops));
+DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, pg_depend, btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));
 
 #endif							/* PG_DEPEND_H */
diff --git a/src/include/catalog/pg_description.h b/src/include/catalog/pg_description.h
index 7545b92a15..10026152e7 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_PKEY(pg_description_o_c_o_index, 2675, DescriptionObjIndexId, 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, DescriptionObjIndexId, pg_description, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
 
 /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */
 DECLARE_FOREIGN_KEY((classoid), pg_class, (oid));
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index 83a0668233..c483cb1042 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -43,9 +43,9 @@ CATALOG(pg_enum,3501,EnumRelationId)
  */
 typedef FormData_pg_enum *Form_pg_enum;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, on pg_enum using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, on pg_enum using btree(enumtypid oid_ops, enumlabel name_ops));
-DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, on pg_enum using btree(enumtypid oid_ops, enumsortorder float4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, pg_enum, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, pg_enum, btree(enumtypid oid_ops, enumlabel name_ops));
+DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, pg_enum, btree(enumtypid oid_ops, enumsortorder float4_ops));
 
 /*
  * prototypes for functions in pg_enum.c
diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h
index e30550f6e1..0ec42edff6 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -51,7 +51,7 @@ typedef FormData_pg_event_trigger *Form_pg_event_trigger;
 
 DECLARE_TOAST(pg_event_trigger, 4145, 4146);
 
-DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, on pg_event_trigger using btree(evtname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, on pg_event_trigger using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, pg_event_trigger, btree(evtname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, pg_event_trigger, btree(oid oid_ops));
 
 #endif							/* PG_EVENT_TRIGGER_H */
diff --git a/src/include/catalog/pg_extension.h b/src/include/catalog/pg_extension.h
index 799c8ed9d0..8c7174e23c 100644
--- a/src/include/catalog/pg_extension.h
+++ b/src/include/catalog/pg_extension.h
@@ -53,7 +53,7 @@ typedef FormData_pg_extension *Form_pg_extension;
 
 DECLARE_TOAST(pg_extension, 4147, 4148);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, on pg_extension using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, on pg_extension using btree(extname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, pg_extension, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, pg_extension, btree(extname name_ops));
 
 #endif							/* PG_EXTENSION_H */
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index e7833ec883..37387f9355 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -52,7 +52,7 @@ typedef FormData_pg_foreign_data_wrapper *Form_pg_foreign_data_wrapper;
 
 DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, on pg_foreign_data_wrapper using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, on pg_foreign_data_wrapper using btree(fdwname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, pg_foreign_data_wrapper, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, pg_foreign_data_wrapper, btree(fdwname name_ops));
 
 #endif							/* PG_FOREIGN_DATA_WRAPPER_H */
diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index 2a14871d74..5993967c6e 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_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, on pg_foreign_server using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, on pg_foreign_server using btree(srvname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, pg_foreign_server, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, pg_foreign_server, btree(srvname name_ops));
 
 #endif							/* PG_FOREIGN_SERVER_H */
diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h
index cfa570a88c..2420e23401 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -44,6 +44,6 @@ typedef FormData_pg_foreign_table *Form_pg_foreign_table;
 
 DECLARE_TOAST(pg_foreign_table, 4153, 4154);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, on pg_foreign_table using btree(ftrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, pg_foreign_table, btree(ftrelid oid_ops));
 
 #endif							/* PG_FOREIGN_TABLE_H */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index b0592571da..32930411b6 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -69,8 +69,8 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO
  */
 typedef FormData_pg_index *Form_pg_index;
 
-DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, on pg_index using btree(indrelid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, on pg_index using btree(indexrelid oid_ops));
+DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, pg_index, btree(indrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, pg_index, btree(indexrelid oid_ops));
 
 /* indkey can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((indrelid, indkey), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h
index ce154ab943..65562b8c3e 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -44,8 +44,8 @@ CATALOG(pg_inherits,2611,InheritsRelationId)
  */
 typedef FormData_pg_inherits *Form_pg_inherits;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, InheritsRelidSeqnoIndexId, on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops));
-DECLARE_INDEX(pg_inherits_parent_index, 2187, InheritsParentIndexId, on pg_inherits using btree(inhparent oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, InheritsRelidSeqnoIndexId, pg_inherits, btree(inhrelid oid_ops, inhseqno int4_ops));
+DECLARE_INDEX(pg_inherits_parent_index, 2187, InheritsParentIndexId, pg_inherits, btree(inhparent oid_ops));
 
 
 extern List *find_inheritance_children(Oid parentrelId, LOCKMODE lockmode);
diff --git a/src/include/catalog/pg_init_privs.h b/src/include/catalog/pg_init_privs.h
index 34fe2b4d0e..3f3df954a8 100644
--- a/src/include/catalog/pg_init_privs.h
+++ b/src/include/catalog/pg_init_privs.h
@@ -65,7 +65,7 @@ typedef FormData_pg_init_privs * Form_pg_init_privs;
 
 DECLARE_TOAST(pg_init_privs, 4155, 4156);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, InitPrivsObjIndexId, 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, InitPrivsObjIndexId, pg_init_privs, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));
 
 /*
  * It is important to know if the initial privileges are from initdb or from an
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index 02003b4627..d666ea2044 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -66,7 +66,7 @@ typedef FormData_pg_language *Form_pg_language;
 
 DECLARE_TOAST(pg_language, 4157, 4158);
 
-DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, on pg_language using btree(lanname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, on pg_language using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, pg_language, btree(lanname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, pg_language, btree(oid oid_ops));
 
 #endif							/* PG_LANGUAGE_H */
diff --git a/src/include/catalog/pg_largeobject.h b/src/include/catalog/pg_largeobject.h
index 95471073a8..c073e10e40 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -44,7 +44,7 @@ CATALOG(pg_largeobject,2613,LargeObjectRelationId)
  */
 typedef FormData_pg_largeobject *Form_pg_largeobject;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNIndexId, on pg_largeobject using btree(loid oid_ops, pageno int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNIndexId, pg_largeobject, btree(loid oid_ops, pageno int4_ops));
 
 extern Oid	LargeObjectCreate(Oid loid);
 extern void LargeObjectDrop(Oid loid);
diff --git a/src/include/catalog/pg_largeobject_metadata.h b/src/include/catalog/pg_largeobject_metadata.h
index 80db926079..0481244845 100644
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -46,6 +46,6 @@ CATALOG(pg_largeobject_metadata,2995,LargeObjectMetadataRelationId)
  */
 typedef FormData_pg_largeobject_metadata *Form_pg_largeobject_metadata;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, LargeObjectMetadataOidIndexId, on pg_largeobject_metadata using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, LargeObjectMetadataOidIndexId, pg_largeobject_metadata, btree(oid oid_ops));
 
 #endif							/* PG_LARGEOBJECT_METADATA_H */
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index 2b0c243178..fc74a14c37 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -53,8 +53,8 @@ typedef FormData_pg_namespace *Form_pg_namespace;
 
 DECLARE_TOAST(pg_namespace, 4163, 4164);
 
-DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, on pg_namespace using btree(nspname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, on pg_namespace using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, pg_namespace, btree(nspname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, pg_namespace, btree(oid oid_ops));
 
 /*
  * prototypes for functions in pg_namespace.c
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index b4b6325c06..a5d09faf1f 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -82,7 +82,7 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId)
  */
 typedef FormData_pg_opclass *Form_pg_opclass;
 
-DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, on pg_opclass using btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, on pg_opclass using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, pg_opclass, btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, pg_opclass, btree(oid oid_ops));
 
 #endif							/* PG_OPCLASS_H */
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index e60cf782a6..aff372b4bb 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -82,8 +82,8 @@ CATALOG(pg_operator,2617,OperatorRelationId)
  */
 typedef FormData_pg_operator *Form_pg_operator;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, on pg_operator using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, pg_operator, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, pg_operator, btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
 
 
 extern ObjectAddress OperatorCreate(const char *operatorName,
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 39b8d7c219..88940de916 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -50,8 +50,8 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId)
  */
 typedef FormData_pg_opfamily *Form_pg_opfamily;
 
-DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, on pg_opfamily using btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, on pg_opfamily using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, pg_opfamily, btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, pg_opfamily, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h
index 1612cebd0e..f46cdd1524 100644
--- a/src/include/catalog/pg_parameter_acl.h
+++ b/src/include/catalog/pg_parameter_acl.h
@@ -50,8 +50,8 @@ typedef FormData_pg_parameter_acl * Form_pg_parameter_acl;
 
 DECLARE_TOAST_WITH_MACRO(pg_parameter_acl, 6244, 6245, PgParameterAclToastTable, PgParameterAclToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, on pg_parameter_acl using btree(parname text_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, on pg_parameter_acl using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, pg_parameter_acl, btree(parname text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, pg_parameter_acl, btree(oid oid_ops));
 
 
 extern Oid	ParameterAclLookup(const char *parameter, bool missing_ok);
diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h
index eb867ad62b..0cf512e1c8 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_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, on pg_partitioned_table using btree(partrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, pg_partitioned_table, btree(partrelid oid_ops));
 
 /* partattrs can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((partrelid, partattrs), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h
index c9525ece74..feaeedbbe6 100644
--- a/src/include/catalog/pg_policy.h
+++ b/src/include/catalog/pg_policy.h
@@ -52,7 +52,7 @@ typedef FormData_pg_policy *Form_pg_policy;
 
 DECLARE_TOAST(pg_policy, 4167, 4168);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, PolicyOidIndexId, on pg_policy using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, PolicyPolrelidPolnameIndexId, on pg_policy using btree(polrelid oid_ops, polname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, PolicyOidIndexId, pg_policy, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, PolicyPolrelidPolnameIndexId, pg_policy, btree(polrelid oid_ops, polname name_ops));
 
 #endif							/* PG_POLICY_H */
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index e7abe0b497..fdb39d4001 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -137,8 +137,8 @@ typedef FormData_pg_proc *Form_pg_proc;
 
 DECLARE_TOAST(pg_proc, 2836, 2837);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, on pg_proc using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, pg_proc, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, pg_proc, btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h
index 6ecaa2a01e..d929c9a188 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -63,8 +63,8 @@ CATALOG(pg_publication,6104,PublicationRelationId)
  */
 typedef FormData_pg_publication *Form_pg_publication;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, on pg_publication using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, on pg_publication using btree(pubname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops));
 
 typedef struct PublicationActions
 {
diff --git a/src/include/catalog/pg_publication_namespace.h b/src/include/catalog/pg_publication_namespace.h
index f1abcb9f16..b361c8ab5e 100644
--- a/src/include/catalog/pg_publication_namespace.h
+++ b/src/include/catalog/pg_publication_namespace.h
@@ -41,7 +41,7 @@ CATALOG(pg_publication_namespace,6237,PublicationNamespaceRelationId)
  */
 typedef FormData_pg_publication_namespace *Form_pg_publication_namespace;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, on pg_publication_namespace using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, pg_publication_namespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, pg_publication_namespace, btree(pnnspid oid_ops, pnpubid oid_ops));
 
 #endif							/* PG_PUBLICATION_NAMESPACE_H */
diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h
index 613e9747c2..bef508764a 100644
--- a/src/include/catalog/pg_publication_rel.h
+++ b/src/include/catalog/pg_publication_rel.h
@@ -47,8 +47,8 @@ typedef FormData_pg_publication_rel *Form_pg_publication_rel;
 
 DECLARE_TOAST(pg_publication_rel, 6228, 6229);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, on pg_publication_rel using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, on pg_publication_rel using btree(prrelid oid_ops, prpubid oid_ops));
-DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, on pg_publication_rel using btree(prpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, pg_publication_rel, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, pg_publication_rel, btree(prrelid oid_ops, prpubid oid_ops));
+DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, pg_publication_rel, btree(prpubid oid_ops));
 
 #endif							/* PG_PUBLICATION_REL_H */
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index d03ef18851..1247fa7c77 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -57,8 +57,8 @@ CATALOG(pg_range,3541,RangeRelationId)
  */
 typedef FormData_pg_range *Form_pg_range;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, on pg_range using btree(rngtypid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, on pg_range using btree(rngmultitypid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, pg_range, btree(rngtypid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, pg_range, btree(rngmultitypid oid_ops));
 
 /*
  * prototypes for functions in pg_range.c
diff --git a/src/include/catalog/pg_replication_origin.h b/src/include/catalog/pg_replication_origin.h
index fa54f120e6..83ff36dcba 100644
--- a/src/include/catalog/pg_replication_origin.h
+++ b/src/include/catalog/pg_replication_origin.h
@@ -56,7 +56,7 @@ typedef FormData_pg_replication_origin *Form_pg_replication_origin;
 
 DECLARE_TOAST_WITH_MACRO(pg_replication_origin, 4181, 4182, PgReplicationOriginToastTable, PgReplicationOriginToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, on pg_replication_origin using btree(roident oid_ops));
-DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, on pg_replication_origin using btree(roname text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, pg_replication_origin, btree(roident oid_ops));
+DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, pg_replication_origin, btree(roname text_ops));
 
 #endif							/* PG_REPLICATION_ORIGIN_H */
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index 21f24e6d7e..60d642b595 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_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, on pg_rewrite using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, pg_rewrite, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, pg_rewrite, btree(ev_class oid_ops, rulename name_ops));
 
 #endif							/* PG_REWRITE_H */
diff --git a/src/include/catalog/pg_seclabel.h b/src/include/catalog/pg_seclabel.h
index 74299cf85d..a3a601f6fe 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -40,6 +40,6 @@ CATALOG(pg_seclabel,3596,SecLabelRelationId)
 
 DECLARE_TOAST(pg_seclabel, 3598, 3599);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_seclabel_object_index, 3597, SecLabelObjectIndexId, 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, SecLabelObjectIndexId, pg_seclabel, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops));
 
 #endif							/* PG_SECLABEL_H */
diff --git a/src/include/catalog/pg_sequence.h b/src/include/catalog/pg_sequence.h
index d528c9122f..fdfc27bbd9 100644
--- a/src/include/catalog/pg_sequence.h
+++ b/src/include/catalog/pg_sequence.h
@@ -39,6 +39,6 @@ CATALOG(pg_sequence,2224,SequenceRelationId)
  */
 typedef FormData_pg_sequence *Form_pg_sequence;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, on pg_sequence using btree(seqrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, pg_sequence, btree(seqrelid oid_ops));
 
 #endif							/* PG_SEQUENCE_H */
diff --git a/src/include/catalog/pg_shdepend.h b/src/include/catalog/pg_shdepend.h
index 35ba911a22..3834d07f78 100644
--- a/src/include/catalog/pg_shdepend.h
+++ b/src/include/catalog/pg_shdepend.h
@@ -72,7 +72,7 @@ CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION
  */
 typedef FormData_pg_shdepend *Form_pg_shdepend;
 
-DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops));
-DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops));
+DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, pg_shdepend, btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops));
+DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, pg_shdepend, btree(refclassid oid_ops, refobjid oid_ops));
 
 #endif							/* PG_SHDEPEND_H */
diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h
index 7b66c12224..c7b66d95d5 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -57,7 +57,7 @@ typedef FormData_pg_shdescription * Form_pg_shdescription;
 
 DECLARE_TOAST_WITH_MACRO(pg_shdescription, 2846, 2847, PgShdescriptionToastTable, PgShdescriptionToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, pg_shdescription, btree(objoid oid_ops, classoid oid_ops));
 
 /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */
 DECLARE_FOREIGN_KEY((classoid), pg_class, (oid));
diff --git a/src/include/catalog/pg_shseclabel.h b/src/include/catalog/pg_shseclabel.h
index 32b03de952..e252b75688 100644
--- a/src/include/catalog/pg_shseclabel.h
+++ b/src/include/catalog/pg_shseclabel.h
@@ -41,6 +41,6 @@ typedef FormData_pg_shseclabel * Form_pg_shseclabel;
 
 DECLARE_TOAST_WITH_MACRO(pg_shseclabel, 4060, 4061, PgShseclabelToastTable, PgShseclabelToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, on pg_shseclabel using btree(objoid oid_ops, classoid oid_ops, provider text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, pg_shseclabel, btree(objoid oid_ops, classoid oid_ops, provider text_ops));
 
 #endif							/* PG_SHSECLABEL_H */
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 8770c5b4c6..864cb54a51 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -136,7 +136,7 @@ typedef FormData_pg_statistic *Form_pg_statistic;
 
 DECLARE_TOAST(pg_statistic, 2840, 2841);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, 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, StatisticRelidAttnumInhIndexId, pg_statistic, btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
 
 DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h
index 53eec9025a..85e56feb80 100644
--- a/src/include/catalog/pg_statistic_ext.h
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -70,9 +70,9 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext;
 
 DECLARE_TOAST(pg_statistic_ext, 3439, 3440);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, on pg_statistic_ext using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops));
-DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, on pg_statistic_ext using btree(stxrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, pg_statistic_ext, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, pg_statistic_ext, btree(stxname name_ops, stxnamespace oid_ops));
+DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, pg_statistic_ext, btree(stxrelid oid_ops));
 
 DECLARE_ARRAY_FOREIGN_KEY((stxrelid, stxkeys), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_statistic_ext_data.h b/src/include/catalog/pg_statistic_ext_data.h
index 64d11a9c58..19a00705e6 100644
--- a/src/include/catalog/pg_statistic_ext_data.h
+++ b/src/include/catalog/pg_statistic_ext_data.h
@@ -54,7 +54,7 @@ typedef FormData_pg_statistic_ext_data *Form_pg_statistic_ext_data;
 
 DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, on pg_statistic_ext_data using btree(stxoid oid_ops, stxdinherit bool_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, pg_statistic_ext_data, btree(stxoid oid_ops, stxdinherit bool_ops));
 
 
 #endif							/* PG_STATISTIC_EXT_DATA_H */
diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h
index 1d40eebc78..be36c4a820 100644
--- a/src/include/catalog/pg_subscription.h
+++ b/src/include/catalog/pg_subscription.h
@@ -115,8 +115,8 @@ typedef FormData_pg_subscription *Form_pg_subscription;
 
 DECLARE_TOAST_WITH_MACRO(pg_subscription, 4183, 4184, PgSubscriptionToastTable, PgSubscriptionToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, on pg_subscription using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, on pg_subscription using btree(subdbid oid_ops, subname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, pg_subscription, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, pg_subscription, btree(subdbid oid_ops, subname name_ops));
 
 typedef struct Subscription
 {
diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h
index 60a2bcca23..f5324b710d 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_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, pg_subscription_rel, btree(srrelid oid_ops, srsubid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index ea1593d874..ea8665e83a 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -49,7 +49,7 @@ typedef FormData_pg_tablespace *Form_pg_tablespace;
 
 DECLARE_TOAST_WITH_MACRO(pg_tablespace, 4185, 4186, PgTablespaceToastTable, PgTablespaceToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, on pg_tablespace using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, on pg_tablespace using btree(spcname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, pg_tablespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, pg_tablespace, btree(spcname name_ops));
 
 #endif							/* PG_TABLESPACE_H */
diff --git a/src/include/catalog/pg_transform.h b/src/include/catalog/pg_transform.h
index 6273b0a491..8eb189784d 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_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, on pg_transform using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, on pg_transform using btree(trftype oid_ops, trflang oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, pg_transform, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, pg_transform, btree(trftype oid_ops, trflang oid_ops));
 
 #endif							/* PG_TRANSFORM_H */
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index 3679b0395f..61c9353fff 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -81,9 +81,9 @@ typedef FormData_pg_trigger *Form_pg_trigger;
 
 DECLARE_TOAST(pg_trigger, 2336, 2337);
 
-DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, TriggerConstraintIndexId, on pg_trigger using btree(tgconstraint oid_ops));
-DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, TriggerRelidNameIndexId, on pg_trigger using btree(tgrelid oid_ops, tgname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, TriggerOidIndexId, on pg_trigger using btree(oid oid_ops));
+DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, TriggerConstraintIndexId, pg_trigger, btree(tgconstraint oid_ops));
+DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, TriggerRelidNameIndexId, pg_trigger, btree(tgrelid oid_ops, tgname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, TriggerOidIndexId, pg_trigger, btree(oid oid_ops));
 
 DECLARE_ARRAY_FOREIGN_KEY((tgrelid, tgattr), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h
index aee0bf71af..e52720387d 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -47,7 +47,7 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId)
 
 typedef FormData_pg_ts_config *Form_pg_ts_config;
 
-DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, on pg_ts_config using btree(cfgname name_ops, cfgnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, on pg_ts_config using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, pg_ts_config, btree(cfgname name_ops, cfgnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, pg_ts_config, btree(oid oid_ops));
 
 #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 359368ecd6..91f092ca48 100644
--- a/src/include/catalog/pg_ts_config_map.h
+++ b/src/include/catalog/pg_ts_config_map.h
@@ -44,6 +44,6 @@ CATALOG(pg_ts_config_map,3603,TSConfigMapRelationId)
 
 typedef FormData_pg_ts_config_map *Form_pg_ts_config_map;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, 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, TSConfigMapIndexId, pg_ts_config_map, btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops));
 
 #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 476325f010..10a6490213 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -53,7 +53,7 @@ typedef FormData_pg_ts_dict *Form_pg_ts_dict;
 
 DECLARE_TOAST(pg_ts_dict, 4169, 4170);
 
-DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, on pg_ts_dict using btree(dictname name_ops, dictnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, on pg_ts_dict using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, pg_ts_dict, btree(dictname name_ops, dictnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, pg_ts_dict, btree(oid oid_ops));
 
 #endif							/* PG_TS_DICT_H */
diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h
index 283de252b4..57d9e8428a 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -54,7 +54,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId)
 
 typedef FormData_pg_ts_parser *Form_pg_ts_parser;
 
-DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, on pg_ts_parser using btree(prsname name_ops, prsnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, on pg_ts_parser using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, pg_ts_parser, btree(prsname name_ops, prsnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, pg_ts_parser, btree(oid oid_ops));
 
 #endif							/* PG_TS_PARSER_H */
diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h
index f4e510c8f9..f3bdc7b200 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -45,7 +45,7 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId)
 
 typedef FormData_pg_ts_template *Form_pg_ts_template;
 
-DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, on pg_ts_template using btree(tmplname name_ops, tmplnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, on pg_ts_template using btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, pg_ts_template, btree(tmplname name_ops, tmplnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, pg_ts_template, btree(oid oid_ops));
 
 #endif							/* PG_TS_TEMPLATE_H */
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 519e570c8c..508ba7b0f7 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -262,8 +262,8 @@ typedef FormData_pg_type *Form_pg_type;
 
 DECLARE_TOAST(pg_type, 4171, 4172);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, on pg_type using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, on pg_type using btree(typname name_ops, typnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, pg_type, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, pg_type, btree(typname name_ops, typnamespace oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index 528c94a7c4..eca33f4cb4 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -49,7 +49,7 @@ typedef FormData_pg_user_mapping *Form_pg_user_mapping;
 
 DECLARE_TOAST(pg_user_mapping, 4173, 4174);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, on pg_user_mapping using btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, on pg_user_mapping using btree(umuser oid_ops, umserver oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, pg_user_mapping, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, pg_user_mapping, btree(umuser oid_ops, umserver oid_ops));
 
 #endif							/* PG_USER_MAPPING_H */
-- 
2.40.1



  [text/plain] 0003-genbki.pl-Factor-out-boilerplate-generation.patch (3.8K, ../[email protected]/4-0003-genbki.pl-Factor-out-boilerplate-generation.patch)
  download | inline diff:
From 2fffa7e60cd46c820b2b8be90eeb1d3dc54eddc1 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 20:11:18 +0200
Subject: [PATCH 3/5] genbki.pl: Factor out boilerplate generation

---
 src/backend/catalog/genbki.pl | 84 ++++++++++++-----------------------
 1 file changed, 29 insertions(+), 55 deletions(-)

diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index c7657cc47c..851bae14f0 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -439,25 +439,8 @@
 	open my $def, '>', $def_file . $tmpext
 	  or die "can't open $def_file$tmpext: $!";
 
-	# Opening boilerplate for pg_*_d.h
-	printf $def <<EOM, $catname, $catname, uc $catname, uc $catname;
-/*-------------------------------------------------------------------------
- *
- * %s_d.h
- *    Macro definitions for %s
- *
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *  ******************************
- *  *** DO NOT EDIT THIS FILE! ***
- *  ******************************
- *
- *  It has been GENERATED by src/backend/catalog/genbki.pl
- *
- *-------------------------------------------------------------------------
- */
+	print_boilerplate($def, "${catname}_d.h", "Macro definitions for $catname");
+	printf $def <<EOM, uc $catname, uc $catname;
 #ifndef %s_D_H
 #define %s_D_H
 
@@ -705,25 +688,8 @@
 
 # Now generate schemapg.h
 
-# Opening boilerplate for schemapg.h
+print_boilerplate($schemapg, "schemapg.h", "Schema_pg_xxx macros for use by relcache.c");
 print $schemapg <<EOM;
-/*-------------------------------------------------------------------------
- *
- * schemapg.h
- *    Schema_pg_xxx macros for use by relcache.c
- *
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *  ******************************
- *  *** DO NOT EDIT THIS FILE! ***
- *  ******************************
- *
- *  It has been GENERATED by src/backend/catalog/genbki.pl
- *
- *-------------------------------------------------------------------------
- */
 #ifndef SCHEMAPG_H
 #define SCHEMAPG_H
 EOM
@@ -741,25 +707,9 @@
 
 # Now generate system_fk_info.h
 
-# Opening boilerplate for system_fk_info.h
+print_boilerplate($fk_info, "system_fk_info.h",
+	"Data about the foreign-key relationships in the system catalogs");
 print $fk_info <<EOM;
-/*-------------------------------------------------------------------------
- *
- * system_fk_info.h
- *    Data about the foreign-key relationships in the system catalogs
- *
- * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
- * Portions Copyright (c) 1994, Regents of the University of California
- *
- * NOTES
- *  ******************************
- *  *** DO NOT EDIT THIS FILE! ***
- *  ******************************
- *
- *  It has been GENERATED by src/backend/catalog/genbki.pl
- *
- *-------------------------------------------------------------------------
- */
 #ifndef SYSTEM_FK_INFO_H
 #define SYSTEM_FK_INFO_H
 
@@ -1121,6 +1071,30 @@ sub assign_next_oid
 	return $result;
 }
 
+sub print_boilerplate
+{
+	my ($fh, $fname, $descr) = @_;
+	printf $fh <<EOM, $fname, $descr;
+/*-------------------------------------------------------------------------
+ *
+ * %s
+ *    %s
+ *
+ * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * NOTES
+ *  ******************************
+ *  *** DO NOT EDIT THIS FILE! ***
+ *  ******************************
+ *
+ *  It has been GENERATED by src/backend/catalog/genbki.pl
+ *
+ *-------------------------------------------------------------------------
+ */
+EOM
+}
+
 sub usage
 {
 	die <<EOM;
-- 
2.40.1



  [text/plain] 0004-Generate-syscache-info-from-catalog-files.patch (72.0K, ../[email protected]/5-0004-Generate-syscache-info-from-catalog-files.patch)
  download | inline diff:
From d75a13dd8c32951f537966cf8efa93dcdc0a8bda Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 20:19:57 +0200
Subject: [PATCH 4/5] Generate syscache info from catalog files

DECLARE_UNIQUE_INDEX gets two additional arguments with the syscache
ID macro and the number of buckets.  From that, we can generate the
existing tables in syscache.h and syscache.c via genbki.pl.
---
 src/backend/catalog/.gitignore                |   2 +
 src/backend/catalog/Catalog.pm                |   6 +-
 src/backend/catalog/Makefile                  |   2 +-
 src/backend/catalog/genbki.pl                 |  55 ++
 src/backend/utils/cache/syscache.c            | 572 +-----------------
 src/include/catalog/.gitignore                |   2 +
 src/include/catalog/genbki.h                  |   7 +-
 src/include/catalog/meson.build               |  18 +-
 src/include/catalog/pg_aggregate.h            |   2 +-
 src/include/catalog/pg_am.h                   |   4 +-
 src/include/catalog/pg_amop.h                 |   4 +-
 src/include/catalog/pg_amproc.h               |   2 +-
 src/include/catalog/pg_attribute.h            |   4 +-
 src/include/catalog/pg_auth_members.h         |   4 +-
 src/include/catalog/pg_authid.h               |   4 +-
 src/include/catalog/pg_cast.h                 |   2 +-
 src/include/catalog/pg_class.h                |   4 +-
 src/include/catalog/pg_collation.h            |   4 +-
 src/include/catalog/pg_constraint.h           |   2 +-
 src/include/catalog/pg_conversion.h           |   6 +-
 src/include/catalog/pg_database.h             |   2 +-
 src/include/catalog/pg_default_acl.h          |   2 +-
 src/include/catalog/pg_enum.h                 |   4 +-
 src/include/catalog/pg_event_trigger.h        |   4 +-
 src/include/catalog/pg_foreign_data_wrapper.h |   4 +-
 src/include/catalog/pg_foreign_server.h       |   4 +-
 src/include/catalog/pg_foreign_table.h        |   2 +-
 src/include/catalog/pg_index.h                |   2 +-
 src/include/catalog/pg_language.h             |   4 +-
 src/include/catalog/pg_namespace.h            |   4 +-
 src/include/catalog/pg_opclass.h              |   4 +-
 src/include/catalog/pg_operator.h             |   4 +-
 src/include/catalog/pg_opfamily.h             |   4 +-
 src/include/catalog/pg_parameter_acl.h        |   4 +-
 src/include/catalog/pg_partitioned_table.h    |   2 +-
 src/include/catalog/pg_proc.h                 |   4 +-
 src/include/catalog/pg_publication.h          |   4 +-
 .../catalog/pg_publication_namespace.h        |   4 +-
 src/include/catalog/pg_publication_rel.h      |   4 +-
 src/include/catalog/pg_range.h                |   4 +-
 src/include/catalog/pg_replication_origin.h   |   4 +-
 src/include/catalog/pg_rewrite.h              |   2 +-
 src/include/catalog/pg_sequence.h             |   2 +-
 src/include/catalog/pg_statistic.h            |   2 +-
 src/include/catalog/pg_statistic_ext.h        |   4 +-
 src/include/catalog/pg_statistic_ext_data.h   |   2 +-
 src/include/catalog/pg_subscription.h         |   4 +-
 src/include/catalog/pg_subscription_rel.h     |   2 +-
 src/include/catalog/pg_tablespace.h           |   2 +-
 src/include/catalog/pg_transform.h            |   4 +-
 src/include/catalog/pg_ts_config.h            |   4 +-
 src/include/catalog/pg_ts_config_map.h        |   2 +-
 src/include/catalog/pg_ts_dict.h              |   4 +-
 src/include/catalog/pg_ts_parser.h            |   4 +-
 src/include/catalog/pg_ts_template.h          |   4 +-
 src/include/catalog/pg_type.h                 |   4 +-
 src/include/catalog/pg_user_mapping.h         |   4 +-
 src/include/utils/syscache.h                  |  98 +--
 src/tools/pginclude/cpluspluscheck            |   5 +
 src/tools/pginclude/headerscheck              |   5 +
 60 files changed, 186 insertions(+), 752 deletions(-)

diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore
index 237ff54165..ff65560379 100644
--- a/src/backend/catalog/.gitignore
+++ b/src/backend/catalog/.gitignore
@@ -1,5 +1,7 @@
 /postgres.bki
 /schemapg.h
+/syscache_info.c.h
+/syscache_info.h
 /system_fk_info.h
 /system_constraints.sql
 /pg_*_d.h
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index a727d692b7..89c2a0a7b8 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -110,7 +110,7 @@ sub ParseHeader
 			  };
 		}
 		elsif (
-			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(\w+),\s*(.+)\)/
+			/^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(\w+),\s*(\w+\s*\([\w\s,]+\))(?:,\s*(\w+),\s*(\w+))?\)/
 		  )
 		{
 			push @{ $catalog{indexing} },
@@ -121,7 +121,9 @@ sub ParseHeader
 				index_oid => $4,
 				index_oid_macro => $5,
 				table_name => $6,
-				index_decl => $7
+				index_decl => $7,
+				syscache_name => $8,
+				syscache_nbuckets => $9,
 			  };
 		}
 		elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/)
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile
index a60107bf94..0dfefae28e 100644
--- a/src/backend/catalog/Makefile
+++ b/src/backend/catalog/Makefile
@@ -74,7 +74,7 @@ CATALOG_HEADERS := \
 	pg_sequence.h pg_publication.h pg_publication_namespace.h \
 	pg_publication_rel.h pg_subscription.h pg_subscription_rel.h
 
-GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h system_fk_info.h
+GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h syscache_info.h syscache_info.c.h system_fk_info.h
 
 POSTGRES_BKI_SRCS := $(addprefix $(top_srcdir)/src/include/catalog/, $(CATALOG_HEADERS))
 
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 851bae14f0..80a7828d6c 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -56,6 +56,7 @@
 my %catalog_data;
 my @toast_decls;
 my @index_decls;
+my %syscaches;
 my %oidcounts;
 my @system_constraints;
 
@@ -150,6 +151,21 @@
 			  $index->{is_pkey} ? "PRIMARY KEY" : "UNIQUE",
 			  $index->{index_name};
 		}
+
+		if ($index->{syscache_name})
+		{
+			my $tbl = $index->{table_name};
+			my $key = $index->{index_decl};
+			$key =~ s/^\w+\(//;
+			$key =~ s/\)$//;
+			$key =~ s/(\w+)\s+\w+/Anum_${tbl}_$1/g;
+			$syscaches{$index->{syscache_name}} = {
+				table_oid_macro => $catalogs{$tbl}->{relation_oid_macro},
+				index_oid_macro => $index->{index_oid_macro},
+				key => $key,
+				nbuckets => $index->{syscache_nbuckets},
+			};
+		}
 	}
 }
 
@@ -419,6 +435,12 @@
 my $constraints_file = $output_path . 'system_constraints.sql';
 open my $constraints, '>', $constraints_file . $tmpext
   or die "can't open $constraints_file$tmpext: $!";
+my $syscache_info_h = $output_path . 'syscache_info.h';
+open my $syscache_info_h_fh, '>', $syscache_info_h . $tmpext
+  or die "can't open $syscache_info_h$tmpext: $!";
+my $syscache_info_c = $output_path . 'syscache_info.c.h';
+open my $syscache_info_c_fh, '>', $syscache_info_c . $tmpext
+  or die "can't open $syscache_info_c$tmpext: $!";
 
 # Generate postgres.bki and pg_*_d.h headers.
 
@@ -751,17 +773,50 @@
 # Closing boilerplate for system_fk_info.h
 print $fk_info "};\n\n#endif\t\t\t\t\t\t\t/* SYSTEM_FK_INFO_H */\n";
 
+# Now generate syscache_info
+
+print_boilerplate($syscache_info_h_fh, "syscache_info.h", "SysCache identifiers");
+print $syscache_info_h_fh "enum SysCacheIdentifier
+{
+";
+
+print_boilerplate($syscache_info_c_fh, "syscache_info.c.h", "SysCache definitions");
+print $syscache_info_c_fh "static const struct cachedesc cacheinfo[] = {\n";
+
+my $last_syscache;
+foreach my $syscache (sort keys %syscaches)
+{
+	print $syscache_info_h_fh "\t$syscache,\n";
+	$last_syscache = $syscache;
+
+	print $syscache_info_c_fh "\t[$syscache] = {\n";
+	print $syscache_info_c_fh "\t\t", $syscaches{$syscache}{table_oid_macro}, ",\n";
+	print $syscache_info_c_fh "\t\t", $syscaches{$syscache}{index_oid_macro}, ",\n";
+	print $syscache_info_c_fh "\t\tKEY(", $syscaches{$syscache}{key}, "),\n";
+	print $syscache_info_c_fh "\t\t", $syscaches{$syscache}{nbuckets}, "\n";
+	print $syscache_info_c_fh "\t},\n";
+}
+
+print $syscache_info_h_fh "};\n";
+print $syscache_info_h_fh "#define SysCacheSize ($last_syscache + 1)\n";
+
+print $syscache_info_c_fh "};\n";
+
 # We're done emitting data
 close $bki;
 close $schemapg;
 close $fk_info;
 close $constraints;
+close $syscache_info_h_fh;
+close $syscache_info_c_fh;
 
 # Finally, rename the completed files into place.
 Catalog::RenameTempFile($bkifile, $tmpext);
 Catalog::RenameTempFile($schemafile, $tmpext);
 Catalog::RenameTempFile($fk_info_file, $tmpext);
 Catalog::RenameTempFile($constraints_file, $tmpext);
+Catalog::RenameTempFile($syscache_info_h, $tmpext);
+Catalog::RenameTempFile($syscache_info_c, $tmpext);
 
 exit($num_errors != 0 ? 1 : 0);
 
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c
index 4e4a34bde8..6daa81ca83 100644
--- a/src/backend/utils/cache/syscache.c
+++ b/src/backend/utils/cache/syscache.c
@@ -85,18 +85,6 @@
 
 	Adding system caches:
 
-	Add your new cache to the list in include/utils/syscache.h.
-	Keep the list sorted alphabetically.
-
-	Add your entry to the cacheinfo[] array below. All cache lists are
-	alphabetical, so add it in the proper place.  Specify the relation OID,
-	index OID, number of keys, key attribute numbers, and initial number of
-	hash buckets.
-
-	The number of hash buckets must be a power of 2.  It's reasonable to
-	set this to the number of entries that might be in the particular cache
-	in a medium-size database.
-
 	There must be a unique index underlying each syscache (ie, an index
 	whose key is the same as that of the cache).  If there is not one
 	already, add the definition for it to include/catalog/pg_*.h using
@@ -104,6 +92,13 @@
 	(Adding an index requires a catversion.h update, while simply
 	adding/deleting caches only requires a recompile.)
 
+	Then add the name of your name cache and the initial number of hash
+	buckets as arguments of DECLARE_UNIQUE_INDEX.
+
+	The number of hash buckets must be a power of 2.  It's reasonable to
+	set this to the number of entries that might be in the particular cache
+	in a medium-size database.
+
 	Finally, any place your relation gets heap_insert() or
 	heap_update() calls, use CatalogTupleInsert() or CatalogTupleUpdate()
 	instead, which also update indexes.  The heap_* calls do not do that.
@@ -126,558 +121,7 @@ struct cachedesc
 /* Macro to provide nkeys and key array with convenient syntax. */
 #define KEY(...) VA_ARGS_NARGS(__VA_ARGS__), { __VA_ARGS__ }
 
-static const struct cachedesc cacheinfo[] = {
-	[AGGFNOID] = {
-		AggregateRelationId,
-		AggregateFnoidIndexId,
-		KEY(Anum_pg_aggregate_aggfnoid),
-		16
-	},
-	[AMNAME] = {
-		AccessMethodRelationId,
-		AmNameIndexId,
-		KEY(Anum_pg_am_amname),
-		4
-	},
-	[AMOID] = {
-		AccessMethodRelationId,
-		AmOidIndexId,
-		KEY(Anum_pg_am_oid),
-		4
-	},
-	[AMOPOPID] = {
-		AccessMethodOperatorRelationId,
-		AccessMethodOperatorIndexId,
-		KEY(Anum_pg_amop_amopopr,
-			Anum_pg_amop_amoppurpose,
-			Anum_pg_amop_amopfamily),
-		64
-	},
-	[AMOPSTRATEGY] = {
-		AccessMethodOperatorRelationId,
-		AccessMethodStrategyIndexId,
-		KEY(Anum_pg_amop_amopfamily,
-			Anum_pg_amop_amoplefttype,
-			Anum_pg_amop_amoprighttype,
-			Anum_pg_amop_amopstrategy),
-		64
-	},
-	[AMPROCNUM] = {
-		AccessMethodProcedureRelationId,
-		AccessMethodProcedureIndexId,
-		KEY(Anum_pg_amproc_amprocfamily,
-			Anum_pg_amproc_amproclefttype,
-			Anum_pg_amproc_amprocrighttype,
-			Anum_pg_amproc_amprocnum),
-		16
-	},
-	[ATTNAME] = {
-		AttributeRelationId,
-		AttributeRelidNameIndexId,
-		KEY(Anum_pg_attribute_attrelid,
-			Anum_pg_attribute_attname),
-		32
-	},
-	[ATTNUM] = {
-		AttributeRelationId,
-		AttributeRelidNumIndexId,
-		KEY(Anum_pg_attribute_attrelid,
-			Anum_pg_attribute_attnum),
-		128
-	},
-	[AUTHMEMMEMROLE] = {
-		AuthMemRelationId,
-		AuthMemMemRoleIndexId,
-		KEY(Anum_pg_auth_members_member,
-			Anum_pg_auth_members_roleid,
-			Anum_pg_auth_members_grantor),
-		8
-	},
-	[AUTHMEMROLEMEM] = {
-		AuthMemRelationId,
-		AuthMemRoleMemIndexId,
-		KEY(Anum_pg_auth_members_roleid,
-			Anum_pg_auth_members_member,
-			Anum_pg_auth_members_grantor),
-		8
-	},
-	[AUTHNAME] = {
-		AuthIdRelationId,
-		AuthIdRolnameIndexId,
-		KEY(Anum_pg_authid_rolname),
-		8
-	},
-	[AUTHOID] = {
-		AuthIdRelationId,
-		AuthIdOidIndexId,
-		KEY(Anum_pg_authid_oid),
-		8
-	},
-	[CASTSOURCETARGET] = {
-		CastRelationId,
-		CastSourceTargetIndexId,
-		KEY(Anum_pg_cast_castsource,
-			Anum_pg_cast_casttarget),
-		256
-	},
-	[CLAAMNAMENSP] = {
-		OperatorClassRelationId,
-		OpclassAmNameNspIndexId,
-		KEY(Anum_pg_opclass_opcmethod,
-			Anum_pg_opclass_opcname,
-			Anum_pg_opclass_opcnamespace),
-		8
-	},
-	[CLAOID] = {
-		OperatorClassRelationId,
-		OpclassOidIndexId,
-		KEY(Anum_pg_opclass_oid),
-		8
-	},
-	[COLLNAMEENCNSP] = {
-		CollationRelationId,
-		CollationNameEncNspIndexId,
-		KEY(Anum_pg_collation_collname,
-			Anum_pg_collation_collencoding,
-			Anum_pg_collation_collnamespace),
-		8
-	},
-	[COLLOID] = {
-		CollationRelationId,
-		CollationOidIndexId,
-		KEY(Anum_pg_collation_oid),
-		8
-	},
-	[CONDEFAULT] = {
-		ConversionRelationId,
-		ConversionDefaultIndexId,
-		KEY(Anum_pg_conversion_connamespace,
-			Anum_pg_conversion_conforencoding,
-			Anum_pg_conversion_contoencoding,
-			Anum_pg_conversion_oid),
-		8
-	},
-	[CONNAMENSP] = {
-		ConversionRelationId,
-		ConversionNameNspIndexId,
-		KEY(Anum_pg_conversion_conname,
-			Anum_pg_conversion_connamespace),
-		8
-	},
-	[CONSTROID] = {
-		ConstraintRelationId,
-		ConstraintOidIndexId,
-		KEY(Anum_pg_constraint_oid),
-		16
-	},
-	[CONVOID] = {
-		ConversionRelationId,
-		ConversionOidIndexId,
-		KEY(Anum_pg_conversion_oid),
-		8
-	},
-	[DATABASEOID] = {
-		DatabaseRelationId,
-		DatabaseOidIndexId,
-		KEY(Anum_pg_database_oid),
-		4
-	},
-	[DEFACLROLENSPOBJ] = {
-		DefaultAclRelationId,
-		DefaultAclRoleNspObjIndexId,
-		KEY(Anum_pg_default_acl_defaclrole,
-			Anum_pg_default_acl_defaclnamespace,
-			Anum_pg_default_acl_defaclobjtype),
-		8
-	},
-	[ENUMOID] = {
-		EnumRelationId,
-		EnumOidIndexId,
-		KEY(Anum_pg_enum_oid),
-		8
-	},
-	[ENUMTYPOIDNAME] = {
-		EnumRelationId,
-		EnumTypIdLabelIndexId,
-		KEY(Anum_pg_enum_enumtypid,
-			Anum_pg_enum_enumlabel),
-		8
-	},
-	[EVENTTRIGGERNAME] = {
-		EventTriggerRelationId,
-		EventTriggerNameIndexId,
-		KEY(Anum_pg_event_trigger_evtname),
-		8
-	},
-	[EVENTTRIGGEROID] = {
-		EventTriggerRelationId,
-		EventTriggerOidIndexId,
-		KEY(Anum_pg_event_trigger_oid),
-		8
-	},
-	[FOREIGNDATAWRAPPERNAME] = {
-		ForeignDataWrapperRelationId,
-		ForeignDataWrapperNameIndexId,
-		KEY(Anum_pg_foreign_data_wrapper_fdwname),
-		2
-	},
-	[FOREIGNDATAWRAPPEROID] = {
-		ForeignDataWrapperRelationId,
-		ForeignDataWrapperOidIndexId,
-		KEY(Anum_pg_foreign_data_wrapper_oid),
-		2
-	},
-	[FOREIGNSERVERNAME] = {
-		ForeignServerRelationId,
-		ForeignServerNameIndexId,
-		KEY(Anum_pg_foreign_server_srvname),
-		2
-	},
-	[FOREIGNSERVEROID] = {
-		ForeignServerRelationId,
-		ForeignServerOidIndexId,
-		KEY(Anum_pg_foreign_server_oid),
-		2
-	},
-	[FOREIGNTABLEREL] = {
-		ForeignTableRelationId,
-		ForeignTableRelidIndexId,
-		KEY(Anum_pg_foreign_table_ftrelid),
-		4
-	},
-	[INDEXRELID] = {
-		IndexRelationId,
-		IndexRelidIndexId,
-		KEY(Anum_pg_index_indexrelid),
-		64
-	},
-	[LANGNAME] = {
-		LanguageRelationId,
-		LanguageNameIndexId,
-		KEY(Anum_pg_language_lanname),
-		4
-	},
-	[LANGOID] = {
-		LanguageRelationId,
-		LanguageOidIndexId,
-		KEY(Anum_pg_language_oid),
-		4
-	},
-	[NAMESPACENAME] = {
-		NamespaceRelationId,
-		NamespaceNameIndexId,
-		KEY(Anum_pg_namespace_nspname),
-		4
-	},
-	[NAMESPACEOID] = {
-		NamespaceRelationId,
-		NamespaceOidIndexId,
-		KEY(Anum_pg_namespace_oid),
-		16
-	},
-	[OPERNAMENSP] = {
-		OperatorRelationId,
-		OperatorNameNspIndexId,
-		KEY(Anum_pg_operator_oprname,
-			Anum_pg_operator_oprleft,
-			Anum_pg_operator_oprright,
-			Anum_pg_operator_oprnamespace),
-		256
-	},
-	[OPEROID] = {
-		OperatorRelationId,
-		OperatorOidIndexId,
-		KEY(Anum_pg_operator_oid),
-		32
-	},
-	[OPFAMILYAMNAMENSP] = {
-		OperatorFamilyRelationId,
-		OpfamilyAmNameNspIndexId,
-		KEY(Anum_pg_opfamily_opfmethod,
-			Anum_pg_opfamily_opfname,
-			Anum_pg_opfamily_opfnamespace),
-		8
-	},
-	[OPFAMILYOID] = {
-		OperatorFamilyRelationId,
-		OpfamilyOidIndexId,
-		KEY(Anum_pg_opfamily_oid),
-		8
-	},
-	[PARAMETERACLNAME] = {
-		ParameterAclRelationId,
-		ParameterAclParnameIndexId,
-		KEY(Anum_pg_parameter_acl_parname),
-		4
-	},
-	[PARAMETERACLOID] = {
-		ParameterAclRelationId,
-		ParameterAclOidIndexId,
-		KEY(Anum_pg_parameter_acl_oid),
-		4
-	},
-	[PARTRELID] = {
-		PartitionedRelationId,
-		PartitionedRelidIndexId,
-		KEY(Anum_pg_partitioned_table_partrelid),
-		32
-	},
-	[PROCNAMEARGSNSP] = {
-		ProcedureRelationId,
-		ProcedureNameArgsNspIndexId,
-		KEY(Anum_pg_proc_proname,
-			Anum_pg_proc_proargtypes,
-			Anum_pg_proc_pronamespace),
-		128
-	},
-	[PROCOID] = {
-		ProcedureRelationId,
-		ProcedureOidIndexId,
-		KEY(Anum_pg_proc_oid),
-		128
-	},
-	[PUBLICATIONNAME] = {
-		PublicationRelationId,
-		PublicationNameIndexId,
-		KEY(Anum_pg_publication_pubname),
-		8
-	},
-	[PUBLICATIONNAMESPACE] = {
-		PublicationNamespaceRelationId,
-		PublicationNamespaceObjectIndexId,
-		KEY(Anum_pg_publication_namespace_oid),
-		64
-	},
-	[PUBLICATIONNAMESPACEMAP] = {
-		PublicationNamespaceRelationId,
-		PublicationNamespacePnnspidPnpubidIndexId,
-		KEY(Anum_pg_publication_namespace_pnnspid,
-			Anum_pg_publication_namespace_pnpubid),
-		64
-	},
-	[PUBLICATIONOID] = {
-		PublicationRelationId,
-		PublicationObjectIndexId,
-		KEY(Anum_pg_publication_oid),
-		8
-	},
-	[PUBLICATIONREL] = {
-		PublicationRelRelationId,
-		PublicationRelObjectIndexId,
-		KEY(Anum_pg_publication_rel_oid),
-		64
-	},
-	[PUBLICATIONRELMAP] = {
-		PublicationRelRelationId,
-		PublicationRelPrrelidPrpubidIndexId,
-		KEY(Anum_pg_publication_rel_prrelid,
-			Anum_pg_publication_rel_prpubid),
-		64
-	},
-	[RANGEMULTIRANGE] = {
-		RangeRelationId,
-		RangeMultirangeTypidIndexId,
-		KEY(Anum_pg_range_rngmultitypid),
-		4
-	},
-	[RANGETYPE] = {
-		RangeRelationId,
-		RangeTypidIndexId,
-		KEY(Anum_pg_range_rngtypid),
-		4
-	},
-	[RELNAMENSP] = {
-		RelationRelationId,
-		ClassNameNspIndexId,
-		KEY(Anum_pg_class_relname,
-			Anum_pg_class_relnamespace),
-		128
-	},
-	[RELOID] = {
-		RelationRelationId,
-		ClassOidIndexId,
-		KEY(Anum_pg_class_oid),
-		128
-	},
-	[REPLORIGIDENT] = {
-		ReplicationOriginRelationId,
-		ReplicationOriginIdentIndex,
-		KEY(Anum_pg_replication_origin_roident),
-		16
-	},
-	[REPLORIGNAME] = {
-		ReplicationOriginRelationId,
-		ReplicationOriginNameIndex,
-		KEY(Anum_pg_replication_origin_roname),
-		16
-	},
-	[RULERELNAME] = {
-		RewriteRelationId,
-		RewriteRelRulenameIndexId,
-		KEY(Anum_pg_rewrite_ev_class,
-			Anum_pg_rewrite_rulename),
-		8
-	},
-	[SEQRELID] = {
-		SequenceRelationId,
-		SequenceRelidIndexId,
-		KEY(Anum_pg_sequence_seqrelid),
-		32
-	},
-	[STATEXTDATASTXOID] = {
-		StatisticExtDataRelationId,
-		StatisticExtDataStxoidInhIndexId,
-		KEY(Anum_pg_statistic_ext_data_stxoid,
-			Anum_pg_statistic_ext_data_stxdinherit),
-		4
-	},
-	[STATEXTNAMENSP] = {
-		StatisticExtRelationId,
-		StatisticExtNameIndexId,
-		KEY(Anum_pg_statistic_ext_stxname,
-			Anum_pg_statistic_ext_stxnamespace),
-		4
-	},
-	[STATEXTOID] = {
-		StatisticExtRelationId,
-		StatisticExtOidIndexId,
-		KEY(Anum_pg_statistic_ext_oid),
-		4
-	},
-	[STATRELATTINH] = {
-		StatisticRelationId,
-		StatisticRelidAttnumInhIndexId,
-		KEY(Anum_pg_statistic_starelid,
-			Anum_pg_statistic_staattnum,
-			Anum_pg_statistic_stainherit),
-		128
-	},
-	[SUBSCRIPTIONNAME] = {
-		SubscriptionRelationId,
-		SubscriptionNameIndexId,
-		KEY(Anum_pg_subscription_subdbid,
-			Anum_pg_subscription_subname),
-		4
-	},
-	[SUBSCRIPTIONOID] = {
-		SubscriptionRelationId,
-		SubscriptionObjectIndexId,
-		KEY(Anum_pg_subscription_oid),
-		4
-	},
-	[SUBSCRIPTIONRELMAP] = {
-		SubscriptionRelRelationId,
-		SubscriptionRelSrrelidSrsubidIndexId,
-		KEY(Anum_pg_subscription_rel_srrelid,
-			Anum_pg_subscription_rel_srsubid),
-		64
-	},
-	[TABLESPACEOID] = {
-		TableSpaceRelationId,
-		TablespaceOidIndexId,
-		KEY(Anum_pg_tablespace_oid),
-		4
-	},
-	[TRFOID] = {
-		TransformRelationId,
-		TransformOidIndexId,
-		KEY(Anum_pg_transform_oid),
-		16
-	},
-	[TRFTYPELANG] = {
-		TransformRelationId,
-		TransformTypeLangIndexId,
-		KEY(Anum_pg_transform_trftype,
-			Anum_pg_transform_trflang),
-		16
-	},
-	[TSCONFIGMAP] = {
-		TSConfigMapRelationId,
-		TSConfigMapIndexId,
-		KEY(Anum_pg_ts_config_map_mapcfg,
-			Anum_pg_ts_config_map_maptokentype,
-			Anum_pg_ts_config_map_mapseqno),
-		2
-	},
-	[TSCONFIGNAMENSP] = {
-		TSConfigRelationId,
-		TSConfigNameNspIndexId,
-		KEY(Anum_pg_ts_config_cfgname,
-			Anum_pg_ts_config_cfgnamespace),
-		2
-	},
-	[TSCONFIGOID] = {
-		TSConfigRelationId,
-		TSConfigOidIndexId,
-		KEY(Anum_pg_ts_config_oid),
-		2
-	},
-	[TSDICTNAMENSP] = {
-		TSDictionaryRelationId,
-		TSDictionaryNameNspIndexId,
-		KEY(Anum_pg_ts_dict_dictname,
-			Anum_pg_ts_dict_dictnamespace),
-		2
-	},
-	[TSDICTOID] = {
-		TSDictionaryRelationId,
-		TSDictionaryOidIndexId,
-		KEY(Anum_pg_ts_dict_oid),
-		2
-	},
-	[TSPARSERNAMENSP] = {
-		TSParserRelationId,
-		TSParserNameNspIndexId,
-		KEY(Anum_pg_ts_parser_prsname,
-			Anum_pg_ts_parser_prsnamespace),
-		2
-	},
-	[TSPARSEROID] = {
-		TSParserRelationId,
-		TSParserOidIndexId,
-		KEY(Anum_pg_ts_parser_oid),
-		2
-	},
-	[TSTEMPLATENAMENSP] = {
-		TSTemplateRelationId,
-		TSTemplateNameNspIndexId,
-		KEY(Anum_pg_ts_template_tmplname,
-			Anum_pg_ts_template_tmplnamespace),
-		2
-	},
-	[TSTEMPLATEOID] = {
-		TSTemplateRelationId,
-		TSTemplateOidIndexId,
-		KEY(Anum_pg_ts_template_oid),
-		2
-	},
-	[TYPENAMENSP] = {
-		TypeRelationId,
-		TypeNameNspIndexId,
-		KEY(Anum_pg_type_typname,
-			Anum_pg_type_typnamespace),
-		64
-	},
-	[TYPEOID] = {
-		TypeRelationId,
-		TypeOidIndexId,
-		KEY(Anum_pg_type_oid),
-		64
-	},
-	[USERMAPPINGOID] = {
-		UserMappingRelationId,
-		UserMappingOidIndexId,
-		KEY(Anum_pg_user_mapping_oid),
-		2
-	},
-	[USERMAPPINGUSERSERVER] = {
-		UserMappingRelationId,
-		UserMappingUserServerIndexId,
-		KEY(Anum_pg_user_mapping_umuser,
-			Anum_pg_user_mapping_umserver),
-		2
-	}
-};
+#include "catalog/syscache_info.c.h"
 
 StaticAssertDecl(lengthof(cacheinfo) == SysCacheSize,
 				 "SysCacheSize does not match syscache.c's array");
diff --git a/src/include/catalog/.gitignore b/src/include/catalog/.gitignore
index 6b83d4c7e6..f7ddf2554b 100644
--- a/src/include/catalog/.gitignore
+++ b/src/include/catalog/.gitignore
@@ -1,4 +1,6 @@
 /schemapg.h
+/syscache_info.c.h
+/syscache_info.h
 /system_fk_info.h
 /pg_*_d.h
 /header-stamp
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index e22a6902fb..2d5bd38cde 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -77,13 +77,14 @@
  * is the name of a #define to generate for its OID.  References to the index
  * in the C code should always use these #defines, not the actual index name
  * (much less the numeric OID).  The fourth argument is the table name.  The
- * rest is much like a standard 'create index' SQL command.
+ * decl argument is much like a standard 'create index' SQL command.
+ * Optionally, specify the syscache ID and bucket size.
  *
  * The macro definitions are just to keep the C compiler from spitting up.
  */
 #define DECLARE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable
-#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,tblname,decl) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,tblname,decl,...) extern int no_such_variable
+#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,tblname,decl,...) extern int no_such_variable
 
 /*
  * These lines inform genbki.pl about manually-assigned OIDs that do not
diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build
index 3179be09d3..1fa22d925d 100644
--- a/src/include/catalog/meson.build
+++ b/src/include/catalog/meson.build
@@ -97,8 +97,22 @@ bki_data_f = files(bki_data)
 
 
 input = []
-output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h']
-output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog']
+output_files = [
+  'postgres.bki',
+  'system_constraints.sql',
+  'schemapg.h',
+  'syscache_info.c.h',
+  'syscache_info.h',
+  'system_fk_info.h',
+]
+output_install = [
+  dir_data,
+  dir_data,
+  dir_include_server / 'catalog',
+  false,
+  dir_include_server / 'catalog',
+  dir_include_server / 'catalog',
+]
 
 foreach h : catalog_headers
   fname = h.split('.h')[0] + '_d.h'
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 085149e258..e6f6f4ccb5 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_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, pg_aggregate, btree(aggfnoid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, pg_aggregate, btree(aggfnoid oid_ops), AGGFNOID, 16);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index d5314bb38b..e3a1313e6c 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -47,8 +47,8 @@ CATALOG(pg_am,2601,AccessMethodRelationId)
  */
 typedef FormData_pg_am *Form_pg_am;
 
-DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, pg_am, btree(amname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, pg_am, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, pg_am, btree(amname name_ops), AMNAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, pg_am, btree(oid oid_ops), AMOID, 4);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index c9bb7b4787..3449166507 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -87,8 +87,8 @@ CATALOG(pg_amop,2602,AccessMethodOperatorRelationId)
  */
 typedef FormData_pg_amop *Form_pg_amop;
 
-DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, pg_amop, btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));
-DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, pg_amop, btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));
+DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, pg_amop, btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops), AMOPSTRATEGY, 64);
+DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, pg_amop, btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops), AMOPOPID, 64);
 DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, pg_amop, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 5acf4efab9..31e67be344 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -67,7 +67,7 @@ CATALOG(pg_amproc,2603,AccessMethodProcedureRelationId)
  */
 typedef FormData_pg_amproc *Form_pg_amproc;
 
-DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, pg_amproc, btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops));
+DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, pg_amproc, btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops), AMPROCNUM, 16);
 DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, pg_amproc, btree(oid oid_ops));
 
 #endif							/* PG_AMPROC_H */
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index f0d6de7c1f..9e99237f56 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -208,8 +208,8 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75,
  */
 typedef FormData_pg_attribute *Form_pg_attribute;
 
-DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops));
+DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops), ATTNAME, 32);
+DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops), ATTNUM, 128);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h
index 4ab8a9f7b7..37104cf20f 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -46,8 +46,8 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_
 typedef FormData_pg_auth_members *Form_pg_auth_members;
 
 DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, pg_auth_members, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, pg_auth_members, btree(roleid oid_ops, member oid_ops, grantor oid_ops));
-DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, pg_auth_members, btree(member oid_ops, roleid oid_ops, grantor oid_ops));
+DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, pg_auth_members, btree(roleid oid_ops, member oid_ops, grantor oid_ops), AUTHMEMROLEMEM, 8);
+DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, pg_auth_members, btree(member oid_ops, roleid oid_ops, grantor oid_ops), AUTHMEMMEMROLE, 8);
 DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, pg_auth_members, btree(grantor oid_ops));
 
 #endif							/* PG_AUTH_MEMBERS_H */
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index 0e7ddc56ea..748ab95fad 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -57,7 +57,7 @@ typedef FormData_pg_authid *Form_pg_authid;
 
 DECLARE_TOAST_WITH_MACRO(pg_authid, 4175, 4176, PgAuthidToastTable, PgAuthidToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops), AUTHNAME, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops), AUTHOID, 8);
 
 #endif							/* PG_AUTHID_H */
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index a2518388b3..32235776ce 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -57,7 +57,7 @@ CATALOG(pg_cast,2605,CastRelationId)
 typedef FormData_pg_cast *Form_pg_cast;
 
 DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, pg_cast, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, pg_cast, btree(castsource oid_ops, casttarget oid_ops));
+DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, pg_cast, btree(castsource oid_ops, casttarget oid_ops), CASTSOURCETARGET, 256);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 55dcd54100..52edbf0229 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -152,8 +152,8 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat
  */
 typedef FormData_pg_class *Form_pg_class;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, pg_class, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, pg_class, btree(relname name_ops, relnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, pg_class, btree(oid oid_ops), RELOID, 128);
+DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, pg_class, btree(relname name_ops, relnamespace oid_ops), RELNAMENSP, 128);
 DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, pg_class, btree(reltablespace oid_ops, relfilenode oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h
index 2d7dcde183..6cf59f479a 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -59,8 +59,8 @@ typedef FormData_pg_collation *Form_pg_collation;
 
 DECLARE_TOAST(pg_collation, 6175, 6176);
 
-DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, pg_collation, btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, pg_collation, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, pg_collation, btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops), COLLNAMEENCNSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, pg_collation, btree(oid oid_ops), COLLOID, 8);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index 0d47c9b589..de1b7bcd57 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -169,7 +169,7 @@ DECLARE_TOAST(pg_constraint, 2832, 2833);
 DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, pg_constraint, btree(conname name_ops, connamespace oid_ops));
 DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, pg_constraint, btree(conrelid oid_ops, contypid oid_ops, conname name_ops));
 DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, pg_constraint, btree(contypid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, pg_constraint, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, pg_constraint, btree(oid oid_ops), CONSTROID, 16);
 DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, pg_constraint, btree(conparentid oid_ops));
 
 /* conkey can contain zero (InvalidAttrNumber) if a whole-row Var is used */
diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h
index 42847fdf12..acd944a4ae 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -60,9 +60,9 @@ CATALOG(pg_conversion,2607,ConversionRelationId)
  */
 typedef FormData_pg_conversion *Form_pg_conversion;
 
-DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, pg_conversion, btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, pg_conversion, btree(conname name_ops, connamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, pg_conversion, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, pg_conversion, btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops), CONDEFAULT, 8);
+DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, pg_conversion, btree(conname name_ops, connamespace oid_ops), CONNAMENSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, pg_conversion, btree(oid oid_ops), CONVOID, 8);
 
 
 extern ObjectAddress ConversionCreate(const char *conname, Oid connamespace,
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index 44e2ed73cf..1eceb52174 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -92,7 +92,7 @@ typedef FormData_pg_database *Form_pg_database;
 DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDatabaseToastIndex);
 
 DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, pg_database, btree(datname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, pg_database, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, pg_database, btree(oid oid_ops), DATABASEOID, 4);
 
 /*
  * pg_database.dat contains an entry for template1, but not for the template0
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index 803ce3eab8..b526af26a6 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -51,7 +51,7 @@ typedef FormData_pg_default_acl *Form_pg_default_acl;
 
 DECLARE_TOAST(pg_default_acl, 4143, 4144);
 
-DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, pg_default_acl, btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops));
+DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, pg_default_acl, btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops), DEFACLROLENSPOBJ, 8);
 DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, pg_default_acl, btree(oid oid_ops));
 
 #ifdef EXPOSE_TO_CLIENT_CODE
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index c483cb1042..4ea20aeabe 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -43,8 +43,8 @@ CATALOG(pg_enum,3501,EnumRelationId)
  */
 typedef FormData_pg_enum *Form_pg_enum;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, pg_enum, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, pg_enum, btree(enumtypid oid_ops, enumlabel name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, pg_enum, btree(oid oid_ops), ENUMOID, 8);
+DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, pg_enum, btree(enumtypid oid_ops, enumlabel name_ops), ENUMTYPOIDNAME, 8);
 DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, pg_enum, btree(enumtypid oid_ops, enumsortorder float4_ops));
 
 /*
diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h
index 0ec42edff6..ca1c5bd728 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -51,7 +51,7 @@ typedef FormData_pg_event_trigger *Form_pg_event_trigger;
 
 DECLARE_TOAST(pg_event_trigger, 4145, 4146);
 
-DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, pg_event_trigger, btree(evtname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, pg_event_trigger, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, pg_event_trigger, btree(evtname name_ops), EVENTTRIGGERNAME, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, pg_event_trigger, btree(oid oid_ops), EVENTTRIGGEROID, 8);
 
 #endif							/* PG_EVENT_TRIGGER_H */
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index 37387f9355..8674eb261a 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -52,7 +52,7 @@ typedef FormData_pg_foreign_data_wrapper *Form_pg_foreign_data_wrapper;
 
 DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, pg_foreign_data_wrapper, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, pg_foreign_data_wrapper, btree(fdwname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, pg_foreign_data_wrapper, btree(oid oid_ops), FOREIGNDATAWRAPPEROID, 2);
+DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, pg_foreign_data_wrapper, btree(fdwname name_ops), FOREIGNDATAWRAPPERNAME, 2);
 
 #endif							/* PG_FOREIGN_DATA_WRAPPER_H */
diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index 5993967c6e..fb77abe36f 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_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, pg_foreign_server, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, pg_foreign_server, btree(srvname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, pg_foreign_server, btree(oid oid_ops), FOREIGNSERVEROID, 2);
+DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, pg_foreign_server, btree(srvname name_ops), FOREIGNSERVERNAME, 2);
 
 #endif							/* PG_FOREIGN_SERVER_H */
diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h
index 2420e23401..8a10130cc0 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -44,6 +44,6 @@ typedef FormData_pg_foreign_table *Form_pg_foreign_table;
 
 DECLARE_TOAST(pg_foreign_table, 4153, 4154);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, pg_foreign_table, btree(ftrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, pg_foreign_table, btree(ftrelid oid_ops), FOREIGNTABLEREL, 4);
 
 #endif							/* PG_FOREIGN_TABLE_H */
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index 32930411b6..9352d8a9ed 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -70,7 +70,7 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO
 typedef FormData_pg_index *Form_pg_index;
 
 DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, pg_index, btree(indrelid oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, pg_index, btree(indexrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, pg_index, btree(indexrelid oid_ops), INDEXRELID, 64);
 
 /* indkey can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((indrelid, indkey), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index d666ea2044..070094edb8 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -66,7 +66,7 @@ typedef FormData_pg_language *Form_pg_language;
 
 DECLARE_TOAST(pg_language, 4157, 4158);
 
-DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, pg_language, btree(lanname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, pg_language, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, pg_language, btree(lanname name_ops), LANGNAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, pg_language, btree(oid oid_ops), LANGOID, 4);
 
 #endif							/* PG_LANGUAGE_H */
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index fc74a14c37..b70073d456 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -53,8 +53,8 @@ typedef FormData_pg_namespace *Form_pg_namespace;
 
 DECLARE_TOAST(pg_namespace, 4163, 4164);
 
-DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, pg_namespace, btree(nspname name_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, pg_namespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, pg_namespace, btree(nspname name_ops), NAMESPACENAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, pg_namespace, btree(oid oid_ops), NAMESPACEOID, 16);
 
 /*
  * prototypes for functions in pg_namespace.c
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index a5d09faf1f..18ecd56ada 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -82,7 +82,7 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId)
  */
 typedef FormData_pg_opclass *Form_pg_opclass;
 
-DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, pg_opclass, btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, pg_opclass, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, pg_opclass, btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops), CLAAMNAMENSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, pg_opclass, btree(oid oid_ops), CLAOID, 8);
 
 #endif							/* PG_OPCLASS_H */
diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h
index aff372b4bb..3daa79cfae 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -82,8 +82,8 @@ CATALOG(pg_operator,2617,OperatorRelationId)
  */
 typedef FormData_pg_operator *Form_pg_operator;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, pg_operator, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, pg_operator, btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, pg_operator, btree(oid oid_ops), OPEROID, 32);
+DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, pg_operator, btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops), OPERNAMENSP, 256);
 
 
 extern ObjectAddress OperatorCreate(const char *operatorName,
diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h
index 88940de916..fe2b5c60c4 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -50,8 +50,8 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId)
  */
 typedef FormData_pg_opfamily *Form_pg_opfamily;
 
-DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, pg_opfamily, btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, pg_opfamily, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, pg_opfamily, btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops), OPFAMILYAMNAMENSP, 8);
+DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, pg_opfamily, btree(oid oid_ops), OPFAMILYOID, 8);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h
index f46cdd1524..aef18ff4a7 100644
--- a/src/include/catalog/pg_parameter_acl.h
+++ b/src/include/catalog/pg_parameter_acl.h
@@ -50,8 +50,8 @@ typedef FormData_pg_parameter_acl * Form_pg_parameter_acl;
 
 DECLARE_TOAST_WITH_MACRO(pg_parameter_acl, 6244, 6245, PgParameterAclToastTable, PgParameterAclToastIndex);
 
-DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, pg_parameter_acl, btree(parname text_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, pg_parameter_acl, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, pg_parameter_acl, btree(parname text_ops), PARAMETERACLNAME, 4);
+DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, pg_parameter_acl, btree(oid oid_ops), PARAMETERACLOID, 4);
 
 
 extern Oid	ParameterAclLookup(const char *parameter, bool missing_ok);
diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h
index 0cf512e1c8..a137f031f7 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_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, pg_partitioned_table, btree(partrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, pg_partitioned_table, btree(partrelid oid_ops), PARTRELID, 32);
 
 /* partattrs can contain zero (InvalidAttrNumber) to represent expressions */
 DECLARE_ARRAY_FOREIGN_KEY_OPT((partrelid, partattrs), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index fdb39d4001..29ef344cc2 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -137,8 +137,8 @@ typedef FormData_pg_proc *Form_pg_proc;
 
 DECLARE_TOAST(pg_proc, 2836, 2837);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, pg_proc, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, pg_proc, btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, pg_proc, btree(oid oid_ops), PROCOID, 128);
+DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, pg_proc, btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops), PROCNAMEARGSNSP, 128);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h
index d929c9a188..c17be5ed88 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -63,8 +63,8 @@ CATALOG(pg_publication,6104,PublicationRelationId)
  */
 typedef FormData_pg_publication *Form_pg_publication;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops), PUBLICATIONOID, 8);
+DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops), PUBLICATIONNAME, 8);
 
 typedef struct PublicationActions
 {
diff --git a/src/include/catalog/pg_publication_namespace.h b/src/include/catalog/pg_publication_namespace.h
index b361c8ab5e..b6326c7730 100644
--- a/src/include/catalog/pg_publication_namespace.h
+++ b/src/include/catalog/pg_publication_namespace.h
@@ -41,7 +41,7 @@ CATALOG(pg_publication_namespace,6237,PublicationNamespaceRelationId)
  */
 typedef FormData_pg_publication_namespace *Form_pg_publication_namespace;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, pg_publication_namespace, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, pg_publication_namespace, btree(pnnspid oid_ops, pnpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, pg_publication_namespace, btree(oid oid_ops), PUBLICATIONNAMESPACE, 64);
+DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, pg_publication_namespace, btree(pnnspid oid_ops, pnpubid oid_ops), PUBLICATIONNAMESPACEMAP, 64);
 
 #endif							/* PG_PUBLICATION_NAMESPACE_H */
diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h
index bef508764a..19cad0a344 100644
--- a/src/include/catalog/pg_publication_rel.h
+++ b/src/include/catalog/pg_publication_rel.h
@@ -47,8 +47,8 @@ typedef FormData_pg_publication_rel *Form_pg_publication_rel;
 
 DECLARE_TOAST(pg_publication_rel, 6228, 6229);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, pg_publication_rel, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, pg_publication_rel, btree(prrelid oid_ops, prpubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, pg_publication_rel, btree(oid oid_ops), PUBLICATIONREL, 64);
+DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, pg_publication_rel, btree(prrelid oid_ops, prpubid oid_ops), PUBLICATIONRELMAP, 64);
 DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, pg_publication_rel, btree(prpubid oid_ops));
 
 #endif							/* PG_PUBLICATION_REL_H */
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index 1247fa7c77..ce662c6a03 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -57,8 +57,8 @@ CATALOG(pg_range,3541,RangeRelationId)
  */
 typedef FormData_pg_range *Form_pg_range;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, pg_range, btree(rngtypid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, pg_range, btree(rngmultitypid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, pg_range, btree(rngtypid oid_ops), RANGETYPE, 4);
+DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, pg_range, btree(rngmultitypid oid_ops), RANGEMULTIRANGE, 4);
 
 /*
  * prototypes for functions in pg_range.c
diff --git a/src/include/catalog/pg_replication_origin.h b/src/include/catalog/pg_replication_origin.h
index 83ff36dcba..49824dbc07 100644
--- a/src/include/catalog/pg_replication_origin.h
+++ b/src/include/catalog/pg_replication_origin.h
@@ -56,7 +56,7 @@ typedef FormData_pg_replication_origin *Form_pg_replication_origin;
 
 DECLARE_TOAST_WITH_MACRO(pg_replication_origin, 4181, 4182, PgReplicationOriginToastTable, PgReplicationOriginToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, pg_replication_origin, btree(roident oid_ops));
-DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, pg_replication_origin, btree(roname text_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, pg_replication_origin, btree(roident oid_ops), REPLORIGIDENT, 16);
+DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, pg_replication_origin, btree(roname text_ops), REPLORIGNAME, 16);
 
 #endif							/* PG_REPLICATION_ORIGIN_H */
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index 60d642b595..8148e3568b 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -54,6 +54,6 @@ typedef FormData_pg_rewrite *Form_pg_rewrite;
 DECLARE_TOAST(pg_rewrite, 2838, 2839);
 
 DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, pg_rewrite, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, pg_rewrite, btree(ev_class oid_ops, rulename name_ops));
+DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, pg_rewrite, btree(ev_class oid_ops, rulename name_ops), RULERELNAME, 8);
 
 #endif							/* PG_REWRITE_H */
diff --git a/src/include/catalog/pg_sequence.h b/src/include/catalog/pg_sequence.h
index fdfc27bbd9..efd441c339 100644
--- a/src/include/catalog/pg_sequence.h
+++ b/src/include/catalog/pg_sequence.h
@@ -39,6 +39,6 @@ CATALOG(pg_sequence,2224,SequenceRelationId)
  */
 typedef FormData_pg_sequence *Form_pg_sequence;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, pg_sequence, btree(seqrelid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, pg_sequence, btree(seqrelid oid_ops), SEQRELID, 32);
 
 #endif							/* PG_SEQUENCE_H */
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 864cb54a51..53bb3d1936 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -136,7 +136,7 @@ typedef FormData_pg_statistic *Form_pg_statistic;
 
 DECLARE_TOAST(pg_statistic, 2840, 2841);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, pg_statistic, btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, pg_statistic, btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops), STATRELATTINH, 128);
 
 DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum));
 
diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h
index 85e56feb80..cb16044e08 100644
--- a/src/include/catalog/pg_statistic_ext.h
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -70,8 +70,8 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext;
 
 DECLARE_TOAST(pg_statistic_ext, 3439, 3440);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, pg_statistic_ext, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, pg_statistic_ext, btree(stxname name_ops, stxnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, pg_statistic_ext, btree(oid oid_ops), STATEXTOID, 4);
+DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, pg_statistic_ext, btree(stxname name_ops, stxnamespace oid_ops), STATEXTNAMENSP, 4);
 DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, pg_statistic_ext, btree(stxrelid oid_ops));
 
 DECLARE_ARRAY_FOREIGN_KEY((stxrelid, stxkeys), pg_attribute, (attrelid, attnum));
diff --git a/src/include/catalog/pg_statistic_ext_data.h b/src/include/catalog/pg_statistic_ext_data.h
index 19a00705e6..0f09883e12 100644
--- a/src/include/catalog/pg_statistic_ext_data.h
+++ b/src/include/catalog/pg_statistic_ext_data.h
@@ -54,7 +54,7 @@ typedef FormData_pg_statistic_ext_data *Form_pg_statistic_ext_data;
 
 DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, pg_statistic_ext_data, btree(stxoid oid_ops, stxdinherit bool_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, pg_statistic_ext_data, btree(stxoid oid_ops, stxdinherit bool_ops), STATEXTDATASTXOID, 4);
 
 
 #endif							/* PG_STATISTIC_EXT_DATA_H */
diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h
index be36c4a820..fff35ebf83 100644
--- a/src/include/catalog/pg_subscription.h
+++ b/src/include/catalog/pg_subscription.h
@@ -115,8 +115,8 @@ typedef FormData_pg_subscription *Form_pg_subscription;
 
 DECLARE_TOAST_WITH_MACRO(pg_subscription, 4183, 4184, PgSubscriptionToastTable, PgSubscriptionToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, pg_subscription, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, pg_subscription, btree(subdbid oid_ops, subname name_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, pg_subscription, btree(oid oid_ops), SUBSCRIPTIONOID, 4);
+DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, pg_subscription, btree(subdbid oid_ops, subname name_ops), SUBSCRIPTIONNAME, 4);
 
 typedef struct Subscription
 {
diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h
index f5324b710d..638f0d5447 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_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, pg_subscription_rel, btree(srrelid oid_ops, srsubid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, pg_subscription_rel, btree(srrelid oid_ops, srsubid oid_ops), SUBSCRIPTIONRELMAP, 64);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index ea8665e83a..8910fe362c 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -49,7 +49,7 @@ typedef FormData_pg_tablespace *Form_pg_tablespace;
 
 DECLARE_TOAST_WITH_MACRO(pg_tablespace, 4185, 4186, PgTablespaceToastTable, PgTablespaceToastIndex);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, pg_tablespace, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, pg_tablespace, btree(oid oid_ops), TABLESPACEOID, 4);
 DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, pg_tablespace, btree(spcname name_ops));
 
 #endif							/* PG_TABLESPACE_H */
diff --git a/src/include/catalog/pg_transform.h b/src/include/catalog/pg_transform.h
index 8eb189784d..2660d7a706 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_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, pg_transform, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, pg_transform, btree(trftype oid_ops, trflang oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, pg_transform, btree(oid oid_ops), TRFOID, 16);
+DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, pg_transform, btree(trftype oid_ops, trflang oid_ops), TRFTYPELANG, 16);
 
 #endif							/* PG_TRANSFORM_H */
diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h
index e52720387d..3699551f0f 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -47,7 +47,7 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId)
 
 typedef FormData_pg_ts_config *Form_pg_ts_config;
 
-DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, pg_ts_config, btree(cfgname name_ops, cfgnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, pg_ts_config, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, pg_ts_config, btree(cfgname name_ops, cfgnamespace oid_ops), TSCONFIGNAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, pg_ts_config, btree(oid oid_ops), TSCONFIGOID, 2);
 
 #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 91f092ca48..437b34a20c 100644
--- a/src/include/catalog/pg_ts_config_map.h
+++ b/src/include/catalog/pg_ts_config_map.h
@@ -44,6 +44,6 @@ CATALOG(pg_ts_config_map,3603,TSConfigMapRelationId)
 
 typedef FormData_pg_ts_config_map *Form_pg_ts_config_map;
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, pg_ts_config_map, btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, pg_ts_config_map, btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops), TSCONFIGMAP, 2);
 
 #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 10a6490213..34e22d9434 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -53,7 +53,7 @@ typedef FormData_pg_ts_dict *Form_pg_ts_dict;
 
 DECLARE_TOAST(pg_ts_dict, 4169, 4170);
 
-DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, pg_ts_dict, btree(dictname name_ops, dictnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, pg_ts_dict, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, pg_ts_dict, btree(dictname name_ops, dictnamespace oid_ops), TSDICTNAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, pg_ts_dict, btree(oid oid_ops), TSDICTOID, 2);
 
 #endif							/* PG_TS_DICT_H */
diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h
index 57d9e8428a..7885c2555e 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -54,7 +54,7 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId)
 
 typedef FormData_pg_ts_parser *Form_pg_ts_parser;
 
-DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, pg_ts_parser, btree(prsname name_ops, prsnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, pg_ts_parser, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, pg_ts_parser, btree(prsname name_ops, prsnamespace oid_ops), TSPARSERNAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, pg_ts_parser, btree(oid oid_ops), TSPARSEROID, 2);
 
 #endif							/* PG_TS_PARSER_H */
diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h
index f3bdc7b200..cd569a700e 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -45,7 +45,7 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId)
 
 typedef FormData_pg_ts_template *Form_pg_ts_template;
 
-DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, pg_ts_template, btree(tmplname name_ops, tmplnamespace oid_ops));
-DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, pg_ts_template, btree(oid oid_ops));
+DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, pg_ts_template, btree(tmplname name_ops, tmplnamespace oid_ops), TSTEMPLATENAMENSP, 2);
+DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, pg_ts_template, btree(oid oid_ops), TSTEMPLATEOID, 2);
 
 #endif							/* PG_TS_TEMPLATE_H */
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index 508ba7b0f7..9d00be8dbb 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -262,8 +262,8 @@ typedef FormData_pg_type *Form_pg_type;
 
 DECLARE_TOAST(pg_type, 4171, 4172);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, pg_type, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, pg_type, btree(typname name_ops, typnamespace oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, pg_type, btree(oid oid_ops), TYPEOID, 64);
+DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, pg_type, btree(typname name_ops, typnamespace oid_ops), TYPENAMENSP, 64);
 
 #ifdef EXPOSE_TO_CLIENT_CODE
 
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index eca33f4cb4..94bc93a83f 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -49,7 +49,7 @@ typedef FormData_pg_user_mapping *Form_pg_user_mapping;
 
 DECLARE_TOAST(pg_user_mapping, 4173, 4174);
 
-DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, pg_user_mapping, btree(oid oid_ops));
-DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, pg_user_mapping, btree(umuser oid_ops, umserver oid_ops));
+DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, pg_user_mapping, btree(oid oid_ops), USERMAPPINGOID, 2);
+DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, pg_user_mapping, btree(umuser oid_ops, umserver oid_ops), USERMAPPINGUSERSERVER, 2);
 
 #endif							/* PG_USER_MAPPING_H */
diff --git a/src/include/utils/syscache.h b/src/include/utils/syscache.h
index 67ea6e4945..68827fba50 100644
--- a/src/include/utils/syscache.h
+++ b/src/include/utils/syscache.h
@@ -20,103 +20,7 @@
 #include "access/htup.h"
 /* we intentionally do not include utils/catcache.h here */
 
-/*
- *		SysCache identifiers.
- *
- *		The order of these identifiers must match the order
- *		of the entries in the array cacheinfo[] in syscache.c.
- *		Keep them in alphabetical order (renumbering only costs a
- *		backend rebuild).
- */
-
-enum SysCacheIdentifier
-{
-	AGGFNOID = 0,
-	AMNAME,
-	AMOID,
-	AMOPOPID,
-	AMOPSTRATEGY,
-	AMPROCNUM,
-	ATTNAME,
-	ATTNUM,
-	AUTHMEMMEMROLE,
-	AUTHMEMROLEMEM,
-	AUTHNAME,
-	AUTHOID,
-	CASTSOURCETARGET,
-	CLAAMNAMENSP,
-	CLAOID,
-	COLLNAMEENCNSP,
-	COLLOID,
-	CONDEFAULT,
-	CONNAMENSP,
-	CONSTROID,
-	CONVOID,
-	DATABASEOID,
-	DEFACLROLENSPOBJ,
-	ENUMOID,
-	ENUMTYPOIDNAME,
-	EVENTTRIGGERNAME,
-	EVENTTRIGGEROID,
-	FOREIGNDATAWRAPPERNAME,
-	FOREIGNDATAWRAPPEROID,
-	FOREIGNSERVERNAME,
-	FOREIGNSERVEROID,
-	FOREIGNTABLEREL,
-	INDEXRELID,
-	LANGNAME,
-	LANGOID,
-	NAMESPACENAME,
-	NAMESPACEOID,
-	OPERNAMENSP,
-	OPEROID,
-	OPFAMILYAMNAMENSP,
-	OPFAMILYOID,
-	PARAMETERACLNAME,
-	PARAMETERACLOID,
-	PARTRELID,
-	PROCNAMEARGSNSP,
-	PROCOID,
-	PUBLICATIONNAME,
-	PUBLICATIONNAMESPACE,
-	PUBLICATIONNAMESPACEMAP,
-	PUBLICATIONOID,
-	PUBLICATIONREL,
-	PUBLICATIONRELMAP,
-	RANGEMULTIRANGE,
-	RANGETYPE,
-	RELNAMENSP,
-	RELOID,
-	REPLORIGIDENT,
-	REPLORIGNAME,
-	RULERELNAME,
-	SEQRELID,
-	STATEXTDATASTXOID,
-	STATEXTNAMENSP,
-	STATEXTOID,
-	STATRELATTINH,
-	SUBSCRIPTIONNAME,
-	SUBSCRIPTIONOID,
-	SUBSCRIPTIONRELMAP,
-	TABLESPACEOID,
-	TRFOID,
-	TRFTYPELANG,
-	TSCONFIGMAP,
-	TSCONFIGNAMENSP,
-	TSCONFIGOID,
-	TSDICTNAMENSP,
-	TSDICTOID,
-	TSPARSERNAMENSP,
-	TSPARSEROID,
-	TSTEMPLATENAMENSP,
-	TSTEMPLATEOID,
-	TYPENAMENSP,
-	TYPEOID,
-	USERMAPPINGOID,
-	USERMAPPINGUSERSERVER
-
-#define SysCacheSize (USERMAPPINGUSERSERVER + 1)
-};
+#include "catalog/syscache_info.h"
 
 extern void InitCatalogCache(void);
 extern void InitCatalogCachePhase2(void);
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index 4e09c4686b..56ed423567 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -119,6 +119,11 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/syscache_info.c.h && continue
+	test "$f" = src/backend/catalog/syscache_info.h && continue
+	test "$f" = src/include/catalog/syscache_info.c.h && continue
+	test "$f" = src/include/catalog/syscache_info.h && continue
+
 	# We can't make these Bison output files compilable standalone
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 8dee1b5670..477e4dd7e6 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -114,6 +114,11 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/syscache_info.c.h && continue
+	test "$f" = src/backend/catalog/syscache_info.h && continue
+	test "$f" = src/include/catalog/syscache_info.c.h && continue
+	test "$f" = src/include/catalog/syscache_info.h && continue
+
 	# We can't make these Bison output files compilable standalone
 	# without using "%code require", which old Bison versions lack.
 	# parser/gram.h will be included by parser/gramparse.h anyway.
-- 
2.40.1



  [text/plain] 0005-WIP-Generate-ObjectProperty-from-catalog-files.patch (6.7K, ../[email protected]/6-0005-WIP-Generate-ObjectProperty-from-catalog-files.patch)
  download | inline diff:
From 881e9f1254376c0877ad562f98ee112eab47ac33 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <[email protected]>
Date: Mon, 29 May 2023 19:56:31 -0400
Subject: [PATCH 5/5] WIP: Generate ObjectProperty from catalog files

---
 src/backend/catalog/.gitignore     |  1 +
 src/backend/catalog/genbki.pl      | 81 ++++++++++++++++++++++++++++++
 src/tools/pginclude/cpluspluscheck |  3 ++
 src/tools/pginclude/headerscheck   |  3 ++
 4 files changed, 88 insertions(+)

diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore
index ff65560379..d817798dc0 100644
--- a/src/backend/catalog/.gitignore
+++ b/src/backend/catalog/.gitignore
@@ -1,3 +1,4 @@
+/objectproperty_info.c.h
 /postgres.bki
 /schemapg.h
 /syscache_info.c.h
diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl
index 80a7828d6c..e0813d1286 100644
--- a/src/backend/catalog/genbki.pl
+++ b/src/backend/catalog/genbki.pl
@@ -19,8 +19,10 @@
 
 use FindBin;
 use lib $FindBin::RealBin;
+use lib "$FindBin::RealBin/../../tools";
 
 use Catalog;
+use PerfectHash;
 
 my $output_path = '';
 my $major_version;
@@ -59,6 +61,7 @@
 my %syscaches;
 my %oidcounts;
 my @system_constraints;
+my @object_properties;
 
 foreach my $header (@ARGV)
 {
@@ -133,6 +136,7 @@
 		$oidcounts{ $toast->{toast_oid} }++;
 		$oidcounts{ $toast->{toast_index_oid} }++;
 	}
+	my ($oid_index, $oid_syscache, $name_syscache, $is_nsp_name_unique);
 	foreach my $index (@{ $catalog->{indexing} })
 	{
 		push @index_decls,
@@ -142,6 +146,7 @@
 		  $index->{table_name},
 		  $index->{index_decl};
 		$oidcounts{ $index->{index_oid} }++;
+		$oid_index = $index->{index_oid_macro} if $index->{index_decl} eq 'btree(oid oid_ops)';
 
 		if ($index->{is_unique})
 		{
@@ -152,6 +157,11 @@
 			  $index->{index_name};
 		}
 
+		if ($index->{is_unique} && $index->{index_decl} =~ /\(\w+name name_ops, \w+namespace oid_ops\)/)
+		{
+			$is_nsp_name_unique = 1;
+		}
+
 		if ($index->{syscache_name})
 		{
 			my $tbl = $index->{table_name};
@@ -165,8 +175,51 @@
 				key => $key,
 				nbuckets => $index->{syscache_nbuckets},
 			};
+
+			$oid_syscache = $index->{syscache_name} if $index->{index_decl} eq 'btree(oid oid_ops)';
+			$name_syscache = $index->{syscache_name} if $index->{index_decl} =~ /^btree\(\w+name name_ops\)$/;
+		}
+	}
+
+	my ($attnum_oid, $attnum_name, $attnum_namespace, $attnum_owner, $attnum_acl);
+	foreach my $att (@$schema)
+	{
+		if ($att->{name} eq 'oid' && $att->{type} eq 'oid')
+		{
+			$attnum_oid = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /name$/ && $att->{type} eq 'name')
+		{
+			$attnum_name = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /namespace$/ && $att->{type} eq 'oid')
+		{
+			$attnum_namespace = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /owner$/ && $att->{type} eq 'oid')
+		{
+			$attnum_owner = "Anum_${catname}_" . $att->{name};
+		}
+		elsif ($att->{name} =~ /acl$/ && $att->{type} eq '_aclitem')
+		{
+			$attnum_acl = "Anum_${catname}_" . $att->{name};
 		}
 	}
+	push @object_properties, {
+		#class_descr => q{"TODO"},
+		class_oid => $catalog->{relation_oid_macro},
+		_class_oid => $catalog->{relation_oid},
+		oid_index_oid => $oid_index,
+		oid_catcache_id => $oid_syscache || '-1',
+		name_catcache_id => $name_syscache || '-1',
+		attnum_oid => $attnum_oid,
+		attnum_name => $attnum_name,
+		attnum_namespace => $attnum_namespace,
+		attnum_owner => $attnum_owner,
+		attnum_acl => $attnum_acl,
+		#objtype => TODO,
+		is_nsp_name_unique => $is_nsp_name_unique ? 'true' : 'false',
+	};
 }
 
 # Complain and exit if we found any duplicate OIDs.
@@ -441,6 +494,9 @@
 my $syscache_info_c = $output_path . 'syscache_info.c.h';
 open my $syscache_info_c_fh, '>', $syscache_info_c . $tmpext
   or die "can't open $syscache_info_c$tmpext: $!";
+my $objectproperty_info = $output_path . 'objectproperty_info.c.h';
+open my $objectproperty_info_fh, '>', $objectproperty_info . $tmpext
+  or die "can't open $objectproperty_info$tmpext: $!";
 
 # Generate postgres.bki and pg_*_d.h headers.
 
@@ -802,6 +858,29 @@
 
 print $syscache_info_c_fh "};\n";
 
+# Now generate objectproperty_info
+
+print_boilerplate($objectproperty_info_fh, "objectproperty_info.h", "object property data");
+print $objectproperty_info_fh "static const ObjectPropertyType ObjectProperty[] =
+{
+";
+
+my @class_oids;
+foreach my $op (@object_properties)
+{
+	print $objectproperty_info_fh "\t{\n";
+	foreach my $p (sort keys %{$op})
+	{
+		printf $objectproperty_info_fh "\t\t%s = %s,\n", $p, ${$op}{$p} if $p !~ /^_/ && ${$op}{$p};
+	}
+	push @class_oids, pack('N', ${$op}{_class_oid});
+	print $objectproperty_info_fh "\t},\n";
+}
+
+print $objectproperty_info_fh "};\n";
+
+print $objectproperty_info_fh "\nstatic " . PerfectHash::generate_hash_function(\@class_oids, 'objectproperty_hash_func', fixed_key_length => 4);
+
 # We're done emitting data
 close $bki;
 close $schemapg;
@@ -809,6 +888,7 @@
 close $constraints;
 close $syscache_info_h_fh;
 close $syscache_info_c_fh;
+close $objectproperty_info_fh;
 
 # Finally, rename the completed files into place.
 Catalog::RenameTempFile($bkifile, $tmpext);
@@ -817,6 +897,7 @@
 Catalog::RenameTempFile($constraints_file, $tmpext);
 Catalog::RenameTempFile($syscache_info_h, $tmpext);
 Catalog::RenameTempFile($syscache_info_c, $tmpext);
+Catalog::RenameTempFile($objectproperty_info, $tmpext);
 
 exit($num_errors != 0 ? 1 : 0);
 
diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck
index 56ed423567..49e3ca7a7b 100755
--- a/src/tools/pginclude/cpluspluscheck
+++ b/src/tools/pginclude/cpluspluscheck
@@ -119,6 +119,9 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/objectproperty_info.c.h && continue
+	test "$f" = src/include/catalog/objectproperty_info.c.h && continue
+
 	test "$f" = src/backend/catalog/syscache_info.c.h && continue
 	test "$f" = src/backend/catalog/syscache_info.h && continue
 	test "$f" = src/include/catalog/syscache_info.c.h && continue
diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck
index 477e4dd7e6..a1ea2ef692 100755
--- a/src/tools/pginclude/headerscheck
+++ b/src/tools/pginclude/headerscheck
@@ -114,6 +114,9 @@ do
 	test "$f" = src/include/common/unicode_nonspacing_table.h && continue
 	test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue
 
+	test "$f" = src/backend/catalog/objectproperty_info.c.h && continue
+	test "$f" = src/include/catalog/objectproperty_info.c.h && continue
+
 	test "$f" = src/backend/catalog/syscache_info.c.h && continue
 	test "$f" = src/backend/catalog/syscache_info.h && continue
 	test "$f" = src/include/catalog/syscache_info.c.h && continue
-- 
2.40.1



view thread (4+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected]
  Subject: Re: generate syscache info automatically
  In-Reply-To: <[email protected]>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox