Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit af7d181

Browse files
committed
Fix pgstatindex() to give consistent results for empty indexes.
For an empty index, the pgstatindex() function would compute 0.0/0.0 for its avg_leaf_density and leaf_fragmentation outputs. On machines that follow the IEEE float arithmetic standard with any care, that results in a NaN. However, per report from Rushabh Lathia, Microsoft couldn't manage to get this right, so you'd get a bizarre error on Windows. Fix by forcing the results to be NaN explicitly, rather than relying on the division operator to give that or the snprintf function to print it correctly. I have some doubts that this is really the most useful definition, but it seems better to remain backward-compatible with those platforms for which the behavior wasn't completely broken. Back-patch to 8.2, since the code is like that in all current releases.
1 parent f18795e commit af7d181

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

contrib/pgstattuple/pgstatindex.c

+10-2
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,17 @@ pgstatindex(PG_FUNCTION_ARGS)
235235
values[j] = palloc(32);
236236
snprintf(values[j++], 32, INT64_FORMAT, indexStat.deleted_pages);
237237
values[j] = palloc(32);
238-
snprintf(values[j++], 32, "%.2f", 100.0 - (double) indexStat.free_space / (double) indexStat.max_avail * 100.0);
238+
if (indexStat.max_avail > 0)
239+
snprintf(values[j++], 32, "%.2f",
240+
100.0 - (double) indexStat.free_space / (double) indexStat.max_avail * 100.0);
241+
else
242+
snprintf(values[j++], 32, "NaN");
239243
values[j] = palloc(32);
240-
snprintf(values[j++], 32, "%.2f", (double) indexStat.fragments / (double) indexStat.leaf_pages * 100.0);
244+
if (indexStat.leaf_pages > 0)
245+
snprintf(values[j++], 32, "%.2f",
246+
(double) indexStat.fragments / (double) indexStat.leaf_pages * 100.0);
247+
else
248+
snprintf(values[j++], 32, "NaN");
241249

242250
tuple = BuildTupleFromCStrings(TupleDescGetAttInMetadata(tupleDesc),
243251
values);

0 commit comments

Comments
 (0)