1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-04 20:11:56 +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

@@ -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");