Fix pg_size_pretty() to avoid overflow for inputs close to INT64_MAX.

The expression that tried to round the value to the nearest TB could
overflow, leading to bogus output as reported in bug #5993 from Nicola
Cossu.  This isn't likely to ever happen in the intended usage of the
function (if it could, we'd be needing to use a wider datatype instead);
but it's not hard to give the expected output, so let's do so.
This commit is contained in:
Tom Lane 2011-04-25 16:22:12 -04:00
parent f8ebe3bcc5
commit af0f20092c

View File

@ -490,9 +490,15 @@ pg_size_pretty(PG_FUNCTION_ARGS)
(size + mult / 2) / mult);
else
{
/* Here we have to worry about avoiding overflow */
int64 val;
mult *= 1024;
val = size / mult;
if ((size % mult) >= (mult / 2))
val++;
snprintf(buf, sizeof(buf), INT64_FORMAT " TB",
(size + mult / 2) / mult);
val);
}
}
}