1 /*-------------------------------------------------------------------------
4 * definition of the system "type" relation (pg_type)
5 * along with the relation's initial contents.
8 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
9 * Portions Copyright (c) 1994, Regents of the University of California
11 * $Id: pg_type.h,v 1.101 2001/02/12 20:07:20 tgl Exp $
14 * the genbki.sh script reads this file and generates .bki
15 * information from the DATA() statements.
17 *-------------------------------------------------------------------------
23 * postgres.h contains the system type definitions and the
24 * CATALOG(), BOOTSTRAP and DATA() sugar words so this file
25 * can be read by both genbki.sh and the C compiler.
30 * pg_type definition. cpp turns this into
31 * typedef struct FormData_pg_type
33 * Some of the values in a pg_type instance are copied into
34 * pg_attribute instances. Some parts of Postgres use the pg_type copy,
35 * while others use the pg_attribute copy, so they must match.
36 * See struct FormData_pg_attribute for details.
39 CATALOG(pg_type) BOOTSTRAP
45 * typlen is the number of bytes we use to represent a value of this
46 * type, e.g. 4 for an int4. But for a variable length type, typlen
53 * typbyval determines whether internal Postgres routines pass a value
54 * of this type by value or by reference. typbyval had better be FALSE
55 * if the length is not 1, 2, or 4 (or 8 on 8-byte-Datum machines).
56 * Variable-length types are always passed by reference. Note that
57 * typbyval can be false even if the length would allow pass-by-value;
58 * this is currently true for type float4, for example.
63 * typtype is 'b' for a basic type and 'c' for a catalog type (ie a
64 * class). If typtype is 'c', typrelid is the OID of the class' entry
65 * in pg_class. (Why do we need an entry in pg_type for classes,
71 Oid typrelid; /* 0 if not a class type */
74 * If typelem is not 0 then it identifies another row in pg_type.
75 * The current type can then be subscripted like an array yielding
76 * values of type typelem. A non-zero typelem does not guarantee
77 * this type to be a "real" array type; some ordinary fixed-length
78 * types can also be subscripted (e.g., oidvector). Variable-length
79 * types can *not* be turned into pseudo-arrays like that. Hence,
80 * the way to determine whether a type is a "true" array type is
81 * typelem != 0 and typlen < 0.
90 * typalign is the alignment required when storing a value of this
91 * type. It applies to storage on disk as well as most
92 * representations of the value inside Postgres. When multiple values
93 * are stored consecutively, such as in the representation of a
94 * complete row on disk, padding is inserted before a datum of this
95 * type so that it begins on the specified boundary. The alignment
96 * reference is the beginning of the first datum in the sequence.
98 * 'c' = CHAR alignment, ie no alignment needed.
99 * 's' = SHORT alignment (2 bytes on most machines).
100 * 'i' = INT alignment (4 bytes on most machines).
101 * 'd' = DOUBLE alignment (8 bytes on many machines, but by no means all).
103 * See include/utils/memutils.h for the macros that compute these
104 * alignment requirements.
106 * NOTE: for types used in system tables, it is critical that the
107 * size and alignment defined in pg_type agree with the way that the
108 * compiler will lay out the field in a struct representing a table row.
114 * typstorage tells if the type is prepared for toasting and what
115 * the default strategy for attributes of this type should be.
117 * 'p' PLAIN type not prepared for toasting
118 * 'e' EXTERNAL external storage possible, don't try to compress
119 * 'x' EXTENDED try to compress and store external if required
120 * 'm' MAIN like 'x' but try to keep in main tuple
125 text typdefault; /* VARIABLE LENGTH FIELD */
129 * Form_pg_type corresponds to a pointer to a row with
130 * the format of pg_type relation.
133 typedef FormData_pg_type *Form_pg_type;
136 * compiler constants for pg_type
139 #define Natts_pg_type 17
140 #define Anum_pg_type_typname 1
141 #define Anum_pg_type_typowner 2
142 #define Anum_pg_type_typlen 3
143 #define Anum_pg_type_typprtlen 4
144 #define Anum_pg_type_typbyval 5
145 #define Anum_pg_type_typtype 6
146 #define Anum_pg_type_typisdefined 7
147 #define Anum_pg_type_typdelim 8
148 #define Anum_pg_type_typrelid 9
149 #define Anum_pg_type_typelem 10
150 #define Anum_pg_type_typinput 11
151 #define Anum_pg_type_typoutput 12
152 #define Anum_pg_type_typreceive 13
153 #define Anum_pg_type_typsend 14
154 #define Anum_pg_type_typalign 15
155 #define Anum_pg_type_typstorage 16
156 #define Anum_pg_type_typdefault 17
159 * initial contents of pg_type
163 /* keep the following ordered by OID so that later changes can be made easier*/
165 /* Make sure the typlen, typbyval, and typalign values here match the initial
166 values for attlen, attbyval, and attalign in both places in pg_attribute.h
171 DATA(insert OID = 16 ( bool PGUID 1 1 t b t \054 0 0 boolin boolout boolin boolout c p _null_ ));
172 DESCR("boolean, 'true'/'false'");
175 DATA(insert OID = 17 ( bytea PGUID -1 -1 f b t \054 0 0 byteain byteaout byteain byteaout i x _null_ ));
176 DESCR("variable-length string, binary values escaped");
179 DATA(insert OID = 18 ( char PGUID 1 1 t b t \054 0 0 charin charout charin charout c p _null_ ));
180 DESCR("single character");
183 DATA(insert OID = 19 ( name PGUID NAMEDATALEN NAMEDATALEN f b t \054 0 18 namein nameout namein nameout i p _null_ ));
184 DESCR("31-character type for storing system identifiers");
187 DATA(insert OID = 20 ( int8 PGUID 8 20 f b t \054 0 0 int8in int8out int8in int8out d p _null_ ));
188 DESCR("~18 digit integer, 8-byte storage");
191 DATA(insert OID = 21 ( int2 PGUID 2 5 t b t \054 0 0 int2in int2out int2in int2out s p _null_ ));
192 DESCR("-32 thousand to 32 thousand, 2-byte storage");
195 DATA(insert OID = 22 ( int2vector PGUID INDEX_MAX_KEYS*2 -1 f b t \054 0 21 int2vectorin int2vectorout int2vectorin int2vectorout i p _null_ ));
196 DESCR("array of INDEX_MAX_KEYS int2 integers, used in system tables");
197 #define INT2VECTOROID 22
199 DATA(insert OID = 23 ( int4 PGUID 4 10 t b t \054 0 0 int4in int4out int4in int4out i p _null_ ));
200 DESCR("-2 billion to 2 billion integer, 4-byte storage");
203 DATA(insert OID = 24 ( regproc PGUID 4 16 t b t \054 0 0 regprocin regprocout regprocin regprocout i p _null_ ));
204 DESCR("registered procedure");
205 #define REGPROCOID 24
207 DATA(insert OID = 25 ( text PGUID -1 -1 f b t \054 0 0 textin textout textin textout i x _null_ ));
208 DESCR("variable-length string, no limit specified");
211 DATA(insert OID = 26 ( oid PGUID 4 10 t b t \054 0 0 oidin oidout oidin oidout i p _null_ ));
212 DESCR("object identifier(oid), maximum 4 billion");
215 DATA(insert OID = 27 ( tid PGUID 6 19 f b t \054 0 0 tidin tidout tidin tidout i p _null_ ));
216 DESCR("(Block, offset), physical location of tuple");
219 DATA(insert OID = 28 ( xid PGUID 4 12 t b t \054 0 0 xidin xidout xidin xidout i p _null_ ));
220 DESCR("transaction id");
223 DATA(insert OID = 29 ( cid PGUID 4 10 t b t \054 0 0 cidin cidout cidin cidout i p _null_ ));
224 DESCR("command identifier type, sequence in transaction id");
227 DATA(insert OID = 30 ( oidvector PGUID INDEX_MAX_KEYS*4 -1 f b t \054 0 26 oidvectorin oidvectorout oidvectorin oidvectorout i p _null_ ));
228 DESCR("array of INDEX_MAX_KEYS oids, used in system tables");
229 #define OIDVECTOROID 30
231 DATA(insert OID = 32 ( SET PGUID -1 -1 f b t \054 0 0 textin textout textin textout i p _null_ ));
232 DESCR("set of tuples");
234 DATA(insert OID = 71 ( pg_type PGUID 4 4 t c t \054 1247 0 int4in int4out int4in int4out i p _null_));
235 DATA(insert OID = 75 ( pg_attribute PGUID 4 4 t c t \054 1249 0 int4in int4out int4in int4out i p _null_));
236 DATA(insert OID = 81 ( pg_proc PGUID 4 4 t c t \054 1255 0 int4in int4out int4in int4out i p _null_));
237 DATA(insert OID = 83 ( pg_class PGUID 4 4 t c t \054 1259 0 int4in int4out int4in int4out i p _null_));
238 DATA(insert OID = 86 ( pg_shadow PGUID 4 4 t c t \054 1260 0 int4in int4out int4in int4out i p _null_));
239 DATA(insert OID = 87 ( pg_group PGUID 4 4 t c t \054 1261 0 int4in int4out int4in int4out i p _null_));
240 DATA(insert OID = 88 ( pg_database PGUID 4 4 t c t \054 1262 0 int4in int4out int4in int4out i p _null_));
241 DATA(insert OID = 90 ( pg_variable PGUID 4 4 t c t \054 1264 0 int4in int4out int4in int4out i p _null_));
242 DATA(insert OID = 99 ( pg_log PGUID 4 4 t c t \054 1269 0 int4in int4out int4in int4out i p _null_));
246 DATA(insert OID = 109 ( pg_attrdef PGUID 4 4 t c t \054 1215 0 int4in int4out int4in int4out i p _null_));
247 DATA(insert OID = 110 ( pg_relcheck PGUID 4 4 t c t \054 1216 0 int4in int4out int4in int4out i p _null_));
248 DATA(insert OID = 111 ( pg_trigger PGUID 4 4 t c t \054 1219 0 int4in int4out int4in int4out i p _null_));
252 DATA(insert OID = 210 ( smgr PGUID 2 12 t b t \054 0 0 smgrin smgrout smgrin smgrout s p _null_ ));
253 DESCR("storage manager");
262 DATA(insert OID = 600 ( point PGUID 16 24 f b t \054 0 701 point_in point_out point_in point_out d p _null_ ));
263 DESCR("geometric point '(x, y)'");
265 DATA(insert OID = 601 ( lseg PGUID 32 48 f b t \054 0 600 lseg_in lseg_out lseg_in lseg_out d p _null_ ));
266 DESCR("geometric line segment '(pt1,pt2)'");
268 DATA(insert OID = 602 ( path PGUID -1 -1 f b t \054 0 0 path_in path_out path_in path_out d x _null_ ));
269 DESCR("geometric path '(pt1,...)'");
271 DATA(insert OID = 603 ( box PGUID 32 100 f b t \073 0 600 box_in box_out box_in box_out d p _null_ ));
272 DESCR("geometric box '(lower left,upper right)'");
274 DATA(insert OID = 604 ( polygon PGUID -1 -1 f b t \054 0 0 poly_in poly_out poly_in poly_out d x _null_ ));
275 DESCR("geometric polygon '(pt1,...)'");
276 #define POLYGONOID 604
278 DATA(insert OID = 628 ( line PGUID 32 48 f b t \054 0 701 line_in line_out line_in line_out d p _null_ ));
279 DESCR("geometric line '(pt1,pt2)'");
281 DATA(insert OID = 629 ( _line PGUID -1 -1 f b t \054 0 628 array_in array_out array_in array_out d x _null_ ));
286 DATA(insert OID = 700 ( float4 PGUID 4 12 f b t \054 0 0 float4in float4out float4in float4out i p _null_ ));
287 DESCR("single-precision floating point number, 4-byte storage");
288 #define FLOAT4OID 700
289 DATA(insert OID = 701 ( float8 PGUID 8 24 f b t \054 0 0 float8in float8out float8in float8out d p _null_ ));
290 DESCR("double-precision floating point number, 8-byte storage");
291 #define FLOAT8OID 701
292 DATA(insert OID = 702 ( abstime PGUID 4 20 t b t \054 0 0 nabstimein nabstimeout nabstimein nabstimeout i p _null_ ));
293 DESCR("absolute, limited-range date and time (Unix system time)");
294 #define ABSTIMEOID 702
295 DATA(insert OID = 703 ( reltime PGUID 4 20 t b t \054 0 0 reltimein reltimeout reltimein reltimeout i p _null_ ));
296 DESCR("relative, limited-range time interval (Unix delta time)");
297 #define RELTIMEOID 703
298 DATA(insert OID = 704 ( tinterval PGUID 12 47 f b t \054 0 0 tintervalin tintervalout tintervalin tintervalout i p _null_ ));
299 DESCR("(abstime,abstime), time interval");
300 #define TINTERVALOID 704
301 DATA(insert OID = 705 ( unknown PGUID -1 -1 f b t \054 0 0 textin textout textin textout i p _null_ ));
303 #define UNKNOWNOID 705
305 DATA(insert OID = 718 ( circle PGUID 24 47 f b t \054 0 0 circle_in circle_out circle_in circle_out d p _null_ ));
306 DESCR("geometric circle '(center,radius)'");
307 #define CIRCLEOID 718
308 DATA(insert OID = 719 ( _circle PGUID -1 -1 f b t \054 0 718 array_in array_out array_in array_out d x _null_ ));
309 DATA(insert OID = 790 ( money PGUID 4 24 f b t \054 0 0 cash_in cash_out cash_in cash_out i p _null_ ));
310 DESCR("$d,ddd.cc, money");
312 DATA(insert OID = 791 ( _money PGUID -1 -1 f b t \054 0 790 array_in array_out array_in array_out i x _null_ ));
315 DATA(insert OID = 829 ( macaddr PGUID 6 -1 f b t \054 0 0 macaddr_in macaddr_out macaddr_in macaddr_out i p _null_ ));
316 DESCR("XX:XX:XX:XX:XX, MAC address");
317 DATA(insert OID = 869 ( inet PGUID -1 -1 f b t \054 0 0 inet_in inet_out inet_in inet_out i p _null_ ));
318 DESCR("IP address/netmask, host address, netmask optional");
320 DATA(insert OID = 650 ( cidr PGUID -1 -1 f b t \054 0 0 cidr_in cidr_out cidr_in cidr_out i p _null_ ));
321 DESCR("network IP address/netmask, network address");
326 /* OIDS 1000 - 1099 */
327 DATA(insert OID = 1000 ( _bool PGUID -1 -1 f b t \054 0 16 array_in array_out array_in array_out i x _null_ ));
328 DATA(insert OID = 1001 ( _bytea PGUID -1 -1 f b t \054 0 17 array_in array_out array_in array_out i x _null_ ));
329 DATA(insert OID = 1002 ( _char PGUID -1 -1 f b t \054 0 18 array_in array_out array_in array_out i x _null_ ));
330 DATA(insert OID = 1003 ( _name PGUID -1 -1 f b t \054 0 19 array_in array_out array_in array_out i x _null_ ));
331 DATA(insert OID = 1005 ( _int2 PGUID -1 -1 f b t \054 0 21 array_in array_out array_in array_out i x _null_ ));
332 DATA(insert OID = 1006 ( _int2vector PGUID -1 -1 f b t \054 0 22 array_in array_out array_in array_out i x _null_ ));
333 DATA(insert OID = 1007 ( _int4 PGUID -1 -1 f b t \054 0 23 array_in array_out array_in array_out i x _null_ ));
334 DATA(insert OID = 1008 ( _regproc PGUID -1 -1 f b t \054 0 24 array_in array_out array_in array_out i x _null_ ));
335 DATA(insert OID = 1009 ( _text PGUID -1 -1 f b t \054 0 25 array_in array_out array_in array_out i x _null_ ));
336 DATA(insert OID = 1028 ( _oid PGUID -1 -1 f b t \054 0 26 array_in array_out array_in array_out i x _null_ ));
337 DATA(insert OID = 1010 ( _tid PGUID -1 -1 f b t \054 0 27 array_in array_out array_in array_out i x _null_ ));
338 DATA(insert OID = 1011 ( _xid PGUID -1 -1 f b t \054 0 28 array_in array_out array_in array_out i x _null_ ));
339 DATA(insert OID = 1012 ( _cid PGUID -1 -1 f b t \054 0 29 array_in array_out array_in array_out i x _null_ ));
340 DATA(insert OID = 1013 ( _oidvector PGUID -1 -1 f b t \054 0 30 array_in array_out array_in array_out i x _null_ ));
341 DATA(insert OID = 1014 ( _bpchar PGUID -1 -1 f b t \054 0 1042 array_in array_out array_in array_out i x _null_ ));
342 DATA(insert OID = 1015 ( _varchar PGUID -1 -1 f b t \054 0 1043 array_in array_out array_in array_out i x _null_ ));
343 DATA(insert OID = 1016 ( _int8 PGUID -1 -1 f b t \054 0 20 array_in array_out array_in array_out d x _null_ ));
344 DATA(insert OID = 1017 ( _point PGUID -1 -1 f b t \054 0 600 array_in array_out array_in array_out d x _null_ ));
345 DATA(insert OID = 1018 ( _lseg PGUID -1 -1 f b t \054 0 601 array_in array_out array_in array_out d x _null_ ));
346 DATA(insert OID = 1019 ( _path PGUID -1 -1 f b t \054 0 602 array_in array_out array_in array_out d x _null_ ));
347 DATA(insert OID = 1020 ( _box PGUID -1 -1 f b t \073 0 603 array_in array_out array_in array_out d x _null_ ));
348 DATA(insert OID = 1021 ( _float4 PGUID -1 -1 f b t \054 0 700 array_in array_out array_in array_out i x _null_ ));
349 DATA(insert OID = 1022 ( _float8 PGUID -1 -1 f b t \054 0 701 array_in array_out array_in array_out d x _null_ ));
350 DATA(insert OID = 1023 ( _abstime PGUID -1 -1 f b t \054 0 702 array_in array_out array_in array_out i x _null_ ));
351 DATA(insert OID = 1024 ( _reltime PGUID -1 -1 f b t \054 0 703 array_in array_out array_in array_out i x _null_ ));
352 DATA(insert OID = 1025 ( _tinterval PGUID -1 -1 f b t \054 0 704 array_in array_out array_in array_out i x _null_ ));
353 DATA(insert OID = 1027 ( _polygon PGUID -1 -1 f b t \054 0 604 array_in array_out array_in array_out d x _null_ ));
355 * Note: the size of aclitem needs to match sizeof(AclItem) in acl.h.
356 * Thanks to some padding, this will be 8 on all platforms.
357 * We also have an Assert to make sure.
359 #define ACLITEMSIZE 8
360 DATA(insert OID = 1033 ( aclitem PGUID 8 -1 f b t \054 0 0 aclitemin aclitemout aclitemin aclitemout i p _null_ ));
361 DESCR("access control list");
362 DATA(insert OID = 1034 ( _aclitem PGUID -1 -1 f b t \054 0 1033 array_in array_out array_in array_out i x _null_ ));
363 DATA(insert OID = 1040 ( _macaddr PGUID -1 -1 f b t \054 0 829 array_in array_out array_in array_out i x _null_ ));
364 DATA(insert OID = 1041 ( _inet PGUID -1 -1 f b t \054 0 869 array_in array_out array_in array_out i x _null_ ));
365 DATA(insert OID = 651 ( _cidr PGUID -1 -1 f b t \054 0 650 array_in array_out array_in array_out i x _null_ ));
366 DATA(insert OID = 1042 ( bpchar PGUID -1 -1 f b t \054 0 0 bpcharin bpcharout bpcharin bpcharout i x _null_ ));
367 DESCR("char(length), blank-padded string, fixed storage length");
368 #define BPCHAROID 1042
369 DATA(insert OID = 1043 ( varchar PGUID -1 -1 f b t \054 0 0 varcharin varcharout varcharin varcharout i x _null_ ));
370 DESCR("varchar(length), non-blank-padded string, variable storage length");
371 #define VARCHAROID 1043
373 DATA(insert OID = 1082 ( date PGUID 4 10 t b t \054 0 0 date_in date_out date_in date_out i p _null_ ));
374 DESCR("ANSI SQL date");
376 DATA(insert OID = 1083 ( time PGUID 8 16 f b t \054 0 0 time_in time_out time_in time_out d p _null_ ));
377 DESCR("hh:mm:ss, ANSI SQL time");
380 /* OIDS 1100 - 1199 */
381 DATA(insert OID = 1182 ( _date PGUID -1 -1 f b t \054 0 1082 array_in array_out array_in array_out i x _null_ ));
382 DATA(insert OID = 1183 ( _time PGUID -1 -1 f b t \054 0 1083 array_in array_out array_in array_out d x _null_ ));
383 DATA(insert OID = 1184 ( timestamp PGUID 8 47 f b t \054 0 0 timestamp_in timestamp_out timestamp_in timestamp_out d p _null_ ));
384 DESCR("date and time");
385 #define TIMESTAMPOID 1184
386 DATA(insert OID = 1185 ( _timestamp PGUID -1 -1 f b t \054 0 1184 array_in array_out array_in array_out d x _null_ ));
387 DATA(insert OID = 1186 ( interval PGUID 12 47 f b t \054 0 0 interval_in interval_out interval_in interval_out d p _null_ ));
388 DESCR("@ <number> <units>, time interval");
389 #define INTERVALOID 1186
390 DATA(insert OID = 1187 ( _interval PGUID -1 -1 f b t \054 0 1186 array_in array_out array_in array_out d x _null_ ));
392 /* OIDS 1200 - 1299 */
393 DATA(insert OID = 1231 ( _numeric PGUID -1 -1 f b t \054 0 1700 array_in array_out array_in array_out i x _null_ ));
394 DATA(insert OID = 1266 ( timetz PGUID 12 22 f b t \054 0 0 timetz_in timetz_out timetz_in timetz_out d p _null_ ));
395 DESCR("hh:mm:ss, ANSI SQL time");
396 #define TIMETZOID 1266
397 DATA(insert OID = 1270 ( _timetz PGUID -1 -1 f b t \054 0 1266 array_in array_out array_in array_out d x _null_ ));
399 /* OIDS 1500 - 1599 */
400 DATA(insert OID = 1560 ( bit PGUID -1 -1 f b t \054 0 0 zpbit_in zpbit_out zpbit_in zpbit_out i x _null_ ));
401 DESCR("fixed-length bit string");
402 #define ZPBITOID 1560
403 DATA(insert OID = 1561 ( _bit PGUID -1 -1 f b t \054 0 1560 array_in array_out array_in array_out i x _null_ ));
404 DATA(insert OID = 1562 ( varbit PGUID -1 -1 f b t \054 0 0 varbit_in varbit_out varbit_in varbit_out i x _null_ ));
405 DESCR("variable-length bit string");
406 #define VARBITOID 1562
407 DATA(insert OID = 1563 ( _varbit PGUID -1 -1 f b t \054 0 1562 array_in array_out array_in array_out i x _null_ ));
409 /* OIDS 1600 - 1699 */
411 /* OIDS 1700 - 1799 */
412 DATA(insert OID = 1700 ( numeric PGUID -1 -1 f b t \054 0 0 numeric_in numeric_out numeric_in numeric_out i m _null_ ));
413 DESCR("numeric(precision, decimal), arbitrary precision number");
414 #define NUMERICOID 1700
418 * prototypes for functions in pg_type.c
420 extern Oid TypeGet(char *typeName, bool *defined);
421 extern Oid TypeShellMake(char *typeName);
422 extern Oid TypeCreate(char *typeName,
429 char *inputProcedure,
430 char *outputProcedure,
431 char *receiveProcedure,
433 char *elementTypeName,
434 char *defaultTypeValue,
438 extern void TypeRename(const char *oldTypeName, const char *newTypeName);
439 extern char *makeArrayTypeName(char *typeName);
442 #endif /* PG_TYPE_H */