Re: RFC: array_agg() per SQL:200n
От | Hitoshi Harada |
---|---|
Тема | Re: RFC: array_agg() per SQL:200n |
Дата | |
Msg-id | 006901c86220$28442810$78cc7830$@com обсуждение исходный текст |
Ответ на | Re: RFC: array_agg() per SQL:200n (Joe Conway <mail@joeconway.com>) |
Список | 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 по дате отправления: