aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2017-09-14 01:53:10 -0700
committerAndres Freund <andres@anarazel.de>2017-09-14 02:02:20 -0700
commit253c8afc9eb178b7241b4cc571acf7fb6ac6f976 (patch)
tree5ca345d197d7f754942f35016c488ef3faa6162c
parent68a7c24fdf2d69fc57cfb26aba7e119aa6ca2621 (diff)
downloadpostgresql-253c8afc9eb178b7241b4cc571acf7fb6ac6f976.tar.gz
postgresql-253c8afc9eb178b7241b4cc571acf7fb6ac6f976.zip
Properly check interrupts in execScan.c.
During the development of d47cfef711 the CFI()s in ExecScan() were moved back and forth, ending up in the wrong place. Thus queries that largely spend their time in ExecScan(), and have neither projection nor a qual, can't be cancelled in a timely manner. Reported-By: Jeff Janes Author: Andres Freund Discussion: https://postgr.es/m/CAMkU=1weDXp8eLLPt9SO1LEUsJYYK9cScaGhLKpuN+WbYo9b5g@mail.gmail.com Backpatch: 10, as d47cfef711
-rw-r--r--src/backend/executor/execScan.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/backend/executor/execScan.c b/src/backend/executor/execScan.c
index 4f131b3ee0d..ee9f9b361d7 100644
--- a/src/backend/executor/execScan.c
+++ b/src/backend/executor/execScan.c
@@ -27,7 +27,7 @@ static bool tlist_matches_tupdesc(PlanState *ps, List *tlist, Index varno, Tuple
/*
- * ExecScanFetch -- fetch next potential tuple
+ * ExecScanFetch -- check interrupts & fetch next potential tuple
*
* This routine is concerned with substituting a test tuple if we are
* inside an EvalPlanQual recheck. If we aren't, just execute
@@ -40,6 +40,8 @@ ExecScanFetch(ScanState *node,
{
EState *estate = node->ps.state;
+ CHECK_FOR_INTERRUPTS();
+
if (estate->es_epqTuple != NULL)
{
/*
@@ -133,6 +135,8 @@ ExecScan(ScanState *node,
projInfo = node->ps.ps_ProjInfo;
econtext = node->ps.ps_ExprContext;
+ /* interrupt checks are in ExecScanFetch */
+
/*
* If we have neither a qual to check nor a projection to do, just skip
* all the overhead and return the raw scan tuple.
@@ -157,8 +161,6 @@ ExecScan(ScanState *node,
{
TupleTableSlot *slot;
- CHECK_FOR_INTERRUPTS();
-
slot = ExecScanFetch(node, accessMtd, recheckMtd);
/*