Re: Return setof values from C-function

From: Merlin Moncure <mmoncure(at)gmail(dot)com>
To: Yuriy Rusinov <yrusinov(at)gmail(dot)com>
Cc: POSTGRES <pgsql-general(at)postgresql(dot)org>
Subject: Re: Return setof values from C-function
Date: 2013-12-10 15:33:49
Message-ID: CAHyXU0zzvBFf+HCL1x-i83gg3EburSVCgZAPSFJHhhKG7u3+Ow@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Tue, Dec 10, 2013 at 1:30 AM, Yuriy Rusinov <yrusinov(at)gmail(dot)com> wrote:
> Dear Colleagues !
>
> I have to return setof values from C-function
>
> I wrote
>
> FuncCallContext *funcctx;
> int call_cntr;
> int max_calls;
> AttInMetadata *attinmeta;
> unsigned long il;
> if (SRF_IS_FIRSTCALL())
> {
> MemoryContext oldcontext;
> funcctx = SRF_FIRSTCALL_INIT();
> oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
> funcctx->max_calls = num;
> if (get_call_result_type(fcinfo, NULL, &tupdesc) !=
> TYPEFUNC_COMPOSITE)
> ereport(ERROR,
> (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
> errmsg("function returning record called in context "
> "that cannot accept type record")));
> attinmeta = 0;//TupleDescGetAttInMetadata(tupdesc);
> funcctx->attinmeta = 0;//attinmeta;
> MemoryContextSwitchTo(oldcontext);
> funcctx->tuple_desc = BlessTupleDesc( tupdesc );
> elog (INFO, "1st row");
> }
> funcctx = SRF_PERCALL_SETUP();
> call_cntr = funcctx->call_cntr;
> max_calls = funcctx->max_calls;
> attinmeta = funcctx->attinmeta;
> HeapTuple tuple;
> if (call_cntr < max_calls)
> {
> elog (INFO, "Rows");
> unsigned long il = call_cntr;
> Datum * hvalues = (Datum *)palloc (2*sizeof(Datum));
> double val = gsl_histogram_get (gHist, il);
> hvalues[0] = UInt32GetDatum (il);
> hvalues[1] = Float8GetDatum (val);
> bool * nulls = palloc( 2 * sizeof( bool ) );
>
> elog (INFO, "%lu", il);
> tuple = heap_form_tuple( tupdesc, hvalues, nulls);
> elog (INFO, "%lu", il);
> //BuildTupleFromCStrings (attinmeta, hvalues);
> pfree (nulls);
> pfree (hvalues);
> SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum( tuple ) );
> }
> else
> {
> SRF_RETURN_DONE(funcctx);
> }
> as written in documentation, but my function drops on
> tuple = heap_form_tuple( tupdesc, hvalues, nulls);
> Could you tell me, are there any errors ?

Where is 'tupdesc' coming from. Don't you need to copy it from the
function context?

merlin

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Yuriy Rusinov 2013-12-10 15:44:32 Re: Return setof values from C-function
Previous Message Albe Laurenz 2013-12-10 15:21:08 Re: DB Audit