From: | Matt Magoffin <postgresql(dot)org(at)msqr(dot)us> |
---|---|
To: | pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Freeing transient memory in aggregate functions |
Date: | 2021-12-20 20:26:47 |
Message-ID: | C1897C9E-665C-4CDA-AE8C-8DA4119E6A12@msqr.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
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
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2021-12-20 21:07:17 | Re: PGBouncer logs explanation required |
Previous Message | Pavel Stehule | 2021-12-20 19:37:44 | Re: Packages, inner subprograms, and parameterizable anonymous blocks for PL/pgSQL |