Dear Colleagues !
--
Best regards,
Sincerely yours,
Yuriy Rusinov.
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.