Thread: Bug in pg_autovacuum ?

Bug in pg_autovacuum ?

From
Cott Lang
Date:
I'm having a problem with pg_autovacuum against both 7.3.2 and 7.4.1 on
Redhat 9 and Fedora Core 1. I'm using pg_autovacuum from 7.4.1,
everything comes from the postgresql.org RPMs.

If the number of tuples is sufficiently high, pg reports 'reltuples'
back in TABLE_STATS_QUERY in scientific notation instead of an integer.

Example:

4.35351e+06 instead of 4353514

pg_autovacuum then uses atoi() to reach the incorrect conclusion that
there are 4 tuples.  Obviously, if that table gets more than a couple of
updates, it gets vacuumed a bit too often. :)

Changing from atoi() to atof() solves the problem completely.

new_tbl->reltuples =
  atof(PQgetvalue(res, row, PQfnumber(res, "reltuples")));

new_tbl->relpages =
  atof(PQgetvalue(res, row, PQfnumber(res, "relpages")));

I'm not sure how I can be the only person running into this. :)

Re: Bug in pg_autovacuum ?

From
Tom Lane
Date:
Cott Lang <cott@internetstaff.com> writes:
> If the number of tuples is sufficiently high, pg reports 'reltuples'
> back in TABLE_STATS_QUERY in scientific notation instead of an integer.

Right, because that column is actually a float4.

> Changing from atoi() to atof() solves the problem completely.

> new_tbl->reltuples =
>   atof(PQgetvalue(res, row, PQfnumber(res, "reltuples")));

> new_tbl->relpages =
>   atof(PQgetvalue(res, row, PQfnumber(res, "relpages")));

I should think this would break in different ways once reltuples exceeds
INT_MAX.  A full fix would require changing new_tbl->reltuples to be
float or double, and coping with any downstream changes that implies.

Also, relpages *is* an integer, though it's best interpreted as an
unsigned one.  (Ditto for relid.)  Looks like this code is 0-for-3 on
getting the datatypes right :-(

            regards, tom lane