From 605ada8dc38b35aa70a281a7cacab65ce89f42be Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 20 Feb 2023 07:36:28 +0100 Subject: [PATCH] Add support for unit "B" to pg_size_pretty() This makes it consistent with the units support in GUC. --- doc/src/sgml/func.sgml | 2 +- src/backend/utils/adt/dbsize.c | 3 ++- src/test/regress/expected/dbsize.out | 15 ++++++++------- src/test/regress/sql/dbsize.sql | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index e09e289a43..15a5a98b0a 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -27162,7 +27162,7 @@ Database Object Size Functions Converts a size in bytes into a more easily human-readable format with - size units (bytes, kB, MB, GB or TB as appropriate). Note that the + size units (bytes, B, kB, MB, GB or TB as appropriate). Note that the units are powers of 2 rather than powers of 10, so 1kB is 1024 bytes, 1MB is 10242 = 1048576 bytes, and so on. diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index dbd404101f..9ecd5428c3 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -49,6 +49,7 @@ struct size_pretty_unit /* When adding units here also update the error message in pg_size_bytes */ static const struct size_pretty_unit size_pretty_units[] = { {"bytes", 10 * 1024, false, 0}, + {"B", 10 * 1024, false, 0}, {"kB", 20 * 1024 - 1, true, 10}, {"MB", 20 * 1024 - 1, true, 20}, {"GB", 20 * 1024 - 1, true, 30}, @@ -813,7 +814,7 @@ pg_size_bytes(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid size: \"%s\"", text_to_cstring(arg)), errdetail("Invalid size unit: \"%s\".", strptr), - errhint("Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"."))); + errhint("Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"."))); if (multiplier > 1) { diff --git a/src/test/regress/expected/dbsize.out b/src/test/regress/expected/dbsize.out index d8d6686b5f..f1121a87aa 100644 --- a/src/test/regress/expected/dbsize.out +++ b/src/test/regress/expected/dbsize.out @@ -81,12 +81,13 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM -- pg_size_bytes() tests SELECT size, pg_size_bytes(size) FROM - (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), + (VALUES ('1'), ('123bytes'), ('256 B'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), ('1TB'), ('3000 TB'), ('1e6 MB'), ('99 PB')) x(size); size | pg_size_bytes ----------+-------------------- 1 | 1 123bytes | 123 + 256 B | 256 1kB | 1024 1MB | 1048576 1 GB | 1073741824 @@ -95,7 +96,7 @@ SELECT size, pg_size_bytes(size) FROM 3000 TB | 3298534883328000 1e6 MB | 1048576000000 99 PB | 111464090777419776 -(10 rows) +(11 rows) -- case-insensitive units are supported SELECT size, pg_size_bytes(size) FROM @@ -153,15 +154,15 @@ SELECT size, pg_size_bytes(size) FROM SELECT pg_size_bytes('1 AB'); ERROR: invalid size: "1 AB" DETAIL: Invalid size unit: "AB". -HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". +HINT: Valid units are "bytes", "B", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('1 AB A'); ERROR: invalid size: "1 AB A" DETAIL: Invalid size unit: "AB A". -HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". +HINT: Valid units are "bytes", "B", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('1 AB A '); ERROR: invalid size: "1 AB A " DETAIL: Invalid size unit: "AB A". -HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". +HINT: Valid units are "bytes", "B", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('9223372036854775807.9'); ERROR: bigint out of range SELECT pg_size_bytes('1e100'); @@ -171,7 +172,7 @@ ERROR: value overflows numeric format SELECT pg_size_bytes('1 byte'); -- the singular "byte" is not supported ERROR: invalid size: "1 byte" DETAIL: Invalid size unit: "byte". -HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". +HINT: Valid units are "bytes", "B", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes(''); ERROR: invalid size: "" SELECT pg_size_bytes('kb'); @@ -189,6 +190,6 @@ ERROR: invalid size: ".+912" SELECT pg_size_bytes('+912+ kB'); ERROR: invalid size: "+912+ kB" DETAIL: Invalid size unit: "+ kB". -HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB". +HINT: Valid units are "bytes", "B", "kB", "MB", "GB", "TB", and "PB". SELECT pg_size_bytes('++123 kB'); ERROR: invalid size: "++123 kB" diff --git a/src/test/regress/sql/dbsize.sql b/src/test/regress/sql/dbsize.sql index 7df865271b..b34cf33385 100644 --- a/src/test/regress/sql/dbsize.sql +++ b/src/test/regress/sql/dbsize.sql @@ -29,7 +29,7 @@ -- pg_size_bytes() tests SELECT size, pg_size_bytes(size) FROM - (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), + (VALUES ('1'), ('123bytes'), ('256 B'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), ('1TB'), ('3000 TB'), ('1e6 MB'), ('99 PB')) x(size); -- case-insensitive units are supported -- 2.39.2