Commit 249126e7 authored by Andres Freund's avatar Andres Freund

Use context with correct lifetime in hypothetical_dense_rank_final.

The query lifetime expression context created in
hypothetical_dense_rank_final() was buggily allocated in the calling
memory context. I (Andres) broke that in bf6c614a.

Reported-By: Rajkumar Raghuwanshi
Author: Amit Langote
Discussion:  https://postgr.es/m/CAKcux6kmzWmur5HhA_aU6gYVFu0RLQdgJJ+aC9SLdcOvBSrpfA@mail.gmail.com
Backpatch: 11-
parent 3a01f68e
......@@ -1310,7 +1310,15 @@ hypothetical_dense_rank_final(PG_FUNCTION_ARGS)
osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0);
econtext = osastate->qstate->econtext;
if (!econtext)
osastate->qstate->econtext = econtext = CreateStandaloneExprContext();
{
MemoryContext oldcontext;
/* Make sure to we create econtext under correct parent context. */
oldcontext = MemoryContextSwitchTo(osastate->qstate->qcontext);
osastate->qstate->econtext = CreateStandaloneExprContext();
econtext = osastate->qstate->econtext;
MemoryContextSwitchTo(oldcontext);
}
/* Adjust nargs to be the number of direct (or aggregated) args */
if (nargs % 2 != 0)
......
......@@ -2092,3 +2092,12 @@ SELECT variance(unique1::int4), sum(unique1::int8) FROM tenk1;
(1 row)
ROLLBACK;
-- test coverage for dense_rank
SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),(3)) v(x) GROUP BY (x) ORDER BY 1;
dense_rank
------------
1
1
1
(3 rows)
......@@ -925,3 +925,6 @@ EXPLAIN (COSTS OFF)
SELECT variance(unique1::int4), sum(unique1::int8) FROM tenk1;
ROLLBACK;
-- test coverage for dense_rank
SELECT dense_rank(x) WITHIN GROUP (ORDER BY x) FROM (VALUES (1),(1),(2),(2),(3),(3)) v(x) GROUP BY (x) ORDER BY 1;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment