Re: Memory management with C aggregate - Mailing list pgsql-hackers

From Ian Burrell
Subject Re: Memory management with C aggregate
Date
Msg-id 40F2D256.7000703@rentrak.com
Whole thread Raw
In response to Re: Memory management with C aggregate  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Tom Lane wrote:
> Ian Burrell <imb@rentrak.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




pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: Point in Time Recovery
Next
From: "Merlin Moncure"
Date:
Subject: case sensitivity in PQExecPrepared