1 /*-------------------------------------------------------------------------
4 * definition of the system "type casts" relation (pg_cast)
5 * along with the relation's initial contents.
7 * As of Postgres 8.0, pg_cast describes not only type coercion functions
8 * but also length coercion functions.
11 * Copyright (c) 2002-2008, PostgreSQL Global Development Group
16 * the genbki.sh script reads this file and generates .bki
17 * information from the DATA() statements.
19 *-------------------------------------------------------------------------
24 #include "catalog/genbki.h"
27 * pg_cast definition. cpp turns this into
28 * typedef struct FormData_pg_cast
31 #define CastRelationId 2605
35 Oid castsource
; /* source datatype for cast */
36 Oid casttarget
; /* destination datatype for cast */
37 Oid castfunc
; /* cast function; 0 = binary coercible */
38 char castcontext
; /* contexts in which cast can be used */
39 char castmethod
; /* cast method */
42 typedef FormData_pg_cast
*Form_pg_cast
;
45 * The allowable values for pg_cast.castcontext are specified by this enum.
46 * Since castcontext is stored as a "char", we use ASCII codes for human
47 * convenience in reading the table. Note that internally to the backend,
48 * these values are converted to the CoercionContext enum (see primnodes.h),
49 * which is defined to sort in a convenient order; the ASCII codes don't
50 * have to sort in any special order.
53 typedef enum CoercionCodes
55 COERCION_CODE_IMPLICIT
= 'i', /* coercion in context of expression */
56 COERCION_CODE_ASSIGNMENT
= 'a', /* coercion in context of assignment */
57 COERCION_CODE_EXPLICIT
= 'e' /* explicit cast operation */
61 * The allowable values for pg_cast.castmethod are specified by this enum.
62 * Since castcontext is stored as a "char", we use ASCII codes for human
63 * convenience in reading the table.
65 typedef enum CoercionMethod
67 COERCION_METHOD_FUNCTION
= 'f', /* use a function */
68 COERCION_METHOD_BINARY
= 'b', /* types are binary-compatible */
69 COERCION_METHOD_INOUT
= 'i' /* use input/output functions */
74 * compiler constants for pg_cast
77 #define Natts_pg_cast 5
78 #define Anum_pg_cast_castsource 1
79 #define Anum_pg_cast_casttarget 2
80 #define Anum_pg_cast_castfunc 3
81 #define Anum_pg_cast_castcontext 4
82 #define Anum_pg_cast_castmethod 5
85 * initial contents of pg_cast
87 * Note: this table has OIDs, but we don't bother to assign them manually,
88 * since nothing needs to know the specific OID of any built-in cast.
93 * Numeric category: implicit casts are allowed in the direction
94 * int2->int4->int8->numeric->float4->float8, while casts in the
95 * reverse direction are assignment-only.
97 DATA(insert ( 20 21 714 a f
));
98 DATA(insert ( 20 23 480 a f
));
99 DATA(insert ( 20 700 652 i f
));
100 DATA(insert ( 20 701 482 i f
));
101 DATA(insert ( 20 1700 1781 i f
));
102 DATA(insert ( 21 20 754 i f
));
103 DATA(insert ( 21 23 313 i f
));
104 DATA(insert ( 21 700 236 i f
));
105 DATA(insert ( 21 701 235 i f
));
106 DATA(insert ( 21 1700 1782 i f
));
107 DATA(insert ( 23 20 481 i f
));
108 DATA(insert ( 23 21 314 a f
));
109 DATA(insert ( 23 700 318 i f
));
110 DATA(insert ( 23 701 316 i f
));
111 DATA(insert ( 23 1700 1740 i f
));
112 DATA(insert ( 700 20 653 a f
));
113 DATA(insert ( 700 21 238 a f
));
114 DATA(insert ( 700 23 319 a f
));
115 DATA(insert ( 700 701 311 i f
));
116 DATA(insert ( 700 1700 1742 a f
));
117 DATA(insert ( 701 20 483 a f
));
118 DATA(insert ( 701 21 237 a f
));
119 DATA(insert ( 701 23 317 a f
));
120 DATA(insert ( 701 700 312 a f
));
121 DATA(insert ( 701 1700 1743 a f
));
122 DATA(insert ( 1700 20 1779 a f
));
123 DATA(insert ( 1700 21 1783 a f
));
124 DATA(insert ( 1700 23 1744 a f
));
125 DATA(insert ( 1700 700 1745 i f
));
126 DATA(insert ( 1700 701 1746 i f
));
128 /* Allow explicit coercions between int4 and bool */
129 DATA(insert ( 23 16 2557 e f
));
130 DATA(insert ( 16 23 2558 e f
));
133 * OID category: allow implicit conversion from any integral type (including
134 * int8, to support OID literals > 2G) to OID, as well as assignment coercion
135 * from OID to int4 or int8. Similarly for each OID-alias type. Also allow
136 * implicit coercions between OID and each OID-alias type, as well as
137 * regproc<->regprocedure and regoper<->regoperator. (Other coercions
138 * between alias types must pass through OID.) Lastly, there are implicit
139 * casts from text and varchar to regclass, which exist mainly to support
140 * legacy forms of nextval() and related functions.
142 DATA(insert ( 20 26 1287 i f
));
143 DATA(insert ( 21 26 313 i f
));
144 DATA(insert ( 23 26 0 i b
));
145 DATA(insert ( 26 20 1288 a f
));
146 DATA(insert ( 26 23 0 a b
));
147 DATA(insert ( 26 24 0 i b
));
148 DATA(insert ( 24 26 0 i b
));
149 DATA(insert ( 20 24 1287 i f
));
150 DATA(insert ( 21 24 313 i f
));
151 DATA(insert ( 23 24 0 i b
));
152 DATA(insert ( 24 20 1288 a f
));
153 DATA(insert ( 24 23 0 a b
));
154 DATA(insert ( 24 2202 0 i b
));
155 DATA(insert ( 2202 24 0 i b
));
156 DATA(insert ( 26 2202 0 i b
));
157 DATA(insert ( 2202 26 0 i b
));
158 DATA(insert ( 20 2202 1287 i f
));
159 DATA(insert ( 21 2202 313 i f
));
160 DATA(insert ( 23 2202 0 i b
));
161 DATA(insert ( 2202 20 1288 a f
));
162 DATA(insert ( 2202 23 0 a b
));
163 DATA(insert ( 26 2203 0 i b
));
164 DATA(insert ( 2203 26 0 i b
));
165 DATA(insert ( 20 2203 1287 i f
));
166 DATA(insert ( 21 2203 313 i f
));
167 DATA(insert ( 23 2203 0 i b
));
168 DATA(insert ( 2203 20 1288 a f
));
169 DATA(insert ( 2203 23 0 a b
));
170 DATA(insert ( 2203 2204 0 i b
));
171 DATA(insert ( 2204 2203 0 i b
));
172 DATA(insert ( 26 2204 0 i b
));
173 DATA(insert ( 2204 26 0 i b
));
174 DATA(insert ( 20 2204 1287 i f
));
175 DATA(insert ( 21 2204 313 i f
));
176 DATA(insert ( 23 2204 0 i b
));
177 DATA(insert ( 2204 20 1288 a f
));
178 DATA(insert ( 2204 23 0 a b
));
179 DATA(insert ( 26 2205 0 i b
));
180 DATA(insert ( 2205 26 0 i b
));
181 DATA(insert ( 20 2205 1287 i f
));
182 DATA(insert ( 21 2205 313 i f
));
183 DATA(insert ( 23 2205 0 i b
));
184 DATA(insert ( 2205 20 1288 a f
));
185 DATA(insert ( 2205 23 0 a b
));
186 DATA(insert ( 26 2206 0 i b
));
187 DATA(insert ( 2206 26 0 i b
));
188 DATA(insert ( 20 2206 1287 i f
));
189 DATA(insert ( 21 2206 313 i f
));
190 DATA(insert ( 23 2206 0 i b
));
191 DATA(insert ( 2206 20 1288 a f
));
192 DATA(insert ( 2206 23 0 a b
));
193 DATA(insert ( 26 3734 0 i b
));
194 DATA(insert ( 3734 26 0 i b
));
195 DATA(insert ( 20 3734 1287 i f
));
196 DATA(insert ( 21 3734 313 i f
));
197 DATA(insert ( 23 3734 0 i b
));
198 DATA(insert ( 3734 20 1288 a f
));
199 DATA(insert ( 3734 23 0 a b
));
200 DATA(insert ( 26 3769 0 i b
));
201 DATA(insert ( 3769 26 0 i b
));
202 DATA(insert ( 20 3769 1287 i f
));
203 DATA(insert ( 21 3769 313 i f
));
204 DATA(insert ( 23 3769 0 i b
));
205 DATA(insert ( 3769 20 1288 a f
));
206 DATA(insert ( 3769 23 0 a b
));
207 DATA(insert ( 25 2205 1079 i f
));
208 DATA(insert ( 1043 2205 1079 i f
));
213 DATA(insert ( 25 1042 0 i b
));
214 DATA(insert ( 25 1043 0 i b
));
215 DATA(insert ( 1042 25 401 i f
));
216 DATA(insert ( 1042 1043 401 i f
));
217 DATA(insert ( 1043 25 0 i b
));
218 DATA(insert ( 1043 1042 0 i b
));
219 DATA(insert ( 18 25 946 i f
));
220 DATA(insert ( 18 1042 860 a f
));
221 DATA(insert ( 18 1043 946 a f
));
222 DATA(insert ( 19 25 406 i f
));
223 DATA(insert ( 19 1042 408 a f
));
224 DATA(insert ( 19 1043 1401 a f
));
225 DATA(insert ( 25 18 944 a f
));
226 DATA(insert ( 1042 18 944 a f
));
227 DATA(insert ( 1043 18 944 a f
));
228 DATA(insert ( 25 19 407 i f
));
229 DATA(insert ( 1042 19 409 i f
));
230 DATA(insert ( 1043 19 1400 i f
));
232 /* Allow explicit coercions between int4 and "char" */
233 DATA(insert ( 18 23 77 e f
));
234 DATA(insert ( 23 18 78 e f
));
239 DATA(insert ( 702 1082 1179 a f
));
240 DATA(insert ( 702 1083 1364 a f
));
241 DATA(insert ( 702 1114 2023 i f
));
242 DATA(insert ( 702 1184 1173 i f
));
243 DATA(insert ( 703 1186 1177 i f
));
244 DATA(insert ( 1082 1114 2024 i f
));
245 DATA(insert ( 1082 1184 1174 i f
));
246 DATA(insert ( 1083 1186 1370 i f
));
247 DATA(insert ( 1083 1266 2047 i f
));
248 DATA(insert ( 1114 702 2030 a f
));
249 DATA(insert ( 1114 1082 2029 a f
));
250 DATA(insert ( 1114 1083 1316 a f
));
251 DATA(insert ( 1114 1184 2028 i f
));
252 DATA(insert ( 1184 702 1180 a f
));
253 DATA(insert ( 1184 1082 1178 a f
));
254 DATA(insert ( 1184 1083 2019 a f
));
255 DATA(insert ( 1184 1114 2027 a f
));
256 DATA(insert ( 1184 1266 1388 a f
));
257 DATA(insert ( 1186 703 1194 a f
));
258 DATA(insert ( 1186 1083 1419 a f
));
259 DATA(insert ( 1266 1083 2046 a f
));
260 /* Cross-category casts between int4 and abstime, reltime */
261 DATA(insert ( 23 702 0 e b
));
262 DATA(insert ( 702 23 0 e b
));
263 DATA(insert ( 23 703 0 e b
));
264 DATA(insert ( 703 23 0 e b
));
269 DATA(insert ( 601 600 1532 e f
));
270 DATA(insert ( 602 600 1533 e f
));
271 DATA(insert ( 602 604 1449 a f
));
272 DATA(insert ( 603 600 1534 e f
));
273 DATA(insert ( 603 601 1541 e f
));
274 DATA(insert ( 603 604 1448 a f
));
275 DATA(insert ( 603 718 1479 e f
));
276 DATA(insert ( 604 600 1540 e f
));
277 DATA(insert ( 604 602 1447 a f
));
278 DATA(insert ( 604 603 1446 e f
));
279 DATA(insert ( 604 718 1474 e f
));
280 DATA(insert ( 718 600 1416 e f
));
281 DATA(insert ( 718 603 1480 e f
));
282 DATA(insert ( 718 604 1544 e f
));
287 DATA(insert ( 650 869 0 i b
));
288 DATA(insert ( 869 650 1715 a f
));
293 DATA(insert ( 1560 1562 0 i b
));
294 DATA(insert ( 1562 1560 0 i b
));
295 /* Cross-category casts between bit and int4, int8 */
296 DATA(insert ( 20 1560 2075 e f
));
297 DATA(insert ( 23 1560 1683 e f
));
298 DATA(insert ( 1560 20 2076 e f
));
299 DATA(insert ( 1560 23 1684 e f
));
302 * Cross-category casts to and from TEXT
304 * We need entries here only for a few specialized cases where the behavior
305 * of the cast function differs from the datatype's I/O functions. Otherwise,
306 * parse_coerce.c will generate CoerceViaIO operations without any prompting.
308 * Note that the castcontext values specified here should be no stronger than
309 * parse_coerce.c's automatic casts ('a' to text, 'e' from text) else odd
310 * behavior will ensue when the automatic cast is applied instead of the
313 DATA(insert ( 650 25 730 a f
));
314 DATA(insert ( 869 25 730 a f
));
315 DATA(insert ( 16 25 2971 a f
));
316 DATA(insert ( 142 25 0 a b
));
317 DATA(insert ( 25 142 2896 e f
));
320 * Cross-category casts to and from VARCHAR
322 * We support all the same casts as for TEXT.
324 DATA(insert ( 650 1043 730 a f
));
325 DATA(insert ( 869 1043 730 a f
));
326 DATA(insert ( 16 1043 2971 a f
));
327 DATA(insert ( 142 1043 0 a b
));
328 DATA(insert ( 1043 142 2896 e f
));
331 * Cross-category casts to and from BPCHAR
333 * We support all the same casts as for TEXT.
335 DATA(insert ( 650 1042 730 a f
));
336 DATA(insert ( 869 1042 730 a f
));
337 DATA(insert ( 16 1042 2971 a f
));
338 DATA(insert ( 142 1042 0 a b
));
339 DATA(insert ( 1042 142 2896 e f
));
342 * Length-coercion functions
344 DATA(insert ( 1042 1042 668 i f
));
345 DATA(insert ( 1043 1043 669 i f
));
346 DATA(insert ( 1083 1083 1968 i f
));
347 DATA(insert ( 1114 1114 1961 i f
));
348 DATA(insert ( 1184 1184 1967 i f
));
349 DATA(insert ( 1186 1186 1200 i f
));
350 DATA(insert ( 1266 1266 1969 i f
));
351 DATA(insert ( 1560 1560 1685 i f
));
352 DATA(insert ( 1562 1562 1687 i f
));
353 DATA(insert ( 1700 1700 1703 i f
));
355 #endif /* PG_CAST_H */