Re: valid casts to anyarray - Mailing list pgsql-general

From Laurenz Albe
Subject Re: valid casts to anyarray
Date
Msg-id 88bf272f86df0c91a7beb7b229a4a784ff97b9f1.camel@cybertec.at
Whole thread Raw
List pgsql-general
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



pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: debugger from superuser only.... why?
Next
From: Tom Lane
Date:
Subject: Re: valid casts to anyarray