Re: ARRAY() returning NULL instead of ARRAY[] resp. {}
От | Joe Conway |
---|---|
Тема | Re: ARRAY() returning NULL instead of ARRAY[] resp. {} |
Дата | |
Msg-id | 42A2169E.9020700@joeconway.com обсуждение исходный текст |
Ответ на | Re: ARRAY() returning NULL instead of ARRAY[] resp. {} (Bruce Momjian <pgman@candle.pha.pa.us>) |
Ответы |
Re: ARRAY() returning NULL instead of ARRAY[] resp. {}
|
Список | pgsql-sql |
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. Joe
В списке pgsql-sql по дате отправления: