mirror of
https://github.com/postgres/postgres.git
synced 2026-03-05 06:43:23 -05:00
An upcoming patch requires this cache so that it can track updates
in the pg_extension catalog. So far though, the EXTENSIONOID cache
only exists in v18 and up (see 490f869d9). We can add it in older
branches without an ABI break, if we are careful not to disturb the
numbering of existing syscache IDs.
In v16 and before, that just requires adding the new ID at the end
of the hand-assigned enum list, ignoring our convention about
alphabetizing the IDs. But in v17, genbki.pl enforces alphabetical
order of the IDs listed in MAKE_SYSCACHE macros. We can fake it
out by calling the new cache ZEXTENSIONOID.
Note that adding a syscache does change the required contents of the
relcache init file (pg_internal.init). But that isn't problematic
since we blow those away at postmaster start for other reasons.
Author: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Noah Misch <noah@leadboat.com>
Security: CVE-2026-2004
Backpatch-through: 14-17
234 lines
6.8 KiB
C
234 lines
6.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* syscache.h
|
|
* System catalog cache definitions.
|
|
*
|
|
* See also lsyscache.h, which provides convenience routines for
|
|
* common cache-lookup operations.
|
|
*
|
|
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/utils/syscache.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef SYSCACHE_H
|
|
#define SYSCACHE_H
|
|
|
|
#include "access/attnum.h"
|
|
#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,
|
|
/* intentionally out of alphabetical order, to avoid an ABI break: */
|
|
EXTENSIONOID
|
|
|
|
#define SysCacheSize (EXTENSIONOID + 1)
|
|
};
|
|
|
|
extern void InitCatalogCache(void);
|
|
extern void InitCatalogCachePhase2(void);
|
|
|
|
extern HeapTuple SearchSysCache(int cacheId,
|
|
Datum key1, Datum key2, Datum key3, Datum key4);
|
|
|
|
/*
|
|
* The use of argument specific numbers is encouraged. They're faster, and
|
|
* insulates the caller from changes in the maximum number of keys.
|
|
*/
|
|
extern HeapTuple SearchSysCache1(int cacheId,
|
|
Datum key1);
|
|
extern HeapTuple SearchSysCache2(int cacheId,
|
|
Datum key1, Datum key2);
|
|
extern HeapTuple SearchSysCache3(int cacheId,
|
|
Datum key1, Datum key2, Datum key3);
|
|
extern HeapTuple SearchSysCache4(int cacheId,
|
|
Datum key1, Datum key2, Datum key3, Datum key4);
|
|
|
|
extern void ReleaseSysCache(HeapTuple tuple);
|
|
|
|
extern HeapTuple SearchSysCacheLocked1(int cacheId,
|
|
Datum key1);
|
|
|
|
/* convenience routines */
|
|
extern HeapTuple SearchSysCacheCopy(int cacheId,
|
|
Datum key1, Datum key2, Datum key3, Datum key4);
|
|
extern HeapTuple SearchSysCacheLockedCopy1(int cacheId,
|
|
Datum key1);
|
|
extern bool SearchSysCacheExists(int cacheId,
|
|
Datum key1, Datum key2, Datum key3, Datum key4);
|
|
extern Oid GetSysCacheOid(int cacheId, AttrNumber oidcol,
|
|
Datum key1, Datum key2, Datum key3, Datum key4);
|
|
|
|
extern HeapTuple SearchSysCacheAttName(Oid relid, const char *attname);
|
|
extern HeapTuple SearchSysCacheCopyAttName(Oid relid, const char *attname);
|
|
extern bool SearchSysCacheExistsAttName(Oid relid, const char *attname);
|
|
|
|
extern HeapTuple SearchSysCacheAttNum(Oid relid, int16 attnum);
|
|
extern HeapTuple SearchSysCacheCopyAttNum(Oid relid, int16 attnum);
|
|
|
|
extern Datum SysCacheGetAttr(int cacheId, HeapTuple tup,
|
|
AttrNumber attributeNumber, bool *isNull);
|
|
|
|
extern Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup,
|
|
AttrNumber attributeNumber);
|
|
|
|
extern uint32 GetSysCacheHashValue(int cacheId,
|
|
Datum key1, Datum key2, Datum key3, Datum key4);
|
|
|
|
/* list-search interface. Users of this must import catcache.h too */
|
|
struct catclist;
|
|
extern struct catclist *SearchSysCacheList(int cacheId, int nkeys,
|
|
Datum key1, Datum key2, Datum key3);
|
|
|
|
extern void SysCacheInvalidate(int cacheId, uint32 hashValue);
|
|
|
|
extern bool RelationInvalidatesSnapshotsOnly(Oid relid);
|
|
extern bool RelationHasSysCache(Oid relid);
|
|
extern bool RelationSupportsSysCache(Oid relid);
|
|
|
|
/*
|
|
* The use of the macros below rather than direct calls to the corresponding
|
|
* functions is encouraged, as it insulates the caller from changes in the
|
|
* maximum number of keys.
|
|
*/
|
|
#define SearchSysCacheCopy1(cacheId, key1) \
|
|
SearchSysCacheCopy(cacheId, key1, 0, 0, 0)
|
|
#define SearchSysCacheCopy2(cacheId, key1, key2) \
|
|
SearchSysCacheCopy(cacheId, key1, key2, 0, 0)
|
|
#define SearchSysCacheCopy3(cacheId, key1, key2, key3) \
|
|
SearchSysCacheCopy(cacheId, key1, key2, key3, 0)
|
|
#define SearchSysCacheCopy4(cacheId, key1, key2, key3, key4) \
|
|
SearchSysCacheCopy(cacheId, key1, key2, key3, key4)
|
|
|
|
#define SearchSysCacheExists1(cacheId, key1) \
|
|
SearchSysCacheExists(cacheId, key1, 0, 0, 0)
|
|
#define SearchSysCacheExists2(cacheId, key1, key2) \
|
|
SearchSysCacheExists(cacheId, key1, key2, 0, 0)
|
|
#define SearchSysCacheExists3(cacheId, key1, key2, key3) \
|
|
SearchSysCacheExists(cacheId, key1, key2, key3, 0)
|
|
#define SearchSysCacheExists4(cacheId, key1, key2, key3, key4) \
|
|
SearchSysCacheExists(cacheId, key1, key2, key3, key4)
|
|
|
|
#define GetSysCacheOid1(cacheId, oidcol, key1) \
|
|
GetSysCacheOid(cacheId, oidcol, key1, 0, 0, 0)
|
|
#define GetSysCacheOid2(cacheId, oidcol, key1, key2) \
|
|
GetSysCacheOid(cacheId, oidcol, key1, key2, 0, 0)
|
|
#define GetSysCacheOid3(cacheId, oidcol, key1, key2, key3) \
|
|
GetSysCacheOid(cacheId, oidcol, key1, key2, key3, 0)
|
|
#define GetSysCacheOid4(cacheId, oidcol, key1, key2, key3, key4) \
|
|
GetSysCacheOid(cacheId, oidcol, key1, key2, key3, key4)
|
|
|
|
#define GetSysCacheHashValue1(cacheId, key1) \
|
|
GetSysCacheHashValue(cacheId, key1, 0, 0, 0)
|
|
#define GetSysCacheHashValue2(cacheId, key1, key2) \
|
|
GetSysCacheHashValue(cacheId, key1, key2, 0, 0)
|
|
#define GetSysCacheHashValue3(cacheId, key1, key2, key3) \
|
|
GetSysCacheHashValue(cacheId, key1, key2, key3, 0)
|
|
#define GetSysCacheHashValue4(cacheId, key1, key2, key3, key4) \
|
|
GetSysCacheHashValue(cacheId, key1, key2, key3, key4)
|
|
|
|
#define SearchSysCacheList1(cacheId, key1) \
|
|
SearchSysCacheList(cacheId, 1, key1, 0, 0)
|
|
#define SearchSysCacheList2(cacheId, key1, key2) \
|
|
SearchSysCacheList(cacheId, 2, key1, key2, 0)
|
|
#define SearchSysCacheList3(cacheId, key1, key2, key3) \
|
|
SearchSysCacheList(cacheId, 3, key1, key2, key3)
|
|
|
|
#define ReleaseSysCacheList(x) ReleaseCatCacheList(x)
|
|
|
|
#endif /* SYSCACHE_H */
|