PostgreSQL Source Code  git master
attoptcache.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  AttributeOpts
 

Typedefs

typedef struct AttributeOpts AttributeOpts
 

Functions

AttributeOptsget_attribute_options (Oid attrelid, int attnum)
 

Typedef Documentation

◆ AttributeOpts

typedef struct AttributeOpts AttributeOpts

Function Documentation

◆ get_attribute_options()

AttributeOpts* get_attribute_options ( Oid  attrelid,
int  attnum 
)

Definition at line 131 of file attoptcache.c.

132 {
134  AttoptCacheEntry *attopt;
135  AttributeOpts *result;
136  HeapTuple tp;
137 
138  /* Find existing cache entry, if any. */
139  if (!AttoptCacheHash)
141  memset(&key, 0, sizeof(key)); /* make sure any padding bits are unset */
142  key.attrelid = attrelid;
143  key.attnum = attnum;
144  attopt =
146  &key,
147  HASH_FIND,
148  NULL);
149 
150  /* Not found in Attopt cache. Construct new cache entry. */
151  if (!attopt)
152  {
154 
155  tp = SearchSysCache2(ATTNUM,
156  ObjectIdGetDatum(attrelid),
158 
159  /*
160  * If we don't find a valid HeapTuple, it must mean someone has
161  * managed to request attribute details for a non-existent attribute.
162  * We treat that case as if no options were specified.
163  */
164  if (!HeapTupleIsValid(tp))
165  opts = NULL;
166  else
167  {
168  Datum datum;
169  bool isNull;
170 
171  datum = SysCacheGetAttr(ATTNUM,
172  tp,
173  Anum_pg_attribute_attoptions,
174  &isNull);
175  if (isNull)
176  opts = NULL;
177  else
178  {
179  bytea *bytea_opts = attribute_reloptions(datum, false);
180 
182  VARSIZE(bytea_opts));
183  memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
184  }
185  ReleaseSysCache(tp);
186  }
187 
188  /*
189  * It's important to create the actual cache entry only after reading
190  * pg_attribute, since the read could cause a cache flush.
191  */
193  &key,
194  HASH_ENTER,
195  NULL);
196  attopt->opts = opts;
197  }
198 
199  /* Return results in caller's memory context. */
200  if (attopt->opts == NULL)
201  return NULL;
202  result = palloc(VARSIZE(attopt->opts));
203  memcpy(result, attopt->opts, VARSIZE(attopt->opts));
204  return result;
205 }
static HTAB * AttoptCacheHash
Definition: attoptcache.c:29
static void InitializeAttoptCache(void)
Definition: attoptcache.c:97
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:1181
MemoryContext CacheMemoryContext
Definition: mcxt.c:152
void * palloc(Size size)
Definition: mcxt.c:1317
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:690
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:269
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition: syscache.c:596
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
Definition: syscache.c:232
#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().