Fix parallel hash join path search.
authorRobert Haas <rhaas@postgresql.org>
Tue, 7 Mar 2017 15:22:07 +0000 (10:22 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 7 Mar 2017 15:22:07 +0000 (10:22 -0500)
When the very cheapest path is not parallel-safe, we want to instead use
the cheapest unparameterized path that is.  The old code searched
innerrel->cheapest_parameterized_paths, but that isn't right, because
the path we want may not be in that list.  Search innerrel->pathlist
instead.

Spotted by Dilip Kumar.

Discussion: http://postgr.es/m/CAFiTN-szCEcZrQm0i_w4xqSaRUTOUFstNu32Zn4rxxDcoa8gnA@mail.gmail.com

src/backend/optimizer/path/joinpath.c

index 28972458830bd49675159a48c8a341dff2d5c85e..99ec5834bfbf001780ad1d002d507c246a3d1cab 100644 (file)
@@ -1510,9 +1510,9 @@ hash_inner_and_outer(PlannerInfo *root,
                        /*
                         * Normally, given that the joinrel is parallel-safe, the cheapest
                         * total inner path will also be parallel-safe, but if not, we'll
-                        * have to search cheapest_parameterized_paths for the cheapest
-                        * safe, unparameterized inner path.  If doing JOIN_UNIQUE_INNER,
-                        * we can't use any alternative inner path.
+                        * have to search for the cheapest safe, unparameterized inner
+                        * path.  If doing JOIN_UNIQUE_INNER, we can't use any alternative
+                        * inner path.
                         */
                        if (cheapest_total_inner->parallel_safe)
                                cheapest_safe_inner = cheapest_total_inner;
@@ -1520,7 +1520,7 @@ hash_inner_and_outer(PlannerInfo *root,
                        {
                                ListCell   *lc;
 
-                               foreach(lc, innerrel->cheapest_parameterized_paths)
+                               foreach(lc, innerrel->pathlist)
                                {
                                        Path       *innerpath = (Path *) lfirst(lc);