Properly check interrupts in execScan.c.
authorAndres Freund <andres@anarazel.de>
Thu, 14 Sep 2017 08:53:10 +0000 (01:53 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 14 Sep 2017 09:00:14 +0000 (02:00 -0700)
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

src/backend/executor/execScan.c

index 47a34a044a76b6c174c6432116c7385b0190b42f..5dfc49deb95483ee6dd92f80b2eccd57e96d73d5 100644 (file)
@@ -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);
 
        /*