Re: [SQL] ARRAY() returning NULL instead of ARRAY[] resp. {}
От | Joe Conway |
---|---|
Тема | Re: [SQL] ARRAY() returning NULL instead of ARRAY[] resp. {} |
Дата | |
Msg-id | 42A46E44.3060100@joeconway.com обсуждение исходный текст |
Ответ на | Re: [SQL] ARRAY() returning NULL instead of ARRAY[] resp. {} (Tom Lane <tgl@sss.pgh.pa.us>) |
Список | pgsql-hackers |
Tom Lane wrote: > Markus Bertheau ☭ <twanger@bluetwanger.de> 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
В списке pgsql-hackers по дате отправления: