syscache.c
来自「postgresql8.3.4源码,开源数据库」· C语言 代码 · 共 982 行 · 第 1/2 页
C
982 行
/*------------------------------------------------------------------------- * * syscache.c * System cache management routines * * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION * $PostgreSQL: pgsql/src/backend/utils/cache/syscache.c,v 1.114 2008/01/01 19:45:53 momjian Exp $ * * NOTES * These routines allow the parser/planner/executor to perform * rapid lookups on the contents of the system catalogs. * * see catalog/syscache.h for a list of the cache id's * *------------------------------------------------------------------------- */#include "postgres.h"#include "access/heapam.h"#include "catalog/indexing.h"#include "catalog/pg_aggregate.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_constraint.h"#include "catalog/pg_conversion.h"#include "catalog/pg_database.h"#include "catalog/pg_enum.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_proc.h"#include "catalog/pg_rewrite.h"#include "catalog/pg_statistic.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 "utils/syscache.h"/*--------------------------------------------------------------------------- Adding system caches: Add your new cache to the list in include/utils/syscache.h. Keep the list sorted alphabetically and adjust the cache numbers accordingly. 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 number of hash buckets. If the relation contains tuples that are associated with a particular relation (for example, its attributes, rules, triggers, etc) then specify the attribute number that contains the OID of the associated relation. This is used by CatalogCacheFlushRelation() to remove the correct tuples during a table drop or relcache invalidation event. 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 definitions for it to include/catalog/indexing.h: you need to add a DECLARE_UNIQUE_INDEX macro and a #define for the index OID. (Adding an index requires a catversion.h update, while simply adding/deleting caches only requires a recompile.) Finally, any place your relation gets heap_insert() or heap_update() calls, make sure there is a CatalogUpdateIndexes() or similar call. The heap_* calls do not update indexes. bjm 1999/11/22*---------------------------------------------------------------------------*//* * struct cachedesc: information defining a single syscache */struct cachedesc{ Oid reloid; /* OID of the relation being cached */ Oid indoid; /* OID of index relation for this cache */ int reloidattr; /* attr number of rel OID reference, or 0 */ int nkeys; /* # of keys needed for cache lookup */ int key[4]; /* attribute numbers of key attrs */ int nbuckets; /* number of hash buckets for this cache */};static const struct cachedesc cacheinfo[] = { {AggregateRelationId, /* AGGFNOID */ AggregateFnoidIndexId, 0, 1, { Anum_pg_aggregate_aggfnoid, 0, 0, 0 }, 32 }, {AccessMethodRelationId, /* AMNAME */ AmNameIndexId, 0, 1, { Anum_pg_am_amname, 0, 0, 0 }, 4 }, {AccessMethodRelationId, /* AMOID */ AmOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 4 }, {AccessMethodOperatorRelationId, /* AMOPOPID */ AccessMethodOperatorIndexId, 0, 2, { Anum_pg_amop_amopopr, Anum_pg_amop_amopfamily, 0, 0 }, 64 }, {AccessMethodOperatorRelationId, /* AMOPSTRATEGY */ AccessMethodStrategyIndexId, 0, 4, { Anum_pg_amop_amopfamily, Anum_pg_amop_amoplefttype, Anum_pg_amop_amoprighttype, Anum_pg_amop_amopstrategy }, 64 }, {AccessMethodProcedureRelationId, /* AMPROCNUM */ AccessMethodProcedureIndexId, 0, 4, { Anum_pg_amproc_amprocfamily, Anum_pg_amproc_amproclefttype, Anum_pg_amproc_amprocrighttype, Anum_pg_amproc_amprocnum }, 64 }, {AttributeRelationId, /* ATTNAME */ AttributeRelidNameIndexId, Anum_pg_attribute_attrelid, 2, { Anum_pg_attribute_attrelid, Anum_pg_attribute_attname, 0, 0 }, 2048 }, {AttributeRelationId, /* ATTNUM */ AttributeRelidNumIndexId, Anum_pg_attribute_attrelid, 2, { Anum_pg_attribute_attrelid, Anum_pg_attribute_attnum, 0, 0 }, 2048 }, {AuthMemRelationId, /* AUTHMEMMEMROLE */ AuthMemMemRoleIndexId, 0, 2, { Anum_pg_auth_members_member, Anum_pg_auth_members_roleid, 0, 0 }, 128 }, {AuthMemRelationId, /* AUTHMEMROLEMEM */ AuthMemRoleMemIndexId, 0, 2, { Anum_pg_auth_members_roleid, Anum_pg_auth_members_member, 0, 0 }, 128 }, {AuthIdRelationId, /* AUTHNAME */ AuthIdRolnameIndexId, 0, 1, { Anum_pg_authid_rolname, 0, 0, 0 }, 128 }, {AuthIdRelationId, /* AUTHOID */ AuthIdOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 128 }, { CastRelationId, /* CASTSOURCETARGET */ CastSourceTargetIndexId, 0, 2, { Anum_pg_cast_castsource, Anum_pg_cast_casttarget, 0, 0 }, 256 }, {OperatorClassRelationId, /* CLAAMNAMENSP */ OpclassAmNameNspIndexId, 0, 3, { Anum_pg_opclass_opcmethod, Anum_pg_opclass_opcname, Anum_pg_opclass_opcnamespace, 0 }, 64 }, {OperatorClassRelationId, /* CLAOID */ OpclassOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 64 }, {ConversionRelationId, /* CONDEFAULT */ ConversionDefaultIndexId, 0, 4, { Anum_pg_conversion_connamespace, Anum_pg_conversion_conforencoding, Anum_pg_conversion_contoencoding, ObjectIdAttributeNumber, }, 128 }, {ConversionRelationId, /* CONNAMENSP */ ConversionNameNspIndexId, 0, 2, { Anum_pg_conversion_conname, Anum_pg_conversion_connamespace, 0, 0 }, 128 }, {ConstraintRelationId, /* CONSTROID */ ConstraintOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 1024 }, {ConversionRelationId, /* CONVOID */ ConversionOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 128 }, {DatabaseRelationId, /* DATABASEOID */ DatabaseOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 4 }, {EnumRelationId, /* ENUMOID */ EnumOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 256 }, {EnumRelationId, /* ENUMTYPOIDNAME */ EnumTypIdLabelIndexId, 0, 2, { Anum_pg_enum_enumtypid, Anum_pg_enum_enumlabel, 0, 0 }, 256 }, {IndexRelationId, /* INDEXRELID */ IndexRelidIndexId, Anum_pg_index_indrelid, 1, { Anum_pg_index_indexrelid, 0, 0, 0 }, 1024 }, {LanguageRelationId, /* LANGNAME */ LanguageNameIndexId, 0, 1, { Anum_pg_language_lanname, 0, 0, 0 }, 4 }, {LanguageRelationId, /* LANGOID */ LanguageOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 4 }, {NamespaceRelationId, /* NAMESPACENAME */ NamespaceNameIndexId, 0, 1, { Anum_pg_namespace_nspname, 0, 0, 0 }, 256 }, {NamespaceRelationId, /* NAMESPACEOID */ NamespaceOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 256 }, {OperatorRelationId, /* OPERNAMENSP */ OperatorNameNspIndexId, 0, 4, { Anum_pg_operator_oprname, Anum_pg_operator_oprleft, Anum_pg_operator_oprright, Anum_pg_operator_oprnamespace }, 1024 }, {OperatorRelationId, /* OPEROID */ OperatorOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 1024 }, {OperatorFamilyRelationId, /* OPFAMILYAMNAMENSP */ OpfamilyAmNameNspIndexId, 0, 3, { Anum_pg_opfamily_opfmethod, Anum_pg_opfamily_opfname, Anum_pg_opfamily_opfnamespace, 0 }, 64 }, {OperatorFamilyRelationId, /* OPFAMILYOID */ OpfamilyOidIndexId, 0, 1, { ObjectIdAttributeNumber, 0, 0, 0 }, 64 }, {ProcedureRelationId, /* PROCNAMEARGSNSP */ ProcedureNameArgsNspIndexId, 0, 3, { Anum_pg_proc_proname, Anum_pg_proc_proargtypes, Anum_pg_proc_pronamespace, 0 }, 2048 }, {ProcedureRelationId, /* PROCOID */ ProcedureOidIndexId, 0, 1,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?