problem when optimizing the window aggregation
Hi,
I'm trying to reduce the re-computing of window aggregation. Here the
AVG function for example.
The original window aggregation's transition value(transValue) of AVG is
an ArrayType, that contains two main values(sum, count).
Now, I'm using a temporary transition value (tempTransValue), and I need
to copy tempTransValue to transValue.
I used the function datumCopy as following:
peraggstate->transValue = datumCopy(peraggstate->tempTransValue,
peraggstate->transtypeByVal, peraggstate->transtypeLen);
But when the copied transValue is passed to the invoke function, here is
int4_avg_accum, the ArrayType returned from PG_GETARG_ARRAYTYPE_P(0) is
null.
Which means the copy action is failed.
Anybody know why? Or give me some suggestions? Thanks very much.
Best Regards
Chaoyong Wang
"Wang, Chaoyong" <Chaoyong.Wang@emc.com> writes:
I used the function datumCopy as following:
peraggstate->transValue = datumCopy(peraggstate->tempTransValue,
peraggstate->transtypeByVal, peraggstate->transtypeLen);
You need to guard that with an is-null check, because datumCopy isn't
designed to cope with null values. (Which is historical, I guess, but
we're not likely to change it now.) If you look around you will find
plenty of examples of this coding pattern.
regards, tom lane
Thanks again, the reason is found.
The following statement frees all the context for aggregation, including the transValue and tempTransValue:
MemoryContextResetAndDeleteChildren(winstate->aggcontext);
-----Original Message-----
From: Tom Lane [mailto:tgl@sss.pgh.pa.us]
Sent: 2012年8月22日 9:47
To: Wang, Chaoyong
Cc: pgsql-hackers@postgresql.org
Subject: Re: [HACKERS] problem when optimizing the window aggregation
"Wang, Chaoyong" <Chaoyong.Wang@emc.com> writes:
I used the function datumCopy as following:
peraggstate->transValue = datumCopy(peraggstate->tempTransValue,
peraggstate->transtypeByVal, peraggstate->transtypeLen);
You need to guard that with an is-null check, because datumCopy isn't
designed to cope with null values. (Which is historical, I guess, but
we're not likely to change it now.) If you look around you will find
plenty of examples of this coding pattern.
regards, tom lane