From c9ac00e6ecfaad4d6a3e1ee478b912c7227ae62a Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Mon, 8 Aug 2011 12:26:13 -0400 Subject: [PATCH] Teach psql to display the comments on conversions and domains. \dc and \dD now accept a "+" option, which will cause the comments to be displayed. Along the way, correct a few oversights in the previous commit in this area, 3b17efdfdd846c9bfad1637686e6f18198ea3df5 - namely, (1) when \dL+ is used, make description still be the last column, for consistency with what we've done elsewhere; and (2) document the difference between \dC and \dC+. Josh Kupershmidt, with a couple of doc changes by me. --- doc/src/sgml/ref/psql-ref.sgml | 10 ++++- src/bin/psql/command.c | 4 +- src/bin/psql/describe.c | 68 ++++++++++++++++++++++++---------- src/bin/psql/describe.h | 4 +- src/bin/psql/help.c | 4 +- 5 files changed, 63 insertions(+), 27 deletions(-) diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index e2e2abe4d3..4a38d2afeb 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -954,7 +954,7 @@ testdb=> - \dc[S] [ pattern ] + \dc[S+] [ pattern ] Lists conversions between character-set encodings. @@ -964,6 +964,8 @@ testdb=> By default, only user-created objects are shown; supply a pattern or the S modifier to include system objects. + If + is appended to the command name, each object + is listed with its associated description. @@ -977,6 +979,8 @@ testdb=> If pattern is specified, only casts whose source or target types match the pattern are listed. + If + is appended to the command name, each object + is listed with its associated description. @@ -1038,7 +1042,7 @@ testdb=> - \dD[S] [ pattern ] + \dD[S+] [ pattern ] Lists domains. If S modifier to include system objects. + If + is appended to the command name, each object + is listed with its associated description. diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 84e031dd53..d6a925e435 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -378,7 +378,7 @@ exec_command(const char *cmd, success = describeTablespaces(pattern, show_verbose); break; case 'c': - success = listConversions(pattern, show_system); + success = listConversions(pattern, show_verbose, show_system); break; case 'C': success = listCasts(pattern, show_verbose); @@ -390,7 +390,7 @@ exec_command(const char *cmd, success = objectDescription(pattern, show_system); break; case 'D': - success = listDomains(pattern, show_system); + success = listDomains(pattern, show_verbose, show_system); break; case 'f': /* function subsystem */ switch (cmd[2]) diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index a8d5ddc96c..5587721ea8 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2665,10 +2665,8 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) gettext_noop("Owner")); appendPQExpBuffer(&buf, - " l.lanpltrusted AS \"%s\",\n" - " d.description AS \"%s\"", - gettext_noop("Trusted"), - gettext_noop("Description")); + " l.lanpltrusted AS \"%s\"", + gettext_noop("Trusted")); if (verbose) { @@ -2686,10 +2684,12 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) } appendPQExpBuffer(&buf, + ",\n d.description AS \"%s\"" "\nFROM pg_catalog.pg_language l\n" "LEFT JOIN pg_catalog.pg_description d\n" " ON d.classoid = l.tableoid AND d.objoid = l.oid\n" - " AND d.objsubid = 0\n"); + " AND d.objsubid = 0\n", + gettext_noop("Description")); if (pattern) processSQLNamePattern(pset.db, &buf, pattern, false, false, @@ -2723,7 +2723,7 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) * Describes domains. */ bool -listDomains(const char *pattern, bool showSystem) +listDomains(const char *pattern, bool verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -2746,17 +2746,30 @@ listDomains(const char *pattern, bool showSystem) appendPQExpBuffer(&buf, " CASE WHEN t.typnotnull THEN ' not null' ELSE '' END ||\n" " CASE WHEN t.typdefault IS NOT NULL THEN ' default ' || t.typdefault ELSE '' END\n" - " ) as \"%s\",\n", - gettext_noop("Modifier")); - appendPQExpBuffer(&buf, + " ) as \"%s\",\n" " pg_catalog.array_to_string(ARRAY(\n" " SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM pg_catalog.pg_constraint r WHERE t.oid = r.contypid\n" - " ), ' ') as \"%s\"\n" - "FROM pg_catalog.pg_type t\n" - " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n" - "WHERE t.typtype = 'd'\n", + " ), ' ') as \"%s\"", + gettext_noop("Modifier"), gettext_noop("Check")); + if (verbose) + appendPQExpBuffer(&buf, + ",\n d.description as \"%s\"", + gettext_noop("Description")); + + appendPQExpBuffer(&buf, + "\nFROM pg_catalog.pg_type t\n" + " LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n"); + + if (verbose) + appendPQExpBuffer(&buf, + " LEFT JOIN pg_catalog.pg_description d " + "ON d.classoid = t.tableoid AND d.objoid = t.oid " + "AND d.objsubid = 0\n"); + + appendPQExpBuffer(&buf, "WHERE t.typtype = 'd'\n"); + if (!showSystem && !pattern) appendPQExpBuffer(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); @@ -2788,7 +2801,7 @@ listDomains(const char *pattern, bool showSystem) * Describes conversions. */ bool -listConversions(const char *pattern, bool showSystem) +listConversions(const char *pattern, bool verbose, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -2803,9 +2816,7 @@ listConversions(const char *pattern, bool showSystem) " pg_catalog.pg_encoding_to_char(c.conforencoding) AS \"%s\",\n" " pg_catalog.pg_encoding_to_char(c.contoencoding) AS \"%s\",\n" " CASE WHEN c.condefault THEN '%s'\n" - " ELSE '%s' END AS \"%s\"\n" - "FROM pg_catalog.pg_conversion c, pg_catalog.pg_namespace n\n" - "WHERE n.oid = c.connamespace\n", + " ELSE '%s' END AS \"%s\"", gettext_noop("Schema"), gettext_noop("Name"), gettext_noop("Source"), @@ -2813,9 +2824,28 @@ listConversions(const char *pattern, bool showSystem) gettext_noop("yes"), gettext_noop("no"), gettext_noop("Default?")); + if (verbose) + appendPQExpBuffer(&buf, + ",\n d.description AS \"%s\"", + gettext_noop("Description")); + + appendPQExpBuffer(&buf, + "\nFROM pg_catalog.pg_conversion c\n" + " JOIN pg_catalog.pg_namespace n " + "ON n.oid = c.connamespace\n"); + + if (verbose) + appendPQExpBuffer(&buf, + "LEFT JOIN pg_catalog.pg_description d " + "ON d.classoid = c.tableoid\n" + " AND d.objoid = c.oid " + "AND d.objsubid = 0\n"); + + appendPQExpBuffer(&buf, "WHERE true\n"); + if (!showSystem && !pattern) - appendPQExpBuffer(&buf, " AND n.nspname <> 'pg_catalog'\n" - " AND n.nspname <> 'information_schema'\n"); + appendPQExpBuffer(&buf, " AND n.nspname <> 'pg_catalog'\n" + " AND n.nspname <> 'information_schema'\n"); processSQLNamePattern(pset.db, &buf, pattern, true, false, "n.nspname", "c.conname", NULL, diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 7dc9a2c154..bf4c31265e 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -61,10 +61,10 @@ extern bool listAllDbs(bool verbose); extern bool listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSystem); /* \dD */ -extern bool listDomains(const char *pattern, bool showSystem); +extern bool listDomains(const char *pattern, bool verbose, bool showSystem); /* \dc */ -extern bool listConversions(const char *pattern, bool showSystem); +extern bool listConversions(const char *pattern, bool verbose, bool showSystem); /* \dC */ extern bool listCasts(const char *pattern, bool verbose); diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index d3b8c170fa..b99ba3acfb 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -195,11 +195,11 @@ slashUsage(unsigned short int pager) fprintf(output, _(" \\d[S+] NAME describe table, view, sequence, or index\n")); fprintf(output, _(" \\da[S] [PATTERN] list aggregates\n")); fprintf(output, _(" \\db[+] [PATTERN] list tablespaces\n")); - fprintf(output, _(" \\dc[S] [PATTERN] list conversions\n")); + fprintf(output, _(" \\dc[S+] [PATTERN] list conversions\n")); fprintf(output, _(" \\dC[+] [PATTERN] list casts\n")); fprintf(output, _(" \\dd[S] [PATTERN] show comments on objects\n")); fprintf(output, _(" \\ddp [PATTERN] list default privileges\n")); - fprintf(output, _(" \\dD[S] [PATTERN] list domains\n")); + fprintf(output, _(" \\dD[S+] [PATTERN] list domains\n")); fprintf(output, _(" \\det[+] [PATTERN] list foreign tables\n")); fprintf(output, _(" \\des[+] [PATTERN] list foreign servers\n")); fprintf(output, _(" \\deu[+] [PATTERN] list user mappings\n")); -- 2.40.0