Joe Conway wrote: > Bruce Momjian wrote: > > Joe Conway wrote: > >> > >>Any thoughts on how this should be handled for an empty 1D array? > > > > No one responed to this email, so I will try. Is this the one > > dimmentional array you were talking about? > > > > test=> select array_dims('{}'::integer[]); > > array_dims > > ------------ > > > > (1 row) > > In this case, what you get is actually a dimensionless array. Literally, > you get this: > > if (nitems == 0) > { > /* Return empty array */ > retval = (ArrayType *) palloc0(sizeof(ArrayType)); > retval->size = sizeof(ArrayType); > retval->elemtype = element_type; > PG_RETURN_ARRAYTYPE_P(retval); > } > > I.e. the array structure is allocated, the size is set (which is > required since arrays are varlena), and the element type is initialized. > There is no initialization of ndim, ARR_DIMS(), or ARR_LBOUND(). > > In this case, since there are no dimensions, array_dims() probably does > the right thing by returning NULL. > > > Why is [1:0] wrong to return? > > > > I'm not sure it is wrong -- it just seems a bit strange. The difference > is that in order to return an empty *one-dimensional* array, ndim, > ARR_DIMS(), and ARR_LBOUND() are all appropriately set (by the patched > code). Basically, ndim == 1, ARR_DIMS() is a single element int array (C > array that is) indicating 0 elements for dimension 1, and ARR_LBOUND() > is a single element int array indicating a lower bound of 1. This leads > to the array_dims() return value of [1:0]. The value 1 is unquestionably > correct for the lower bound index, but what should be reported for the > upper bound? We can't return [1:1], because that would indicate that we > have one element.
OK, so '[1:0]' seems correct. How would to specify such an array manually in a string? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 ---------------------------(end of broadcast)--------------------------- TIP 9: the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match