PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
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 spcid, int attnum)
 

Typedef Documentation

Function Documentation

AttributeOpts* get_attribute_options ( Oid  spcid,
int  attnum 
)

Definition at line 104 of file attoptcache.c.

References Anum_pg_attribute_attoptions, AttoptCacheKey::attnum, ATTNUM, AttoptCacheKey::attrelid, attribute_reloptions(), CacheMemoryContext, HASH_ENTER, HASH_FIND, hash_search(), HeapTupleIsValid, InitializeAttoptCache(), Int16GetDatum, MemoryContextAlloc(), NULL, ObjectIdGetDatum, AttoptCacheEntry::opts, palloc(), ReleaseSysCache(), result, SearchSysCache2, SysCacheGetAttr(), and VARSIZE.

Referenced by compute_index_stats(), and do_analyze_rel().

105 {
106  AttoptCacheKey key;
107  AttoptCacheEntry *attopt;
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
115  * unset */
116  key.attrelid = attrelid;
117  key.attnum = attnum;
118  attopt =
120  (void *) &key,
121  HASH_FIND,
122  NULL);
123 
124  /* Not found in Attopt cache. Construct new cache entry. */
125  if (!attopt)
126  {
127  AttributeOpts *opts;
128 
129  tp = SearchSysCache2(ATTNUM,
130  ObjectIdGetDatum(attrelid),
131  Int16GetDatum(attnum));
132 
133  /*
134  * If we don't find a valid HeapTuple, it must mean someone has
135  * managed to request attribute details for a non-existent attribute.
136  * We treat that case as if no options were specified.
137  */
138  if (!HeapTupleIsValid(tp))
139  opts = NULL;
140  else
141  {
142  Datum datum;
143  bool isNull;
144 
145  datum = SysCacheGetAttr(ATTNUM,
146  tp,
148  &isNull);
149  if (isNull)
150  opts = NULL;
151  else
152  {
153  bytea *bytea_opts = attribute_reloptions(datum, false);
154 
156  VARSIZE(bytea_opts));
157  memcpy(opts, bytea_opts, VARSIZE(bytea_opts));
158  }
159  ReleaseSysCache(tp);
160  }
161 
162  /*
163  * It's important to create the actual cache entry only after reading
164  * pg_attribute, since the read could cause a cache flush.
165  */
167  (void *) &key,
168  HASH_ENTER,
169  NULL);
170  attopt->opts = opts;
171  }
172 
173  /* Return results in caller's memory context. */
174  if (attopt->opts == NULL)
175  return NULL;
176  result = palloc(VARSIZE(attopt->opts));
177  memcpy(result, attopt->opts, VARSIZE(attopt->opts));
178  return result;
179 }
#define VARSIZE(PTR)
Definition: postgres.h:304
#define Int16GetDatum(X)
Definition: postgres.h:457
return result
Definition: formatting.c:1618
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:885
bytea * attribute_reloptions(Datum reloptions, bool validate)
Definition: reloptions.c:1462
#define ObjectIdGetDatum(X)
Definition: postgres.h:513
static HTAB * AttoptCacheHash
Definition: attoptcache.c:28
uintptr_t Datum
Definition: postgres.h:372
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:1116
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition: syscache.c:1278
#define HeapTupleIsValid(tuple)
Definition: htup.h:77
#define NULL
Definition: c.h:229
AttributeOpts * opts
Definition: attoptcache.c:40
#define Anum_pg_attribute_attoptions
Definition: pg_attribute.h:215
void * palloc(Size size)
Definition: mcxt.c:849
void * MemoryContextAlloc(MemoryContext context, Size size)
Definition: mcxt.c:707
static void InitializeAttoptCache(void)
Definition: attoptcache.c:77
Definition: c.h:439
MemoryContext CacheMemoryContext
Definition: mcxt.c:46
#define SearchSysCache2(cacheId, key1, key2)
Definition: syscache.h:154