Return setof values from C-function

From: Yuriy Rusinov <yrusinov(at)gmail(dot)com>
To: POSTGRES <pgsql-general(at)postgresql(dot)org>
Subject: Return setof values from C-function
Date: 2013-12-10 07:30:56
Message-ID: CAA5U4szi9DvRt9veLL38nf0xe-kXHQUciNTBw_S90nWzNU0RjA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

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 ?

--
Best regards,
Sincerely yours,
Yuriy Rusinov.

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Spiros Ioannou 2013-12-10 08:43:30 Re: While only running pg_dump, postgresql performs writes inside base/ directory. How can we stop this?
Previous Message Dinesh Kumar 2013-12-10 06:30:55 Re: pgadmin III query