On 20.02.23 15:34, Justin Pryzby wrote:
On Mon, Feb 20, 2023 at 07:44:15AM +0100, Peter Eisentraut wrote:
This patch adds support for the unit "B" to pg_size_pretty(). This makes it
It seems like what it actually does is to support "B" in pg_size_bytes()
- is that what you meant ?
yes
pg_size_pretty() already supports "bytes", so this doesn't actually make
sizes any more pretty, or evidently change its output at all.
Right, this is for the input side.
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},
This adds a duplicate line (unitbits=0) where no other existing line
uses duplicates. If that's intentional, I think it deserves a comment
highlighting that it's an /*alias*/, and about why that does the right
thing, either here about or in the commit message.
I have added a comment about that.
From 6b3a155260e2da5338f7cb6a1d729a0d34e3935a Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Wed, 22 Feb 2023 00:44:45 +0100
Subject: [PATCH v2] Add support for unit "B" to pg_size_bytes()
This makes it consistent with the units support in GUC.
Discussion:
https://www.postgresql.org/message-id/flat/0106914a-9eb5-22be-40d8-652cc88c827d%40enterprisedb.com
---
doc/src/sgml/func.sgml | 2 +-
src/backend/utils/adt/dbsize.c | 10 ++++++++--
src/test/regress/expected/dbsize.out | 15 ++++++++-------
src/test/regress/sql/dbsize.sql | 2 +-
4 files changed, 18 insertions(+), 11 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 @@ <title>Database Object Size Functions</title>
</para>
<para>
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 1024<superscript>2</superscript> = 1048576 bytes, and so on.
</para></entry>
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c
index dbd404101f..cab7834e8a 100644
--- a/src/backend/utils/adt/dbsize.c
+++ b/src/backend/utils/adt/dbsize.c
@@ -46,9 +46,15 @@ struct size_pretty_unit
* unit */
};
-/* When adding units here also update the error message in pg_size_bytes */
+/*
+ * When adding units here also update the error message in pg_size_bytes.
+ *
+ * Aliases (with the same unitbits) are allowed. pg_size_pretty uses the
+ * first one among them.
+ */
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 +819,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
base-commit: 8028e294b456bf1539649527fd98b3985fa4752a
--
2.39.2