]> granicus.if.org Git - postgresql/blob - src/include/utils/typcache.h
Update copyright for 2018
[postgresql] / src / include / utils / typcache.h
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 */
26 typedef struct DomainConstraintCache DomainConstraintCache;
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 */
37         int16           typlen;
38         bool            typbyval;
39         char            typalign;
40         char            typstorage;
41         char            typtype;
42         Oid                     typrelid;
43         Oid                     typelem;
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          */
71         FmgrInfo        eq_opr_finfo;
72         FmgrInfo        cmp_proc_finfo;
73         FmgrInfo        hash_proc_finfo;
74         FmgrInfo        hash_extended_proc_finfo;
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          */
82         TupleDesc       tupDesc;
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          */
101         Oid                     domainBaseType;
102         int32           domainBaseTypmod;
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          */
108         DomainConstraintCache *domainData;
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          */
117         struct TypeCacheEnumData *enumData;
118
119         /* We also maintain a list of all known domain-type cache entries */
120         struct TypeCacheEntry *nextDomain;
121 } TypeCacheEntry;
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 */
157 } DomainConstraintRef;
158
159 typedef struct SharedRecordTypmodRegistry SharedRecordTypmodRegistry;
160
161 extern TypeCacheEntry *lookup_type_cache(Oid type_id, int flags);
162
163 extern void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref,
164                                                 MemoryContext refctx, bool need_exprstate);
165
166 extern void UpdateDomainConstraintRef(DomainConstraintRef *ref);
167
168 extern bool DomainHasConstraints(Oid type_id);
169
170 extern TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod);
171
172 extern TupleDesc lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod,
173                                                            bool noError);
174
175 extern TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod);
176
177 extern TupleDesc lookup_rowtype_tupdesc_domain(Oid type_id, int32 typmod,
178                                                           bool noError);
179
180 extern void assign_record_type_typmod(TupleDesc tupDesc);
181
182 extern int      compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2);
183
184 extern size_t SharedRecordTypmodRegistryEstimate(void);
185
186 extern void SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *,
187                                                            dsm_segment *segment, dsa_area *area);
188
189 extern void SharedRecordTypmodRegistryAttach(SharedRecordTypmodRegistry *);
190
191 #endif                                                  /* TYPCACHE_H */