diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 24e8ee0a36..ac351d32d4 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1264,7 +1264,7 @@ testdb=> \dL[S+] [ pattern ] - Lists all procedural languages. If pattern is specified, only languages whose names match the pattern are listed. By default, only user-created languages @@ -1311,7 +1311,6 @@ testdb=> \dO[S+] [ pattern ] - Lists collations. @@ -1320,8 +1319,11 @@ testdb=> listed. 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 + to the command name, each collation is listed with its associated description, if any. + Note that only collations usable with the current database's encoding + are shown, so the results may vary in different databases of the + same installation. diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 09a40093d1..a30eaeb10f 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2883,7 +2883,7 @@ listCasts(const char *pattern) /* * \dO * - * Describes collations + * Describes collations. */ bool listCollations(const char *pattern, bool verbose, bool showSystem) @@ -2907,17 +2907,25 @@ listCollations(const char *pattern, bool verbose, bool showSystem) if (verbose) appendPQExpBuffer(&buf, - ",\n pg_catalog.obj_description(c.oid, 'pg_collation') AS \"%s\"", + ",\n pg_catalog.obj_description(c.oid, 'pg_collation') AS \"%s\"", gettext_noop("Description")); appendPQExpBuffer(&buf, - "FROM pg_catalog.pg_collation c, pg_catalog.pg_namespace n\n" + "\nFROM pg_catalog.pg_collation c, pg_catalog.pg_namespace n\n" "WHERE n.oid = c.collnamespace\n"); if (!showSystem && !pattern) appendPQExpBuffer(&buf, " AND n.nspname <> 'pg_catalog'\n" " AND n.nspname <> 'information_schema'\n"); + /* + * Hide collations that aren't usable in the current database's encoding. + * If you think to change this, note that pg_collation_is_visible rejects + * unusable collations, so you will need to hack name pattern processing + * somehow to avoid inconsistent behavior. + */ + appendPQExpBuffer(&buf, " AND c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))\n"); + processSQLNamePattern(pset.db, &buf, pattern, true, false, "n.nspname", "c.collname", NULL, "pg_catalog.pg_collation_is_visible(c.oid)");