Re: Question about using AggCheckCallContext in a C function - Mailing list pgsql-general

From Tom Lane
Subject Re: Question about using AggCheckCallContext in a C function
Date
Msg-id 24389.1376336837@sss.pgh.pa.us
Whole thread Raw
In response to Re: Question about using AggCheckCallContext in a C function  (Matt Solnit <msolnit@soasta.com>)
Responses Re: Question about using AggCheckCallContext in a C function  (Matt Solnit <msolnit@soasta.com>)
List pgsql-general
Matt Solnit <msolnit@soasta.com> writes:
> 2. The function seems to work consistently when I do a SELECT
> SUM(mycol) without any GROUP BY.  It's only when I add grouping that
> the failures happen.  I'm not sure if this is a real clue or a red
> herring.

That isn't enormously surprising, since the memory management for
the transition values is different in the two cases.

> Finally, can you tell me what precisely happens when you call
> datumCopy() with ArrayType?  If it's only returning a copy of
> the TOAST reference, then how is it safe for the transition function
> to modify the content?  I'm probably *completely* misunderstanding
> how this works, so I would love to be enlightened :-).

You're right, datumCopy() won't expand a TOAST reference.  What does
expand it is PG_GETARG_ARRAYTYPE_P().  So if you have a case where the
system picks up a copy of an array input that happens to be toasted,
it's the GETARG step in the next invocation of the aggregate transition
function that expands the TOAST reference, and then after that you have an
in-memory copy that's safe to modify.  Maybe you're missing that somehow?
The code fragment you showed looked okay but ...

            regards, tom lane


pgsql-general by date:

Previous
From: Matt Solnit
Date:
Subject: Re: Question about using AggCheckCallContext in a C function
Next
From: Joe Van Dyk
Date:
Subject: Why doesn't COPY support the HEADER options for tab-separated output?