Tweak the API for per-datatype typmodin functions so that they are passed

an array of strings rather than an array of integers, and allow any simple
constant or identifier to be used in typmods; for example
	create table foo (f1 widget(42,'23skidoo',point));
Of course the typmodin function has still got to pack this info into a
non-negative int32 for storage, but it's still a useful improvement in
flexibility, especially considering that you can do nearly anything if you
are willing to keep the info in a side table.  We can get away with this
change since we have not yet released a version providing user-definable
typmods.  Per discussion.
This commit is contained in:
Tom Lane 2007-06-15 20:56:52 +00:00
parent 839fcc9fd0
commit 23347231a5
16 changed files with 113 additions and 62 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$PostgreSQL: pgsql/doc/src/sgml/ref/create_type.sgml,v 1.71 2007/05/12 00:54:59 tgl Exp $ $PostgreSQL: pgsql/doc/src/sgml/ref/create_type.sgml,v 1.72 2007/06/15 20:56:49 tgl Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -195,11 +195,11 @@ CREATE TYPE <replaceable class="parameter">name</replaceable>
are needed if the type supports modifiers, that is optional constraints are needed if the type supports modifiers, that is optional constraints
attached to a type declaration, such as <literal>char(5)</> or attached to a type declaration, such as <literal>char(5)</> or
<literal>numeric(30,2)</>. <productname>PostgreSQL</productname> allows <literal>numeric(30,2)</>. <productname>PostgreSQL</productname> allows
user-defined types to take one or more integer constants as modifiers; user-defined types to take one or more simple constants or identifiers as
however, this information must be capable of being packed into a single modifiers; however, this information must be capable of being packed into a
non-negative integer value for storage in the system catalogs. The single non-negative integer value for storage in the system catalogs. The
<replaceable class="parameter">type_modifier_input_function</replaceable> <replaceable class="parameter">type_modifier_input_function</replaceable>
is passed the declared modifier(s) in the form of an <type>integer</> is passed the declared modifier(s) in the form of a <type>cstring</>
array. It must check the values for validity (throwing an error if they array. It must check the values for validity (throwing an error if they
are wrong), and if they are correct, return a single non-negative are wrong), and if they are correct, return a single non-negative
<type>integer</> value that will be stored as the column <quote>typmod</>. <type>integer</> value that will be stored as the column <quote>typmod</>.

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.104 2007/05/12 00:54:59 tgl Exp $ * $PostgreSQL: pgsql/src/backend/commands/typecmds.c,v 1.105 2007/06/15 20:56:49 tgl Exp $
* *
* DESCRIPTION * DESCRIPTION
* The "DefineFoo" routines take the parse tree and pick out the * The "DefineFoo" routines take the parse tree and pick out the
@ -1270,9 +1270,9 @@ findTypeTypmodinFunction(List *procname)
Oid procOid; Oid procOid;
/* /*
* typmodin functions always take one int4[] argument and return int4. * typmodin functions always take one cstring[] argument and return int4.
*/ */
argList[0] = INT4ARRAYOID; argList[0] = CSTRINGARRAYOID;
procOid = LookupFuncName(procname, 1, argList, true); procOid = LookupFuncName(procname, 1, argList, true);
if (!OidIsValid(procOid)) if (!OidIsValid(procOid))

View File

@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.593 2007/06/11 22:22:41 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.594 2007/06/15 20:56:49 tgl Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
@ -6695,7 +6695,7 @@ ConstTypename:
* by the standard, including qualified names. We also allow type modifiers. * by the standard, including qualified names. We also allow type modifiers.
* To avoid parsing conflicts against function invocations, the modifiers * To avoid parsing conflicts against function invocations, the modifiers
* have to be shown as expr_list here, but parse analysis will only accept * have to be shown as expr_list here, but parse analysis will only accept
* integer constants for them. * constants for them.
*/ */
GenericType: GenericType:
type_function_name opt_type_modifiers type_function_name opt_type_modifiers

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.90 2007/05/11 17:57:12 tgl Exp $ * $PostgreSQL: pgsql/src/backend/parser/parse_type.c,v 1.91 2007/06/15 20:56:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -289,28 +289,55 @@ typenameTypeMod(ParseState *pstate, const TypeName *typename,
parser_errposition(pstate, typename->location))); parser_errposition(pstate, typename->location)));
/* /*
* Convert the list of (raw grammar output) expressions to an integer * Convert the list of raw-grammar-output expressions to a cstring array.
* array. Currently, we only allow simple integer constants, though * Currently, we allow simple numeric constants, string literals, and
* possibly this could be extended. * identifiers; possibly this list could be extended.
*/ */
datums = (Datum *) palloc(list_length(typename->typmods) * sizeof(Datum)); datums = (Datum *) palloc(list_length(typename->typmods) * sizeof(Datum));
n = 0; n = 0;
foreach(l, typename->typmods) foreach(l, typename->typmods)
{ {
A_Const *ac = (A_Const *) lfirst(l); Node *tm = (Node *) lfirst(l);
char *cstr = NULL;
if (!IsA(ac, A_Const) || if (IsA(tm, A_Const))
!IsA(&ac->val, Integer)) {
A_Const *ac = (A_Const *) tm;
/*
* The grammar hands back some integers with ::int4 attached,
* so allow a cast decoration if it's an Integer value, but
* not otherwise.
*/
if (IsA(&ac->val, Integer))
{
cstr = (char *) palloc(32);
snprintf(cstr, 32, "%ld", (long) ac->val.val.ival);
}
else if (ac->typename == NULL) /* no casts allowed */
{
/* otherwise we can just use the str field directly. */
cstr = ac->val.val.str;
}
}
else if (IsA(tm, ColumnRef))
{
ColumnRef *cr = (ColumnRef *) tm;
if (list_length(cr->fields) == 1)
cstr = strVal(linitial(cr->fields));
}
if (!cstr)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_SYNTAX_ERROR), (errcode(ERRCODE_SYNTAX_ERROR),
errmsg("type modifiers must be integer constants"), errmsg("type modifiers must be simple constants or identifiers"),
parser_errposition(pstate, typename->location))); parser_errposition(pstate, typename->location)));
datums[n++] = Int32GetDatum(ac->val.val.ival); datums[n++] = CStringGetDatum(cstr);
} }
/* hardwired knowledge about int4's representation details here */ /* hardwired knowledge about cstring's representation details here */
arrtypmod = construct_array(datums, n, INT4OID, arrtypmod = construct_array(datums, n, CSTRINGOID,
sizeof(int4), true, 'i'); -2, false, 'c');
result = DatumGetInt32(OidFunctionCall1(typmodin, result = DatumGetInt32(OidFunctionCall1(typmodin,
PointerGetDatum(arrtypmod))); PointerGetDatum(arrtypmod)));

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/arrayutils.c,v 1.23 2007/01/05 22:19:40 momjian Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/arrayutils.c,v 1.24 2007/06/15 20:56:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -17,6 +17,7 @@
#include "catalog/pg_type.h" #include "catalog/pg_type.h"
#include "utils/array.h" #include "utils/array.h"
#include "utils/builtins.h"
#include "utils/memutils.h" #include "utils/memutils.h"
@ -191,16 +192,21 @@ mda_next_tuple(int n, int *curr, const int *span)
} }
/* /*
* ArrayGetTypmods: verify that argument is a 1-D integer array, * ArrayGetIntegerTypmods: verify that argument is a 1-D cstring array,
* return its length and a pointer to the first contained integer. * and get the contents converted to integers. Returns a palloc'd array
* and places the length at *n.
*/ */
int32 * int32 *
ArrayGetTypmods(ArrayType *arr, int *n) ArrayGetIntegerTypmods(ArrayType *arr, int *n)
{ {
if (ARR_ELEMTYPE(arr) != INT4OID) int32 *result;
Datum *elem_values;
int i;
if (ARR_ELEMTYPE(arr) != CSTRINGOID)
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_ARRAY_ELEMENT_ERROR), (errcode(ERRCODE_ARRAY_ELEMENT_ERROR),
errmsg("typmod array must be type integer[]"))); errmsg("typmod array must be type cstring[]")));
if (ARR_NDIM(arr) != 1) if (ARR_NDIM(arr) != 1)
ereport(ERROR, ereport(ERROR,
@ -212,7 +218,18 @@ ArrayGetTypmods(ArrayType *arr, int *n)
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
errmsg("typmod array must not contain nulls"))); errmsg("typmod array must not contain nulls")));
*n = ArrayGetNItems(ARR_NDIM(arr), ARR_DIMS(arr)); /* hardwired knowledge about cstring's representation details here */
deconstruct_array(arr, CSTRINGOID,
-2, false, 'c',
&elem_values, NULL, n);
return (int32 *) ARR_DATA_PTR(arr); result = (int32 *) palloc(*n * sizeof(int32));
for (i = 0; i < *n; i++)
result[i] = pg_atoi(DatumGetCString(elem_values[i]),
sizeof(int32), '\0');
pfree(elem_values);
return result;
} }

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.132 2007/06/05 21:31:06 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.133 2007/06/15 20:56:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -53,7 +53,7 @@ anytime_typmodin(bool istz, ArrayType *ta)
int32 *tl; int32 *tl;
int n; int n;
tl = ArrayGetTypmods(ta, &n); tl = ArrayGetIntegerTypmods(ta, &n);
/* /*
* we're not too tense about good error message here because grammar * we're not too tense about good error message here because grammar

View File

@ -14,7 +14,7 @@
* Copyright (c) 1998-2007, PostgreSQL Global Development Group * Copyright (c) 1998-2007, PostgreSQL Global Development Group
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.104 2007/06/09 15:52:30 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/numeric.c,v 1.105 2007/06/15 20:56:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -547,7 +547,7 @@ numerictypmodin(PG_FUNCTION_ARGS)
int n; int n;
int32 typmod; int32 typmod;
tl = ArrayGetTypmods(ta, &n); tl = ArrayGetIntegerTypmods(ta, &n);
if (n == 2) if (n == 2)
{ {

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.177 2007/06/05 21:31:06 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.178 2007/06/15 20:56:50 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -64,7 +64,7 @@ anytimestamp_typmodin(bool istz, ArrayType *ta)
int32 *tl; int32 *tl;
int n; int n;
tl = ArrayGetTypmods(ta, &n); tl = ArrayGetIntegerTypmods(ta, &n);
/* /*
* we're not too tense about good error message here because grammar * we're not too tense about good error message here because grammar
@ -719,7 +719,7 @@ intervaltypmodin(PG_FUNCTION_ARGS)
int n; int n;
int32 typmod; int32 typmod;
tl = ArrayGetTypmods(ta, &n); tl = ArrayGetIntegerTypmods(ta, &n);
/* /*
* tl[0] - opt_interval * tl[0] - opt_interval

View File

@ -9,7 +9,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.53 2007/02/27 23:48:09 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/varbit.c,v 1.54 2007/06/15 20:56:51 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -32,7 +32,7 @@ anybit_typmodin(ArrayType *ta, const char *typename)
int32 *tl; int32 *tl;
int n; int n;
tl = ArrayGetTypmods(ta, &n); tl = ArrayGetIntegerTypmods(ta, &n);
/* /*
* we're not too tense about good error message here because grammar * we're not too tense about good error message here because grammar

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.123 2007/04/06 04:21:43 tgl Exp $ * $PostgreSQL: pgsql/src/backend/utils/adt/varchar.c,v 1.124 2007/06/15 20:56:51 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -31,7 +31,7 @@ anychar_typmodin(ArrayType *ta, const char *typename)
int32 *tl; int32 *tl;
int n; int n;
tl = ArrayGetTypmods(ta, &n); tl = ArrayGetIntegerTypmods(ta, &n);
/* /*
* we're not too tense about good error message here because grammar * we're not too tense about good error message here because grammar

View File

@ -37,7 +37,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.411 2007/06/06 23:00:40 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.412 2007/06/15 20:56:51 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 200706061 #define CATALOG_VERSION_NO 200706151
#endif #endif

View File

@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.459 2007/06/06 23:00:41 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.460 2007/06/15 20:56:51 tgl Exp $
* *
* NOTES * NOTES
* The script catalog/genbki.sh reads this file and generates .bki * The script catalog/genbki.sh reads this file and generates .bki
@ -1308,7 +1308,7 @@ DATA(insert OID = 1044 ( bpcharin PGNSP PGUID 12 1 0 f f t f i 3 1042 "2275
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1045 ( bpcharout PGNSP PGUID 12 1 0 f f t f i 1 2275 "1042" _null_ _null_ _null_ bpcharout - _null_ )); DATA(insert OID = 1045 ( bpcharout PGNSP PGUID 12 1 0 f f t f i 1 2275 "1042" _null_ _null_ _null_ bpcharout - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2913 ( bpchartypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ bpchartypmodin - _null_ )); DATA(insert OID = 2913 ( bpchartypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ bpchartypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2914 ( bpchartypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ bpchartypmodout - _null_ )); DATA(insert OID = 2914 ( bpchartypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ bpchartypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -1316,7 +1316,7 @@ DATA(insert OID = 1046 ( varcharin PGNSP PGUID 12 1 0 f f t f i 3 1043 "227
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1047 ( varcharout PGNSP PGUID 12 1 0 f f t f i 1 2275 "1043" _null_ _null_ _null_ varcharout - _null_ )); DATA(insert OID = 1047 ( varcharout PGNSP PGUID 12 1 0 f f t f i 1 2275 "1043" _null_ _null_ _null_ varcharout - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2915 ( varchartypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ varchartypmodin - _null_ )); DATA(insert OID = 2915 ( varchartypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ varchartypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2916 ( varchartypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ varchartypmodout - _null_ )); DATA(insert OID = 2916 ( varchartypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ varchartypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -1389,7 +1389,7 @@ DATA(insert OID = 1143 ( time_in PGNSP PGUID 12 1 0 f f t f s 3 1083 "2275
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1144 ( time_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1083" _null_ _null_ _null_ time_out - _null_ )); DATA(insert OID = 1144 ( time_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1083" _null_ _null_ _null_ time_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2909 ( timetypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ timetypmodin - _null_ )); DATA(insert OID = 2909 ( timetypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ timetypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2910 ( timetypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timetypmodout - _null_ )); DATA(insert OID = 2910 ( timetypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timetypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -1409,7 +1409,7 @@ DATA(insert OID = 1150 ( timestamptz_in PGNSP PGUID 12 1 0 f f t f s 3 1184 "
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1151 ( timestamptz_out PGNSP PGUID 12 1 0 f f t f s 1 2275 "1184" _null_ _null_ _null_ timestamptz_out - _null_ )); DATA(insert OID = 1151 ( timestamptz_out PGNSP PGUID 12 1 0 f f t f s 1 2275 "1184" _null_ _null_ _null_ timestamptz_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2907 ( timestamptztypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ timestamptztypmodin - _null_ )); DATA(insert OID = 2907 ( timestamptztypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ timestamptztypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2908 ( timestamptztypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timestamptztypmodout - _null_ )); DATA(insert OID = 2908 ( timestamptztypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timestamptztypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -1434,7 +1434,7 @@ DATA(insert OID = 1160 ( interval_in PGNSP PGUID 12 1 0 f f t f s 3 1186 "22
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1161 ( interval_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1186" _null_ _null_ _null_ interval_out - _null_ )); DATA(insert OID = 1161 ( interval_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1186" _null_ _null_ _null_ interval_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2903 ( intervaltypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ intervaltypmodin - _null_ )); DATA(insert OID = 2903 ( intervaltypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ intervaltypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2904 ( intervaltypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ intervaltypmodout - _null_ )); DATA(insert OID = 2904 ( intervaltypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ intervaltypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -1644,7 +1644,7 @@ DATA(insert OID = 1312 ( timestamp_in PGNSP PGUID 12 1 0 f f t f s 3 1114 "22
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1313 ( timestamp_out PGNSP PGUID 12 1 0 f f t f s 1 2275 "1114" _null_ _null_ _null_ timestamp_out - _null_ )); DATA(insert OID = 1313 ( timestamp_out PGNSP PGUID 12 1 0 f f t f s 1 2275 "1114" _null_ _null_ _null_ timestamp_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2905 ( timestamptypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ timestamptypmodin - _null_ )); DATA(insert OID = 2905 ( timestamptypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ timestamptypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2906 ( timestamptypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timestamptypmodout - _null_ )); DATA(insert OID = 2906 ( timestamptypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timestamptypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -1701,7 +1701,7 @@ DATA(insert OID = 1350 ( timetz_in PGNSP PGUID 12 1 0 f f t f s 3 1266 "227
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1351 ( timetz_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1266" _null_ _null_ _null_ timetz_out - _null_ )); DATA(insert OID = 1351 ( timetz_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1266" _null_ _null_ _null_ timetz_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2911 ( timetztypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ timetztypmodin - _null_ )); DATA(insert OID = 2911 ( timetztypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ timetztypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2912 ( timetztypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timetztypmodout - _null_ )); DATA(insert OID = 2912 ( timetztypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ timetztypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -2033,7 +2033,7 @@ DATA(insert OID = 1564 ( bit_in PGNSP PGUID 12 1 0 f f t f i 3 1560 "2275 26
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1565 ( bit_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1560" _null_ _null_ _null_ bit_out - _null_ )); DATA(insert OID = 1565 ( bit_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1560" _null_ _null_ _null_ bit_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2919 ( bittypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ bittypmodin - _null_ )); DATA(insert OID = 2919 ( bittypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ bittypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2920 ( bittypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ bittypmodout - _null_ )); DATA(insert OID = 2920 ( bittypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ bittypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -2062,7 +2062,7 @@ DATA(insert OID = 1579 ( varbit_in PGNSP PGUID 12 1 0 f f t f i 3 1562 "2275
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1580 ( varbit_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1562" _null_ _null_ _null_ varbit_out - _null_ )); DATA(insert OID = 1580 ( varbit_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1562" _null_ _null_ _null_ varbit_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2902 ( varbittypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ varbittypmodin - _null_ )); DATA(insert OID = 2902 ( varbittypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ varbittypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2921 ( varbittypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ varbittypmodout - _null_ )); DATA(insert OID = 2921 ( varbittypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ varbittypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
@ -2485,7 +2485,7 @@ DATA(insert OID = 1701 ( numeric_in PGNSP PGUID 12 1 0 f f t f i 3 1700 "2275
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 1702 ( numeric_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1700" _null_ _null_ _null_ numeric_out - _null_ )); DATA(insert OID = 1702 ( numeric_out PGNSP PGUID 12 1 0 f f t f i 1 2275 "1700" _null_ _null_ _null_ numeric_out - _null_ ));
DESCR("I/O"); DESCR("I/O");
DATA(insert OID = 2917 ( numerictypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1007" _null_ _null_ _null_ numerictypmodin - _null_ )); DATA(insert OID = 2917 ( numerictypmodin PGNSP PGUID 12 1 0 f f t f i 1 23 "1263" _null_ _null_ _null_ numerictypmodin - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");
DATA(insert OID = 2918 ( numerictypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ numerictypmodout - _null_ )); DATA(insert OID = 2918 ( numerictypmodout PGNSP PGUID 12 1 0 f f t f i 1 2275 "23" _null_ _null_ _null_ numerictypmodout - _null_ ));
DESCR("I/O typmod"); DESCR("I/O typmod");

View File

@ -8,7 +8,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.185 2007/06/06 23:00:43 tgl Exp $ * $PostgreSQL: pgsql/src/include/catalog/pg_type.h,v 1.186 2007/06/15 20:56:52 tgl Exp $
* *
* NOTES * NOTES
* the genbki.sh script reads this file and generates .bki * the genbki.sh script reads this file and generates .bki
@ -451,8 +451,11 @@ DESCR("access control list");
#define ACLITEMOID 1033 #define ACLITEMOID 1033
DATA(insert OID = 1034 ( _aclitem PGNSP PGUID -1 f b t \054 0 1033 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ )); DATA(insert OID = 1034 ( _aclitem PGNSP PGUID -1 f b t \054 0 1033 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
DATA(insert OID = 1040 ( _macaddr PGNSP PGUID -1 f b t \054 0 829 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ )); DATA(insert OID = 1040 ( _macaddr PGNSP PGUID -1 f b t \054 0 829 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
DATA(insert OID = 1041 ( _inet PGNSP PGUID -1 f b t \054 0 869 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ )); DATA(insert OID = 1041 ( _inet PGNSP PGUID -1 f b t \054 0 869 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
DATA(insert OID = 651 ( _cidr PGNSP PGUID -1 f b t \054 0 650 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ )); DATA(insert OID = 651 ( _cidr PGNSP PGUID -1 f b t \054 0 650 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
DATA(insert OID = 1263 ( _cstring PGNSP PGUID -1 f b t \054 0 2275 0 array_in array_out array_recv array_send - - - i x f 0 -1 0 _null_ _null_ ));
#define CSTRINGARRAYOID 1263
DATA(insert OID = 1042 ( bpchar PGNSP PGUID -1 f b t \054 0 0 1014 bpcharin bpcharout bpcharrecv bpcharsend bpchartypmodin bpchartypmodout - i x f 0 -1 0 _null_ _null_ )); DATA(insert OID = 1042 ( bpchar PGNSP PGUID -1 f b t \054 0 0 1014 bpcharin bpcharout bpcharrecv bpcharsend bpchartypmodin bpchartypmodout - i x f 0 -1 0 _null_ _null_ ));
DESCR("char(length), blank-padded string, fixed storage length"); DESCR("char(length), blank-padded string, fixed storage length");
#define BPCHAROID 1042 #define BPCHAROID 1042
@ -554,10 +557,14 @@ DATA(insert OID = 2951 ( _uuid PGNSP PGUID -1 f b t \054 0 2950 0 array_in arr
* These cannot be used to define table columns, but are valid as function * These cannot be used to define table columns, but are valid as function
* argument and result types (if supported by the function's implementation * argument and result types (if supported by the function's implementation
* language). * language).
*
* Note: cstring is a borderline case; it is still considered a pseudo-type,
* but there is now support for it in records and arrays. Perhaps we should
* just treat it as a regular base type?
*/ */
DATA(insert OID = 2249 ( record PGNSP PGUID -1 f p t \054 0 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ )); DATA(insert OID = 2249 ( record PGNSP PGUID -1 f p t \054 0 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 _null_ _null_ ));
#define RECORDOID 2249 #define RECORDOID 2249
DATA(insert OID = 2275 ( cstring PGNSP PGUID -2 f p t \054 0 0 0 cstring_in cstring_out cstring_recv cstring_send - - - c p f 0 -1 0 _null_ _null_ )); DATA(insert OID = 2275 ( cstring PGNSP PGUID -2 f p t \054 0 0 1263 cstring_in cstring_out cstring_recv cstring_send - - - c p f 0 -1 0 _null_ _null_ ));
#define CSTRINGOID 2275 #define CSTRINGOID 2275
DATA(insert OID = 2276 ( any PGNSP PGUID 4 t p t \054 0 0 0 any_in any_out - - - - - i p f 0 -1 0 _null_ _null_ )); DATA(insert OID = 2276 ( any PGNSP PGUID 4 t p t \054 0 0 0 any_in any_out - - - - - i p f 0 -1 0 _null_ _null_ ));
#define ANYOID 2276 #define ANYOID 2276

View File

@ -49,7 +49,7 @@
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $PostgreSQL: pgsql/src/include/utils/array.h,v 1.64 2007/03/27 23:21:12 tgl Exp $ * $PostgreSQL: pgsql/src/include/utils/array.h,v 1.65 2007/06/15 20:56:52 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -256,7 +256,7 @@ extern void mda_get_range(int n, int *span, const int *st, const int *endp);
extern void mda_get_prod(int n, const int *range, int *prod); extern void mda_get_prod(int n, const int *range, int *prod);
extern void mda_get_offset_values(int n, int *dist, const int *prod, const int *span); extern void mda_get_offset_values(int n, int *dist, const int *prod, const int *span);
extern int mda_next_tuple(int n, int *curr, const int *span); extern int mda_next_tuple(int n, int *curr, const int *span);
extern int32 *ArrayGetTypmods(ArrayType *arr, int *n); extern int32 *ArrayGetIntegerTypmods(ArrayType *arr, int *n);
/* /*
* prototypes for functions defined in array_userfuncs.c * prototypes for functions defined in array_userfuncs.c

View File

@ -227,7 +227,7 @@ SELECT p1.oid, p1.typname, p2.oid, p2.proname
FROM pg_type AS p1, pg_proc AS p2 FROM pg_type AS p1, pg_proc AS p2
WHERE p1.typmodin = p2.oid AND p1.typtype in ('b', 'p') AND NOT WHERE p1.typmodin = p2.oid AND p1.typtype in ('b', 'p') AND NOT
(p2.pronargs = 1 AND (p2.pronargs = 1 AND
p2.proargtypes[0] = 'int4[]'::regtype AND p2.proargtypes[0] = 'cstring[]'::regtype AND
p2.prorettype = 'int4'::regtype AND NOT p2.proretset); p2.prorettype = 'int4'::regtype AND NOT p2.proretset);
oid | typname | oid | proname oid | typname | oid | proname
-----+---------+-----+--------- -----+---------+-----+---------

View File

@ -176,7 +176,7 @@ SELECT p1.oid, p1.typname, p2.oid, p2.proname
FROM pg_type AS p1, pg_proc AS p2 FROM pg_type AS p1, pg_proc AS p2
WHERE p1.typmodin = p2.oid AND p1.typtype in ('b', 'p') AND NOT WHERE p1.typmodin = p2.oid AND p1.typtype in ('b', 'p') AND NOT
(p2.pronargs = 1 AND (p2.pronargs = 1 AND
p2.proargtypes[0] = 'int4[]'::regtype AND p2.proargtypes[0] = 'cstring[]'::regtype AND
p2.prorettype = 'int4'::regtype AND NOT p2.proretset); p2.prorettype = 'int4'::regtype AND NOT p2.proretset);
-- Check for bogus typmodout routines -- Check for bogus typmodout routines