If I have a multi-call SRF and a user_fctx struct allocated in the
multi_call_memory_ctx, and in the if(SRF_IS_FIRSTCALL()) block while still
in the multi_call_memory_ctx I use PG_GETARG_TEXT_P(n) to get an argument
to my function, and stash the result of this in my user_fctx struct, am I
guaranteed that this pointer will remain valid throughout the remaining
calls to this SRF, or should I instead use PG_GETARG_TEXT_P_COPY(n)?

Here is an example of what I am talking about

typedef struct testfunc_ctx {
 text * txt;
} testfunc_ctx;

Datum testfunc(PG_FUNCTION_ARGS)
{
 FuncCallContext *funcctx;
 testfunc_ctx *userctx;
 MemoryContext oldcontext;

 if (SRF_IS_FIRSTCALL())
 {
  funcctx = SRF_FIRSTCALL_INIT();
  oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
  userctx = palloc(sizeof(testfunc_ctx));
/* XXX does this need to be PG_GETARG_TEXT_P_COPY, or is this ok like this */
  userctx->txt = PG_GETARG_TEXT_P(0);
  MemoryContextSwitchTo(oldcontext);
  funcctx->user_fctx = userctx;
 }

 funcctx = SRF_PERCALL_SETUP();
 userctx = funcctx->user_fctx;
 /* do something with userctx->txt */

 if (done)
  SRF_RETURN_DONE(funcctx);
 else
  SRF_RETURN_NEXT(funcctx, result);
}


-- 
The New Testament offers the basis for modern computer coding theory,
in the form of an affirmation of the binary number system.

        But let your communication be Yea, yea; nay, nay: for
        whatsoever is more than these cometh of evil.
                -- Matthew 5:37

---------------------------(end of broadcast)---------------------------
TIP 9: In versions below 8.0, the planner will ignore your desire to
       choose an index scan if your joining column's datatypes do not
       match

Reply via email to