On 3 April 2013 15:10, Tom Lane <t...@sss.pgh.pa.us> wrote: > I think though that the upthread argument that we'd have multiple > interpretations of the same thing is bogus. To me, the core idea that's > being suggested here is that '{}' should mean a zero-length 1-D array, > not a zero-D array as formerly. We would still need a way to represent > zero-D arrays, if only because they'd still exist on-disk in existing > databases (assuming we're not willing to break pg_upgrade for this). > I suggest that that ought *not* involve any braces. Perhaps '[]=' would > be a suitable representation.
Then restoring an old SQL dump would silently convert all old zero-D arrays to zero-length 1-D arrays. Also, if you failed to completely rewrite all your application code, and accidentally missed a few functions, you could very easily end up in a situation where your tables contained a mixture of zero-D arrays and zero-length 1-D arrays, that wouldn't compare equally, leading to all sorts of nasty bugs. > In the other direction, ISTM that > '{{},{},{}}' is a zero-by-three array, Isn't that a three-by-zero array rather than a zero-by-three array? Either way, what is the use-case for it? I certainly can't remember ever using a 0x3 or 3x0 matrix. > entirely distinct from '{}' or > '{{}}' in dimensionality if not content. And '{{}}' is a one-by-zero array. There is currently no proposed syntax for representing a zero-by-zero array, or a zero-by-one array. All I see here is endless opportunity for confusion and code breakage, with very little real benefit. I actually don't think the current behaviour is broken. I find it perfectly logical and consistent to have a single dimensionless concept of an empty array. It has no elements, so questions like are they arranged in 1-D or 2-D, and what index do they start at are meaningless, and so should return NULL. The only counter-intuitive thing is that array_length() returns NULL instead of 0 for the empty array, and it doesn't take long to get used to that behaviour. Much of this seems to have grown out of a desire to fix the confusing behaviour of array_length(), but seems to have ended up in a much more confusing place. Given that array_length() takes 2 arguments, it is somewhat forgivable for it to return NULL when you ask for the array's length in a dimension that it doesn't have. Perhaps what might make the API easier to work with is a new single-argument function --- e.g., array_size() that would return the number of elements in the array --- 0 for '{}', 3 for '{1,2,3}', 6 for '{{1,2},{3,4},{5,6}}' and so on. Regards, Dean -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers