On Tue, 2023-09-26 at 21:39 +0200, Philip Carlsen wrote:
> I've been down a rabbit hole today trying to understand what exactly makes a 
> type
> a valid candidate for an ANYARRAY function argument (e.g., something you can 
> 'unnest()').
> 
> My reading has led me across such functions as 'get_promoted_array_type',  
> 'IsTrueArrayType',
> 'can_coerce_type', and 'check_generic_type_consistency', and this has led me 
> to believe
> that any type which has a valid (i.e., non-zero?) pg_type.typelem defined 
> should be applicable.
> 
> However, I cannot seem to be able to call 'unnest' on a 'point': 
> 
> postgres=# select unnest(point(1,2));
> ERROR:  function unnest(point) does not exist
> 
> ... even though according to 'pg_catalog.pg_type' the type 'point' does 
> indeed look
> very array-like (it should be equivalent to an float8 array). The only 
> difference I
> can spot is that it has 'typsubscript=raw_array_subscript_handler', as 
> opposed to
> typsubscript=array_subscript_handler' which is what 'IsTrueArrayType' checks 
> for.
> 
> Can anyone here perhaps enlighten me as to how I can tell if a type is a 
> valid ANYARRAY
> (and bonus points to point out the check I must have missed in the (parser?) 
> source code)?

I'd say that the type has to be an array type...

For example, here is the definition of "cardinality()", which takes "anyarray"
as argument:

Datum
array_cardinality(PG_FUNCTION_ARGS)
{
    AnyArrayType *v = PG_GETARG_ANY_ARRAY_P(0);

    PG_RETURN_INT32(ArrayGetNItems(AARR_NDIM(v), AARR_DIMS(v)));
}

Yours,
Laurenz Albe


Reply via email to