Commit 96cdeae07 added toast tables to most catalogs. One disadvantage is that the toast declarations require hard-coded oids, even though only shared catalogs actually need stable oids. Now that we can assign oids on the fly, it makes sense to do so for toast tables as well, as in the attached.
-John Naylor
src/backend/catalog/genbki.pl | 26 ++++++++++++++++++++++++++ src/include/catalog/toasting.h | 32 ++------------------------------ 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index edc8ea9f53..f4d7160c6a 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -285,6 +285,7 @@ my @tables_needing_macros; foreach my $catname (@catnames) { my $catalog = $catalogs{$catname}; + my $has_toastable_type = 0; # Create one definition header with macro definitions for each catalog. my $def_file = $output_path . $catname . '_d.h'; @@ -345,6 +346,12 @@ EOM # Build hash of column names for use later $attnames{$attname} = 1; + # Flag catalogs with toastable datatypes. + if ($types{$atttype}->{typstorage} eq 'x') + { + $has_toastable_type = 1; + } + # Emit column definitions if (!$first) { @@ -506,6 +513,25 @@ EOM } } + # Create toast declarations for normal catalogs. To prevent + # circular dependencies and to avoid adding complexity to VACUUM + # FULL logic, exclude pg_class, pg_attribute, and pg_index. Also, + # to prevent pg_upgrade from seeing a non-empty new cluster, exclude + # pg_largeobject and pg_largeobject_metadata from the set as large + # object data is handled as user data. Those relations have no reason + # to use a toast table anyway. Toast tables and indexes for shared + # catalogs need stable oids, so must be specified in toasting.h. + if ($has_toastable_type and !$catalog->{shared_relation} + and $catname ne 'pg_class' + and $catname ne 'pg_attribute' + and $catname ne 'pg_index' + and $catname ne 'pg_largeobject' + and $catname ne 'pg_largeobject_metadata') + { + push @toast_decls, sprintf "declare toast %s %s on %s\n", + $maxoid++, $maxoid++, $catname; + } + print $bki "close $catname\n"; printf $def "\n#endif\t\t\t\t\t\t\t/* %s_D_H */\n", uc $catname; diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h index f259890e43..1c389c685d 100644 --- a/src/include/catalog/toasting.h +++ b/src/include/catalog/toasting.h @@ -42,37 +42,9 @@ extern void BootstrapToastTable(char *relName, * the OID to assign to the toast table, and the OID to assign to the * toast table's index. The reason we hard-wire these OIDs is that we * need stable OIDs for shared relations, and that includes toast tables - * of shared relations. + * of shared relations. Toast table commands for normal catalogs are + * generated by genbki.pl, and oids for those are assigned on the fly. */ - -/* normal catalogs */ -DECLARE_TOAST(pg_aggregate, 4159, 4160); -DECLARE_TOAST(pg_attrdef, 2830, 2831); -DECLARE_TOAST(pg_collation, 4161, 4162); -DECLARE_TOAST(pg_constraint, 2832, 2833); -DECLARE_TOAST(pg_default_acl, 4143, 4144); -DECLARE_TOAST(pg_description, 2834, 2835); -DECLARE_TOAST(pg_event_trigger, 4145, 4146); -DECLARE_TOAST(pg_extension, 4147, 4148); -DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150); -DECLARE_TOAST(pg_foreign_server, 4151, 4152); -DECLARE_TOAST(pg_foreign_table, 4153, 4154); -DECLARE_TOAST(pg_init_privs, 4155, 4156); -DECLARE_TOAST(pg_language, 4157, 4158); -DECLARE_TOAST(pg_namespace, 4163, 4164); -DECLARE_TOAST(pg_partitioned_table, 4165, 4166); -DECLARE_TOAST(pg_policy, 4167, 4168); -DECLARE_TOAST(pg_proc, 2836, 2837); -DECLARE_TOAST(pg_rewrite, 2838, 2839); -DECLARE_TOAST(pg_seclabel, 3598, 3599); -DECLARE_TOAST(pg_statistic, 2840, 2841); -DECLARE_TOAST(pg_statistic_ext, 3439, 3440); -DECLARE_TOAST(pg_trigger, 2336, 2337); -DECLARE_TOAST(pg_ts_dict, 4169, 4170); -DECLARE_TOAST(pg_type, 4171, 4172); -DECLARE_TOAST(pg_user_mapping, 4173, 4174); - -/* shared catalogs */ DECLARE_TOAST(pg_authid, 4175, 4176); #define PgAuthidToastTable 4175 #define PgAuthidToastIndex 4176