PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
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-2017, 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 
22 
23 /* DomainConstraintCache is an opaque struct known only within typcache.c */
25 
26 /* TypeCacheEnumData is an opaque struct known only within typcache.c */
27 struct TypeCacheEnumData;
28 
29 typedef struct TypeCacheEntry
30 {
31  /* typeId is the hash lookup key and MUST BE FIRST */
32  Oid type_id; /* OID of the data type */
33 
34  /* some subsidiary information copied from the pg_type row */
36  bool typbyval;
37  char typalign;
38  char typstorage;
39  char typtype;
41 
42  /*
43  * Information obtained from opfamily entries
44  *
45  * These will be InvalidOid if no match could be found, or if the
46  * information hasn't yet been requested. Also note that for array and
47  * composite types, typcache.c checks that the contained types are
48  * comparable or hashable before allowing eq_opr etc to become set.
49  */
50  Oid btree_opf; /* the default btree opclass' family */
51  Oid btree_opintype; /* the default btree opclass' opcintype */
52  Oid hash_opf; /* the default hash opclass' family */
53  Oid hash_opintype; /* the default hash opclass' opcintype */
54  Oid eq_opr; /* the equality operator */
55  Oid lt_opr; /* the less-than operator */
56  Oid gt_opr; /* the greater-than operator */
57  Oid cmp_proc; /* the btree comparison function */
58  Oid hash_proc; /* the hash calculation function */
59 
60  /*
61  * Pre-set-up fmgr call info for the equality operator, the btree
62  * comparison function, and the hash calculation function. These are kept
63  * in the type cache to avoid problems with memory leaks in repeated calls
64  * to functions such as array_eq, array_cmp, hash_array. There is not
65  * currently a need to maintain call info for the lt_opr or gt_opr.
66  */
70 
71  /*
72  * Tuple descriptor if it's a composite type (row type). NULL if not
73  * composite or information hasn't yet been requested. (NOTE: this is a
74  * reference-counted tupledesc.)
75  */
77 
78  /*
79  * Fields computed when TYPECACHE_RANGE_INFO is requested. Zeroes if not
80  * a range type or information hasn't yet been requested. Note that
81  * rng_cmp_proc_finfo could be different from the element type's default
82  * btree comparison function.
83  */
84  struct TypeCacheEntry *rngelemtype; /* range's element type */
85  Oid rng_collation; /* collation for comparisons, if any */
86  FmgrInfo rng_cmp_proc_finfo; /* comparison function */
87  FmgrInfo rng_canonical_finfo; /* canonicalization function, if any */
88  FmgrInfo rng_subdiff_finfo; /* difference function, if any */
89 
90  /*
91  * Domain constraint data if it's a domain type. NULL if not domain, or
92  * if domain has no constraints, or if information hasn't been requested.
93  */
95 
96  /* Private data, for internal use of typcache.c only */
97  int flags; /* flags about what we've computed */
98 
99  /*
100  * Private information about an enum type. NULL if not enum or
101  * information hasn't been requested.
102  */
104 
105  /* We also maintain a list of all known domain-type cache entries */
108 
109 /* Bit flags to indicate which fields a given caller needs to have set */
110 #define TYPECACHE_EQ_OPR 0x0001
111 #define TYPECACHE_LT_OPR 0x0002
112 #define TYPECACHE_GT_OPR 0x0004
113 #define TYPECACHE_CMP_PROC 0x0008
114 #define TYPECACHE_HASH_PROC 0x0010
115 #define TYPECACHE_EQ_OPR_FINFO 0x0020
116 #define TYPECACHE_CMP_PROC_FINFO 0x0040
117 #define TYPECACHE_HASH_PROC_FINFO 0x0080
118 #define TYPECACHE_TUPDESC 0x0100
119 #define TYPECACHE_BTREE_OPFAMILY 0x0200
120 #define TYPECACHE_HASH_OPFAMILY 0x0400
121 #define TYPECACHE_RANGE_INFO 0x0800
122 #define TYPECACHE_DOMAIN_INFO 0x1000
123 
124 /*
125  * Callers wishing to maintain a long-lived reference to a domain's constraint
126  * set must store it in one of these. Use InitDomainConstraintRef() and
127  * UpdateDomainConstraintRef() to manage it. Note: DomainConstraintState is
128  * considered an executable expression type, so it's defined in execnodes.h.
129  */
130 typedef struct DomainConstraintRef
131 {
132  List *constraints; /* list of DomainConstraintState nodes */
133  MemoryContext refctx; /* context holding DomainConstraintRef */
134  TypeCacheEntry *tcache; /* typcache entry for domain type */
135  bool need_exprstate; /* does caller need check_exprstate? */
136 
137  /* Management data --- treat these fields as private to typcache.c */
138  DomainConstraintCache *dcc; /* current constraints, or NULL if none */
139  MemoryContextCallback callback; /* used to release refcount when done */
141 
142 
143 extern TypeCacheEntry *lookup_type_cache(Oid type_id, int flags);
144 
145 extern void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref,
146  MemoryContext refctx, bool need_exprstate);
147 
149 
150 extern bool DomainHasConstraints(Oid type_id);
151 
152 extern TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod);
153 
154 extern TupleDesc lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod,
155  bool noError);
156 
157 extern TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod);
158 
159 extern void assign_record_type_typmod(TupleDesc tupDesc);
160 
161 extern int compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2);
162 
163 #endif /* TYPCACHE_H */
int compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2)
Definition: typcache.c:1554
MemoryContextCallback callback
Definition: typcache.h:139
signed short int16
Definition: c.h:255
struct TypeCacheEnumData * enumData
Definition: typcache.h:103
Definition: fmgr.h:56
FmgrInfo rng_cmp_proc_finfo
Definition: typcache.h:86
DomainConstraintCache * dcc
Definition: typcache.h:138
TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod)
Definition: typcache.c:1285
Oid hash_opintype
Definition: typcache.h:53
DomainConstraintCache * domainData
Definition: typcache.h:94
void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref, MemoryContext refctx, bool need_exprstate)
Definition: typcache.c:965
struct TypeCacheEntry TypeCacheEntry
unsigned int Oid
Definition: postgres_ext.h:31
int16 typlen
Definition: typcache.h:35
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
Definition: typcache.c:1251
bool typbyval
Definition: typcache.h:36
signed int int32
Definition: c.h:256
FmgrInfo rng_subdiff_finfo
Definition: typcache.h:88
FmgrInfo cmp_proc_finfo
Definition: typcache.h:68
struct TypeCacheEntry * nextDomain
Definition: typcache.h:106
void UpdateDomainConstraintRef(DomainConstraintRef *ref)
Definition: typcache.c:1003
void assign_record_type_typmod(TupleDesc tupDesc)
Definition: typcache.c:1324
char typstorage
Definition: typcache.h:38
FmgrInfo hash_proc_finfo
Definition: typcache.h:69
FmgrInfo rng_canonical_finfo
Definition: typcache.h:87
MemoryContext refctx
Definition: typcache.h:133
struct TypeCacheEntry * rngelemtype
Definition: typcache.h:84
struct DomainConstraintRef DomainConstraintRef
Oid btree_opintype
Definition: typcache.h:51
FmgrInfo eq_opr_finfo
Definition: typcache.h:67
char typtype
Definition: typcache.h:39
bool DomainHasConstraints(Oid type_id)
Definition: typcache.c:1052
TypeCacheEntry * tcache
Definition: typcache.h:134
Oid rng_collation
Definition: typcache.h:85
char typalign
Definition: typcache.h:37
Definition: pg_list.h:45
TupleDesc tupDesc
Definition: typcache.h:76
TypeCacheEntry * lookup_type_cache(Oid type_id, int flags)
Definition: typcache.c:184
TupleDesc lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod, bool noError)
Definition: typcache.c:1268