From 304845075ce0eb9045af50ed32c688a0cb8dd490 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 9 Jan 2011 13:09:07 -0500 Subject: [PATCH] Use array_contains_nulls instead of ARR_HASNULL on user-supplied arrays. This applies the fix for bug #5784 to remaining places where we wish to reject nulls in user-supplied arrays. In all these places, there's no reason not to allow a null bitmap to be present, so long as none of the current elements are actually null. I did not change some other places where we are looking at system catalog entries or aggregate transition values, as the presence of a null bitmap in such an array would be suspicious. --- contrib/cube/cube.c | 6 +++--- contrib/ltree/_ltree_gist.c | 4 ++-- contrib/ltree/_ltree_op.c | 6 +++--- contrib/ltree/lquery_op.c | 2 +- contrib/ltree/ltree_gist.c | 2 +- src/backend/utils/adt/arrayfuncs.c | 4 ++-- src/backend/utils/adt/arrayutils.c | 2 +- src/backend/utils/adt/tsrank.c | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/contrib/cube/cube.c b/contrib/cube/cube.c index 1633152432..4a207ccb98 100644 --- a/contrib/cube/cube.c +++ b/contrib/cube/cube.c @@ -187,7 +187,7 @@ cube_a_f8_f8(PG_FUNCTION_ARGS) double *dur, *dll; - if (ARR_HASNULL(ur) || ARR_HASNULL(ll)) + if (array_contains_nulls(ur) || array_contains_nulls(ll)) ereport(ERROR, (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), errmsg("cannot work with arrays containing NULLs"))); @@ -228,7 +228,7 @@ cube_a_f8(PG_FUNCTION_ARGS) int size; double *dur; - if (ARR_HASNULL(ur)) + if (array_contains_nulls(ur)) ereport(ERROR, (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), errmsg("cannot work with arrays containing NULLs"))); @@ -262,7 +262,7 @@ cube_subset(PG_FUNCTION_ARGS) i; int *dx; - if (ARR_HASNULL(idx)) + if (array_contains_nulls(idx)) ereport(ERROR, (errcode(ERRCODE_ARRAY_ELEMENT_ERROR), errmsg("cannot work with arrays containing NULLs"))); diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c index f221c2de54..c1f509ed8b 100644 --- a/contrib/ltree/_ltree_gist.c +++ b/contrib/ltree/_ltree_gist.c @@ -92,7 +92,7 @@ _ltree_compress(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); - if (ARR_HASNULL(val)) + if (array_contains_nulls(val)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array must not contain nulls"))); @@ -538,7 +538,7 @@ _arrq_cons(ltree_gist *key, ArrayType *_query) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); - if (ARR_HASNULL(_query)) + if (array_contains_nulls(_query)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array must not contain nulls"))); diff --git a/contrib/ltree/_ltree_op.c b/contrib/ltree/_ltree_op.c index 096a748c51..f4f0451fd8 100644 --- a/contrib/ltree/_ltree_op.c +++ b/contrib/ltree/_ltree_op.c @@ -52,7 +52,7 @@ array_iterator(ArrayType *la, PGCALL2 callback, void *param, ltree **found) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); - if (ARR_HASNULL(la)) + if (array_contains_nulls(la)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array must not contain nulls"))); @@ -152,7 +152,7 @@ _lt_q_regex(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); - if (ARR_HASNULL(_query)) + if (array_contains_nulls(_query)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array must not contain nulls"))); @@ -310,7 +310,7 @@ _lca(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); - if (ARR_HASNULL(la)) + if (array_contains_nulls(la)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array must not contain nulls"))); diff --git a/contrib/ltree/lquery_op.c b/contrib/ltree/lquery_op.c index 1fbed78157..fe9ecb118a 100644 --- a/contrib/ltree/lquery_op.c +++ b/contrib/ltree/lquery_op.c @@ -348,7 +348,7 @@ lt_q_regex(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); - if (ARR_HASNULL(_query)) + if (array_contains_nulls(_query)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array must not contain nulls"))); diff --git a/contrib/ltree/ltree_gist.c b/contrib/ltree/ltree_gist.c index 47a85bbabc..26c34753dc 100644 --- a/contrib/ltree/ltree_gist.c +++ b/contrib/ltree/ltree_gist.c @@ -606,7 +606,7 @@ arrq_cons(ltree_gist *key, ArrayType *_query) ereport(ERROR, (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array must be one-dimensional"))); - if (ARR_HASNULL(_query)) + if (array_contains_nulls(_query)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array must not contain nulls"))); diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index a1bcbe687f..1be96517df 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -4700,7 +4700,7 @@ array_fill_internal(ArrayType *dims, ArrayType *lbs, errmsg("wrong range of array subscripts"), errdetail("Lower bound of dimension array must be one."))); - if (ARR_HASNULL(dims)) + if (array_contains_nulls(dims)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("dimension values cannot be null"))); @@ -4732,7 +4732,7 @@ array_fill_internal(ArrayType *dims, ArrayType *lbs, errmsg("wrong range of array subscripts"), errdetail("Lower bound of dimension array must be one."))); - if (ARR_HASNULL(lbs)) + if (array_contains_nulls(lbs)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("dimension values cannot be null"))); diff --git a/src/backend/utils/adt/arrayutils.c b/src/backend/utils/adt/arrayutils.c index e3f116975d..af7359ca4e 100644 --- a/src/backend/utils/adt/arrayutils.c +++ b/src/backend/utils/adt/arrayutils.c @@ -213,7 +213,7 @@ ArrayGetIntegerTypmods(ArrayType *arr, int *n) (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("typmod array must be one-dimensional"))); - if (ARR_HASNULL(arr)) + if (array_contains_nulls(arr)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("typmod array must not contain nulls"))); diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c index 65823bd705..8f5941c147 100644 --- a/src/backend/utils/adt/tsrank.c +++ b/src/backend/utils/adt/tsrank.c @@ -408,7 +408,7 @@ getWeights(ArrayType *win) (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), errmsg("array of weight is too short"))); - if (ARR_HASNULL(win)) + if (array_contains_nulls(win)) ereport(ERROR, (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), errmsg("array of weight must not contain nulls")));