postgres.git / summary / log / commit / refs

commit    14d8b539d3bd4cf9faf65ca86a733bada202107f
Author:   Thomas Munro <tmunro@postgresql.org>
Date:     Tue Jun 18 10:38:30 2019 +0000
First released in: 12.0, 11.5

    Prevent Parallel Hash Join for JOIN_UNIQUE_INNER.
    
    WHERE EXISTS (...) queries cannot be executed by Parallel Hash Join
    with jointype JOIN_UNIQUE_INNER, because there is no way to make a
    partial plan totally unique.  The consequence of allowing such plans
    was duplicate results from some EXISTS queries.
    
    Back-patch to 11.  Bug #15857.
    
    Author: Thomas Munro
    Reviewed-by: Tom Lane
    Reported-by: Vladimir Kriukov
    Discussion: https://postgr.es/m/15857-d1ba2a64bce0795e%40postgresql.org


src/backend/optimizer/path/joinpath.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index 642f9510938..1a00200ac1b 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -1867,9 +1867,12 @@ hash_inner_and_outer(PlannerInfo *root, /* * Can we use a partial inner plan too, so that we can build a - * shared hash table in parallel? + * shared hash table in parallel? We can't handle + * JOIN_UNIQUE_INNER because we can't guarantee uniqueness. */ - if (innerrel->partial_pathlist != NIL && enable_parallel_hash) + if (innerrel->partial_pathlist != NIL && + save_jointype != JOIN_UNIQUE_INNER && + enable_parallel_hash) { cheapest_partial_inner = (Path *) linitial(innerrel->partial_pathlist); [parent: e5f26d79badf]