diff options
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 61 |
1 files changed, 32 insertions, 29 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index a8f22a8c154..4ad30b7627e 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -4521,48 +4521,41 @@ create_mergejoin_plan(PlannerInfo *root, { Relids outer_relids = outer_path->parent->relids; Plan *sort_plan; - bool use_incremental_sort = false; - int presorted_keys; + + /* + * We can assert that the outer path is not already ordered + * appropriately for the mergejoin; otherwise, outersortkeys would + * have been set to NIL. + */ + Assert(!pathkeys_contained_in(best_path->outersortkeys, + outer_path->pathkeys)); /* * We choose to use incremental sort if it is enabled and there are * presorted keys; otherwise we use full sort. */ - if (enable_incremental_sort) - { - bool is_sorted PG_USED_FOR_ASSERTS_ONLY; - - is_sorted = pathkeys_count_contained_in(best_path->outersortkeys, - outer_path->pathkeys, - &presorted_keys); - Assert(!is_sorted); - - if (presorted_keys > 0) - use_incremental_sort = true; - } - - if (!use_incremental_sort) - { - sort_plan = (Plan *) - make_sort_from_pathkeys(outer_plan, - best_path->outersortkeys, - outer_relids); - - label_sort_with_costsize(root, (Sort *) sort_plan, -1.0); - } - else + if (enable_incremental_sort && best_path->outer_presorted_keys > 0) { sort_plan = (Plan *) make_incrementalsort_from_pathkeys(outer_plan, best_path->outersortkeys, outer_relids, - presorted_keys); + best_path->outer_presorted_keys); label_incrementalsort_with_costsize(root, (IncrementalSort *) sort_plan, best_path->outersortkeys, -1.0); } + else + { + sort_plan = (Plan *) + make_sort_from_pathkeys(outer_plan, + best_path->outersortkeys, + outer_relids); + + label_sort_with_costsize(root, (Sort *) sort_plan, -1.0); + } outer_plan = sort_plan; outerpathkeys = best_path->outersortkeys; @@ -4578,9 +4571,19 @@ create_mergejoin_plan(PlannerInfo *root, */ Relids inner_relids = inner_path->parent->relids; - Sort *sort = make_sort_from_pathkeys(inner_plan, - best_path->innersortkeys, - inner_relids); + Sort *sort; + + /* + * We can assert that the inner path is not already ordered + * appropriately for the mergejoin; otherwise, innersortkeys would + * have been set to NIL. + */ + Assert(!pathkeys_contained_in(best_path->innersortkeys, + inner_path->pathkeys)); + + sort = make_sort_from_pathkeys(inner_plan, + best_path->innersortkeys, + inner_relids); label_sort_with_costsize(root, sort, -1.0); inner_plan = (Plan *) sort; |