I have a question about trying to keep memory from growing too much in a C aggregate function with pass-by-reference types. I am trying to keep track of a last-seen value in my aggregate state, so I have code roughly doing this: Datum current; MemoryContext aggContext; AggCheckCallContext(fcinfo, &aggContext); old = MemoryContextSwitchTo(aggContext); if (!PG_ARGISNULL(0)) { current = PG_GETARG_DATUM(0); state->last = datumCopy(¤t, typbyval, typlen); } MemoryContextSwitchTo(old); I’m essentially doing a datumCopy() on every non-null input value. I was wondering if there is a way to free the previously copied datum, since I don’t really need it anymore? Something like if (!PG_ARGISNULL(0)) { current = PG_GETARG_DATUM(0); if (state->last != NULL) { pfree(state->last); } state->last = datumCopy(¤t, typbyval, typlen); } I wasn’t sure it was allowed to call pfree() like this. My actual function is dealing with array input values, and for large sets of inputs I didn’t want to grow memory use as large as the entire data set being aggregated. Kind regards, Matt |