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"));