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 bf6c614a2f.

Reported-By: Rajkumar Raghuwanshi
Author: Amit Langote
Discussion:  https://postgr.es/m/CAKcux6kmzWmur5HhA_aU6gYVFu0RLQdgJJ+aC9SLdcOvBSrpfA@mail.gmail.com
Backpatch: 11-
This commit is contained in:
Andres Freund 2018-07-04 17:36:01 -07:00
parent 0c69db762d
commit e60cfcefe6
3 changed files with 21 additions and 1 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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;