• Robert Haas's avatar
    Allow for parallel execution whenever ExecutorRun() is done only once. · 691b8d59
    Robert Haas authored
    Previously, it was unsafe to execute a plan in parallel if
    ExecutorRun() might be called with a non-zero row count.  However,
    it's quite easy to fix things up so that we can support that case,
    provided that it is known that we will never call ExecutorRun() a
    second time for the same QueryDesc.  Add infrastructure to signal
    this, and cross-checks to make sure that a caller who claims this is
    true doesn't later reneg.
    
    While that pattern never happens with queries received directly from a
    client -- there's no way to know whether multiple Execute messages
    will be sent unless the first one requests all the rows -- it's pretty
    common for queries originating from procedural languages, which often
    limit the result to a single tuple or to a user-specified number of
    tuples.
    
    This commit doesn't actually enable parallelism in any additional
    cases, because currently none of the places that would be able to
    benefit from this infrastructure pass CURSOR_OPT_PARALLEL_OK in the
    first place, but it makes it much more palatable to pass
    CURSOR_OPT_PARALLEL_OK in places where we currently don't, because it
    eliminates some cases where we'd end up having to run the parallel
    plan serially.
    
    Patch by me, based on some ideas from Rafia Sabih and corrected by
    Rafia Sabih based on feedback from Dilip Kumar and myself.
    
    Discussion: http://postgr.es/m/CA+TgmobXEhvHbJtWDuPZM9bVSLiTj-kShxQJ2uM5GPDze9fRYA@mail.gmail.com
    691b8d59
portal.h 9.61 KB