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;