Re: ARRAY() returning NULL instead of ARRAY[] resp. {} - Mailing list pgsql-sql

From Joe Conway
Subject Re: ARRAY() returning NULL instead of ARRAY[] resp. {}
Date
Msg-id 42A2169E.9020700@joeconway.com
Whole thread Raw
In response to Re: ARRAY() returning NULL instead of ARRAY[] resp. {}  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: ARRAY() returning NULL instead of ARRAY[] resp. {}
List 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 by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: ARRAY() returning NULL instead of ARRAY[] resp. {}
Next
From: Bruce Momjian
Date:
Subject: Re: ARRAY() returning NULL instead of ARRAY[] resp. {}