*** a/doc/src/sgml/array.sgml
--- b/doc/src/sgml/array.sgml
***************
*** 338,343 **** SELECT array_length(schedule, 1) FROM sal_emp WHERE name = 'Carol';
--- 338,354 ----
2
(1 row)
+
+ The single-argument overload of array_length can be used
+ to get the length of a one-dimensional array:
+
+ SELECT array_length(schedule) FROM sal_emp WHERE name = 'Carol';
+
+ array_length
+ --------------
+ 2
+ (1 row)
+
*** a/doc/src/sgml/func.sgml
--- b/doc/src/sgml/func.sgml
***************
*** 11096,11101 **** SELECT NULLIF(value, '(none)') ...
--- 11096,11112 ----
+ array_length(anyarray)
+
+
+ int
+ returns the length of the array (array must be one-dimensional)
+ array_length(array[1,2,3])
+ 3
+
+
+
+
array_lower(anyarray, int)
*** a/src/backend/utils/adt/arrayfuncs.c
--- b/src/backend/utils/adt/arrayfuncs.c
***************
*** 1740,1745 **** array_length(PG_FUNCTION_ARGS)
--- 1740,1779 ----
}
/*
+ * array_length_single:
+ * Returns the length of a single-dimensional array. The array must be
+ * single-dimensional or empty and its lower bound must be 1.
+ */
+ Datum
+ array_length_single(PG_FUNCTION_ARGS)
+ {
+ ArrayType *v = PG_GETARG_ARRAYTYPE_P(0);
+ int result;
+ int *lb;
+ int *dimv;
+
+ /* empty array */
+ if (ARR_NDIM(v) == 0)
+ PG_RETURN_INT32(0);
+
+ if (ARR_NDIM(v) != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("input array is not single-dimensional")));
+
+ lb = ARR_LBOUND(v);
+ if (lb[0] != 1)
+ ereport(ERROR,
+ (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
+ errmsg("lower bound of array is not 1")));
+
+ dimv = ARR_DIMS(v);
+ result = dimv[0];
+ 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
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
***************
*** 840,845 **** DATA(insert OID = 2092 ( array_upper PGNSP PGUID 12 1 0 0 0 f f f f t f i 2
--- 840,847 ----
DESCR("array upper dimension");
DATA(insert OID = 2176 ( array_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2277 23" _null_ _null_ _null_ _null_ array_length _null_ _null_ _null_ ));
DESCR("array length");
+ DATA(insert OID = 3179 ( array_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2277" _null_ _null_ _null_ _null_ array_length_single _null_ _null_ _null_ ));
+ DESCR("array length");
DATA(insert OID = 378 ( array_append PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2277 2283" _null_ _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 0 f f f f f f i 2 0 2277 "2283 2277" _null_ _null_ _null_ _null_ array_push _null_ _null_ _null_ ));
*** a/src/include/utils/array.h
--- b/src/include/utils/array.h
***************
*** 204,209 **** extern Datum array_dims(PG_FUNCTION_ARGS);
--- 204,210 ----
extern Datum array_lower(PG_FUNCTION_ARGS);
extern Datum array_upper(PG_FUNCTION_ARGS);
extern Datum array_length(PG_FUNCTION_ARGS);
+ extern Datum array_length_single(PG_FUNCTION_ARGS);
extern Datum array_larger(PG_FUNCTION_ARGS);
extern Datum array_smaller(PG_FUNCTION_ARGS);
extern Datum generate_subscripts(PG_FUNCTION_ARGS);
*** a/src/test/regress/expected/arrays.out
--- b/src/test/regress/expected/arrays.out
***************
*** 1455,1460 **** select array_length(array[[1,2,3], [4,5,6]], 3);
--- 1455,1482 ----
(1 row)
+ select array_length(NULL::int[]);
+ array_length
+ --------------
+
+ (1 row)
+
+ select array_length(array[1,2,3]);
+ array_length
+ --------------
+ 3
+ (1 row)
+
+ select array_length('{}'::int[]);
+ array_length
+ --------------
+ 0
+ (1 row)
+
+ select array_length('[2:4]={5,6,7}'::int[]);
+ ERROR: lower bound of array is not 1
+ select array_length('{{1,2}}'::int[]);
+ ERROR: input array is not single-dimensional
select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss;
array_agg
--------------------------------------
*** a/src/test/regress/sql/arrays.sql
--- b/src/test/regress/sql/arrays.sql
***************
*** 419,424 **** select array_length(array[[1,2,3], [4,5,6]], 1);
--- 419,430 ----
select array_length(array[[1,2,3], [4,5,6]], 2);
select array_length(array[[1,2,3], [4,5,6]], 3);
+ select array_length(NULL::int[]);
+ select array_length(array[1,2,3]);
+ select array_length('{}'::int[]);
+ select array_length('[2:4]={5,6,7}'::int[]);
+ select array_length('{{1,2}}'::int[]);
+
select array_agg(unique1) from (select unique1 from tenk1 where unique1 < 15 order by unique1) ss;
select array_agg(ten) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;
select array_agg(nullif(ten, 4)) from (select ten from tenk1 where unique1 < 15 order by unique1) ss;