# Re: [HACKERS] Missing array support

Peter Eisentraut wrote:
```It doesn't say anything specifically about multidimensional arrays, but
the grammar clearly allows declaring arrays of arrays.

```

```         <data type> ::=
<predefined type>
| <row type>
| <user-defined type>
| <reference type>
| <collection type>```

```         <collection type> ::=
<data type> <array specification>```

```         <array specification> ::=
<collection type constructor>
<left bracket or trigraph> <unsigned integer> <right bracket or
trigraph>```

```         <collection type constructor> ::=
ARRAY
```
```Yeah, I noticed that after I replied. So
<data type> <array specification>
means something like this is valid
integer ARRAY[3] ARRAY[4] ARRAY[5]
?```

```Is this the same then as our syntax?
integer [3][4][5]```

```This also has some consequences for the cardinality function.  In order to
get the cardinality of the second dimension, you'd need to call
cardinality(a[1]).  (I suppose it allows different cardinalities at
various positions, so the array does not need to be an n-dimensional
rectangle.)
```
```Hmmm. So this implies that if arr is a 2D array, we need to treat:
arr as a 2D array
arr[n] as a 1D array
arr[n][m] as a scalar```

If that's true, we have a good bit of work left to do to be compliant; e.g.:

```regression=# select f from z;
f
-----------------------------------------------------------------------------------```

```{{{1,1},{1,1},{1,1}},{{1,1},{1,1},{1,1}},{{1,1},{1,1},{1,1}},{{1,1},{1,1},{1,1}}}
(1 row)```

```regression=# select f[1][1] from z;
f
---```

(1 row)

```regression=# select f[1][1][1] from z;
f
---
1
(1 row)```

Based on the above, "select f[1][1] from z;" ought to result in "{1,1}"?

```select * from unnest(array['a','b']) as t(f1, f2) WITH ORDINALITY;
f1 | f2
----+----
1  | a
2  | b
```

The WITH ORDINALITY goes before the AS clause.

OK

```The reason it is defined in terms of the LATERAL clause is that that
allows you to refer to column aliases defined in FROM items to its left.
This is the way variable arguments of function calls as table sources can
be resolved.  (At least this is my interpretation.  I found some examples
```

Thanks for explaining that. I've never seen a LATERAL clause, and I was wondering just what this part meant. So this applies to the discussion we had a while back about set returning functions in the targetlist?

Joe

```---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster
```