PostgreSQL Source Code  git master
typcache.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * typcache.h
4  * Type cache definitions.
5  *
6  * The type cache exists to speed lookup of certain information about data
7  * types that is not directly available from a type's pg_type row.
8  *
9  * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
10  * Portions Copyright (c) 1994, Regents of the University of California
11  *
12  * src/include/utils/typcache.h
13  *
14  *-------------------------------------------------------------------------
15  */
16 #ifndef TYPCACHE_H
17 #define TYPCACHE_H
18 
19 #include "access/tupdesc.h"
20 #include "fmgr.h"
21 #include "storage/dsm.h"
22 #include "utils/dsa.h"
23 
24 
25 /* DomainConstraintCache is an opaque struct known only within typcache.c */
27 
28 /* TypeCacheEnumData is an opaque struct known only within typcache.c */
29 struct TypeCacheEnumData;
30 
31 typedef struct TypeCacheEntry
32 {
33  /* typeId is the hash lookup key and MUST BE FIRST */
34  Oid type_id; /* OID of the data type */
35 
36  /* some subsidiary information copied from the pg_type row */
38  bool typbyval;
39  char typalign;
40  char typstorage;
41  char typtype;
44 
45  /*
46  * Information obtained from opfamily entries
47  *
48  * These will be InvalidOid if no match could be found, or if the
49  * information hasn't yet been requested. Also note that for array and
50  * composite types, typcache.c checks that the contained types are
51  * comparable or hashable before allowing eq_opr etc to become set.
52  */
53  Oid btree_opf; /* the default btree opclass' family */
54  Oid btree_opintype; /* the default btree opclass' opcintype */
55  Oid hash_opf; /* the default hash opclass' family */
56  Oid hash_opintype; /* the default hash opclass' opcintype */
57  Oid eq_opr; /* the equality operator */
58  Oid lt_opr; /* the less-than operator */
59  Oid gt_opr; /* the greater-than operator */
60  Oid cmp_proc; /* the btree comparison function */
61  Oid hash_proc; /* the hash calculation function */
62  Oid hash_extended_proc; /* the extended hash calculation function */
63 
64  /*
65  * Pre-set-up fmgr call info for the equality operator, the btree
66  * comparison function, and the hash calculation function. These are kept
67  * in the type cache to avoid problems with memory leaks in repeated calls
68  * to functions such as array_eq, array_cmp, hash_array. There is not
69  * currently a need to maintain call info for the lt_opr or gt_opr.
70  */
75 
76  /*
77  * Tuple descriptor if it's a composite type (row type). NULL if not
78  * composite or information hasn't yet been requested. (NOTE: this is a
79  * reference-counted tupledesc.) To simplify caching dependent info,
80  * tupDescSeqNo is incremented each time tupDesc is rebuilt in a session.
81  */
83  int64 tupDescSeqNo;
84 
85  /*
86  * Fields computed when TYPECACHE_RANGE_INFO is requested. Zeroes if not
87  * a range type or information hasn't yet been requested. Note that
88  * rng_cmp_proc_finfo could be different from the element type's default
89  * btree comparison function.
90  */
91  struct TypeCacheEntry *rngelemtype; /* range's element type */
92  Oid rng_collation; /* collation for comparisons, if any */
93  FmgrInfo rng_cmp_proc_finfo; /* comparison function */
94  FmgrInfo rng_canonical_finfo; /* canonicalization function, if any */
95  FmgrInfo rng_subdiff_finfo; /* difference function, if any */
96 
97  /*
98  * Domain's base type and typmod if it's a domain type. Zeroes if not
99  * domain, or if information hasn't been requested.
100  */
103 
104  /*
105  * Domain constraint data if it's a domain type. NULL if not domain, or
106  * if domain has no constraints, or if information hasn't been requested.
107  */
109 
110  /* Private data, for internal use of typcache.c only */
111  int flags; /* flags about what we've computed */
112 
113  /*
114  * Private information about an enum type. NULL if not enum or
115  * information hasn't been requested.
116  */
118 
119  /* We also maintain a list of all known domain-type cache entries */
122 
123 /* Bit flags to indicate which fields a given caller needs to have set */
124 #define TYPECACHE_EQ_OPR 0x0001
125 #define TYPECACHE_LT_OPR 0x0002
126 #define TYPECACHE_GT_OPR 0x0004
127 #define TYPECACHE_CMP_PROC 0x0008
128 #define TYPECACHE_HASH_PROC 0x0010
129 #define TYPECACHE_EQ_OPR_FINFO 0x0020
130 #define TYPECACHE_CMP_PROC_FINFO 0x0040
131 #define TYPECACHE_HASH_PROC_FINFO 0x0080
132 #define TYPECACHE_TUPDESC 0x0100
133 #define TYPECACHE_BTREE_OPFAMILY 0x0200
134 #define TYPECACHE_HASH_OPFAMILY 0x0400
135 #define TYPECACHE_RANGE_INFO 0x0800
136 #define TYPECACHE_DOMAIN_BASE_INFO 0x1000
137 #define TYPECACHE_DOMAIN_CONSTR_INFO 0x2000
138 #define TYPECACHE_HASH_EXTENDED_PROC 0x4000
139 #define TYPECACHE_HASH_EXTENDED_PROC_FINFO 0x8000
140 
141 /*
142  * Callers wishing to maintain a long-lived reference to a domain's constraint
143  * set must store it in one of these. Use InitDomainConstraintRef() and
144  * UpdateDomainConstraintRef() to manage it. Note: DomainConstraintState is
145  * considered an executable expression type, so it's defined in execnodes.h.
146  */
147 typedef struct DomainConstraintRef
148 {
149  List *constraints; /* list of DomainConstraintState nodes */
150  MemoryContext refctx; /* context holding DomainConstraintRef */
151  TypeCacheEntry *tcache; /* typcache entry for domain type */
152  bool need_exprstate; /* does caller need check_exprstate? */
153 
154  /* Management data --- treat these fields as private to typcache.c */
155  DomainConstraintCache *dcc; /* current constraints, or NULL if none */
156  MemoryContextCallback callback; /* used to release refcount when done */
158 
160 
162 
164  MemoryContext refctx, bool need_exprstate);
165 
167 
168 extern bool DomainHasConstraints(Oid type_id);
169 
171 
173  bool noError);
174 
176 
178  bool noError);
179 
181 
182 extern int compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2);
183 
184 extern size_t SharedRecordTypmodRegistryEstimate(void);
185 
187  dsm_segment *segment, dsa_area *area);
188 
190 
191 #endif /* TYPCACHE_H */
int compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2)
Definition: typcache.c:2154
MemoryContextCallback callback
Definition: typcache.h:156
signed short int16
Definition: c.h:293
struct TypeCacheEnumData * enumData
Definition: typcache.h:117
Definition: fmgr.h:56
FmgrInfo rng_cmp_proc_finfo
Definition: typcache.h:93
DomainConstraintCache * dcc
Definition: typcache.h:155
TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod)
Definition: typcache.c:1652
Oid hash_opintype
Definition: typcache.h:56
DomainConstraintCache * domainData
Definition: typcache.h:108
void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref, MemoryContext refctx, bool need_exprstate)
Definition: typcache.c:1181
struct TypeCacheEntry TypeCacheEntry
size_t SharedRecordTypmodRegistryEstimate(void)
Definition: typcache.c:1805
TupleDesc lookup_rowtype_tupdesc_domain(Oid type_id, int32 typmod, bool noError)
Definition: typcache.c:1674
unsigned int Oid
Definition: postgres_ext.h:31
int16 typlen
Definition: typcache.h:37
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
Definition: typcache.c:1618
bool typbyval
Definition: typcache.h:38
signed int int32
Definition: c.h:294
Oid domainBaseType
Definition: typcache.h:101
FmgrInfo rng_subdiff_finfo
Definition: typcache.h:95
FmgrInfo cmp_proc_finfo
Definition: typcache.h:72
struct TypeCacheEntry * nextDomain
Definition: typcache.h:120
void UpdateDomainConstraintRef(DomainConstraintRef *ref)
Definition: typcache.c:1219
void assign_record_type_typmod(TupleDesc tupDesc)
Definition: typcache.c:1738
char typstorage
Definition: typcache.h:40
int32 domainBaseTypmod
Definition: typcache.h:102
void SharedRecordTypmodRegistryAttach(SharedRecordTypmodRegistry *)
Definition: typcache.c:1926
Oid hash_extended_proc
Definition: typcache.h:62
FmgrInfo hash_proc_finfo
Definition: typcache.h:73
FmgrInfo rng_canonical_finfo
Definition: typcache.h:94
MemoryContext refctx
Definition: typcache.h:150
struct TypeCacheEntry * rngelemtype
Definition: typcache.h:91
struct DomainConstraintRef DomainConstraintRef
FmgrInfo hash_extended_proc_finfo
Definition: typcache.h:74
int64 tupDescSeqNo
Definition: typcache.h:83
Oid btree_opintype
Definition: typcache.h:54
FmgrInfo eq_opr_finfo
Definition: typcache.h:71
char typtype
Definition: typcache.h:41
bool DomainHasConstraints(Oid type_id)
Definition: typcache.c:1268
void SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *, dsm_segment *segment, dsa_area *area)
Definition: typcache.c:1827
TypeCacheEntry * tcache
Definition: typcache.h:151
Oid rng_collation
Definition: typcache.h:92
Definition: dsa.c:354
char typalign
Definition: typcache.h:39
Definition: pg_list.h:45
TupleDesc tupDesc
Definition: typcache.h:82
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
Definition: typcache.c:311
TupleDesc lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod, bool noError)
Definition: typcache.c:1635