I have added code Oid * oids = (Oid *)palloc (2*sizeof (Oid)); oids[0] = INT8OID; oids[1] = FLOAT8OID; if (get_call_result_type(fcinfo, oids, &tupdescRes) != TYPEFUNC_COMPOSITE) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("function returning record called in context " "that cannot accept type record")));
and try to obtain tupdescRes from get_call_result_type function, before this I do create type hist_point as (inum bigint, bin float8); and create or replace function histogram (varchar, float8, float8, int4) returns setof hist_point as '$libdir/libfloader.so', 'histogram' language 'c' strict security definer; but the result does not obtained. On Tue, Dec 10, 2013 at 7:33 PM, Merlin Moncure <mmonc...@gmail.com> wrote: > On Tue, Dec 10, 2013 at 1:30 AM, Yuriy Rusinov <yrusi...@gmail.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 > -- Best regards, Sincerely yours, Yuriy Rusinov.