PostgreSQL Source Code  git master
attoptcache.c File Reference
#include "postgres.h"
#include "access/reloptions.h"
#include "utils/attoptcache.h"
#include "utils/catcache.h"
#include "utils/hsearch.h"
#include "utils/inval.h"
#include "utils/syscache.h"
#include "varatt.h"
Include dependency graph for attoptcache.c:

Go to the source code of this file.

Data Structures

struct  AttoptCacheKey
 
struct  AttoptCacheEntry
 

Functions

static void InvalidateAttoptCacheCallback (Datum arg, int cacheid, uint32 hashvalue)
 
static void InitializeAttoptCache (void)
 
AttributeOptsget_attribute_options (Oid attrelid, int attnum)
 

Variables

static HTABAttoptCacheHash = NULL
 

Function Documentation

◆ get_attribute_options()

AttributeOpts* get_attribute_options ( Oid  attrelid,
int  attnum 
)

Definition at line 104 of file attoptcache.c.

105 {
107  AttoptCacheEntry *attopt;
108  AttributeOpts *result;
109  HeapTuple tp;
110 
111  /* Find existing cache entry, if any. */
112  if (!AttoptCacheHash)
114  memset(&key, 0, sizeof(key)); /* make sure any padding bits are unset */
115  key.attrelid = attrelid;
116  key.attnum = attnum;
117  attopt =
119  &key,
120  HASH_FIND,
121  NULL);
122 
123  /* Not found in Attopt cache. Construct new cache entry. */
124  if (!attopt)
125  {
127 
128  tp = SearchSysCache2(ATTNUM,
129  ObjectIdGetDatum(attrelid),
131 
132  /*
133  * If we don't find a valid HeapTuple, it must mean someone has
134  * managed to request attribute details for a non-existent attribute.
135  * We treat that case as if no options were specified.
136  */
137  if (!HeapTupleIsValid(tp))
138  opts = NULL;
139  else
140  {
141  Datum datum;
142  bool isNull;
143 
144  datum = SysCacheGetAttr(ATTNUM,
145  tp,
146  Anum_pg_attribute_attoptions,
147  &isNull);
148  if (isNull)
149  opts = NULL;
150  else
151  {
152  bytea *bytea_opts = attribute_reloptions(datum, false);
153 
155  VARSIZE(bytea_opts));
156  memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
157  }
158  ReleaseSysCache(tp);
159  }
160 
161  /*
162  * It's important to create the actual cache entry only after reading
163  * pg_attribute, since the read could cause a cache flush.
164  */
166  &key,
167  HASH_ENTER,
168  NULL);
169  attopt->opts = opts;
170  }
171 
172  /* Return results in caller's memory context. */
173  if (attopt->opts == NULL)
174  return NULL;
175  result = palloc(VARSIZE(attopt->opts));
176  memcpy(result, attopt->opts, VARSIZE(attopt->opts));
177  return result;
178 }
static HTAB * AttoptCacheHash
Definition: attoptcache.c:29
static void InitializeAttoptCache(void)
Definition: attoptcache.c:78
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:955
@ HASH_FIND
Definition: hsearch.h:113
@ HASH_ENTER
Definition: hsearch.h:114
#define HeapTupleIsValid(tuple)
Definition: htup.h:78
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:1180
MemoryContext CacheMemoryContext
Definition: mcxt.c:152
void * palloc(Size size)
Definition: mcxt.c:1316
static AmcheckOptions opts
Definition: pg_amcheck.c:111
int16 attnum
Definition: pg_attribute.h:74
uintptr_t Datum
Definition: postgres.h:64
static Datum Int16GetDatum(int16 X)
Definition: postgres.h:172
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:252
bytea * attribute_reloptions(Datum reloptions, bool validate)
Definition: reloptions.c:2069
AttributeOpts * opts
Definition: attoptcache.c:41
Definition: c.h:687
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:266
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition: syscache.c:479
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
Definition: syscache.c:229
#define VARSIZE(PTR)
Definition: varatt.h:279

References attnum, AttoptCacheHash, attribute_reloptions(), CacheMemoryContext, HASH_ENTER, HASH_FIND, hash_search(), HeapTupleIsValid, InitializeAttoptCache(), Int16GetDatum(), sort-test::key, MemoryContextAlloc(), ObjectIdGetDatum(), AttoptCacheEntry::opts, opts, palloc(), ReleaseSysCache(), SearchSysCache2(), SysCacheGetAttr(), and VARSIZE.

Referenced by compute_expr_stats(), and do_analyze_rel().

◆ InitializeAttoptCache()

static void InitializeAttoptCache ( void  )
static

Definition at line 78 of file attoptcache.c.

79 {
80  HASHCTL ctl;
81 
82  /* Initialize the hash table. */
83  ctl.keysize = sizeof(AttoptCacheKey);
84  ctl.entrysize = sizeof(AttoptCacheEntry);
86  hash_create("Attopt cache", 256, &ctl,
88 
89  /* Make sure we've initialized CacheMemoryContext. */
90  if (!CacheMemoryContext)
92 
93  /* Watch for invalidation events. */
96  (Datum) 0);
97 }
static void InvalidateAttoptCacheCallback(Datum arg, int cacheid, uint32 hashvalue)
Definition: attoptcache.c:55
void CreateCacheMemoryContext(void)
Definition: catcache.c:679
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
Definition: dynahash.c:352
#define HASH_ELEM
Definition: hsearch.h:95
#define HASH_BLOBS
Definition: hsearch.h:97
void CacheRegisterSyscacheCallback(int cacheid, SyscacheCallbackFunction func, Datum arg)
Definition: inval.c:1516
tree ctl
Definition: radixtree.h:1851

References AttoptCacheHash, CacheMemoryContext, CacheRegisterSyscacheCallback(), CreateCacheMemoryContext(), ctl, HASH_BLOBS, hash_create(), HASH_ELEM, and InvalidateAttoptCacheCallback().

Referenced by get_attribute_options().

◆ InvalidateAttoptCacheCallback()

static void InvalidateAttoptCacheCallback ( Datum  arg,
int  cacheid,
uint32  hashvalue 
)
static

Definition at line 55 of file attoptcache.c.

56 {
57  HASH_SEQ_STATUS status;
58  AttoptCacheEntry *attopt;
59 
61  while ((attopt = (AttoptCacheEntry *) hash_seq_search(&status)) != NULL)
62  {
63  if (attopt->opts)
64  pfree(attopt->opts);
66  &attopt->key,
68  NULL) == NULL)
69  elog(ERROR, "hash table corrupted");
70  }
71 }
void * hash_seq_search(HASH_SEQ_STATUS *status)
Definition: dynahash.c:1395
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
Definition: dynahash.c:1385
#define ERROR
Definition: elog.h:39
#define elog(elevel,...)
Definition: elog.h:224
@ HASH_REMOVE
Definition: hsearch.h:115
void pfree(void *pointer)
Definition: mcxt.c:1520
AttoptCacheKey key
Definition: attoptcache.c:40

References AttoptCacheHash, elog, ERROR, HASH_REMOVE, hash_search(), hash_seq_init(), hash_seq_search(), AttoptCacheEntry::key, AttoptCacheEntry::opts, and pfree().

Referenced by InitializeAttoptCache().

Variable Documentation

◆ AttoptCacheHash

HTAB* AttoptCacheHash = NULL
static