Thread: Bug in pg_autovacuum ?
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. :)
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