Tom Lane wrote:
Markus Bertheau =?UTF-8?Q?=E2=98=AD?= <[EMAIL PROTECTED]> writes:

By analogy, array_upper('{}'::TEXT[], 1) should return 0 instead of
NULL.

No, that doesn't follow ... we've traditionally considered '{}' to
denote a zero-dimensional array.  A 1-D array of no elements is
'[1:0]={}', just as Joe shows ... or at least it would be except
for an overenthusiastic error check:

regression=# select '[1:0]={}' :: int[];
ERROR:  upper bound cannot be less than lower bound

I think this should be a legal boundary case.  In general, it should be
possible to form zero-size arrays of any number of dimensions.


I've been playing with exactly this over the weekend. Of course, as usual, the devil is in the details. For instance, using the above notation, how would I specify a zero-element 1D array starting at a lower bound index of 0? The answer following the above pattern would be:

  select '[0:-1]={}'::int[];

You could not use '[0:0]={}'::int[], because that would be a one-element array. I propose the following instead:

regression=# select '[1:]={}' :: int[];
 int4
------
 {}
(1 row)

regression=# select array_dims('[1:]={}' :: int[]);
 array_dims
------------
 [1:]
(1 row)

In other words, an missing upper bound indicates zero elements.

Now the next question; what does a 2D zero-element array look like? I think this makes sense:

regression=# select '[1:2][1:]={{},{}}'::int[];
 int4
------
 {}
(1 row)

Except (I think) array_out() should probably output something closer to the input literal. Any thoughts on this?

Joe

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to