mirror of
https://github.com/postgres/postgres.git
synced 2025-04-22 23:02:54 +03:00
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
This commit is contained in:
parent
d2e40b310a
commit
1ab973ab60
@ -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);
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user