aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/adt/arrayfuncs.c26
-rw-r--r--src/test/regress/expected/arrays.out27
-rw-r--r--src/test/regress/sql/arrays.sql8
3 files changed, 42 insertions, 19 deletions
diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c
index 11e1bce4338..d9c8aa569c9 100644
--- a/src/backend/utils/adt/arrayfuncs.c
+++ b/src/backend/utils/adt/arrayfuncs.c
@@ -5734,25 +5734,19 @@ array_fill_internal(ArrayType *dims, ArrayType *lbs,
/*
* Params checks
*/
- if (ARR_NDIM(dims) != 1)
+ if (ARR_NDIM(dims) > 1)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
errmsg("wrong number of array subscripts"),
errdetail("Dimension array must be one dimensional.")));
- if (ARR_LBOUND(dims)[0] != 1)
- ereport(ERROR,
- (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
- errmsg("wrong range of array subscripts"),
- errdetail("Lower bound of dimension array must be one.")));
-
if (array_contains_nulls(dims))
ereport(ERROR,
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
errmsg("dimension values cannot be null")));
dimv = (int *) ARR_DATA_PTR(dims);
- ndims = ARR_DIMS(dims)[0];
+ ndims = (ARR_NDIM(dims) > 0) ? ARR_DIMS(dims)[0] : 0;
if (ndims < 0) /* we do allow zero-dimension arrays */
ereport(ERROR,
@@ -5766,24 +5760,18 @@ array_fill_internal(ArrayType *dims, ArrayType *lbs,
if (lbs != NULL)
{
- if (ARR_NDIM(lbs) != 1)
+ if (ARR_NDIM(lbs) > 1)
ereport(ERROR,
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
errmsg("wrong number of array subscripts"),
errdetail("Dimension array must be one dimensional.")));
- if (ARR_LBOUND(lbs)[0] != 1)
- ereport(ERROR,
- (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
- errmsg("wrong range of array subscripts"),
- errdetail("Lower bound of dimension array must be one.")));
-
if (array_contains_nulls(lbs))
ereport(ERROR,
(errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
errmsg("dimension values cannot be null")));
- if (ARR_DIMS(lbs)[0] != ndims)
+ if (ndims != ((ARR_NDIM(lbs) > 0) ? ARR_DIMS(lbs)[0] : 0))
ereport(ERROR,
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
errmsg("wrong number of array subscripts"),
@@ -5801,12 +5789,12 @@ array_fill_internal(ArrayType *dims, ArrayType *lbs,
lbsv = deflbs;
}
+ nitems = ArrayGetNItems(ndims, dimv);
+
/* fast track for empty array */
- if (ndims == 0)
+ if (nitems <= 0)
return construct_empty_array(elmtype);
- nitems = ArrayGetNItems(ndims, dimv);
-
/*
* We arrange to look up info about element type only once per series of
* calls, assuming the element type doesn't change underneath us.
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out
index 59e4472e4fd..8c5050577bf 100644
--- a/src/test/regress/expected/arrays.out
+++ b/src/test/regress/expected/arrays.out
@@ -1553,16 +1553,43 @@ select array_fill('juhu'::text, array[3,3]);
{{juhu,juhu,juhu},{juhu,juhu,juhu},{juhu,juhu,juhu}}
(1 row)
+select a, a = '{}' as is_eq, array_dims(a)
+ from (select array_fill(42, array[0]) as a) ss;
+ a | is_eq | array_dims
+----+-------+------------
+ {} | t |
+(1 row)
+
+select a, a = '{}' as is_eq, array_dims(a)
+ from (select array_fill(42, '{}') as a) ss;
+ a | is_eq | array_dims
+----+-------+------------
+ {} | t |
+(1 row)
+
+select a, a = '{}' as is_eq, array_dims(a)
+ from (select array_fill(42, '{}', '{}') as a) ss;
+ a | is_eq | array_dims
+----+-------+------------
+ {} | t |
+(1 row)
+
-- raise exception
select array_fill(1, null, array[2,2]);
ERROR: dimension array or low bound array cannot be null
select array_fill(1, array[2,2], null);
ERROR: dimension array or low bound array cannot be null
+select array_fill(1, array[2,2], '{}');
+ERROR: wrong number of array subscripts
+DETAIL: Low bound array has different size than dimensions array.
select array_fill(1, array[3,3], array[1,1,1]);
ERROR: wrong number of array subscripts
DETAIL: Low bound array has different size than dimensions array.
select array_fill(1, array[1,2,null]);
ERROR: dimension values cannot be null
+select array_fill(1, array[[1,2],[3,4]]);
+ERROR: wrong number of array subscripts
+DETAIL: Dimension array must be one dimensional.
select string_to_array('1|2|3', '|');
string_to_array
-----------------
diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql
index 2fbc699f604..9de72075631 100644
--- a/src/test/regress/sql/arrays.sql
+++ b/src/test/regress/sql/arrays.sql
@@ -482,11 +482,19 @@ select array_fill(7, array[3,3],array[2,2]);
select array_fill(7, array[3,3]);
select array_fill('juhu'::text, array[3,3],array[2,2]);
select array_fill('juhu'::text, array[3,3]);
+select a, a = '{}' as is_eq, array_dims(a)
+ from (select array_fill(42, array[0]) as a) ss;
+select a, a = '{}' as is_eq, array_dims(a)
+ from (select array_fill(42, '{}') as a) ss;
+select a, a = '{}' as is_eq, array_dims(a)
+ from (select array_fill(42, '{}', '{}') as a) ss;
-- raise exception
select array_fill(1, null, array[2,2]);
select array_fill(1, array[2,2], null);
+select array_fill(1, array[2,2], '{}');
select array_fill(1, array[3,3], array[1,1,1]);
select array_fill(1, array[1,2,null]);
+select array_fill(1, array[[1,2],[3,4]]);
select string_to_array('1|2|3', '|');
select string_to_array('1|2|3|', '|');