From: | Ian Burrell <imb(at)rentrak(dot)com> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | Re: Memory management with C aggregate |
Date: | 2004-07-12 18:03:02 |
Message-ID: | 40F2D256.7000703@rentrak.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Tom Lane wrote:
> Ian Burrell <imb(at)rentrak(dot)com> writes:
>
>>We have user-defined aggregates written in C running inside the server.
>> We are running into some memory management issues and wondering what
>>is the best way to solve the problem.
>
>
>>The state of the aggregates is a structure with a pointer to allocated
>>memory. The structure and memory are allocated in the
>>PortalMemoryContext and freed in the ffunc. We just discovered that the
>>ffunc function can be called multiple times with the same state on
>>certain queries. The double free causes a crash.
>
>
> AFAICS the ffunc should be called only once per aggregated group.
> Perhaps your code is confused about the handling of groups? If so,
> the double free is hardly your only worry --- you'll be computing wrong
> answers anyway till you fix that.
>
The aggregate is in a subquery which might make a difference. The ffunc
is only called multiple times when a nested loop is used in the query
plan. With other query plans, the ffunc is only called once. The ffunc
seems to be called once for every combination.
I can't get the following query to use a nested loop, but our query is
similar, but with a compound key and a custom aggregate. If x has N
rows, y has M, with N groups, then the ffunc can be called N*M times, M
times for each N group.
SELECT x.key_no, s.agg
FROM x
INNER JOIN (
SELECT y.key_no, custom_agg(num) AS agg
FROM y
GROUP BY key_no
) s
USING (key_no)
ORDER BY key_no
I'll try to come up with a test case that illustrates the problem.
- Ian
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2004-07-12 18:32:49 | [subxacts] Open nested xact items |
Previous Message | Bruce Momjian | 2004-07-12 17:49:41 | Beta date |