On Tue, Dec 10, 2013 at 1:30 AM, Yuriy Rusinov <yrusinov@xxxxxxxxx> 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 -- Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-general