Forbid parallel Hash Right Join or Hash Full Join.
authorRobert Haas <rhaas@postgresql.org>
Wed, 20 Apr 2016 21:48:55 +0000 (17:48 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 20 Apr 2016 21:48:55 +0000 (17:48 -0400)
That won't work.  You'll get bogus null-extended rows.

Mithun Cy

src/backend/optimizer/path/joinpath.c

index 41b60d01d37f4e4c1157a6e3551025f796f8eb14..f8e02b9c45de6a5963fe724f753efcb80b48e9a2 100644 (file)
@@ -1450,10 +1450,14 @@ hash_inner_and_outer(PlannerInfo *root,
         * If the joinrel is parallel-safe, we may be able to consider a
         * partial hash join.  However, we can't handle JOIN_UNIQUE_OUTER,
         * because the outer path will be partial, and therefore we won't be
-        * able to properly guarantee uniqueness.  Also, the resulting path
-        * must not be parameterized.
+        * able to properly guarantee uniqueness.  Similarly, we can't handle
+        * JOIN_FULL and JOIN_RIGHT, because they can produce false null
+        * extended rows.  Also, the resulting path must not be parameterized.
         */
-       if (joinrel->consider_parallel && jointype != JOIN_UNIQUE_OUTER &&
+       if (joinrel->consider_parallel &&
+           jointype != JOIN_UNIQUE_OUTER &&
+           jointype != JOIN_FULL &&
+           jointype != JOIN_RIGHT &&
            outerrel->partial_pathlist != NIL &&
            bms_is_empty(joinrel->lateral_relids))
        {