aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/adt/dbsize.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
index 66221766f24..c1507a11e1d 100644
--- a/src/backend/utils/adt/dbsize.c
+++ b/src/backend/utils/adt/dbsize.c
@@ -381,39 +381,33 @@ pg_size_pretty(PG_FUNCTION_ARGS)
int64 size = PG_GETARG_INT64(0);
char *result = palloc(50 + VARHDRSZ);
int64 limit = 10 * 1024;
- int64 mult = 1;
+ int64 limit2 = limit * 2 - 1;
- if (size < limit * mult)
+ if (size < limit)
snprintf(VARDATA(result), 50, INT64_FORMAT " bytes", size);
else
{
- mult *= 1024;
- if (size < limit * mult)
+ size >>= 9; /* keep one extra bit for rounding */
+ if (size < limit2)
snprintf(VARDATA(result), 50, INT64_FORMAT " kB",
- (size + mult / 2) / mult);
+ (size + 1) / 2);
else
{
- mult *= 1024;
- if (size < limit * mult)
+ size >>= 10;
+ if (size < limit2)
snprintf(VARDATA(result), 50, INT64_FORMAT " MB",
- (size + mult / 2) / mult);
+ (size + 1) / 2);
else
{
- mult *= 1024;
- if (size < limit * mult)
+ size >>= 10;
+ if (size < limit2)
snprintf(VARDATA(result), 50, INT64_FORMAT " GB",
- (size + mult / 2) / mult);
+ (size + 1) / 2);
else
{
- /* Here we have to worry about avoiding overflow */
- int64 val;
-
- mult *= 1024;
- val = size / mult;
- if ((size % mult) >= (mult / 2))
- val++;
+ size >>= 10;
snprintf(VARDATA(result), 50, INT64_FORMAT " TB",
- val);
+ (size + 1) / 2);
}
}
}