postgres.git / summary / log / commit / refs

commit    2cd0acfdade82f3cab362fd9129d453f81cc2745
Author:   Amit Kapila <akapila@postgresql.org>
Date:     Mon Aug 13 02:52:18 2018 +0000

    Prohibit shutting down resources if there is a possibility of back up.
    
    Currently, we release the asynchronous resources as soon as it is evident
    that no more rows will be needed e.g. when a Limit is filled.  This can be
    problematic especially for custom and foreign scans where we can scan
    backward.  Fix that by disallowing the shutting down of resources in such
    cases.
    
    Reported-by: Robert Haas
    Analysed-by: Robert Haas and Amit Kapila
    Author: Amit Kapila
    Reviewed-by: Robert Haas
    Backpatch-through: 9.6 where this code was introduced
    Discussion: https://postgr.es/m/86137f17-1dfb-42f9-7421-82fd786b04a1@anayrat.info


src/backend/executor/execMain.c | 16 ++++++++++++---- src/backend/executor/nodeLimit.c | 10 ++++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index b797d064b7e..c583e020a0e 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -1726,8 +1726,12 @@ ExecutePlan(EState *estate, */ if (TupIsNull(slot)) { - /* Allow nodes to release or shut down resources. */ - (void) ExecShutdownNode(planstate); + /* + * If we know we won't need to back up, we can release + * resources at this point. + */ + if (!(estate->es_top_eflags & EXEC_FLAG_BACKWARD)) + (void) ExecShutdownNode(planstate); break; } @@ -1773,8 +1777,12 @@ ExecutePlan(EState *estate, current_tuple_count++; if (numberTuples && numberTuples == current_tuple_count) { - /* Allow nodes to release or shut down resources. */ - (void) ExecShutdownNode(planstate); + /* + * If we know we won't need to back up, we can release + * resources at this point. + */ + if (!(estate->es_top_eflags & EXEC_FLAG_BACKWARD)) + (void) ExecShutdownNode(planstate); break; } } diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c index 66ea6aa3c35..bb28cf7d1db 100644 --- a/src/backend/executor/nodeLimit.c +++ b/src/backend/executor/nodeLimit.c @@ -134,8 +134,14 @@ ExecLimit(PlanState *pstate) node->position - node->offset >= node->count) { node->lstate = LIMIT_WINDOWEND; - /* Allow nodes to release or shut down resources. */ - (void) ExecShutdownNode(outerPlan); + + /* + * If we know we won't need to back up, we can release + * resources at this point. + */ + if (!(node->ps.state->es_top_eflags & EXEC_FLAG_BACKWARD)) + (void) ExecShutdownNode(outerPlan); + return NULL; } [parent: 07172d5aff8f]