prohibit_shutdown_backward_scans_v2.patch
application/octet-stream
Filename: prohibit_shutdown_backward_scans_v2.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v2
Subject: Prohibit shutting down resources if there is a possibility of back up.
| File | + | − |
|---|---|---|
| src/backend/executor/execMain.c | 12 | 4 |
| src/backend/executor/nodeLimit.c | 8 | 2 |
From cd4a6348dc2b925a6da1c4464417a94074687e5a Mon Sep 17 00:00:00 2001
From: Amit Kapila <akapila@postgresql.org>
Date: Fri, 3 Aug 2018 13:34:41 +0530
Subject: [PATCH] Prohibit shutting down resources if there is a possibility of
back up.
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 01e1a46..0a58688 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 66ea6aa..bb28cf7 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;
}
--
1.8.3.1