Thread
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
-
BUG #14487: malformed empty array from array_fill
Andrew Gierth <andrew@tao11.riddles.org.uk> — 2017-01-05T15:21:56Z
The following bug has been logged on the website: Bug reference: 14487 Logged by: Andrew Gierth Email address: andrew@tao11.riddles.org.uk PostgreSQL version: 9.6.1 Operating system: any Description: array_fill returns a malformed empty array when given a size of zero: select a, a = '{}' from (select array_fill(null::integer, array[0]) as a) s; a | ?column? ----+---------- {} | f The result actually has ndims=1 and a length of 0, which can be checked with array_length(a,1). Obvious fix is to move the fast-track empty result to after computing nitems? -
Re: BUG #14487: malformed empty array from array_fill
Andrew Gierth <andrew@tao11.riddles.org.uk> — 2017-01-05T15:33:19Z
>>>>> "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. -- Andrew (irc:RhodiumToad)
-
Re: BUG #14487: malformed empty array from array_fill
Tom Lane <tgl@sss.pgh.pa.us> — 2017-01-05T15:55:13Z
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