windowagg_fix.patch
text/plain
Filename: windowagg_fix.patch
Type: text/plain
Part: 0
Message:
Re: Bug in row_number() optimization
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/executor/nodeWindowAgg.c | 15 | 0 |
diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c
index 81ba024bba..083a3b2386 100644
--- a/src/backend/executor/nodeWindowAgg.c
+++ b/src/backend/executor/nodeWindowAgg.c
@@ -2234,6 +2234,21 @@ ExecWindowAgg(PlanState *pstate)
if (winstate->numaggs > 0)
eval_windowaggregates(winstate);
}
+ else if (!winstate->top_window)
+ {
+ /*
+ * Otherwise, if we're not the top-window, we'd better fill the
+ * aggregate values in with something, else they might be pointing
+ * to freed memory. These don't need to be valid since WindowAggs
+ * above us cannot reference the result of another WindowAgg.
+ */
+ numfuncs = winstate->numfuncs;
+ for (i = 0; i < numfuncs; i++)
+ {
+ econtext->ecxt_aggvalues[i] = (Datum) 0;
+ econtext->ecxt_aggnulls[i] = true;
+ }
+ }
/*
* If we have created auxiliary read pointers for the frame or group