1 /*-------------------------------------------------------------------------
4 * Type cache definitions.
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.
9 * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
10 * Portions Copyright (c) 1994, Regents of the University of California
12 * src/include/utils/typcache.h
14 *-------------------------------------------------------------------------
19 #include "access/tupdesc.h"
21 #include "storage/dsm.h"
22 #include "utils/dsa.h"
25 /* DomainConstraintCache is an opaque struct known only within typcache.c */
26 typedef struct DomainConstraintCache DomainConstraintCache;
28 /* TypeCacheEnumData is an opaque struct known only within typcache.c */
29 struct TypeCacheEnumData;
31 typedef struct TypeCacheEntry
33 /* typeId is the hash lookup key and MUST BE FIRST */
34 Oid type_id; /* OID of the data type */
36 /* some subsidiary information copied from the pg_type row */
46 * Information obtained from opfamily entries
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.
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 */
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.
71 FmgrInfo eq_opr_finfo;
72 FmgrInfo cmp_proc_finfo;
73 FmgrInfo hash_proc_finfo;
74 FmgrInfo hash_extended_proc_finfo;
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.
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.
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 */
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.
102 int32 domainBaseTypmod;
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.
108 DomainConstraintCache *domainData;
110 /* Private data, for internal use of typcache.c only */
111 int flags; /* flags about what we've computed */
114 * Private information about an enum type. NULL if not enum or
115 * information hasn't been requested.
117 struct TypeCacheEnumData *enumData;
119 /* We also maintain a list of all known domain-type cache entries */
120 struct TypeCacheEntry *nextDomain;
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
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.
147 typedef struct DomainConstraintRef
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? */
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;
159 typedef struct SharedRecordTypmodRegistry SharedRecordTypmodRegistry;
161 extern TypeCacheEntry *lookup_type_cache(Oid type_id, int flags);
163 extern void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref,
164 MemoryContext refctx, bool need_exprstate);
166 extern void UpdateDomainConstraintRef(DomainConstraintRef *ref);
168 extern bool DomainHasConstraints(Oid type_id);
170 extern TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod);
172 extern TupleDesc lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod,
175 extern TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod);
177 extern TupleDesc lookup_rowtype_tupdesc_domain(Oid type_id, int32 typmod,
180 extern void assign_record_type_typmod(TupleDesc tupDesc);
182 extern int compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2);
184 extern size_t SharedRecordTypmodRegistryEstimate(void);
186 extern void SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *,
187 dsm_segment *segment, dsa_area *area);
189 extern void SharedRecordTypmodRegistryAttach(SharedRecordTypmodRegistry *);
191 #endif /* TYPCACHE_H */