Re: BUG #14487: malformed empty array from array_fill

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Andrew Gierth <andrew(at)tao11(dot)riddles(dot)org(dot)uk>
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #14487: malformed empty array from array_fill
Date: 2017-01-05 15:55:13
Message-ID: 17089.1483631713@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Andrew Gierth <andrew(at)tao11(dot)riddles(dot)org(dot)uk> writes:
> "andrew" == andrew <andrew(at)tao11(dot)riddles(dot)org(dot)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

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Vitaly Burovoy 2017-01-05 16:05:42 Re: [BUGS][PATCH] BUG #14486: Inserting and selecting interval have different constraints
Previous Message Andrew Gierth 2017-01-05 15:33:19 Re: BUG #14487: malformed empty array from array_fill