mirror of
https://github.com/postgres/postgres.git
synced 2025-08-24 09:27:52 +03:00
Doc: add some commentary about ExecutorRun's NoMovement special case.
Robert Haas expressed concern about whether commit 3eea7a0c9
exposed
the parallel-execution machinery to a case it isn't tested for, namely
a second non-parallel execution of a plan after a parallel execution.
Investigation shows that that can't happen because of pquery.c's
manipulation of the scan direction, but it sure wasn't obvious to
start with. Add some commentary about that.
Discussion: https://postgr.es/m/CA+TgmoagyKQy=HFw+wLo0AKTYWHui+iKswZ8Jnqqd-cFby-WVg@mail.gmail.com
This commit is contained in:
@@ -348,7 +348,16 @@ standard_ExecutorRun(QueryDesc *queryDesc,
|
||||
dest->rStartup(dest, operation, queryDesc->tupDesc);
|
||||
|
||||
/*
|
||||
* run plan
|
||||
* Run plan, unless direction is NoMovement.
|
||||
*
|
||||
* Note: pquery.c selects NoMovement if a prior call already reached
|
||||
* end-of-data in the user-specified fetch direction. This is important
|
||||
* because various parts of the executor can misbehave if called again
|
||||
* after reporting EOF. For example, heapam.c would actually restart a
|
||||
* heapscan and return all its data afresh. There is also some doubt
|
||||
* about whether a parallel plan would operate properly if an additional,
|
||||
* necessarily non-parallel execution request occurs after completing a
|
||||
* parallel execution. (That case should work, but it's untested.)
|
||||
*/
|
||||
if (!ScanDirectionIsNoMovement(direction))
|
||||
ExecutePlan(queryDesc,
|
||||
|
Reference in New Issue
Block a user