10000 Disable WindowAgg inverse transitions when subplans are present · postgres/postgres@8d2a858 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8d2a858

Browse files
committed
Disable WindowAgg inverse transitions when subplans are present
When an aggregate function is used as a WindowFunc and a tuple transitions out of the window frame, we ordinarily try to make use of the aggregate function's inverse transition function to "unaggregate" the exiting tuple. This optimization is disabled for various cases, including when the aggregate contains a volatile function. In such a case we'd be unable to ensure that the transition value was calculated to the same value during transitions and inverse transitions. Unfortunately, we did this check by calling contain_volatile_functions() which does not recursively search SubPlans for volatile functions. If the aggregate function's arguments or its FILTER clause contained a subplan with volatile functions then we'd fail to notice this. Here we fix this by just disabling the optimization when the WindowFunc contains any subplans. Volatile functions are not the only reason that a subplan may have nonrepeatable results. Bug: #17777 Reported-by: Anban Company Discussion: https://postgr.es/m/17777-860b739b6efde977%40postgresql.org Reviewed-by: Tom Lane Backpatch-through: 11
1 parent 36a646d commit 8d2a858

File tree

1 file changed

+9
-1
lines changed

1 file changed

+9
-1
lines changed

src/backend/executor/nodeWindowAgg.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2648,16 +2648,24 @@ initialize_peragg(WindowAggState *winstate, WindowFunc *wfunc,
26482648
* aggregate's arguments (and FILTER clause if any) contain any calls to
26492649
* volatile functions. Otherwise, the difference between restarting and
26502650
* not restarting the aggregation would be user-visible.
2651+
*
2652+
* We also don't risk using moving aggregates when there are subplans in
2653+
* the arguments or FILTER clause. This is partly because
2654+
* contain_volatile_functions() doesn't look inside subplans; but there
2655+
* are other reasons why a subplan's output might be volatile. For
2656+
* example, syncscan mode can render the results nonrepeatable.
26512657
*/
26522658
if (!OidIsValid(aggform->aggminvtransfn))
26532659
use_ma_code = false; /* sine qua non */
26542660
else if (aggform->aggmfinalmodify == AGGMODIFY_READ_ONLY &&
2655-
aggform->aggfinalmodify != AGGMODIFY_READ_ONLY)
2661+
aggform->aggfinalmodify != AGGMODIFY_READ_ONLY)
26562662
use_ma_code = true; /* decision forced by safety */
26572663
else if (winstate->frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING)
26582664
use_ma_code = false; /* non-moving frame head */
26592665
else if (contain_volatile_functions((Node *) wfunc))
26602666
use_ma_code = false; /* avoid possible behavioral change */
2667+
else if (contain_subplans((Node *) wfunc))
2668+
use_ma_code = false; /* subplans might contain volatile functions */
26612669
else
26622670
use_ma_code = true; /* yes, let's use it */
26632671
if (use_ma_code)

0 commit comments

Comments
 (0)
0