BUG #14487: malformed empty array from array_fill

Started by Andrew Gierthover 9 years ago3 messagesbugs
Jump to latest
#1Andrew Gierth
andrew@tao11.riddles.org.uk

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?

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#2Andrew Gierth
andrew@tao11.riddles.org.uk
In reply to: Andrew Gierth (#1)
Re: BUG #14487: malformed empty array from array_fill

"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)

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andrew Gierth (#2)
Re: BUG #14487: malformed empty array from array_fill

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

--
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs