incremental-sort-groups-fix.patch
text/plain
Filename: incremental-sort-groups-fix.patch
Type: text/plain
Part: 0
Message:
Re: sqlsmith crash incremental sort
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/optimizer/path/costsize.c | 18 | 1 |
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;