1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-14 18:42:34 +03:00

Teach pg_size_pretty and pg_size_bytes about petabytes

There was talk about adding units all the way up to yottabytes but it
seems quite far-fetched that anyone would need those.  Since such large
units are not exactly commonplace, it seems unlikely that having
pg_size_pretty outputting unit any larger than petabytes would actually be
helpful to anyone.

Since petabytes are on the horizon, let's just add those only.  Maybe one
day we'll get to add additional units, but it will likely be a while
before we'll need to think beyond petabytes in regards to the size of a
database.

Author: David Christensen
Discussion: https://postgr.es/m/CAOxo6XKmHc_WZip-x5QwaOqFEiCq_SVD0B7sbTZQk+qqcn2qaw@mail.gmail.com
This commit is contained in:
David Rowley
2021-07-09 18:56:00 +12:00
parent 0f80b47d24
commit ca2e4472ba
3 changed files with 72 additions and 64 deletions

View File

@ -52,6 +52,7 @@ static const struct size_pretty_unit size_pretty_units[] = {
{"MB", 20 * 1024 - 1, true, 20}, {"MB", 20 * 1024 - 1, true, 20},
{"GB", 20 * 1024 - 1, true, 30}, {"GB", 20 * 1024 - 1, true, 30},
{"TB", 20 * 1024 - 1, true, 40}, {"TB", 20 * 1024 - 1, true, 40},
{"PB", 20 * 1024 - 1, true, 50},
{NULL, 0, false, 0} {NULL, 0, false, 0}
}; };
@ -811,7 +812,7 @@ pg_size_bytes(PG_FUNCTION_ARGS)
(errcode(ERRCODE_INVALID_PARAMETER_VALUE), (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("invalid size: \"%s\"", text_to_cstring(arg)), errmsg("invalid size: \"%s\"", text_to_cstring(arg)),
errdetail("Invalid size unit: \"%s\".", strptr), errdetail("Invalid size unit: \"%s\".", strptr),
errhint("Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"."))); errhint("Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\".")));
if (multiplier > 1) if (multiplier > 1)
{ {

View File

@ -53,7 +53,7 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM
10994579406847 | 10239 GB | -10239 GB 10994579406847 | 10239 GB | -10239 GB
10994579406848 | 10 TB | -10 TB 10994579406848 | 10 TB | -10 TB
11258449312612351 | 10239 TB | -10239 TB 11258449312612351 | 10239 TB | -10239 TB
11258449312612352 | 10240 TB | -10240 TB 11258449312612352 | 10 PB | -10 PB
(10 rows) (10 rows)
SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM
@ -61,71 +61,77 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM
(10485247::numeric), (10485248::numeric), (10485247::numeric), (10485248::numeric),
(10736893951::numeric), (10736893952::numeric), (10736893951::numeric), (10736893952::numeric),
(10994579406847::numeric), (10994579406848::numeric), (10994579406847::numeric), (10994579406848::numeric),
(11258449312612351::numeric), (11258449312612352::numeric)) x(size); (11258449312612351::numeric), (11258449312612352::numeric),
size | pg_size_pretty | pg_size_pretty (11528652096115048447::numeric), (11528652096115048448::numeric)) x(size);
-------------------+----------------+---------------- size | pg_size_pretty | pg_size_pretty
10239 | 10239 bytes | -10239 bytes ----------------------+----------------+----------------
10240 | 10 kB | -10 kB 10239 | 10239 bytes | -10239 bytes
10485247 | 10239 kB | -10239 kB 10240 | 10 kB | -10 kB
10485248 | 10 MB | -10 MB 10485247 | 10239 kB | -10239 kB
10736893951 | 10239 MB | -10239 MB 10485248 | 10 MB | -10 MB
10736893952 | 10 GB | -10 GB 10736893951 | 10239 MB | -10239 MB
10994579406847 | 10239 GB | -10239 GB 10736893952 | 10 GB | -10 GB
10994579406848 | 10 TB | -10 TB 10994579406847 | 10239 GB | -10239 GB
11258449312612351 | 10239 TB | -10239 TB 10994579406848 | 10 TB | -10 TB
11258449312612352 | 10240 TB | -10240 TB 11258449312612351 | 10239 TB | -10239 TB
(10 rows) 11258449312612352 | 10 PB | -10 PB
11528652096115048447 | 10239 PB | -10239 PB
11528652096115048448 | 10240 PB | -10240 PB
(12 rows)
-- pg_size_bytes() tests -- pg_size_bytes() tests
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM
(VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '),
('1TB'), ('3000 TB'), ('1e6 MB')) x(size); ('1TB'), ('3000 TB'), ('1e6 MB'), ('99 PB')) x(size);
size | pg_size_bytes size | pg_size_bytes
----------+------------------ ----------+--------------------
1 | 1 1 | 1
123bytes | 123 123bytes | 123
1kB | 1024 1kB | 1024
1MB | 1048576 1MB | 1048576
1 GB | 1073741824 1 GB | 1073741824
1.5 GB | 1610612736 1.5 GB | 1610612736
1TB | 1099511627776 1TB | 1099511627776
3000 TB | 3298534883328000 3000 TB | 3298534883328000
1e6 MB | 1048576000000 1e6 MB | 1048576000000
(9 rows) 99 PB | 111464090777419776
(10 rows)
-- case-insensitive units are supported -- case-insensitive units are supported
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM
(VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '), (VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '),
('1tb'), ('3000 tb'), ('1e6 mb')) x(size); ('1tb'), ('3000 tb'), ('1e6 mb'), ('99 pb')) x(size);
size | pg_size_bytes size | pg_size_bytes
----------+------------------ ----------+--------------------
1 | 1 1 | 1
123bYteS | 123 123bYteS | 123
1kb | 1024 1kb | 1024
1mb | 1048576 1mb | 1048576
1 Gb | 1073741824 1 Gb | 1073741824
1.5 gB | 1610612736 1.5 gB | 1610612736
1tb | 1099511627776 1tb | 1099511627776
3000 tb | 3298534883328000 3000 tb | 3298534883328000
1e6 mb | 1048576000000 1e6 mb | 1048576000000
(9 rows) 99 pb | 111464090777419776
(10 rows)
-- negative numbers are supported -- negative numbers are supported
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM
(VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '), (VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '),
('-1tb'), ('-3000 TB'), ('-10e-1 MB')) x(size); ('-1tb'), ('-3000 TB'), ('-10e-1 MB'), ('-99 PB')) x(size);
size | pg_size_bytes size | pg_size_bytes
-----------+------------------- -----------+---------------------
-1 | -1 -1 | -1
-123bytes | -123 -123bytes | -123
-1kb | -1024 -1kb | -1024
-1mb | -1048576 -1mb | -1048576
-1 Gb | -1073741824 -1 Gb | -1073741824
-1.5 gB | -1610612736 -1.5 gB | -1610612736
-1tb | -1099511627776 -1tb | -1099511627776
-3000 TB | -3298534883328000 -3000 TB | -3298534883328000
-10e-1 MB | -1048576 -10e-1 MB | -1048576
(9 rows) -99 PB | -111464090777419776
(10 rows)
-- different cases with allowed points -- different cases with allowed points
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM
@ -147,15 +153,15 @@ SELECT size, pg_size_bytes(size) FROM
SELECT pg_size_bytes('1 AB'); SELECT pg_size_bytes('1 AB');
ERROR: invalid size: "1 AB" ERROR: invalid size: "1 AB"
DETAIL: Invalid size unit: "AB". DETAIL: Invalid size unit: "AB".
HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB".
SELECT pg_size_bytes('1 AB A'); SELECT pg_size_bytes('1 AB A');
ERROR: invalid size: "1 AB A" ERROR: invalid size: "1 AB A"
DETAIL: Invalid size unit: "AB A". DETAIL: Invalid size unit: "AB A".
HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB".
SELECT pg_size_bytes('1 AB A '); SELECT pg_size_bytes('1 AB A ');
ERROR: invalid size: "1 AB A " ERROR: invalid size: "1 AB A "
DETAIL: Invalid size unit: "AB A". DETAIL: Invalid size unit: "AB A".
HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB".
SELECT pg_size_bytes('9223372036854775807.9'); SELECT pg_size_bytes('9223372036854775807.9');
ERROR: bigint out of range ERROR: bigint out of range
SELECT pg_size_bytes('1e100'); SELECT pg_size_bytes('1e100');
@ -165,7 +171,7 @@ ERROR: value overflows numeric format
SELECT pg_size_bytes('1 byte'); -- the singular "byte" is not supported SELECT pg_size_bytes('1 byte'); -- the singular "byte" is not supported
ERROR: invalid size: "1 byte" ERROR: invalid size: "1 byte"
DETAIL: Invalid size unit: "byte". DETAIL: Invalid size unit: "byte".
HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB".
SELECT pg_size_bytes(''); SELECT pg_size_bytes('');
ERROR: invalid size: "" ERROR: invalid size: ""
SELECT pg_size_bytes('kb'); SELECT pg_size_bytes('kb');
@ -183,6 +189,6 @@ ERROR: invalid size: ".+912"
SELECT pg_size_bytes('+912+ kB'); SELECT pg_size_bytes('+912+ kB');
ERROR: invalid size: "+912+ kB" ERROR: invalid size: "+912+ kB"
DETAIL: Invalid size unit: "+ kB". DETAIL: Invalid size unit: "+ kB".
HINT: Valid units are "bytes", "kB", "MB", "GB", and "TB". HINT: Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB".
SELECT pg_size_bytes('++123 kB'); SELECT pg_size_bytes('++123 kB');
ERROR: invalid size: "++123 kB" ERROR: invalid size: "++123 kB"

View File

@ -24,22 +24,23 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM
(10485247::numeric), (10485248::numeric), (10485247::numeric), (10485248::numeric),
(10736893951::numeric), (10736893952::numeric), (10736893951::numeric), (10736893952::numeric),
(10994579406847::numeric), (10994579406848::numeric), (10994579406847::numeric), (10994579406848::numeric),
(11258449312612351::numeric), (11258449312612352::numeric)) x(size); (11258449312612351::numeric), (11258449312612352::numeric),
(11528652096115048447::numeric), (11528652096115048448::numeric)) x(size);
-- pg_size_bytes() tests -- pg_size_bytes() tests
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM
(VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '),
('1TB'), ('3000 TB'), ('1e6 MB')) x(size); ('1TB'), ('3000 TB'), ('1e6 MB'), ('99 PB')) x(size);
-- case-insensitive units are supported -- case-insensitive units are supported
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM
(VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '), (VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '),
('1tb'), ('3000 tb'), ('1e6 mb')) x(size); ('1tb'), ('3000 tb'), ('1e6 mb'), ('99 pb')) x(size);
-- negative numbers are supported -- negative numbers are supported
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM
(VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '), (VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '),
('-1tb'), ('-3000 TB'), ('-10e-1 MB')) x(size); ('-1tb'), ('-3000 TB'), ('-10e-1 MB'), ('-99 PB')) x(size);
-- different cases with allowed points -- different cases with allowed points
SELECT size, pg_size_bytes(size) FROM SELECT size, pg_size_bytes(size) FROM