From: Tom Lane Date: Sun, 27 Mar 2016 22:21:03 +0000 (-0400) Subject: Guard against zero vardata.rel->tuples in estimate_hash_bucketsize(). X-Git-Tag: REL9_6_BETA1~380 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d65b665d524a67273b075f468bf3d60ce31f4040;p=postgresql Guard against zero vardata.rel->tuples in estimate_hash_bucketsize(). If the referenced rel was proven empty, we'd compute 0/0 here, which results in the function returning NaN. That's a bit more serious than the other zero-divide case. Still, it only seems to be possible in HEAD, so no back-patch. Per report from Piotr Stefaniak. I looked through the rest of selfuncs.c and found no other likely trouble spots. --- diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index 30751fc8ac..a6555e91b7 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -3540,7 +3540,7 @@ estimate_hash_bucketsize(PlannerInfo *root, Node *hashkey, double nbuckets) * XXX Possibly better way, but much more expensive: multiply by * selectivity of rel's restriction clauses that mention the target Var. */ - if (vardata.rel) + if (vardata.rel && vardata.rel->tuples > 0) { ndistinct *= vardata.rel->rows / vardata.rel->tuples; ndistinct = clamp_row_est(ndistinct);