diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 0eef5d7707..34b5ecfd07 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -1804,6 +1804,7 @@ cost_incremental_sort(Path *path, List *presortedExprs = NIL; ListCell *l; int i = 0; + bool found_zero_varno = false; Assert(presorted_keys != 0); @@ -1817,10 +1818,22 @@ cost_incremental_sort(Path *path, /* Extract presorted keys as list of expressions */ foreach(l, pathkeys) { + Node *expr; PathKey *key = (PathKey *) lfirst(l); EquivalenceMember *member = (EquivalenceMember *) linitial(key->pk_eclass->ec_members); + expr = (Node *) member->em_expr; + + if (IsA(expr, RelabelType)) + expr = (Node *) ((RelabelType *) expr)->arg; + + if (IsA(expr, Var) && ((Var *) expr)->varno == 0) + { + found_zero_varno = true; + break; + } + presortedExprs = lappend(presortedExprs, member->em_expr); i++; @@ -1829,7 +1842,11 @@ cost_incremental_sort(Path *path, } /* Estimate number of groups with equal presorted keys */ - input_groups = estimate_num_groups(root, presortedExprs, input_tuples, NULL); + if (!found_zero_varno) + input_groups = estimate_num_groups(root, presortedExprs, input_tuples, NULL); + else + input_groups = input_tuples; + group_tuples = input_tuples / input_groups; group_input_run_cost = input_run_cost / input_groups;