diff --git a/doc/src/sgml/array.sgml b/doc/src/sgml/array.sgml index 4d762c53d3..08a3ee021d 100644 --- a/doc/src/sgml/array.sgml +++ b/doc/src/sgml/array.sgml @@ -1,4 +1,4 @@ - + Arrays @@ -324,6 +324,18 @@ SELECT array_upper(schedule, 1) FROM sal_emp WHERE name = 'Carol'; ------------- 2 (1 row) + + + array_length will return the length of a specified + array dimension: + + +SELECT array_length(schedule, 1) FROM sal_emp WHERE name = 'Carol'; + + array_length +-------------- + 2 +(1 row) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 1e32990451..85403e2c9f 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1,4 +1,4 @@ - + Functions and Operators @@ -9408,6 +9408,17 @@ SELECT NULLIF(value, '(none)') ... array_fill(7, ARRAY[3], ARRAY[2]) [2:4]={7,7,7} + + + + array_length(anyarray, int) + + + int + returns the length of the requested array dimension + array_length(array[1,2,3], 1) + 3 + @@ -9452,6 +9463,19 @@ SELECT NULLIF(value, '(none)') ... array_upper(ARRAY[1,2,3,4], 1) 4 + + + + cardinality(anyarray) + + + int + returns the length of the first dimension of the array + (special case of array_length for SQL + compatibility) + cardinality(array[1,2,3]) + 3 + diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index 97dc3dc6c8..9d2b036897 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.148 2008/11/04 14:49:11 petere Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/arrayfuncs.c,v 1.149 2008/11/12 13:09:27 petere Exp $ * *------------------------------------------------------------------------- */ @@ -1640,6 +1640,34 @@ array_upper(PG_FUNCTION_ARGS) PG_RETURN_INT32(result); } +/* + * array_length : + * returns the length, of the dimension 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 diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 599e01db6a..3e7e52b57f 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -37,7 +37,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.503 2008/11/09 21:24:33 tgl Exp $ + * $PostgreSQL: pgsql/src/include/catalog/catversion.h,v 1.504 2008/11/12 13:09:27 petere Exp $ * *------------------------------------------------------------------------- */ @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 200811091 +#define CATALOG_VERSION_NO 200811121 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index ea686c319d..6288ca4e77 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.524 2008/11/04 14:49:11 petere Exp $ + * $PostgreSQL: pgsql/src/include/catalog/pg_proc.h,v 1.525 2008/11/12 13:09:28 petere Exp $ * * NOTES * The script catalog/genbki.sh reads this file and generates .bki @@ -996,6 +996,10 @@ DATA(insert OID = 2091 ( array_lower PGNSP PGUID 12 1 0 0 f f t f i 2 23 "22 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 = 2179 ( cardinality PGNSP PGUID 14 1 0 0 f f t f i 1 23 "2277" _null_ _null_ _null_ "select array_length($1, 1)" _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_ )); diff --git a/src/include/utils/array.h b/src/include/utils/array.h index 6bbc46e13b..33d9ad3207 100644 --- a/src/include/utils/array.h +++ b/src/include/utils/array.h @@ -49,7 +49,7 @@ * Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/array.h,v 1.69 2008/11/04 14:49:12 petere Exp $ + * $PostgreSQL: pgsql/src/include/utils/array.h,v 1.70 2008/11/12 13:09:28 petere Exp $ * *------------------------------------------------------------------------- */ @@ -199,6 +199,7 @@ extern Datum array_ndims(PG_FUNCTION_ARGS); 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); diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out index c538fad621..804d52b798 100644 --- a/src/test/regress/expected/arrays.out +++ b/src/test/regress/expected/arrays.out @@ -1075,3 +1075,53 @@ select array_to_string(string_to_array('1|2|3', '|'), '|'); 1|2|3 (1 row) +select array_length(array[1,2,3], 1); + array_length +-------------- + 3 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 0); + array_length +-------------- + +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 1); + array_length +-------------- + 2 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 2); + array_length +-------------- + 3 +(1 row) + +select array_length(array[[1,2,3], [4,5,6]], 3); + array_length +-------------- + +(1 row) + +select cardinality(array[1,2,3]); + cardinality +------------- + 3 +(1 row) + +select cardinality(array[[1,2,3], [4,5,6]]); + cardinality +------------- + 2 +(1 row) + +select c, cardinality(c), d, cardinality(d) from arrtest; + c | cardinality | d | cardinality +-------------------+-------------+---------------+------------- + {} | | {} | + {foobar,new_word} | 2 | {{elt1,elt2}} | 1 + {foo,new_word} | 2 | {bar,foo} | 2 +(3 rows) + diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql index a15b81ab28..04b19a4ace 100644 --- a/src/test/regress/sql/arrays.sql +++ b/src/test/regress/sql/arrays.sql @@ -386,3 +386,12 @@ select string_to_array('1|2|3', NULL); select string_to_array(NULL, '|'); select array_to_string(string_to_array('1|2|3', '|'), '|'); + +select array_length(array[1,2,3], 1); +select array_length(array[[1,2,3], [4,5,6]], 0); +select array_length(array[[1,2,3], [4,5,6]], 1); +select array_length(array[[1,2,3], [4,5,6]], 2); +select array_length(array[[1,2,3], [4,5,6]], 3); +select cardinality(array[1,2,3]); +select cardinality(array[[1,2,3], [4,5,6]]); +select c, cardinality(c), d, cardinality(d) from arrtest;