Re: Server crashed with dense_rank on partition table.
Andres Freund <andres@anarazel.de>
From: Andres Freund <andres@anarazel.de>
To: Amit Langote <Langote_Amit_f8@lab.ntt.co.jp>
Cc: Michael Paquier <michael@paquier.xyz>, Rajkumar Raghuwanshi <rajkumar.raghuwanshi@enterprisedb.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2018-07-05T00:40:18Z
Lists: pgsql-hackers
On 2018-07-02 17:14:14 +0900, Amit Langote wrote: > I studied this a bit and found a bug that's causing the crash. > > The above mentioned commit has this hunk: > > @@ -1309,6 +1311,9 @@ hypothetical_dense_rank_final(PG_FUNCTION_ARGS) > PG_RETURN_INT64(rank); > > osastate = (OSAPerGroupState *) PG_GETARG_POINTER(0); > + econtext = osastate->qstate->econtext; > + if (!econtext) > + osastate->qstate->econtext = econtext = > CreateStandaloneExprContext(); > > In CreateStandloneExprContext(), we have this: > > econtext->ecxt_per_query_memory = CurrentMemoryContext; > > /* > * Create working memory for expression evaluation in this context. > */ > econtext->ecxt_per_tuple_memory = > AllocSetContextCreate(CurrentMemoryContext, > "ExprContext", > ALLOCSET_DEFAULT_SIZES); > > I noticed when debugging the crashing query that CurrentMemoryContext is > actually per-tuple memory context of some expression context of the > calling code, which would get reset before getting here again. So, it's > wrong of hypothetical_dense_rank_final to call CreateStandloneExprContext > without first switching to an actual per-query context. > > Attached patch seems to fix the crash. Thanks, that looks correct. Pushed! - Andres
Commits
-
Use context with correct lifetime in hypothetical_dense_rank_final.
- e60cfcefe635 11.0 landed
- 249126e761e1 12.0 landed
-
Do execGrouping.c via expression eval machinery, take two.
- bf6c614a2f2c 11.0 cited