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