Clamp adjusted ndistinct to positive integer in estimate_hash_bucketsize().
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Mar 2016 22:06:53 +0000 (18:06 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 27 Mar 2016 22:07:16 +0000 (18:07 -0400)
This avoids a possible divide-by-zero in the following calculation,
and rounding the number to an integer seems like saner behavior anyway.
Assuming IEEE math, the division would yield +Infinity which would get
replaced by 1.0 at the bottom of the function, so nothing really
interesting would ensue; but avoiding divide-by-zero seems like a
good idea on general principles.

Per report from Piotr Stefaniak.  No back-patch since this seems
mostly cosmetic.

src/backend/utils/adt/selfuncs.c

index b2c57e87a5e5a0a8b3248db979506f9cb9290e3d..30751fc8ac6475b1e98e93a9e12ebbe4c9783c05 100644 (file)
@@ -3541,7 +3541,10 @@ estimate_hash_bucketsize(PlannerInfo *root, Node *hashkey, double nbuckets)
         * selectivity of rel's restriction clauses that mention the target Var.
         */
        if (vardata.rel)
+       {
                ndistinct *= vardata.rel->rows / vardata.rel->tuples;
+               ndistinct = clamp_row_est(ndistinct);
+       }
 
        /*
         * Initial estimate of bucketsize fraction is 1/nbuckets as long as the