]> granicus.if.org Git - postgresql/commitdiff
Use context with correct lifetime in hypothetical_dense_rank_final.
authorAndres Freund <andres@anarazel.de>
Thu, 5 Jul 2018 00:36:01 +0000 (17:36 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 5 Jul 2018 00:36:19 +0000 (17:36 -0700)
The query lifetime expression context created in
hypothetical_dense_rank_final() was buggily allocated in the calling
memory context. I (Andres) broke that in bf6c614a2f2.

Reported-By: Rajkumar Raghuwanshi
Author: Amit Langote
Discussion:  https://postgr.es/m/CAKcux6kmzWmur5HhA_aU6gYVFu0RLQdgJJ+aC9SLdcOvBSrpfA@mail.gmail.com
Backpatch: 11-

src/backend/utils/adt/orderedsetaggs.c
src/test/regress/expected/aggregates.out
src/test/regress/sql/aggregates.sql

index ed36851fddf433430852a6edb203d78c44a1d40c..5867f3df07059495ee4fac077eb714001d578e2c 100644 (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)
index 10d6bb68240c8c704e19d564029bc6d624e09b70..a120dd83f7bf7892bac3b8a812ae6e6ebd932c31 100644 (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)
+
index 1b6db5095605a2f921aa5b630a6d4e316d2f65a1..7e77467ecd47440c004a27310771af3093dddea8 100644 (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;