1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-25 21:42:33 +03:00

Reorder tests in get_cheapest_path_for_pathkeys().

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
This commit is contained in:
Robert Haas 2023-09-07 13:51:35 -04:00
parent ac22a9545c
commit 9caf042088

View File

@ -407,7 +407,8 @@ pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common)
/* /*
* get_cheapest_path_for_pathkeys * get_cheapest_path_for_pathkeys
* Find the cheapest path (according to the specified criterion) that * 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. * Return NULL if no such path.
* *
* 'paths' is a list of possible paths that all generate the same relation * '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); 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 * Since cost comparison is a lot cheaper than pathkey comparison, do
* that first. (XXX is that still true?) * 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) compare_path_costs(matched_path, path, cost_criterion) <= 0)
continue; continue;
if (require_parallel_safe && !path->parallel_safe)
continue;
if (pathkeys_contained_in(pathkeys, path->pathkeys) && if (pathkeys_contained_in(pathkeys, path->pathkeys) &&
bms_is_subset(PATH_REQ_OUTER(path), required_outer)) bms_is_subset(PATH_REQ_OUTER(path), required_outer))
matched_path = path; matched_path = path;