Re: valid casts to anyarray

From: Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at>
To: Philip Carlsen <plcplc(at)gmail(dot)com>, pgsql-general(at)lists(dot)postgresql(dot)org
Subject: Re: valid casts to anyarray
Date: 2023-09-27 14:49:51
Message-ID: 88bf272f86df0c91a7beb7b229a4a784ff97b9f1.camel@cybertec.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2023-09-27 14:50:24 Re: valid casts to anyarray
Previous Message Tom Lane 2023-09-27 13:52:09 Re: debugger from superuser only.... why?