PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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,
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
void * palloc(Size size)
Definition: mcxt.c:1317
MemoryContext CacheMemoryContext
Definition: mcxt.c:152
static AmcheckOptions opts
Definition: pg_amcheck.c:112
int16 attnum
Definition: pg_attribute.h:74
uintptr_t Datum
Definition: postgres.h:69
static Datum Int16GetDatum(int16 X)
Definition: postgres.h:177
static Datum ObjectIdGetDatum(Oid X)
Definition: postgres.h:257
bytea * attribute_reloptions(Datum reloptions, bool validate)
Definition: reloptions.c:2069
AttributeOpts * opts
Definition: attoptcache.c:41
Definition: c.h:644
void ReleaseSysCache(HeapTuple tuple)
Definition: syscache.c:269
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
Definition: syscache.c:600
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().