Re: BUG #14487: malformed empty array from array_fill
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andrew Gierth <andrew@tao11.riddles.org.uk>
Cc: pgsql-bugs@postgresql.org
Date: 2017-01-05T15:55:13Z
Lists: pgsql-bugs
Andrew Gierth <andrew@tao11.riddles.org.uk> writes:
> "andrew" == andrew <andrew@tao11.riddles.org.uk> writes:
> andrew> array_fill returns a malformed empty array when given a size of
> andrew> zero:
> Also, why does array_fill reject the case of an empty array of
> dimensions? It seems obvious that it should return an empty array
> result in such cases.
Yeah. The code seems to have been intending to allow that:
ndims = ARR_DIMS(dims)[0];
if (ndims < 0) /* we do allow zero-dimension arrays */
but it doesn't work right, precisely because that case comes out
as being zero-dimensional not one dimension of length 0.
Ideally I think we would reject zeroes in the lengths array as being an
error, but it's probably too late for that, because likely people are
using array[0] to get an empty result array since '{}' doesn't work.
It also strikes me that this restriction is quite pointless:
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.")));
I think it's reasonable to disallow multi-dimensional input arrays here,
but I don't see why it matters what the LB is.
regards, tom lane
Commits
-
Fix handling of empty arrays in array_fill().
- ee9cb284a6d6 9.3.16 landed
- e0d59c6ef57b 9.2.20 landed
- 82f8107b92c9 10.0 landed
- 5b4f8f4c6d61 9.6.2 landed
- 4e446563be72 9.4.11 landed
- 4555a375a1b2 9.5.6 landed