Consider: CREATE TABLE testwid ( txtnotnull text, txtnull text, int8notnull int8, int8null int8 ); INSERT INTO testwid SELECT 'a' || g.i, NULL, g.i, NULL FROM generate_series(1,10000) AS g(i); ANALYZE testwid; SELECT attname, avg_width FROM pg_stats WHERE tablename = 'testwid'; attname | avg_width -------------+----------- txtnotnull | 5 txtnull | 0 int8notnull | 8 int8null | 8 (4 rows)
I see in analyze.c 8<----------------- /* We can only compute average width if we found some non-null values.*/ if (nonnull_cnt > 0) [snip] else if (null_cnt > 0) { /* We found only nulls; assume the column is entirely null */ stats->stats_valid = true; stats->stanullfrac = 1.0; if (is_varwidth) stats->stawidth = 0; /* "unknown" */ else stats->stawidth = stats->attrtype->typlen; stats->stadistinct = 0.0; /* "unknown" */ } 8<----------------- So apparently intentional, but seems gratuitously inconsistent. Could this cause any actual inconsistent behaviors? In any case that first comment does not reflect the code. Joe -- Crunchy Data - http://crunchydata.com PostgreSQL Support for Secure Enterprises Consulting, Training, & Open Source Development
signature.asc
Description: OpenPGP digital signature