Skip to content

Commit 69cc60d

Browse files
committed
Guard against input_rows == 0 in estimate_num_groups().
This case doesn't normally happen, because the planner usually clamps all row estimates to at least one row; but I found that it can arise when dealing with relations excluded by constraints. Without a defense, estimate_num_groups() can return zero, which leads to divisions by zero inside the planner as well as assertion failures in the executor. An alternative fix would be to change set_dummy_rel_pathlist() to make the size estimate for a dummy relation 1 row instead of 0, but that seemed pretty ugly; and probably someday we'll want to drop the convention that the minimum rowcount estimate is 1 row. Back-patch to 8.4, as the problem can be demonstrated that far back.
1 parent 477b5a0 commit 69cc60d

File tree

1 file changed

+8
-0
lines changed

1 file changed

+8
-0
lines changed

src/backend/utils/adt/selfuncs.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3209,6 +3209,14 @@ estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows)
32093209
double numdistinct;
32103210
ListCell *l;
32113211

3212+
/*
3213+
* We don't ever want to return an estimate of zero groups, as that tends
3214+
* to lead to division-by-zero and other unpleasantness. The input_rows
3215+
* estimate is usually already at least 1, but clamp it just in case it
3216+
* isn't.
3217+
*/
3218+
input_rows = clamp_row_est(input_rows);
3219+
32123220
/*
32133221
* If no grouping columns, there's exactly one group. (This can't happen
32143222
* for normal cases with GROUP BY or DISTINCT, but it is possible for

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy