Re: RFC: array_agg() per SQL:200n - Mailing list pgsql-hackers

From Hitoshi Harada
Subject Re: RFC: array_agg() per SQL:200n
Date
Msg-id 006901c86220$28442810$78cc7830$@com
Whole thread Raw
In response to Re: RFC: array_agg() per SQL:200n  (Joe Conway <mail@joeconway.com>)
List pgsql-hackers
yet another inverse function I wrote before, though it applies for only 1D
array.

typedef struct _enuminfo{ArrayType    *data;char        *ptr;int16        typlen;bool        typbyval;char
typalign;
} EnumInfo;

Datum array_enum(PG_FUNCTION_ARGS){FuncCallContext *funcctx;MemoryContext oldcontext;ArrayType    *input;EnumInfo
*info;Datum       result;if(SRF_IS_FIRSTCALL()){    funcctx = SRF_FIRSTCALL_INIT();    oldcontext =
 
MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);        input = PG_GETARG_ARRAYTYPE_P(0);    if(ARR_NDIM(input)
!=1){        elog(ERROR, "array_enum() accepts only one dimension
 
array.");    }    funcctx->max_calls = ArrayGetNItems(ARR_NDIM(input),
ARR_DIMS(input));        info = (EnumInfo*)palloc0(sizeof(EnumInfo));    info->data =
(ArrayType*)PG_DETOAST_DATUM_COPY(input);   info->ptr = ARR_DATA_PTR(info->data);    get_typlenbyvalalign(
info->data->elemtype,        &(info->typlen),         &(info->typbyval),         &(info->typalign)    );
funcctx->user_fctx= info;        MemoryContextSwitchTo(oldcontext);}funcctx = SRF_PERCALL_SETUP();info =
funcctx->user_fctx;if(funcctx->call_cntr< funcctx->max_calls){    /* Get source element */    result =
fetch_att(info->ptr,info->typbyval, info->typlen);
 
    info->ptr = att_addlength(info->ptr, info->typlen,
PointerGetDatum(info->ptr));    info->ptr = (char *) att_align(info->ptr, info->typalign);    SRF_RETURN_NEXT(funcctx,
result);}else{   SRF_RETURN_DONE(funcctx);}
 
}

Hitoshi Harada

> -----Original Message-----
> From: pgsql-hackers-owner@postgresql.org
> [mailto:pgsql-hackers-owner@postgresql.org] On Behalf Of Joe Conway
> Sent: Tuesday, January 29, 2008 11:00 AM
> To: Jeff Davis
> Cc: Neil Conway; pgsql-hackers
> Subject: Re: [HACKERS] RFC: array_agg() per SQL:200n
> 
> Jeff Davis wrote:
> > On Sun, 2008-01-27 at 22:11 -0800, Neil Conway wrote:
> >> p. 564 discusses the required behavior. The result of array_agg() is an
> >> array with one element per input value, sorted according to the optional
> >> ORDER BY clause. NULL input values are included in the array, and the
> >> result for an empty group is NULL, not an empty array. Note that per
> >> page 66, I'd expect array values in the input to array_agg() not to be
> >> flattened.
> >
> > Should there be an inverse operator (a SRF, in this case) that returns a
> > set from an array?
> 
> Yes -- see UNNEST
> 
> Joe
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 9: In versions below 8.0, the planner will ignore your desire to
>        choose an index scan if your joining column's datatypes do not
>        match



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Bogus cleanup code in GSSAPI/SSPI patch
Next
From: Caleb Welton
Date:
Subject: Transition functions for SUM(::int2), SUM(::int4, SUM(::int8])