Teach pg_size_pretty and pg_size_bytes about petabytes
authorDavid Rowley <drowley@postgresql.org>
Fri, 9 Jul 2021 06:56:00 +0000 (18:56 +1200)
committerDavid Rowley <drowley@postgresql.org>
Fri, 9 Jul 2021 06:56:00 +0000 (18:56 +1200)
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

src/backend/utils/adt/dbsize.c
src/test/regress/expected/dbsize.out
src/test/regress/sql/dbsize.sql

index 6c381b02b7ec68b46a7b87e81dc82db086f186d7..d5a7fb13f3cc8acb4a0477a0086944c53871f12e 100644 (file)
@@ -52,6 +52,7 @@ static const struct size_pretty_unit size_pretty_units[] = {
    {"MB", 20 * 1024 - 1, true, 20},
    {"GB", 20 * 1024 - 1, true, 30},
    {"TB", 20 * 1024 - 1, true, 40},
+   {"PB", 20 * 1024 - 1, true, 50},
    {NULL, 0, false, 0}
 };
 
@@ -811,7 +812,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\", and \"TB\".")));
+                    errhint("Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\".")));
 
        if (multiplier > 1)
        {
index 29804aee8b801f8a0ab612548067b63384d5c8b5..d8d6686b5f4be23193d6f1c6902ee49c33cd4bd7 100644 (file)
@@ -53,7 +53,7 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM
     10994579406847 | 10239 GB       | -10239 GB
     10994579406848 | 10 TB          | -10 TB
  11258449312612351 | 10239 TB       | -10239 TB
- 11258449312612352 | 10240 TB       | -10240 TB
+ 11258449312612352 | 10 PB          | -10 PB
 (10 rows)
 
 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),
             (10736893951::numeric), (10736893952::numeric),
             (10994579406847::numeric), (10994579406848::numeric),
-            (11258449312612351::numeric), (11258449312612352::numeric)) x(size);
-       size        | pg_size_pretty | pg_size_pretty 
--------------------+----------------+----------------
-             10239 | 10239 bytes    | -10239 bytes
-             10240 | 10 kB          | -10 kB
-          10485247 | 10239 kB       | -10239 kB
-          10485248 | 10 MB          | -10 MB
-       10736893951 | 10239 MB       | -10239 MB
-       10736893952 | 10 GB          | -10 GB
-    10994579406847 | 10239 GB       | -10239 GB
-    10994579406848 | 10 TB          | -10 TB
- 11258449312612351 | 10239 TB       | -10239 TB
- 11258449312612352 | 10240 TB       | -10240 TB
-(10 rows)
+            (11258449312612351::numeric), (11258449312612352::numeric),
+            (11528652096115048447::numeric), (11528652096115048448::numeric)) x(size);
+         size         | pg_size_pretty | pg_size_pretty 
+----------------------+----------------+----------------
+                10239 | 10239 bytes    | -10239 bytes
+                10240 | 10 kB          | -10 kB
+             10485247 | 10239 kB       | -10239 kB
+             10485248 | 10 MB          | -10 MB
+          10736893951 | 10239 MB       | -10239 MB
+          10736893952 | 10 GB          | -10 GB
+       10994579406847 | 10239 GB       | -10239 GB
+       10994579406848 | 10 TB          | -10 TB
+    11258449312612351 | 10239 TB       | -10239 TB
+    11258449312612352 | 10 PB          | -10 PB
+ 11528652096115048447 | 10239 PB       | -10239 PB
+ 11528652096115048448 | 10240 PB       | -10240 PB
+(12 rows)
 
 -- pg_size_bytes() tests
 SELECT size, pg_size_bytes(size) FROM
     (VALUES ('1'), ('123bytes'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '),
-            ('1TB'), ('3000 TB'), ('1e6 MB')) x(size);
-   size   |  pg_size_bytes   
-----------+------------------
- 1        |                1
- 123bytes |              123
- 1kB      |             1024
- 1MB      |          1048576
-  1 GB    |       1073741824
- 1.5 GB   |       1610612736
- 1TB      |    1099511627776
- 3000 TB  | 3298534883328000
- 1e6 MB   |    1048576000000
-(9 rows)
+            ('1TB'), ('3000 TB'), ('1e6 MB'), ('99 PB')) x(size);
+   size   |   pg_size_bytes    
+----------+--------------------
+ 1        |                  1
+ 123bytes |                123
+ 1kB      |               1024
+ 1MB      |            1048576
+  1 GB    |         1073741824
+ 1.5 GB   |         1610612736
+ 1TB      |      1099511627776
+ 3000 TB  |   3298534883328000
+ 1e6 MB   |      1048576000000
+ 99 PB    | 111464090777419776
+(10 rows)
 
 -- case-insensitive units are supported
 SELECT size, pg_size_bytes(size) FROM
     (VALUES ('1'), ('123bYteS'), ('1kb'), ('1mb'), (' 1 Gb'), ('1.5 gB '),
-            ('1tb'), ('3000 tb'), ('1e6 mb')) x(size);
-   size   |  pg_size_bytes   
-----------+------------------
- 1        |                1
- 123bYteS |              123
- 1kb      |             1024
- 1mb      |          1048576
-  1 Gb    |       1073741824
- 1.5 gB   |       1610612736
- 1tb      |    1099511627776
- 3000 tb  | 3298534883328000
- 1e6 mb   |    1048576000000
-(9 rows)
+            ('1tb'), ('3000 tb'), ('1e6 mb'), ('99 pb')) x(size);
+   size   |   pg_size_bytes    
+----------+--------------------
+ 1        |                  1
+ 123bYteS |                123
+ 1kb      |               1024
+ 1mb      |            1048576
+  1 Gb    |         1073741824
+ 1.5 gB   |         1610612736
+ 1tb      |      1099511627776
+ 3000 tb  |   3298534883328000
+ 1e6 mb   |      1048576000000
+ 99 pb    | 111464090777419776
+(10 rows)
 
 -- negative numbers are supported
 SELECT size, pg_size_bytes(size) FROM
     (VALUES ('-1'), ('-123bytes'), ('-1kb'), ('-1mb'), (' -1 Gb'), ('-1.5 gB '),
-            ('-1tb'), ('-3000 TB'), ('-10e-1 MB')) x(size);
-   size    |   pg_size_bytes   
------------+-------------------
- -1        |                -1
- -123bytes |              -123
- -1kb      |             -1024
- -1mb      |          -1048576
-  -1 Gb    |       -1073741824
- -1.5 gB   |       -1610612736
- -1tb      |    -1099511627776
- -3000 TB  | -3298534883328000
- -10e-1 MB |          -1048576
-(9 rows)
+            ('-1tb'), ('-3000 TB'), ('-10e-1 MB'), ('-99 PB')) x(size);
+   size    |    pg_size_bytes    
+-----------+---------------------
+ -1        |                  -1
+ -123bytes |                -123
+ -1kb      |               -1024
+ -1mb      |            -1048576
+  -1 Gb    |         -1073741824
+ -1.5 gB   |         -1610612736
+ -1tb      |      -1099511627776
+ -3000 TB  |   -3298534883328000
+ -10e-1 MB |            -1048576
+ -99 PB    | -111464090777419776
+(10 rows)
 
 -- different cases with allowed points
 SELECT size, pg_size_bytes(size) FROM
@@ -147,15 +153,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", and "TB".
+HINT:  Valid units are "bytes", "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", and "TB".
+HINT:  Valid units are "bytes", "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", and "TB".
+HINT:  Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB".
 SELECT pg_size_bytes('9223372036854775807.9');
 ERROR:  bigint out of range
 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
 ERROR:  invalid size: "1 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('');
 ERROR:  invalid size: ""
 SELECT pg_size_bytes('kb');
@@ -183,6 +189,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", and "TB".
+HINT:  Valid units are "bytes", "kB", "MB", "GB", "TB", and "PB".
 SELECT pg_size_bytes('++123 kB');
 ERROR:  invalid size: "++123 kB"
index 6a45c5eb1cfd5203a36bcd175f6743fcc097dd9c..7df865271b681d424d991c7c14650e2c33a31dd2 100644 (file)
@@ -24,22 +24,23 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM
             (10485247::numeric), (10485248::numeric),
             (10736893951::numeric), (10736893952::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
 SELECT size, pg_size_bytes(size) FROM
     (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
 SELECT size, pg_size_bytes(size) FROM
     (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
 SELECT size, pg_size_bytes(size) FROM
     (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
 SELECT size, pg_size_bytes(size) FROM