Skip to content

Commit 79e5d72

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 a0a9883 commit 79e5d72

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
@@ -2987,6 +2987,14 @@ estimate_num_groups(PlannerInfo *root, List *groupExprs, double input_rows)
29872987
double numdistinct;
29882988
ListCell *l;
29892989

2990+
/*
2991+
* We don't ever want to return an estimate of zero groups, as that tends
2992+
* to lead to division-by-zero and other unpleasantness. The input_rows
2993+
* estimate is usually already at least 1, but clamp it just in case it
2994+
* isn't.
2995+
*/
2996+
input_rows = clamp_row_est(input_rows);
2997+
29902998
/*
29912999
* If no grouping columns, there's exactly one group. (This can't happen
29923000
* 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