Reorder tests in get_cheapest_path_for_pathkeys().
authorRobert Haas <rhaas@postgresql.org>
Thu, 7 Sep 2023 17:51:35 +0000 (13:51 -0400)
committerRobert Haas <rhaas@postgresql.org>
Thu, 7 Sep 2023 17:51:35 +0000 (13:51 -0400)
Checking parallel safety should be even cheaper than cost comparison, so
do that first.

Also make some minor, related comment improvements.

Richard Guo, reviewed by Aleksander Alekseev, Andy Fan, and me.

Discussion: http://postgr.es/m/CAMbWs4-KE2wf4QPj_Sr5mX4QFtBNNKGmxK=+e=KZEGUjdG33=g@mail.gmail.com

src/backend/optimizer/path/pathkeys.c

index e53ea842248bd567741f76ca6d97bb31f254c789..fdb60aaa8d2b4b705e4387c15f7d54c922e08ca5 100644 (file)
@@ -407,7 +407,8 @@ pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common)
 /*
  * get_cheapest_path_for_pathkeys
  *       Find the cheapest path (according to the specified criterion) that
- *       satisfies the given pathkeys and parameterization.
+ *       satisfies the given pathkeys and parameterization, and is parallel-safe
+ *       if required.
  *       Return NULL if no such path.
  *
  * 'paths' is a list of possible paths that all generate the same relation
@@ -429,6 +430,10 @@ get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
        {
                Path       *path = (Path *) lfirst(l);
 
+               /* If required, reject paths that are not parallel-safe */
+               if (require_parallel_safe && !path->parallel_safe)
+                       continue;
+
                /*
                 * Since cost comparison is a lot cheaper than pathkey comparison, do
                 * that first.  (XXX is that still true?)
@@ -437,9 +442,6 @@ get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,
                        compare_path_costs(matched_path, path, cost_criterion) <= 0)
                        continue;
 
-               if (require_parallel_safe && !path->parallel_safe)
-                       continue;
-
                if (pathkeys_contained_in(pathkeys, path->pathkeys) &&
                        bms_is_subset(PATH_REQ_OUTER(path), required_outer))
                        matched_path = path;