77 *
88 *
99 * IDENTIFICATION
10- * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.116 1999/08/01 04:54:24 tgl Exp $
10+ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.117 1999/08/08 17:13:10 tgl Exp $
1111 *
1212 *-------------------------------------------------------------------------
1313 */
@@ -2339,19 +2339,27 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
23392339/* overwrite the existing statistics in the tuple */
23402340if (VacAttrStatsEqValid (stats ))
23412341{
2342- if (stats -> nonnull_cnt + stats -> null_cnt == 0 ||
2343- (stats -> null_cnt <=1 && stats -> best_cnt == 1 ))
2342+ if (stats -> nonnull_cnt == 0 && stats -> null_cnt == 0 )
2343+ {
2344+ /* empty relation, so put a dummy value in attdisbursion */
23442345selratio = 0 ;
2346+ }
2347+ else if (stats -> null_cnt <=1 && stats -> best_cnt == 1 )
2348+ {
2349+ /* looks like we have a unique-key attribute */
2350+ double total = ((double )stats -> nonnull_cnt )+ ((double )stats -> null_cnt );
2351+
2352+ selratio = 1.0 /total ;
2353+ }
23452354else if (VacAttrStatsLtGtValid (stats )&& stats -> min_cnt + stats -> max_cnt == stats -> nonnull_cnt )
23462355{
23472356/* exact result when there are just 1 or 2 values... */
23482357double min_cnt_d = stats -> min_cnt ,
23492358max_cnt_d = stats -> max_cnt ,
2350- null_cnt_d = stats -> null_cnt ,
2351- nonnull_cnt_d = stats -> nonnull_cnt ; /* prevent overflow */
2359+ null_cnt_d = stats -> null_cnt ;
2360+ double total = (( double ) stats -> nonnull_cnt ) + null_cnt_d ;
23522361
2353- selratio = (min_cnt_d * min_cnt_d + max_cnt_d * max_cnt_d + null_cnt_d * null_cnt_d ) /
2354- (nonnull_cnt_d + null_cnt_d ) / (nonnull_cnt_d + null_cnt_d );
2362+ selratio = (min_cnt_d * min_cnt_d + max_cnt_d * max_cnt_d + null_cnt_d * null_cnt_d ) / (total * total );
23552363}
23562364else
23572365{
@@ -2362,7 +2370,7 @@ vc_updstats(Oid relid, int num_pages, int num_tuples, bool hasindex, VRelStats *
23622370 * we assume count of other values are 20% of best
23632371 * count in table
23642372 */
2365- selratio = (most * most + 0.20 * most * (total - most )) /total / total ;
2373+ selratio = (most * most + 0.20 * most * (total - most )) /( total * total ) ;
23662374}
23672375if (selratio < 0.0 )
23682376selratio = 0.0 ;