diff options
author | Peter Eisentraut <peter@eisentraut.org> | 2023-03-07 20:26:29 +0100 |
---|---|---|
committer | Peter Eisentraut <peter@eisentraut.org> | 2023-03-07 20:31:16 +0100 |
commit | ce1215d9b05b524339e31b7bba1f481af8b16fc8 (patch) | |
tree | 329d42f32469492d05fc59aaf62f03fa9363df11 /src/backend/utils/adt/dbsize.c | |
parent | af4d5715fc73c2ae2a22226e6f46958201464955 (diff) | |
download | postgresql-ce1215d9b05b524339e31b7bba1f481af8b16fc8.tar.gz postgresql-ce1215d9b05b524339e31b7bba1f481af8b16fc8.zip |
Add support for unit "B" to pg_size_bytes()
This makes it consistent with the units support in GUC.
Reviewed-by: David Rowley <dgrowleyml@gmail.com>
Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/0106914a-9eb5-22be-40d8-652cc88c827d%40enterprisedb.com
Diffstat (limited to 'src/backend/utils/adt/dbsize.c')
-rw-r--r-- | src/backend/utils/adt/dbsize.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index dbd404101f8..e5c0f1c45b6 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -46,7 +46,7 @@ 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 docs and the error message in pg_size_bytes */ static const struct size_pretty_unit size_pretty_units[] = { {"bytes", 10 * 1024, false, 0}, {"kB", 20 * 1024 - 1, true, 10}, @@ -57,6 +57,19 @@ static const struct size_pretty_unit size_pretty_units[] = { {NULL, 0, false, 0} }; +/* Additional unit aliases accepted by pg_size_bytes */ +struct size_bytes_unit_alias +{ + const char *alias; + int unit_index; /* corresponding size_pretty_units element */ +}; + +/* When adding units here also update the docs and the error message in pg_size_bytes */ +static const struct size_bytes_unit_alias size_bytes_aliases[] = { + {"B", 0}, + {NULL} +}; + /* Return physical size of directory contents, or 0 if dir doesn't exist */ static int64 db_dir_size(const char *path) @@ -801,9 +814,19 @@ pg_size_bytes(PG_FUNCTION_ARGS) { /* Parse the unit case-insensitively */ if (pg_strcasecmp(strptr, unit->name) == 0) - { - multiplier = ((int64) 1) << unit->unitbits; break; + } + + /* If not found, look in table of aliases */ + if (unit->name == NULL) + { + for (const struct size_bytes_unit_alias *a = size_bytes_aliases; a->alias != NULL; a++) + { + if (pg_strcasecmp(strptr, a->alias) == 0) + { + unit = &size_pretty_units[a->unit_index]; + break; + } } } @@ -813,7 +836,9 @@ 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\"."))); + + multiplier = ((int64) 1) << unit->unitbits; if (multiplier > 1) { |