Updated version attached, this time without the compiler warning. Sorry for the sloppy work.
...Robert
Index: doc/src/sgml/array.sgml =================================================================== RCS file: /projects/cvsroot/pgsql/doc/src/sgml/array.sgml,v retrieving revision 1.67 diff -c -r1.67 array.sgml *** doc/src/sgml/array.sgml 29 Oct 2008 11:24:52 -0000 1.67 --- doc/src/sgml/array.sgml 7 Nov 2008 04:04:33 -0000 *************** *** 325,330 **** --- 325,342 ---- 2 (1 row) </programlisting> + + <function>array_length</function> will return the length of a specified + array dimension: + + <programlisting> + SELECT array_length(schedule, 1) FROM sal_emp WHERE name = 'Carol'; + + array_length + -------------- + 2 + (1 row) + </programlisting> </para> </sect2> Index: doc/src/sgml/func.sgml =================================================================== RCS file: /projects/cvsroot/pgsql/doc/src/sgml/func.sgml,v retrieving revision 1.455 diff -c -r1.455 func.sgml *** doc/src/sgml/func.sgml 4 Nov 2008 14:49:11 -0000 1.455 --- doc/src/sgml/func.sgml 7 Nov 2008 04:04:44 -0000 *************** *** 9411,9416 **** --- 9411,9427 ---- <row> <entry> <literal> + <function>array_length</function>(<type>anyarray</type>, <type>int</type>) + </literal> + </entry> + <entry><type>int</type></entry> + <entry>returns length of the requested array dimension</entry> + <entry><literal>array_length(array[1,2,3], 1)</literal></entry> + <entry><literal>3</literal></entry> + </row> + <row> + <entry> + <literal> <function>array_lower</function>(<type>anyarray</type>, <type>int</type>) </literal> </entry> Index: src/backend/utils/adt/arrayfuncs.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/arrayfuncs.c,v retrieving revision 1.148 diff -c -r1.148 arrayfuncs.c *** src/backend/utils/adt/arrayfuncs.c 4 Nov 2008 14:49:11 -0000 1.148 --- src/backend/utils/adt/arrayfuncs.c 7 Nov 2008 04:04:49 -0000 *************** *** 1641,1646 **** --- 1641,1674 ---- } /* + * array_length : + * returns the length, of the DIM requested, for + * the array pointed to by "v", as an int4 + */ + Datum + array_length(PG_FUNCTION_ARGS) + { + ArrayType *v = PG_GETARG_ARRAYTYPE_P(0); + int reqdim = PG_GETARG_INT32(1); + int *dimv; + int result; + + /* Sanity check: does it look like an array at all? */ + if (ARR_NDIM(v) <= 0 || ARR_NDIM(v) > MAXDIM) + PG_RETURN_NULL(); + + /* Sanity check: was the requested dim valid */ + if (reqdim <= 0 || reqdim > ARR_NDIM(v)) + PG_RETURN_NULL(); + + dimv = ARR_DIMS(v); + + result = dimv[reqdim - 1]; + + PG_RETURN_INT32(result); + } + + /* * array_ref : * This routine takes an array pointer and a subscript array and returns * the referenced item as a Datum. Note that for a pass-by-reference Index: src/include/catalog/pg_proc.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/catalog/pg_proc.h,v retrieving revision 1.524 diff -c -r1.524 pg_proc.h *** src/include/catalog/pg_proc.h 4 Nov 2008 14:49:11 -0000 1.524 --- src/include/catalog/pg_proc.h 7 Nov 2008 04:05:01 -0000 *************** *** 996,1001 **** --- 996,1003 ---- DESCR("array lower dimension"); DATA(insert OID = 2092 ( array_upper PGNSP PGUID 12 1 0 0 f f t f i 2 23 "2277 23" _null_ _null_ _null_ array_upper _null_ _null_ _null_ )); DESCR("array upper dimension"); + DATA(insert OID = 2176 ( array_length PGNSP PGUID 12 1 0 0 f f t f i 2 23 "2277 23" _null_ _null_ _null_ array_length _null_ _null_ _null_ )); + DESCR("array length"); DATA(insert OID = 378 ( array_append PGNSP PGUID 12 1 0 0 f f f f i 2 2277 "2277 2283" _null_ _null_ _null_ array_push _null_ _null_ _null_ )); DESCR("append element onto end of array"); DATA(insert OID = 379 ( array_prepend PGNSP PGUID 12 1 0 0 f f f f i 2 2277 "2283 2277" _null_ _null_ _null_ array_push _null_ _null_ _null_ )); Index: src/include/utils/array.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/utils/array.h,v retrieving revision 1.69 diff -c -r1.69 array.h *** src/include/utils/array.h 4 Nov 2008 14:49:12 -0000 1.69 --- src/include/utils/array.h 7 Nov 2008 04:05:02 -0000 *************** *** 199,204 **** --- 199,205 ---- extern Datum array_dims(PG_FUNCTION_ARGS); extern Datum array_lower(PG_FUNCTION_ARGS); extern Datum array_upper(PG_FUNCTION_ARGS); + extern Datum array_length(PG_FUNCTION_ARGS); extern Datum array_larger(PG_FUNCTION_ARGS); extern Datum array_smaller(PG_FUNCTION_ARGS); extern Datum generate_subscripts(PG_FUNCTION_ARGS);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers