summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2011-02-18 00:00:49 +0000
committerTom Lane2011-02-18 00:00:49 +0000
commit52b60530f257b1591d8b72264cd6c0dd9aabfd46 (patch)
tree6eda7c7cbeaac73debfe3526614a65a8db272a58
parentde623f33353c96657651f9c3a6c8756616c610e4 (diff)
Fix tsmatchsel() to account properly for null rows.
ts_typanalyze.c computes MCE statistics as fractions of the non-null rows, which seems fairly reasonable, and anyway changing it in released versions wouldn't be a good idea. But then ts_selfuncs.c has to account for that. Failure to do so results in overestimates in columns with a significant fraction of null documents. Back-patch to 8.4 where this stuff was introduced. Jesper Krogh
-rw-r--r--src/backend/tsearch/ts_selfuncs.c6
-rw-r--r--src/include/catalog/pg_statistic.h2
2 files changed, 8 insertions, 0 deletions
diff --git a/src/backend/tsearch/ts_selfuncs.c b/src/backend/tsearch/ts_selfuncs.c
index 8ce9fb46aa..7f33c16a24 100644
--- a/src/backend/tsearch/ts_selfuncs.c
+++ b/src/backend/tsearch/ts_selfuncs.c
@@ -189,11 +189,17 @@ tsquerysel(VariableStatData *vardata, Datum constval)
/* No most-common-elements info, so do without */
selec = tsquery_opr_selec_no_stats(query);
}
+
+ /*
+ * MCE stats count only non-null rows, so adjust for null rows.
+ */
+ selec *= (1.0 - stats->stanullfrac);
}
else
{
/* No stats at all, so do without */
selec = tsquery_opr_selec_no_stats(query);
+ /* we assume no nulls here, so no stanullfrac correction */
}
return selec;
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index f38921f1c6..927cd0b047 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -246,6 +246,8 @@ typedef FormData_pg_statistic *Form_pg_statistic;
* type with identifiable elements (for instance, tsvector). staop contains
* the equality operator appropriate to the element type. stavalues contains
* the most common element values, and stanumbers their frequencies. Unlike
+ * MCV slots, frequencies are measured as the fraction of non-null rows the
+ * element value appears in, not the frequency of all rows. Also unlike
* MCV slots, the values are sorted into order (to support binary search
* for a particular value). Since this puts the minimum and maximum
* frequencies at unpredictable spots in stanumbers, there are two extra