/*
* If we have most-common-values info, look for extreme MCVs. This is
* needed even if we also have a histogram, since the histogram excludes
- * the MCVs.
+ * the MCVs. However, if we *only* have MCVs and no histogram, we should
+ * be pretty wary of deciding that that is a full representation of the
+ * data. Proceed only if the MCVs represent the whole table (to within
+ * roundoff error).
*/
if (get_attstatsslot(&sslot, vardata->statsTuple,
STATISTIC_KIND_MCV, InvalidOid,
- ATTSTATSSLOT_VALUES))
+ have_data ? ATTSTATSSLOT_VALUES :
+ (ATTSTATSSLOT_VALUES | ATTSTATSSLOT_NUMBERS)))
{
- get_stats_slot_range(&sslot, opfuncoid, &opproc,
- collation, typLen, typByVal,
- &tmin, &tmax, &have_data);
+ bool use_mcvs = have_data;
+
+ if (!have_data)
+ {
+ double sumcommon = 0.0;
+ double nullfrac;
+ int i;
+
+ for (i = 0; i < sslot.nnumbers; i++)
+ sumcommon += sslot.numbers[i];
+ nullfrac = ((Form_pg_statistic) GETSTRUCT(vardata->statsTuple))->stanullfrac;
+ if (sumcommon + nullfrac > 0.99999)
+ use_mcvs = true;
+ }
+
+ if (use_mcvs)
+ get_stats_slot_range(&sslot, opfuncoid, &opproc,
+ collation, typLen, typByVal,
+ &tmin, &tmax, &have_data);
free_attstatsslot(&sslot);
}