Return setof values from C-function - Mailing list pgsql-general

From Yuriy Rusinov
Subject Return setof values from C-function
Date
Msg-id CAA5U4szi9DvRt9veLL38nf0xe-kXHQUciNTBw_S90nWzNU0RjA@mail.gmail.com
Whole thread Raw
Responses Re: Return setof values from C-function  (Merlin Moncure <mmoncure@gmail.com>)
List 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.

pgsql-general by date:

Previous
From: Dinesh Kumar
Date:
Subject: Re: pgadmin III query
Next
From: Spiros Ioannou
Date:
Subject: Re: While only running pg_dump, postgresql performs writes inside base/ directory. How can we stop this?