1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-21 05:21:08 +03:00

Generate syscache info from catalog files

Add a new genbki macros MAKE_SYSCACHE that specifies the syscache ID
macro, the underlying index, and the number of buckets.  From that, we
can generate the existing tables in syscache.h and syscache.c via
genbki.pl.

Reviewed-by: John Naylor <johncnaylorls@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/75ae5875-3abc-dafc-8aec-73247ed41cde@eisentraut.org
This commit is contained in:
Peter Eisentraut
2024-01-23 07:13:38 +01:00
parent 46d8587b50
commit 9b1a6f50b9
60 changed files with 267 additions and 717 deletions

View File

@@ -1,5 +1,7 @@
/postgres.bki
/schemapg.h
/syscache_ids.h
/syscache_info.h
/system_fk_info.h
/system_constraints.sql
/pg_*_d.h

View File

@@ -129,6 +129,16 @@ sub ParseHeader
%+,
};
}
elsif (
/^MAKE_SYSCACHE\(\s*
(?<syscache_name>\w+),\s*
(?<index_name>\w+),\s*
(?<syscache_nbuckets>\w+)\s*
\)/x
)
{
push @{ $catalog{syscaches} }, {%+};
}
elsif (
/^DECLARE_OID_DEFINING_MACRO\(\s*
(?<other_name>\w+),\s*

View File

@@ -120,7 +120,7 @@ CATALOG_HEADERS := \
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_ids.h syscache_info.h system_fk_info.h
POSTGRES_BKI_SRCS := $(addprefix $(top_srcdir)/src/include/catalog/, $(CATALOG_HEADERS))

View File

@@ -56,6 +56,8 @@ my %catalogs;
my %catalog_data;
my @toast_decls;
my @index_decls;
my %syscaches;
my %syscache_catalogs;
my %oidcounts;
my @system_constraints;
@@ -121,6 +123,9 @@ foreach my $header (@ARGV)
}
}
# Lookup table to get index info by index name
my %indexes;
# If the header file contained toast or index info, build BKI
# commands for those, which we'll output later.
foreach my $toast (@{ $catalog->{toasting} })
@@ -134,6 +139,8 @@ foreach my $header (@ARGV)
}
foreach my $index (@{ $catalog->{indexing} })
{
$indexes{ $index->{index_name} } = $index;
push @index_decls,
sprintf "declare %sindex %s %s on %s using %s\n",
$index->{is_unique} ? 'unique ' : '',
@@ -151,6 +158,26 @@ foreach my $header (@ARGV)
$index->{index_name};
}
}
# Analyze syscache info
foreach my $syscache (@{ $catalog->{syscaches} })
{
my $index = $indexes{ $syscache->{index_name} };
my $tblname = $index->{table_name};
my $key = $index->{index_decl};
$key =~ s/^\w+\(//;
$key =~ s/\)$//;
$key =~ s/(\w+)\s+\w+/Anum_${tblname}_$1/g;
$syscaches{ $syscache->{syscache_name} } = {
table_oid_macro => $catalogs{$tblname}->{relation_oid_macro},
index_oid_macro => $index->{index_oid_macro},
key => $key,
nbuckets => $syscache->{syscache_nbuckets},
};
$syscache_catalogs{$catname} = 1;
}
}
# Complain and exit if we found any duplicate OIDs.
@@ -419,6 +446,12 @@ open my $fk_info, '>', $fk_info_file . $tmpext
my $constraints_file = $output_path . 'system_constraints.sql';
open my $constraints, '>', $constraints_file . $tmpext
or die "can't open $constraints_file$tmpext: $!";
my $syscache_ids_file = $output_path . 'syscache_ids.h';
open my $syscache_ids_fh, '>', $syscache_ids_file . $tmpext
or die "can't open $syscache_ids_file$tmpext: $!";
my $syscache_info_file = $output_path . 'syscache_info.h';
open my $syscache_info_fh, '>', $syscache_info_file . $tmpext
or die "can't open $syscache_info_file$tmpext: $!";
# Generate postgres.bki and pg_*_d.h headers.
@@ -753,17 +786,59 @@ foreach my $catname (@catnames)
# 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_ids_fh, "syscache_ids.h", "SysCache identifiers");
print $syscache_ids_fh "enum SysCacheIdentifier
{
";
print_boilerplate($syscache_info_fh, "syscache_info.h",
"SysCache definitions");
print $syscache_info_fh "\n";
foreach my $catname (sort keys %syscache_catalogs)
{
print $syscache_info_fh qq{#include "catalog/${catname}_d.h"\n};
}
print $syscache_info_fh "\n";
print $syscache_info_fh "static const struct cachedesc cacheinfo[] = {\n";
my $last_syscache;
foreach my $syscache (sort keys %syscaches)
{
print $syscache_ids_fh "\t$syscache,\n";
$last_syscache = $syscache;
print $syscache_info_fh "\t[$syscache] = {\n";
print $syscache_info_fh "\t\t", $syscaches{$syscache}{table_oid_macro},
",\n";
print $syscache_info_fh "\t\t", $syscaches{$syscache}{index_oid_macro},
",\n";
print $syscache_info_fh "\t\tKEY(", $syscaches{$syscache}{key}, "),\n";
print $syscache_info_fh "\t\t", $syscaches{$syscache}{nbuckets}, "\n";
print $syscache_info_fh "\t},\n";
}
print $syscache_ids_fh "};\n";
print $syscache_ids_fh "#define SysCacheSize ($last_syscache + 1)\n";
print $syscache_info_fh "};\n";
# We're done emitting data
close $bki;
close $schemapg;
close $fk_info;
close $constraints;
close $syscache_ids_fh;
close $syscache_info_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_ids_file, $tmpext);
Catalog::RenameTempFile($syscache_info_file, $tmpext);
exit($num_errors != 0 ? 1 : 0);

View File

@@ -22,59 +22,13 @@
#include "access/htup_details.h"
#include "access/sysattr.h"
#include "catalog/pg_aggregate.h"
#include "catalog/pg_am.h"
#include "catalog/pg_amop.h"
#include "catalog/pg_amproc.h"
#include "catalog/pg_auth_members.h"
#include "catalog/pg_authid.h"
#include "catalog/pg_cast.h"
#include "catalog/pg_collation.h"
#include "catalog/pg_constraint.h"
#include "catalog/pg_conversion.h"
#include "catalog/pg_database.h"
#include "catalog/pg_db_role_setting.h"
#include "catalog/pg_default_acl.h"
#include "catalog/pg_depend.h"
#include "catalog/pg_description.h"
#include "catalog/pg_enum.h"
#include "catalog/pg_event_trigger.h"
#include "catalog/pg_foreign_data_wrapper.h"
#include "catalog/pg_foreign_server.h"
#include "catalog/pg_foreign_table.h"
#include "catalog/pg_language.h"
#include "catalog/pg_namespace.h"
#include "catalog/pg_opclass.h"
#include "catalog/pg_operator.h"
#include "catalog/pg_opfamily.h"
#include "catalog/pg_parameter_acl.h"
#include "catalog/pg_partitioned_table.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_publication.h"
#include "catalog/pg_publication_namespace.h"
#include "catalog/pg_publication_rel.h"
#include "catalog/pg_range.h"
#include "catalog/pg_replication_origin.h"
#include "catalog/pg_rewrite.h"
#include "catalog/pg_seclabel.h"
#include "catalog/pg_sequence.h"
#include "catalog/pg_shdepend.h"
#include "catalog/pg_shdescription.h"
#include "catalog/pg_shseclabel.h"
#include "catalog/pg_statistic.h"
#include "catalog/pg_statistic_ext.h"
#include "catalog/pg_statistic_ext_data.h"
#include "catalog/pg_subscription.h"
#include "catalog/pg_subscription_rel.h"
#include "catalog/pg_tablespace.h"
#include "catalog/pg_transform.h"
#include "catalog/pg_ts_config.h"
#include "catalog/pg_ts_config_map.h"
#include "catalog/pg_ts_dict.h"
#include "catalog/pg_ts_parser.h"
#include "catalog/pg_ts_template.h"
#include "catalog/pg_type.h"
#include "catalog/pg_user_mapping.h"
#include "catalog/pg_db_role_setting_d.h"
#include "catalog/pg_depend_d.h"
#include "catalog/pg_description_d.h"
#include "catalog/pg_seclabel_d.h"
#include "catalog/pg_shdepend_d.h"
#include "catalog/pg_shdescription_d.h"
#include "catalog/pg_shseclabel_d.h"
#include "lib/qunique.h"
#include "utils/catcache.h"
#include "utils/lsyscache.h"
@@ -85,18 +39,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 +46,13 @@
(Adding an index requires a catversion.h update, while simply
adding/deleting caches only requires a recompile.)
Add a MAKE_SYSCACHE call to the same pg_*.h file specifying the name of
your cache, the underlying index, and the 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.
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 +75,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.h"
StaticAssertDecl(lengthof(cacheinfo) == SysCacheSize,
"SysCacheSize does not match syscache.c's array");