On Wed, Nov 12, 2008 at 02:12:19PM +0200, Peter Eisentraut wrote: > Tom Lane wrote: > >Seems like we ought to clean this up. I'm not sure which way to jump > >though: should we decree that arrays of no elements must always have > >zero dimensions, or should we get rid of that and standardize on, say, > >1-D array with lower bound 1 and upper bound 0? > > It was pointed out to me today that a zero-dimensional matrix is a > scalar. This makes a bit of sense, if you say that > > '{{56}}' is of type int[][], 2 dimensions > '{56}' is of type int[], 1 dimension > '56' is of type int, 0 dimensions > > Notice that the number of brace pairs in the literal matches the number > of bracket pairs in the type declaration. > > By that logic, '{}' has one dimension. I think this also works best in > practice, for example with array concatenation.
I could argue a very convincing case that '{}' should be of *at least* one dimension. The fact that you can concat it onto any other size array suggests the current implementation of PG agrees---probably for very different reasons though. '{{}}' would imply an array of at least two dimensions, but doesn't appear to be currently supported. Another weirdo is the fact that this works: (ARRAY[ARRAY[3]])[1][1]; whereas this doesn't: ((ARRAY[ARRAY[3]])[1])[1]; which seems a little strange, although from a historical point of view I can understand why it behaves the way it does. From the current behavior, the following syntax would make more sense: (ARRAY[ARRAY[3]])[1,1]; I.e. it's obvious that you're pulling stuff out of a two dimensional array. With the current syntax, I'd expect to get slices of higher dimensional arrays back: (ARRAY[ARRAY[3,4]])[1]; would evaluate to: ARRAY[3,4] We then get onto issues of arrays currently having to be rectangular; even though it's trivial to express things that don't want rectangular arrays: SELECT array(VALUES (ARRAY[1]),(ARRAY[2,3])); I'd expect to get a 1D array of 1D arrays back from this---note that this is distinct from a 2D array, which would indeed be rectangular and wouldn't work at all. I'd expect the following to be invalid: SELECT array(VALUES (ARRAY[1]),(ARRAY[ARRAY[2,3]])); I could go on, but I'm not sure of any good ways of keeping this all compatible with the current syntax or semantics. Sam -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers