DETOASTing in custom memory context
Tom, thanks again for the quick answer and
sorry for the lame question about memor allocation.
I hope this is acceptable:
Is there a way to make PG_DETOAST_DATUM and friends allocate
memory in a custom memory context ?
Right now I'm DETOASTing, memcopying in a custom context
and pfreeing the DETOASTed datum, I'd like to avoid one
copy.
TIA.
--strk;
From whitin an aggregate sfunc I did:
oldcontext = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
geom = (GEOMETRY *)PG_DETOAST_DATUM(datum);
MemoryContextSwitchTo(oldcontext);
And later in aggregate's finalfunc:
pfree(geom);
Result:
segfault!
What's wrong with it ?
NOTE that if I MemoryContextAllocate in fcinfo->flinfo->fn_mcxt and
memcopy DETOASTED geom, everything works (ar at least it seems to)
--strk;
strk wrote:
Show quoted text
Tom, thanks again for the quick answer and
sorry for the lame question about memor allocation.I hope this is acceptable:
Is there a way to make PG_DETOAST_DATUM and friends allocate
memory in a custom memory context ?Right now I'm DETOASTing, memcopying in a custom context
and pfreeing the DETOASTed datum, I'd like to avoid one
copy.TIA.
--strk;---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
joining column's datatypes do not match
strk <strk@keybit.net> writes:
From whitin an aggregate sfunc I did:
oldcontext = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
geom = (GEOMETRY *)PG_DETOAST_DATUM(datum);
MemoryContextSwitchTo(oldcontext);
And later in aggregate's finalfunc:
pfree(geom);
Result:
segfault!
What's wrong with it ?
Perhaps you wanted PG_DETOAST_DATUM_COPY(). Or possibly use
PG_FREE_IF_COPY() rather than an unconditional pfree, though
that would depend on just what your usage pattern is.
regards, tom lane
tgl wrote:
strk <strk@keybit.net> writes:
From whitin an aggregate sfunc I did:
oldcontext = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt);
geom = (GEOMETRY *)PG_DETOAST_DATUM(datum);
MemoryContextSwitchTo(oldcontext);And later in aggregate's finalfunc:
pfree(geom);Result:
segfault!What's wrong with it ?
Perhaps you wanted PG_DETOAST_DATUM_COPY(). Or possibly use
PG_FREE_IF_COPY() rather than an unconditional pfree, though
that would depend on just what your usage pattern is.
Sure, how did I miss that !
PG_FREE_IF_COPY is unapplicable here since pfree() call is in a
different function that the one DETOASTING it (finalfunc and sfunc
respectively of an aggregate), but PG_DETOAST_DATUM_COPY() did at
least force a copy and thus the context-switch...
thanks,
--strk;