On Wed, Jul 14, 2021 at 02:05:29PM +0900, Ian Lawrence Barwick wrote: > 2021年7月14日(水) 12:07 Justin Pryzby <pry...@telsasoft.com>: > > > > \db+ and \l+ show sizes of tablespaces and databases, so I was surprised in > > the > > past that \dn+ didn't show sizes of schemas. I would find that somewhat > > convenient, and I assume other people would use it even more useful. > > It's something which would be useful to have. But see this previous proposal: > > > https://www.postgresql.org/message-id/flat/2d6d2ebf-4dbc-4f74-17d8-05461f4782e2%40dalibo.com
Thanks for finding that. It sounds like the objections were: 1) it may be too slow - I propose the size should be shown only with \n++; I think \db and \l should get the same treatment, and probably everywhere should change to use the "int verbose". I moved the ++ columns to the right-most column. 2) it may fail or be misleading if user lacks permissions. I think Tom's concern was that at some point we might decide to avoid showing a relation's size to a user who has no access to the rel, and then \dn+ would show misleading information, or fail. I implemented this a server-side function for super-user/monitoring role only. I think \dn++ is also a reasonable way to address the second concern - if someone asksk for "very verbose" outpu, they get more of an internal, implementation dependant output, which might be more likely to change in future releases. For example, if we move the ++ columns to the right, someone might jusifiably think that the \n and \n+ columns would be less likely to change in the future than the \n++ columns. I imagine ++ would find more uses in the future. Like, say, size of an access methods \dA++. I'll add that in a future revision - I hope that PG15 will also have create table like (INCLUDE ACCESS METHOD), ALTER TABLE SET ACCESS METHOD, and pg_restore --no-tableam. ++ may also allow improved testing of psql features - platform dependent stuff like size can be in ++, allowing better/easier/testing of +. -- Justin
>From 21bb5d22492089a804903a817b8dd5c179643056 Mon Sep 17 00:00:00 2001 From: Justin Pryzby <pryz...@telsasoft.com> Date: Tue, 13 Jul 2021 21:25:48 -0500 Subject: [PATCH v2 1/5] psql: \dn+ to show size of each schema.. See also: 358a897fa, 528ac10c7 --- src/backend/utils/adt/dbsize.c | 81 +++++++++++++++++++++++++++++++++ src/bin/psql/describe.c | 7 +++ src/include/catalog/pg_proc.dat | 10 ++++ 3 files changed, 98 insertions(+) diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index d5a7fb13f3..d13e691807 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -13,8 +13,10 @@ #include <sys/stat.h> +#include "access/genam.h" #include "access/htup_details.h" #include "access/relation.h" +#include "access/table.h" #include "catalog/catalog.h" #include "catalog/namespace.h" #include "catalog/pg_authid.h" @@ -25,6 +27,8 @@ #include "storage/fd.h" #include "utils/acl.h" #include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" #include "utils/numeric.h" #include "utils/rel.h" #include "utils/relfilenodemap.h" @@ -832,6 +836,83 @@ pg_size_bytes(PG_FUNCTION_ARGS) PG_RETURN_INT64(result); } +/* Compute the size of a schema (namespace) */ +static int64 +calculate_namespace_size(Oid nspOid) +{ + int64 totalsize = 0; + AclResult aclresult; + Relation pg_class; + ScanKeyData skey; + SysScanDesc scan; + HeapTuple tuple; + + /* + * User must be a member of pg_read_all_stats or have CREATE privilege for + * target namespace. + */ + if (!is_member_of_role(GetUserId(), ROLE_PG_READ_ALL_STATS)) + { + aclresult = pg_namespace_aclcheck(nspOid, GetUserId(), ACL_CREATE); + if (aclresult != ACLCHECK_OK) + aclcheck_error(aclresult, OBJECT_SCHEMA, + get_namespace_name(nspOid)); + } + + ScanKeyInit(&skey, Anum_pg_class_relnamespace, + BTEqualStrategyNumber, F_OIDEQ, nspOid); + + pg_class = table_open(RelationRelationId, AccessShareLock); + scan = systable_beginscan(pg_class, InvalidOid, false, NULL, 1, &skey); + while (HeapTupleIsValid(tuple = systable_getnext(scan))) + { + Relation rel; + Form_pg_class classtuple = (Form_pg_class) GETSTRUCT(tuple); + + rel = try_relation_open(classtuple->oid, AccessShareLock); + if (!rel) + continue; + + for (int forkNum = 1; forkNum <= MAX_FORKNUM; forkNum++) + totalsize += calculate_relation_size(&rel->rd_node, rel->rd_backend, forkNum); + + relation_close(rel, AccessShareLock); + } + + systable_endscan(scan); + table_close(pg_class, AccessShareLock); + return totalsize; +} + +Datum +pg_namespace_size_oid(PG_FUNCTION_ARGS) +{ + int64 size; + Oid nspOid = PG_GETARG_OID(0); + + size = calculate_namespace_size(nspOid); + + if (size == 0) + PG_RETURN_NULL(); + + PG_RETURN_INT64(size); +} + +Datum +pg_namespace_size_name(PG_FUNCTION_ARGS) +{ + int64 size; + Name nspName = PG_GETARG_NAME(0); + Oid nspOid = get_namespace_oid(NameStr(*nspName), false); + + size = calculate_namespace_size(nspOid); + + if (size == 0) + PG_RETURN_NULL(); + + PG_RETURN_INT64(size); +} + /* * Get the filenode of a relation * diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index ba658f731b..76b50b429d 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -5036,6 +5036,13 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) appendPQExpBuffer(&buf, ",\n pg_catalog.obj_description(n.oid, 'pg_namespace') AS \"%s\"", gettext_noop("Description")); + + if (verbose && pset.sversion >= 150000) + appendPQExpBuffer(&buf, + ",\n (SELECT pg_catalog.pg_size_pretty(pg_namespace_size(n.oid))) AS \"%s\"", + // ",\n (SELECT pg_catalog.pg_size_pretty(sum(pg_relation_size(oid,fork))) FROM pg_catalog.pg_class c,\n" + // " (VALUES('main'),('fsm'),('vm'),('init')) AS fork(fork) WHERE c.relnamespace = n.oid) AS \"%s\"", + gettext_noop("Size")); } appendPQExpBufferStr(&buf, diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index fde251fa4f..2d07f66b67 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -7158,6 +7158,16 @@ descr => 'total disk space usage for the specified tablespace', proname => 'pg_tablespace_size', provolatile => 'v', prorettype => 'int8', proargtypes => 'name', prosrc => 'pg_tablespace_size_name' }, + +{ oid => '9410', + descr => 'total disk space usage for the specified namespace', + proname => 'pg_namespace_size', provolatile => 'v', prorettype => 'int8', + proargtypes => 'oid', prosrc => 'pg_namespace_size_oid' }, +{ oid => '9411', + descr => 'total disk space usage for the specified namespace', + proname => 'pg_namespace_size', provolatile => 'v', prorettype => 'int8', + proargtypes => 'name', prosrc => 'pg_namespace_size_name' }, + { oid => '2324', descr => 'total disk space usage for the specified database', proname => 'pg_database_size', provolatile => 'v', prorettype => 'int8', proargtypes => 'oid', prosrc => 'pg_database_size_oid' }, -- 2.17.0
>From d6b1732958a3812b4a72538aa8c1f016cf856d1a Mon Sep 17 00:00:00 2001 From: Justin Pryzby <pryz...@telsasoft.com> Date: Thu, 15 Jul 2021 03:14:20 -0500 Subject: [PATCH v2 2/5] psql \dn, \db and \l to show the size only with ++.. \dt+ and \dP+ are not changed, since showing the table sizes is their primary purpose. --- src/bin/psql/command.c | 20 +++++++++++++------- src/bin/psql/describe.c | 12 ++++++------ src/bin/psql/describe.h | 6 +++--- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 49d4c0e3ce..92952b4d19 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -362,7 +362,8 @@ exec_command(const char *cmd, else if (strcmp(cmd, "if") == 0) status = exec_command_if(scan_state, cstack, query_buf); else if (strcmp(cmd, "l") == 0 || strcmp(cmd, "list") == 0 || - strcmp(cmd, "l+") == 0 || strcmp(cmd, "list+") == 0) + strcmp(cmd, "l+") == 0 || strcmp(cmd, "l++") == 0 || + strcmp(cmd, "list+") == 0 || strcmp(cmd, "list++") == 0) status = exec_command_list(scan_state, active_branch, cmd); else if (strncmp(cmd, "lo_", 3) == 0) status = exec_command_lo(scan_state, active_branch, cmd); @@ -707,6 +708,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) if (active_branch) { char *pattern; + int verbose = 0; bool show_verbose, show_system; @@ -714,7 +716,10 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) pattern = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); - show_verbose = strchr(cmd, '+') ? true : false; + for (const char *t = cmd; *t != '\0'; ++t) + verbose += *t == '+' ? 1 : 0; + + show_verbose = (bool) (verbose != 0); show_system = strchr(cmd, 'S') ? true : false; switch (cmd[1]) @@ -766,7 +771,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) success = describeAggregates(pattern, show_verbose, show_system); break; case 'b': - success = describeTablespaces(pattern, show_verbose); + success = describeTablespaces(pattern, verbose); break; case 'c': success = listConversions(pattern, show_verbose, show_system); @@ -813,7 +818,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) success = listLanguages(pattern, show_verbose, show_system); break; case 'n': - success = listSchemas(pattern, show_verbose, show_system); + success = listSchemas(pattern, verbose, show_system); break; case 'o': success = exec_command_dfo(scan_state, cmd, pattern, @@ -1870,14 +1875,15 @@ exec_command_list(PsqlScanState scan_state, bool active_branch, const char *cmd) if (active_branch) { char *pattern; - bool show_verbose; + int verbose = 0; pattern = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); - show_verbose = strchr(cmd, '+') ? true : false; + for (const char *t = cmd; *t != '\0'; ++t) + verbose += *t == '+' ? 1 : 0; - success = listAllDbs(pattern, show_verbose); + success = listAllDbs(pattern, verbose); if (pattern) free(pattern); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 76b50b429d..b6a6a378a4 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -217,7 +217,7 @@ describeAccessMethods(const char *pattern, bool verbose) * Takes an optional regexp to select particular tablespaces */ bool -describeTablespaces(const char *pattern, bool verbose) +describeTablespaces(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -263,7 +263,7 @@ describeTablespaces(const char *pattern, bool verbose) ",\n spcoptions AS \"%s\"", gettext_noop("Options")); - if (verbose && pset.sversion >= 90200) + if (verbose > 1 && pset.sversion >= 90200) appendPQExpBuffer(&buf, ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS \"%s\"", gettext_noop("Size")); @@ -1023,7 +1023,7 @@ describeOperators(const char *oper_pattern, * for \l, \list, and -l switch */ bool -listAllDbs(const char *pattern, bool verbose) +listAllDbs(const char *pattern, int verbose) { PGresult *res; PQExpBufferData buf; @@ -1046,7 +1046,7 @@ listAllDbs(const char *pattern, bool verbose) gettext_noop("Ctype")); appendPQExpBufferStr(&buf, " "); printACLColumn(&buf, "d.datacl"); - if (verbose && pset.sversion >= 80200) + if (verbose > 1 && pset.sversion >= 80200) appendPQExpBuffer(&buf, ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n" " THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))\n" @@ -5016,7 +5016,7 @@ listCollations(const char *pattern, bool verbose, bool showSystem) * Describes schemas (namespaces) */ bool -listSchemas(const char *pattern, bool verbose, bool showSystem) +listSchemas(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -5037,7 +5037,7 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) ",\n pg_catalog.obj_description(n.oid, 'pg_namespace') AS \"%s\"", gettext_noop("Description")); - if (verbose && pset.sversion >= 150000) + if (verbose > 1 && pset.sversion >= 150000) appendPQExpBuffer(&buf, ",\n (SELECT pg_catalog.pg_size_pretty(pg_namespace_size(n.oid))) AS \"%s\"", // ",\n (SELECT pg_catalog.pg_size_pretty(sum(pg_relation_size(oid,fork))) FROM pg_catalog.pg_class c,\n" diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 71b320f1fc..a65f111130 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -16,7 +16,7 @@ extern bool describeAggregates(const char *pattern, bool verbose, bool showSyste extern bool describeAccessMethods(const char *pattern, bool verbose); /* \db */ -extern bool describeTablespaces(const char *pattern, bool verbose); +extern bool describeTablespaces(const char *pattern, int verbose); /* \df, \dfa, \dfn, \dft, \dfw, etc. */ extern bool describeFunctions(const char *functypes, const char *func_pattern, @@ -62,7 +62,7 @@ extern bool listTSDictionaries(const char *pattern, bool verbose); extern bool listTSTemplates(const char *pattern, bool verbose); /* \l */ -extern bool listAllDbs(const char *pattern, bool verbose); +extern bool listAllDbs(const char *pattern, int verbose); /* \dt, \di, \ds, \dS, etc. */ extern bool listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem); @@ -83,7 +83,7 @@ extern bool listCasts(const char *pattern, bool verbose); extern bool listCollations(const char *pattern, bool verbose, bool showSystem); /* \dn */ -extern bool listSchemas(const char *pattern, bool verbose, bool showSystem); +extern bool listSchemas(const char *pattern, int verbose, bool showSystem); /* \dew */ extern bool listForeignDataWrappers(const char *pattern, bool verbose); -- 2.17.0
>From 6fc9726ce426aa7542bb28391391771a526a9e4b Mon Sep 17 00:00:00 2001 From: Justin Pryzby <pryz...@telsasoft.com> Date: Thu, 15 Jul 2021 03:19:58 -0500 Subject: [PATCH v2 3/5] f!convert the other verbose to int, too --- src/bin/psql/command.c | 76 ++++++++++++++++++++--------------------- src/bin/psql/describe.c | 62 ++++++++++++++++----------------- src/bin/psql/describe.h | 56 +++++++++++++++--------------- 3 files changed, 96 insertions(+), 98 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 92952b4d19..34f1ee54b5 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -75,7 +75,7 @@ static backslashResult exec_command_d(PsqlScanState scan_state, bool active_bran const char *cmd); static bool exec_command_dfo(PsqlScanState scan_state, const char *cmd, const char *pattern, - bool show_verbose, bool show_system); + int verbose, bool show_system); static backslashResult exec_command_edit(PsqlScanState scan_state, bool active_branch, PQExpBuffer query_buf, PQExpBuffer previous_buf); static backslashResult exec_command_ef_ev(PsqlScanState scan_state, bool active_branch, @@ -709,8 +709,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) { char *pattern; int verbose = 0; - bool show_verbose, - show_system; + bool show_system; /* We don't do SQLID reduction on the pattern yet */ pattern = psql_scan_slash_option(scan_state, @@ -719,7 +718,6 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) for (const char *t = cmd; *t != '\0'; ++t) verbose += *t == '+' ? 1 : 0; - show_verbose = (bool) (verbose != 0); show_system = strchr(cmd, 'S') ? true : false; switch (cmd[1]) @@ -728,10 +726,10 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) case '+': case 'S': if (pattern) - success = describeTableDetails(pattern, show_verbose, show_system); + success = describeTableDetails(pattern, verbose, show_system); else /* standard listing of interesting things */ - success = listTables("tvmsE", NULL, show_verbose, show_system); + success = listTables("tvmsE", NULL, verbose, show_system); break; case 'A': { @@ -744,19 +742,19 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) { case '\0': case '+': - success = describeAccessMethods(pattern, show_verbose); + success = describeAccessMethods(pattern, verbose); break; case 'c': - success = listOperatorClasses(pattern, pattern2, show_verbose); + success = listOperatorClasses(pattern, pattern2, verbose); break; case 'f': - success = listOperatorFamilies(pattern, pattern2, show_verbose); + success = listOperatorFamilies(pattern, pattern2, verbose); break; case 'o': - success = listOpFamilyOperators(pattern, pattern2, show_verbose); + success = listOpFamilyOperators(pattern, pattern2, verbose); break; case 'p': - success = listOpFamilyFunctions(pattern, pattern2, show_verbose); + success = listOpFamilyFunctions(pattern, pattern2, verbose); break; default: status = PSQL_CMD_UNKNOWN; @@ -768,16 +766,16 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) } break; case 'a': - success = describeAggregates(pattern, show_verbose, show_system); + success = describeAggregates(pattern, verbose, show_system); break; case 'b': success = describeTablespaces(pattern, verbose); break; case 'c': - success = listConversions(pattern, show_verbose, show_system); + success = listConversions(pattern, verbose, show_system); break; case 'C': - success = listCasts(pattern, show_verbose); + success = listCasts(pattern, verbose); break; case 'd': if (strncmp(cmd, "ddp", 3) == 0) @@ -786,7 +784,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) success = objectDescription(pattern, show_system); break; case 'D': - success = listDomains(pattern, show_verbose, show_system); + success = listDomains(pattern, verbose, show_system); break; case 'f': /* function subsystem */ switch (cmd[2]) @@ -800,7 +798,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) case 't': case 'w': success = exec_command_dfo(scan_state, cmd, pattern, - show_verbose, show_system); + verbose, show_system); break; default: status = PSQL_CMD_UNKNOWN; @@ -809,23 +807,23 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) break; case 'g': /* no longer distinct from \du */ - success = describeRoles(pattern, show_verbose, show_system); + success = describeRoles(pattern, verbose, show_system); break; case 'l': success = do_lo_list(); break; case 'L': - success = listLanguages(pattern, show_verbose, show_system); + success = listLanguages(pattern, verbose, show_system); break; case 'n': success = listSchemas(pattern, verbose, show_system); break; case 'o': success = exec_command_dfo(scan_state, cmd, pattern, - show_verbose, show_system); + verbose, show_system); break; case 'O': - success = listCollations(pattern, show_verbose, show_system); + success = listCollations(pattern, verbose, show_system); break; case 'p': success = permissionsList(pattern); @@ -839,7 +837,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) case 't': case 'i': case 'n': - success = listPartitionedTables(&cmd[2], pattern, show_verbose); + success = listPartitionedTables(&cmd[2], pattern, verbose); break; default: status = PSQL_CMD_UNKNOWN; @@ -848,7 +846,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) } break; case 'T': - success = describeTypes(pattern, show_verbose, show_system); + success = describeTypes(pattern, verbose, show_system); break; case 't': case 'v': @@ -856,7 +854,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) case 'i': case 's': case 'E': - success = listTables(&cmd[1], pattern, show_verbose, show_system); + success = listTables(&cmd[1], pattern, verbose, show_system); break; case 'r': if (cmd[2] == 'd' && cmd[3] == 's') @@ -878,36 +876,36 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) switch (cmd[2]) { case 'p': - if (show_verbose) + if (verbose) success = describePublications(pattern); else success = listPublications(pattern); break; case 's': - success = describeSubscriptions(pattern, show_verbose); + success = describeSubscriptions(pattern, verbose); break; default: status = PSQL_CMD_UNKNOWN; } break; case 'u': - success = describeRoles(pattern, show_verbose, show_system); + success = describeRoles(pattern, verbose, show_system); break; case 'F': /* text search subsystem */ switch (cmd[2]) { case '\0': case '+': - success = listTSConfigs(pattern, show_verbose); + success = listTSConfigs(pattern, verbose); break; case 'p': - success = listTSParsers(pattern, show_verbose); + success = listTSParsers(pattern, verbose); break; case 'd': - success = listTSDictionaries(pattern, show_verbose); + success = listTSDictionaries(pattern, verbose); break; case 't': - success = listTSTemplates(pattern, show_verbose); + success = listTSTemplates(pattern, verbose); break; default: status = PSQL_CMD_UNKNOWN; @@ -918,16 +916,16 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) switch (cmd[2]) { case 's': - success = listForeignServers(pattern, show_verbose); + success = listForeignServers(pattern, verbose); break; case 'u': - success = listUserMappings(pattern, show_verbose); + success = listUserMappings(pattern, verbose); break; case 'w': - success = listForeignDataWrappers(pattern, show_verbose); + success = listForeignDataWrappers(pattern, verbose); break; case 't': - success = listForeignTables(pattern, show_verbose); + success = listForeignTables(pattern, verbose); break; default: status = PSQL_CMD_UNKNOWN; @@ -935,7 +933,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) } break; case 'x': /* Extensions */ - if (show_verbose) + if (verbose) success = listExtensionContents(pattern); else success = listExtensions(pattern); @@ -944,7 +942,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) success = listExtendedStats(pattern); break; case 'y': /* Event Triggers */ - success = listEventTriggers(pattern, show_verbose); + success = listEventTriggers(pattern, verbose); break; default: status = PSQL_CMD_UNKNOWN; @@ -966,7 +964,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) static bool exec_command_dfo(PsqlScanState scan_state, const char *cmd, const char *pattern, - bool show_verbose, bool show_system) + int verbose, bool show_system) { bool success; char *arg_patterns[FUNC_MAX_ARGS]; @@ -989,11 +987,11 @@ exec_command_dfo(PsqlScanState scan_state, const char *cmd, if (cmd[1] == 'f') success = describeFunctions(&cmd[2], pattern, arg_patterns, num_arg_patterns, - show_verbose, show_system); + verbose, show_system); else success = describeOperators(pattern, arg_patterns, num_arg_patterns, - show_verbose, show_system); + verbose, show_system); while (--num_arg_patterns >= 0) free(arg_patterns[num_arg_patterns]); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index b6a6a378a4..afdb330d41 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -32,7 +32,7 @@ static const char *map_typename_pattern(const char *pattern); static bool describeOneTableDetails(const char *schemaname, const char *relationname, const char *oid, - bool verbose); + int verbose); static void add_tablespace_footer(printTableContent *const cont, char relkind, Oid tablespace, const bool newline); static void add_role_attribute(PQExpBuffer buf, const char *const str); @@ -61,7 +61,7 @@ static bool listOneExtensionContents(const char *extname, const char *oid); * Takes an optional regexp to select particular aggregates */ bool -describeAggregates(const char *pattern, bool verbose, bool showSystem) +describeAggregates(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -147,7 +147,7 @@ describeAggregates(const char *pattern, bool verbose, bool showSystem) * Takes an optional regexp to select particular access methods */ bool -describeAccessMethods(const char *pattern, bool verbose) +describeAccessMethods(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -315,7 +315,7 @@ describeTablespaces(const char *pattern, int verbose) bool describeFunctions(const char *functypes, const char *func_pattern, char **arg_patterns, int num_arg_patterns, - bool verbose, bool showSystem) + int verbose, bool showSystem) { bool showAggregate = strchr(functypes, 'a') != NULL; bool showNormal = strchr(functypes, 'n') != NULL; @@ -714,7 +714,7 @@ describeFunctions(const char *functypes, const char *func_pattern, * describe types */ bool -describeTypes(const char *pattern, bool verbose, bool showSystem) +describeTypes(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -890,7 +890,7 @@ map_typename_pattern(const char *pattern) bool describeOperators(const char *oper_pattern, char **arg_patterns, int num_arg_patterns, - bool verbose, bool showSystem) + int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -1527,10 +1527,10 @@ objectDescription(const char *pattern, bool showSystem) * This routine finds the tables to be displayed, and calls * describeOneTableDetails for each one. * - * verbose: if true, this is \d+ + * verbose: this is \d+ (or \d++) */ bool -describeTableDetails(const char *pattern, bool verbose, bool showSystem) +describeTableDetails(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -1611,7 +1611,7 @@ static bool describeOneTableDetails(const char *schemaname, const char *relationname, const char *oid, - bool verbose) + int verbose) { bool retval = false; PQExpBufferData buf; @@ -3736,7 +3736,7 @@ add_tablespace_footer(printTableContent *const cont, char relkind, * Describes roles. Any schema portion of the pattern is ignored. */ bool -describeRoles(const char *pattern, bool verbose, bool showSystem) +describeRoles(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -3992,7 +3992,7 @@ listDbRoleSettings(const char *pattern, const char *pattern2) * (any order of the above is fine) */ bool -listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem) +listTables(const char *tabtypes, const char *pattern, int verbose, bool showSystem) { bool showTables = strchr(tabtypes, 't') != NULL; bool showIndexes = strchr(tabtypes, 'i') != NULL; @@ -4208,7 +4208,7 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys * and you can mix and match these in any order. */ bool -listPartitionedTables(const char *reltypes, const char *pattern, bool verbose) +listPartitionedTables(const char *reltypes, const char *pattern, int verbose) { bool showTables = strchr(reltypes, 't') != NULL; bool showIndexes = strchr(reltypes, 'i') != NULL; @@ -4404,7 +4404,7 @@ listPartitionedTables(const char *reltypes, const char *pattern, bool verbose) * Describes languages. */ bool -listLanguages(const char *pattern, bool verbose, bool showSystem) +listLanguages(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -4479,7 +4479,7 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) * Describes domains. */ bool -listDomains(const char *pattern, bool verbose, bool showSystem) +listDomains(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -4565,7 +4565,7 @@ listDomains(const char *pattern, bool verbose, bool showSystem) * Describes conversions. */ bool -listConversions(const char *pattern, bool verbose, bool showSystem) +listConversions(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -4641,7 +4641,7 @@ listConversions(const char *pattern, bool verbose, bool showSystem) * Describes Event Triggers. */ bool -listEventTriggers(const char *pattern, bool verbose) +listEventTriggers(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -4799,7 +4799,7 @@ listExtendedStats(const char *pattern) * Describes casts. */ bool -listCasts(const char *pattern, bool verbose) +listCasts(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -4917,7 +4917,7 @@ listCasts(const char *pattern, bool verbose) * Describes collations. */ bool -listCollations(const char *pattern, bool verbose, bool showSystem) +listCollations(const char *pattern, int verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -5080,7 +5080,7 @@ listSchemas(const char *pattern, int verbose, bool showSystem) * list text search parsers */ bool -listTSParsers(const char *pattern, bool verbose) +listTSParsers(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -5327,7 +5327,7 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname) * list text search dictionaries */ bool -listTSDictionaries(const char *pattern, bool verbose) +listTSDictionaries(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -5398,7 +5398,7 @@ listTSDictionaries(const char *pattern, bool verbose) * list text search templates */ bool -listTSTemplates(const char *pattern, bool verbose) +listTSTemplates(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -5469,7 +5469,7 @@ listTSTemplates(const char *pattern, bool verbose) * list text search configurations */ bool -listTSConfigs(const char *pattern, bool verbose) +listTSConfigs(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -5675,7 +5675,7 @@ describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname, * Describes foreign-data wrappers */ bool -listForeignDataWrappers(const char *pattern, bool verbose) +listForeignDataWrappers(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -5758,7 +5758,7 @@ listForeignDataWrappers(const char *pattern, bool verbose) * Describes foreign servers. */ bool -listForeignServers(const char *pattern, bool verbose) +listForeignServers(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -5840,7 +5840,7 @@ listForeignServers(const char *pattern, bool verbose) * Describes user mappings. */ bool -listUserMappings(const char *pattern, bool verbose) +listUserMappings(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -5901,7 +5901,7 @@ listUserMappings(const char *pattern, bool verbose) * Describes foreign tables. */ bool -listForeignTables(const char *pattern, bool verbose) +listForeignTables(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -6390,7 +6390,7 @@ describePublications(const char *pattern) * Takes an optional regexp to select particular subscriptions */ bool -describeSubscriptions(const char *pattern, bool verbose) +describeSubscriptions(const char *pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -6501,7 +6501,7 @@ printACLColumn(PQExpBuffer buf, const char *colname) */ bool listOperatorClasses(const char *access_method_pattern, - const char *type_pattern, bool verbose) + const char *type_pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -6595,7 +6595,7 @@ listOperatorClasses(const char *access_method_pattern, */ bool listOperatorFamilies(const char *access_method_pattern, - const char *type_pattern, bool verbose) + const char *type_pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -6677,7 +6677,7 @@ listOperatorFamilies(const char *access_method_pattern, */ bool listOpFamilyOperators(const char *access_method_pattern, - const char *family_pattern, bool verbose) + const char *family_pattern, int verbose) { PQExpBufferData buf; PGresult *res; @@ -6764,7 +6764,7 @@ listOpFamilyOperators(const char *access_method_pattern, */ bool listOpFamilyFunctions(const char *access_method_pattern, - const char *family_pattern, bool verbose) + const char *family_pattern, int verbose) { PQExpBufferData buf; PGresult *res; diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index a65f111130..cdf286242b 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -10,10 +10,10 @@ /* \da */ -extern bool describeAggregates(const char *pattern, bool verbose, bool showSystem); +extern bool describeAggregates(const char *pattern, int verbose, bool showSystem); /* \dA */ -extern bool describeAccessMethods(const char *pattern, bool verbose); +extern bool describeAccessMethods(const char *pattern, int verbose); /* \db */ extern bool describeTablespaces(const char *pattern, int verbose); @@ -21,18 +21,18 @@ extern bool describeTablespaces(const char *pattern, int verbose); /* \df, \dfa, \dfn, \dft, \dfw, etc. */ extern bool describeFunctions(const char *functypes, const char *func_pattern, char **arg_patterns, int num_arg_patterns, - bool verbose, bool showSystem); + int verbose, bool showSystem); /* \dT */ -extern bool describeTypes(const char *pattern, bool verbose, bool showSystem); +extern bool describeTypes(const char *pattern, int verbose, bool showSystem); /* \do */ extern bool describeOperators(const char *oper_pattern, char **arg_patterns, int num_arg_patterns, - bool verbose, bool showSystem); + int verbose, bool showSystem); /* \du, \dg */ -extern bool describeRoles(const char *pattern, bool verbose, bool showSystem); +extern bool describeRoles(const char *pattern, int verbose, bool showSystem); /* \drds */ extern bool listDbRoleSettings(const char *pattern, const char *pattern2); @@ -47,58 +47,58 @@ extern bool listDefaultACLs(const char *pattern); extern bool objectDescription(const char *pattern, bool showSystem); /* \d foo */ -extern bool describeTableDetails(const char *pattern, bool verbose, bool showSystem); +extern bool describeTableDetails(const char *pattern, int verbose, bool showSystem); /* \dF */ -extern bool listTSConfigs(const char *pattern, bool verbose); +extern bool listTSConfigs(const char *pattern, int verbose); /* \dFp */ -extern bool listTSParsers(const char *pattern, bool verbose); +extern bool listTSParsers(const char *pattern, int verbose); /* \dFd */ -extern bool listTSDictionaries(const char *pattern, bool verbose); +extern bool listTSDictionaries(const char *pattern, int verbose); /* \dFt */ -extern bool listTSTemplates(const char *pattern, bool verbose); +extern bool listTSTemplates(const char *pattern, int verbose); /* \l */ extern bool listAllDbs(const char *pattern, int verbose); /* \dt, \di, \ds, \dS, etc. */ -extern bool listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem); +extern bool listTables(const char *tabtypes, const char *pattern, int verbose, bool showSystem); /* \dP */ -extern bool listPartitionedTables(const char *reltypes, const char *pattern, bool verbose); +extern bool listPartitionedTables(const char *reltypes, const char *pattern, int verbose); /* \dD */ -extern bool listDomains(const char *pattern, bool verbose, bool showSystem); +extern bool listDomains(const char *pattern, int verbose, bool showSystem); /* \dc */ -extern bool listConversions(const char *pattern, bool verbose, bool showSystem); +extern bool listConversions(const char *pattern, int verbose, bool showSystem); /* \dC */ -extern bool listCasts(const char *pattern, bool verbose); +extern bool listCasts(const char *pattern, int verbose); /* \dO */ -extern bool listCollations(const char *pattern, bool verbose, bool showSystem); +extern bool listCollations(const char *pattern, int verbose, bool showSystem); /* \dn */ extern bool listSchemas(const char *pattern, int verbose, bool showSystem); /* \dew */ -extern bool listForeignDataWrappers(const char *pattern, bool verbose); +extern bool listForeignDataWrappers(const char *pattern, int verbose); /* \des */ -extern bool listForeignServers(const char *pattern, bool verbose); +extern bool listForeignServers(const char *pattern, int verbose); /* \deu */ -extern bool listUserMappings(const char *pattern, bool verbose); +extern bool listUserMappings(const char *pattern, int verbose); /* \det */ -extern bool listForeignTables(const char *pattern, bool verbose); +extern bool listForeignTables(const char *pattern, int verbose); /* \dL */ -extern bool listLanguages(const char *pattern, bool verbose, bool showSystem); +extern bool listLanguages(const char *pattern, int verbose, bool showSystem); /* \dx */ extern bool listExtensions(const char *pattern); @@ -110,7 +110,7 @@ extern bool listExtensionContents(const char *pattern); extern bool listExtendedStats(const char *pattern); /* \dy */ -extern bool listEventTriggers(const char *pattern, bool verbose); +extern bool listEventTriggers(const char *pattern, int verbose); /* \dRp */ bool listPublications(const char *pattern); @@ -119,25 +119,25 @@ bool listPublications(const char *pattern); bool describePublications(const char *pattern); /* \dRs */ -bool describeSubscriptions(const char *pattern, bool verbose); +bool describeSubscriptions(const char *pattern, int verbose); /* \dAc */ extern bool listOperatorClasses(const char *access_method_pattern, const char *opclass_pattern, - bool verbose); + int verbose); /* \dAf */ extern bool listOperatorFamilies(const char *access_method_pattern, const char *opclass_pattern, - bool verbose); + int verbose); /* \dAo */ extern bool listOpFamilyOperators(const char *accessMethod_pattern, - const char *family_pattern, bool verbose); + const char *family_pattern, int verbose); /* \dAp */ extern bool listOpFamilyFunctions(const char *access_method_pattern, - const char *family_pattern, bool verbose); + const char *family_pattern, int verbose); #endif /* DESCRIBE_H */ -- 2.17.0
>From 72679f3c7d8b56b2a1f341d389f79040ccca9dd2 Mon Sep 17 00:00:00 2001 From: Justin Pryzby <pryz...@telsasoft.com> Date: Thu, 15 Jul 2021 03:23:25 -0500 Subject: [PATCH v2 4/5] f! change if (verbose) to if (verbose > 0) --- src/bin/psql/command.c | 4 +- src/bin/psql/describe.c | 112 ++++++++++++++++++++-------------------- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 34f1ee54b5..c3738a106f 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -876,7 +876,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) switch (cmd[2]) { case 'p': - if (verbose) + if (verbose > 0) success = describePublications(pattern); else success = listPublications(pattern); @@ -933,7 +933,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) } break; case 'x': /* Extensions */ - if (verbose) + if (verbose > 0) success = listExtensionContents(pattern); else success = listExtensions(pattern); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index afdb330d41..4d76f117c3 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -177,7 +177,7 @@ describeAccessMethods(const char *pattern, int verbose) gettext_noop("Table"), gettext_noop("Type")); - if (verbose) + if (verbose > 0) { appendPQExpBuffer(&buf, ",\n amhandler AS \"%s\",\n" @@ -252,13 +252,13 @@ describeTablespaces(const char *pattern, int verbose) gettext_noop("Owner"), gettext_noop("Location")); - if (verbose) + if (verbose > 0) { appendPQExpBufferStr(&buf, ",\n "); printACLColumn(&buf, "spcacl"); } - if (verbose && pset.sversion >= 90000) + if (verbose > 0 && pset.sversion >= 90000) appendPQExpBuffer(&buf, ",\n spcoptions AS \"%s\"", gettext_noop("Options")); @@ -268,7 +268,7 @@ describeTablespaces(const char *pattern, int verbose) ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS \"%s\"", gettext_noop("Size")); - if (verbose && pset.sversion >= 80200) + if (verbose > 0 && pset.sversion >= 80200) appendPQExpBuffer(&buf, ",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"", gettext_noop("Description")); @@ -475,7 +475,7 @@ describeFunctions(const char *functypes, const char *func_pattern, gettext_noop("func"), gettext_noop("Type")); - if (verbose) + if (verbose > 0) { appendPQExpBuffer(&buf, ",\n CASE\n" @@ -535,7 +535,7 @@ describeFunctions(const char *functypes, const char *func_pattern, i, i, i, i, i, i); } - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, " LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang\n"); @@ -727,7 +727,7 @@ describeTypes(const char *pattern, int verbose, bool showSystem) " pg_catalog.format_type(t.oid, NULL) AS \"%s\",\n", gettext_noop("Schema"), gettext_noop("Name")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, " t.typname AS \"%s\",\n" " CASE WHEN t.typrelid != 0\n" @@ -738,7 +738,7 @@ describeTypes(const char *pattern, int verbose, bool showSystem) " END AS \"%s\",\n", gettext_noop("Internal name"), gettext_noop("Size")); - if (verbose && pset.sversion >= 80300) + if (verbose > 0 && pset.sversion >= 80300) { appendPQExpBufferStr(&buf, " pg_catalog.array_to_string(\n" @@ -760,13 +760,13 @@ describeTypes(const char *pattern, int verbose, bool showSystem) " ) AS \"%s\",\n", gettext_noop("Elements")); } - if (verbose) + if (verbose > 0) { appendPQExpBuffer(&buf, " pg_catalog.pg_get_userbyid(t.typowner) AS \"%s\",\n", gettext_noop("Owner")); } - if (verbose && pset.sversion >= 90200) + if (verbose > 0 && pset.sversion >= 90200) { printACLColumn(&buf, "t.typacl"); appendPQExpBufferStr(&buf, ",\n "); @@ -927,7 +927,7 @@ describeOperators(const char *oper_pattern, gettext_noop("Right arg type"), gettext_noop("Result type")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, " o.oprcode AS \"%s\",\n", gettext_noop("Function")); @@ -1053,17 +1053,17 @@ listAllDbs(const char *pattern, int verbose) " ELSE 'No Access'\n" " END as \"%s\"", gettext_noop("Size")); - if (verbose && pset.sversion >= 80000) + if (verbose > 0 && pset.sversion >= 80000) appendPQExpBuffer(&buf, ",\n t.spcname as \"%s\"", gettext_noop("Tablespace")); - if (verbose && pset.sversion >= 80200) + if (verbose > 0 && pset.sversion >= 80200) appendPQExpBuffer(&buf, ",\n pg_catalog.shobj_description(d.oid, 'pg_database') as \"%s\"", gettext_noop("Description")); appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_database d\n"); - if (verbose && pset.sversion >= 80000) + if (verbose > 0 && pset.sversion >= 80000) appendPQExpBufferStr(&buf, " JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid\n"); @@ -2050,7 +2050,7 @@ describeOneTableDetails(const char *schemaname, " pg_catalog.pg_options_to_table(attfdwoptions)), ', ') || ')' END AS attfdwoptions"); fdwopts_col = cols++; } - if (verbose) + if (verbose > 0) { appendPQExpBufferStr(&buf, ",\n a.attstorage"); attstorage_col = cols++; @@ -2313,7 +2313,7 @@ describeOneTableDetails(const char *schemaname, "false as inhdetachpending"); /* If verbose, also request the partition constraint definition */ - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, ",\n pg_catalog.pg_get_partition_constraintdef(c.oid)"); appendPQExpBuffer(&buf, @@ -2336,7 +2336,7 @@ describeOneTableDetails(const char *schemaname, strcmp(detached, "t") == 0 ? " DETACH PENDING" : ""); printTableAddFooter(&cont, tmpbuf.data); - if (verbose) + if (verbose > 0) { char *partconstraintdef = NULL; @@ -3543,7 +3543,7 @@ describeOneTableDetails(const char *schemaname, printfPQExpBuffer(&buf, _("Number of partitions: %d"), tuples); printTableAddFooter(&cont, buf.data); } - else if (!verbose) + else if (verbose == 0) { /* print the number of child tables, if any */ if (tuples > 0) @@ -3593,7 +3593,7 @@ describeOneTableDetails(const char *schemaname, printTableAddFooter(&cont, buf.data); } - if (verbose && + if (verbose > 0 && (tableinfo.relkind == RELKIND_RELATION || tableinfo.relkind == RELKIND_MATVIEW) && @@ -3617,7 +3617,7 @@ describeOneTableDetails(const char *schemaname, } /* OIDs, if verbose and not a materialized view */ - if (verbose && tableinfo.relkind != RELKIND_MATVIEW && tableinfo.hasoids) + if (verbose > 0 && tableinfo.relkind != RELKIND_MATVIEW && tableinfo.hasoids) printTableAddFooter(&cont, _("Has OIDs: yes")); /* Tablespace info */ @@ -3625,7 +3625,7 @@ describeOneTableDetails(const char *schemaname, true); /* Access method info */ - if (verbose && tableinfo.relam != NULL && !pset.hide_tableam) + if (verbose > 0 && tableinfo.relam != NULL && !pset.hide_tableam) { printfPQExpBuffer(&buf, _("Access method: %s"), tableinfo.relam); printTableAddFooter(&cont, buf.data); @@ -3633,7 +3633,7 @@ describeOneTableDetails(const char *schemaname, } /* reloptions, if verbose */ - if (verbose && + if (verbose > 0 && tableinfo.reloptions && tableinfo.reloptions[0] != '\0') { const char *t = _("Options"); @@ -3764,7 +3764,7 @@ describeRoles(const char *pattern, int verbose, bool showSystem) " JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)\n" " WHERE m.member = r.oid) as memberof"); - if (verbose && pset.sversion >= 80200) + if (verbose > 0 && pset.sversion >= 80200) { appendPQExpBufferStr(&buf, "\n, pg_catalog.shobj_description(r.oid, 'pg_authid') AS description"); ncols++; @@ -3819,7 +3819,7 @@ describeRoles(const char *pattern, int verbose, bool showSystem) /* ignores implicit memberships from superuser & pg_database_owner */ printTableAddHeader(&cont, gettext_noop("Member of"), true, align); - if (verbose && pset.sversion >= 80200) + if (verbose > 0 && pset.sversion >= 80200) printTableAddHeader(&cont, gettext_noop("Description"), true, align); for (i = 0; i < nrows; i++) @@ -3879,7 +3879,7 @@ describeRoles(const char *pattern, int verbose, bool showSystem) printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); - if (verbose && pset.sversion >= 80200) + if (verbose > 0 && pset.sversion >= 80200) printTableAddCell(&cont, PQgetvalue(res, i, 9), false, false); } termPQExpBuffer(&buf); @@ -4057,7 +4057,7 @@ listTables(const char *tabtypes, const char *pattern, int verbose, bool showSyst cols_so_far++; } - if (verbose) + if (verbose > 0) { /* * Show whether a relation is permanent, temporary, or unlogged. Like @@ -4283,7 +4283,7 @@ listPartitionedTables(const char *reltypes, const char *pattern, int verbose) ",\n c2.oid::regclass as \"%s\"", gettext_noop("Table")); - if (verbose) + if (verbose > 0) { if (showNested) { @@ -4318,7 +4318,7 @@ listPartitionedTables(const char *reltypes, const char *pattern, int verbose) appendPQExpBufferStr(&buf, "\n LEFT JOIN pg_catalog.pg_inherits inh ON c.oid = inh.inhrelid"); - if (verbose) + if (verbose > 0) { if (pset.sversion < 120000) { @@ -4424,7 +4424,7 @@ listLanguages(const char *pattern, int verbose, bool showSystem) " l.lanpltrusted AS \"%s\"", gettext_noop("Trusted")); - if (verbose) + if (verbose > 0) { appendPQExpBuffer(&buf, ",\n NOT l.lanispl AS \"%s\",\n" @@ -4510,7 +4510,7 @@ listDomains(const char *pattern, int verbose, bool showSystem) gettext_noop("Default"), gettext_noop("Check")); - if (verbose) + if (verbose > 0) { if (pset.sversion >= 90200) { @@ -4526,7 +4526,7 @@ listDomains(const char *pattern, int verbose, bool showSystem) "\nFROM pg_catalog.pg_type t\n" " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n"); - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, " LEFT JOIN pg_catalog.pg_description d " "ON d.classoid = t.tableoid AND d.objoid = t.oid " @@ -4589,7 +4589,7 @@ listConversions(const char *pattern, int verbose, bool showSystem) gettext_noop("yes"), gettext_noop("no"), gettext_noop("Default?")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\n d.description AS \"%s\"", gettext_noop("Description")); @@ -4599,7 +4599,7 @@ listConversions(const char *pattern, int verbose, bool showSystem) " JOIN pg_catalog.pg_namespace n " "ON n.oid = c.connamespace\n"); - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, "LEFT JOIN pg_catalog.pg_description d " "ON d.classoid = c.tableoid\n" @@ -4672,7 +4672,7 @@ listEventTriggers(const char *pattern, int verbose) gettext_noop("Enabled"), gettext_noop("Function"), gettext_noop("Tags")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\npg_catalog.obj_description(e.oid, 'pg_event_trigger') as \"%s\"", gettext_noop("Description")); @@ -4847,7 +4847,7 @@ listCasts(const char *pattern, int verbose) gettext_noop("yes"), gettext_noop("Implicit?")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\n d.description AS \"%s\"", gettext_noop("Description")); @@ -4868,7 +4868,7 @@ listCasts(const char *pattern, int verbose) " LEFT JOIN pg_catalog.pg_namespace nt\n" " ON nt.oid = tt.typnamespace\n"); - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, " LEFT JOIN pg_catalog.pg_description d\n" " ON d.classoid = c.tableoid AND d.objoid = " @@ -4966,7 +4966,7 @@ listCollations(const char *pattern, int verbose, bool showSystem) gettext_noop("yes"), gettext_noop("Deterministic?")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\n pg_catalog.obj_description(c.oid, 'pg_collation') AS \"%s\"", gettext_noop("Description")); @@ -5029,7 +5029,7 @@ listSchemas(const char *pattern, int verbose, bool showSystem) gettext_noop("Name"), gettext_noop("Owner")); - if (verbose) + if (verbose > 0) { appendPQExpBufferStr(&buf, ",\n "); printACLColumn(&buf, "n.nspacl"); @@ -5096,7 +5096,7 @@ listTSParsers(const char *pattern, int verbose) return true; } - if (verbose) + if (verbose > 0) return listTSParsersVerbose(pattern); initPQExpBuffer(&buf); @@ -5352,7 +5352,7 @@ listTSDictionaries(const char *pattern, int verbose) gettext_noop("Schema"), gettext_noop("Name")); - if (verbose) + if (verbose > 0) { appendPQExpBuffer(&buf, " ( SELECT COALESCE(nt.nspname, '(null)')::pg_catalog.text || '.' || t.tmplname FROM\n" @@ -5416,7 +5416,7 @@ listTSTemplates(const char *pattern, int verbose) initPQExpBuffer(&buf); - if (verbose) + if (verbose > 0) printfPQExpBuffer(&buf, "SELECT\n" " n.nspname AS \"%s\",\n" @@ -5485,7 +5485,7 @@ listTSConfigs(const char *pattern, int verbose) return true; } - if (verbose) + if (verbose > 0) return listTSConfigsVerbose(pattern); initPQExpBuffer(&buf); @@ -5705,7 +5705,7 @@ listForeignDataWrappers(const char *pattern, int verbose) " fdw.fdwvalidator::pg_catalog.regproc AS \"%s\"", gettext_noop("Validator")); - if (verbose) + if (verbose > 0) { appendPQExpBufferStr(&buf, ",\n "); printACLColumn(&buf, "fdwacl"); @@ -5726,7 +5726,7 @@ listForeignDataWrappers(const char *pattern, int verbose) appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_foreign_data_wrapper fdw\n"); - if (verbose && pset.sversion >= 90100) + if (verbose > 0 && pset.sversion >= 90100) appendPQExpBufferStr(&buf, "LEFT JOIN pg_catalog.pg_description d\n" " ON d.classoid = fdw.tableoid " @@ -5783,7 +5783,7 @@ listForeignServers(const char *pattern, int verbose) gettext_noop("Owner"), gettext_noop("Foreign-data wrapper")); - if (verbose) + if (verbose > 0) { appendPQExpBufferStr(&buf, ",\n "); printACLColumn(&buf, "s.srvacl"); @@ -5808,7 +5808,7 @@ listForeignServers(const char *pattern, int verbose) "\nFROM pg_catalog.pg_foreign_server s\n" " JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid=s.srvfdw\n"); - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, "LEFT JOIN pg_catalog.pg_description d\n " "ON d.classoid = s.tableoid AND d.objoid = s.oid " @@ -5863,7 +5863,7 @@ listUserMappings(const char *pattern, int verbose) gettext_noop("Server"), gettext_noop("User name")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\n CASE WHEN umoptions IS NULL THEN '' ELSE " " '(' || pg_catalog.array_to_string(ARRAY(SELECT " @@ -5926,7 +5926,7 @@ listForeignTables(const char *pattern, int verbose) gettext_noop("Table"), gettext_noop("Server")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\n CASE WHEN ftoptions IS NULL THEN '' ELSE " " '(' || pg_catalog.array_to_string(ARRAY(SELECT " @@ -5946,7 +5946,7 @@ listForeignTables(const char *pattern, int verbose) " ON n.oid = c.relnamespace\n" " INNER JOIN pg_catalog.pg_foreign_server s" " ON s.oid = ft.ftserver\n"); - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, " LEFT JOIN pg_catalog.pg_description d\n" " ON d.classoid = c.tableoid AND " @@ -6420,7 +6420,7 @@ describeSubscriptions(const char *pattern, int verbose) gettext_noop("Enabled"), gettext_noop("Publication")); - if (verbose) + if (verbose > 0) { /* Binary mode and streaming are only supported in v14 and higher */ if (pset.sversion >= 140000) @@ -6536,7 +6536,7 @@ listOperatorClasses(const char *access_method_pattern, gettext_noop("yes"), gettext_noop("no"), gettext_noop("Default?")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\n CASE\n" " WHEN pg_catalog.pg_opfamily_is_visible(of.oid)\n" @@ -6552,7 +6552,7 @@ listOperatorClasses(const char *access_method_pattern, " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.opcnamespace\n" " LEFT JOIN pg_catalog.pg_type t ON t.oid = c.opcintype\n" " LEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace\n"); - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = c.opcfamily\n" " LEFT JOIN pg_catalog.pg_namespace ofn ON ofn.oid = of.opfnamespace\n"); @@ -6620,7 +6620,7 @@ listOperatorFamilies(const char *access_method_pattern, gettext_noop("AM"), gettext_noop("Operator family"), gettext_noop("Applicable types")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ",\n pg_catalog.pg_get_userbyid(f.opfowner) AS \"%s\"\n", gettext_noop("Owner")); @@ -6710,7 +6710,7 @@ listOpFamilyOperators(const char *access_method_pattern, gettext_noop("search"), gettext_noop("Purpose")); - if (verbose) + if (verbose > 0) appendPQExpBuffer(&buf, ", ofs.opfname AS \"%s\"\n", gettext_noop("Sort opfamily")); @@ -6719,7 +6719,7 @@ listOpFamilyOperators(const char *access_method_pattern, " LEFT JOIN pg_catalog.pg_opfamily of ON of.oid = o.amopfamily\n" " LEFT JOIN pg_catalog.pg_am am ON am.oid = of.opfmethod AND am.oid = o.amopmethod\n" " LEFT JOIN pg_catalog.pg_namespace nsf ON of.opfnamespace = nsf.oid\n"); - if (verbose) + if (verbose > 0) appendPQExpBufferStr(&buf, " LEFT JOIN pg_catalog.pg_opfamily ofs ON ofs.oid = o.amopsortfamily\n"); @@ -6791,7 +6791,7 @@ listOpFamilyFunctions(const char *access_method_pattern, gettext_noop("Registered right type"), gettext_noop("Number")); - if (!verbose) + if (verbose == 0) appendPQExpBuffer(&buf, ", p.proname AS \"%s\"\n", gettext_noop("Function")); -- 2.17.0
>From 5339b8a9dd54874ee07c53877e9aee4eae744ddc Mon Sep 17 00:00:00 2001 From: Justin Pryzby <pryz...@telsasoft.com> Date: Thu, 15 Jul 2021 13:35:26 -0500 Subject: [PATCH v2 5/5] Move the double-plus verbose options to the right-most column --- src/bin/psql/describe.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 4d76f117c3..4304e0b890 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -263,16 +263,16 @@ describeTablespaces(const char *pattern, int verbose) ",\n spcoptions AS \"%s\"", gettext_noop("Options")); - if (verbose > 1 && pset.sversion >= 90200) - appendPQExpBuffer(&buf, - ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS \"%s\"", - gettext_noop("Size")); - if (verbose > 0 && pset.sversion >= 80200) appendPQExpBuffer(&buf, ",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"", gettext_noop("Description")); + if (verbose > 1 && pset.sversion >= 90200) + appendPQExpBuffer(&buf, + ",\n pg_catalog.pg_size_pretty(pg_catalog.pg_tablespace_size(oid)) AS \"%s\"", + gettext_noop("Size")); + appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_tablespace\n"); @@ -1046,13 +1046,7 @@ listAllDbs(const char *pattern, int verbose) gettext_noop("Ctype")); appendPQExpBufferStr(&buf, " "); printACLColumn(&buf, "d.datacl"); - if (verbose > 1 && pset.sversion >= 80200) - appendPQExpBuffer(&buf, - ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n" - " THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))\n" - " ELSE 'No Access'\n" - " END as \"%s\"", - gettext_noop("Size")); + if (verbose > 0 && pset.sversion >= 80000) appendPQExpBuffer(&buf, ",\n t.spcname as \"%s\"", @@ -1061,6 +1055,15 @@ listAllDbs(const char *pattern, int verbose) appendPQExpBuffer(&buf, ",\n pg_catalog.shobj_description(d.oid, 'pg_database') as \"%s\"", gettext_noop("Description")); + + if (verbose > 1 && pset.sversion >= 80200) + appendPQExpBuffer(&buf, + ",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n" + " THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))\n" + " ELSE 'No Access'\n" + " END as \"%s\"", + gettext_noop("Size")); + appendPQExpBufferStr(&buf, "\nFROM pg_catalog.pg_database d\n"); if (verbose > 0 && pset.sversion >= 80000) -- 2.17.0