• Robert Haas's avatar
    Pass InitPlan values to workers via Gather (Merge). · e89a71fb
    Robert Haas authored
    If a PARAM_EXEC parameter is used below a Gather (Merge) but the InitPlan
    that computes it is attached to or above the Gather (Merge), force the
    value to be computed before starting parallelism and pass it down to all
    workers.  This allows us to use parallelism in cases where it previously
    would have had to be rejected as unsafe.  We do - in this case - lose the
    optimization that the value is only computed if it's actually used.  An
    alternative strategy would be to have the first worker that needs the value
    compute it, but one downside of that approach is that we'd then need to
    select a parallel-safe path to compute the parameter value; it couldn't for
    example contain a Gather (Merge) node.  At some point in the future, we
    might want to consider both approaches.
    
    Independent of that consideration, there is a great deal more work that
    could be done to make more kinds of PARAM_EXEC parameters parallel-safe.
    This infrastructure could be used to allow a Gather (Merge) on the inner
    side of a nested loop (although that's not a very appealing plan) and
    cases where the InitPlan is attached below the Gather (Merge) could be
    addressed as well using various techniques.  But this is a good start.
    
    Amit Kapila, reviewed and revised by me.  Reviewing and testing from
    Kuntal Ghosh, Haribabu Kommi, and Tushar Ahuja.
    
    Discussion: http://postgr.es/m/CAA4eK1LV0Y1AUV4cUCdC+sYOx0Z0-8NAJ2Pd9=UKsbQ5Sr7+JQ@mail.gmail.com
    e89a71fb
nodeGatherMerge.c 21.5 KB