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.