From 9c5e2c120be42fbd1a743ddf539ff451e1cce23b Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Thu, 20 Jan 2011 00:00:30 -0500 Subject: [PATCH] Add new psql command \dL to list languages. Original patch by Fernando Ike, revived by Josh Kuperschmidt, reviewed by Andreas Karlsson, and in earlier versions by Tom Lane and Peter Eisentraut. --- doc/src/sgml/ref/psql-ref.sgml | 15 ++++++++ src/bin/psql/command.c | 3 ++ src/bin/psql/describe.c | 68 ++++++++++++++++++++++++++++++++++ src/bin/psql/describe.h | 2 + src/bin/psql/help.c | 1 + src/bin/psql/tab-complete.c | 4 +- 6 files changed, 92 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 5f61561eea..30d4507eb3 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1249,6 +1249,21 @@ 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 + are shown; supply the S modifier to include system + objects. If + is appended to the command name, each + language is listed with its call handler, validator, access privileges, + and whether it is a system object. + + + \dn[S+] [ pattern ] diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 962c13c136..301dc11bcc 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -416,6 +416,9 @@ exec_command(const char *cmd, case 'l': success = do_lo_list(); break; + case 'L': + success = listLanguages(pattern, show_verbose, show_system); + break; case 'n': success = listSchemas(pattern, show_verbose, show_system); break; diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 205190f729..e9436f862a 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2566,6 +2566,74 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys } +/* + * \dL + * + * Describes languages. + */ +bool +listLanguages(const char *pattern, bool verbose, bool showSystem) +{ + PQExpBufferData buf; + PGresult *res; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + + printfPQExpBuffer(&buf, + "SELECT l.lanname AS \"%s\",\n", + gettext_noop("Name")); + if (pset.sversion >= 80300) + appendPQExpBuffer(&buf, + " pg_catalog.pg_get_userbyid(l.lanowner) as \"%s\",\n", + gettext_noop("Owner")); + + appendPQExpBuffer(&buf, + " l.lanpltrusted AS \"%s\"", + gettext_noop("Trusted")); + + if (verbose) + { + appendPQExpBuffer(&buf, + ",\n NOT l.lanispl AS \"%s\",\n" + " l.lanplcallfoid::regprocedure AS \"%s\",\n" + " l.lanvalidator::regprocedure AS \"%s\",\n ", + gettext_noop("Internal Language"), + gettext_noop("Call Handler"), + gettext_noop("Validator")); + if (pset.sversion >= 90000) + appendPQExpBuffer(&buf, "l.laninline::regprocedure AS \"%s\",\n ", + gettext_noop("Inline Handler")); + printACLColumn(&buf, "l.lanacl"); + } + + appendPQExpBuffer(&buf, + "\nFROM pg_catalog.pg_language l\n"); + + processSQLNamePattern(pset.db, &buf, pattern, false, false, + NULL, "l.lanname", NULL, NULL); + + if (!showSystem && !pattern) + appendPQExpBuffer(&buf, "WHERE lanplcallfoid != 0\n"); + + appendPQExpBuffer(&buf, "ORDER BY 1;"); + + res = PSQLexec(buf.data, false); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.nullPrint = NULL; + myopt.title = _("List of languages"); + myopt.translate_header = true; + + printQuery(res, &myopt, pset.queryFout, pset.logfile); + + PQclear(res); + return true; +} + + /* * \dD * diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 2029ef848d..4e80bcf41f 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -84,5 +84,7 @@ extern bool listUserMappings(const char *pattern, bool verbose); /* \det */ extern bool listForeignTables(const char *pattern, bool verbose); +/* \dL */ +extern bool listLanguages(const char *pattern, bool verbose, bool showSystem); #endif /* DESCRIBE_H */ diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 96c85a25d6..bd5c4b767b 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -211,6 +211,7 @@ slashUsage(unsigned short int pager) fprintf(output, _(" \\dg[+] [PATTERN] list roles\n")); fprintf(output, _(" \\di[S+] [PATTERN] list indexes\n")); fprintf(output, _(" \\dl list large objects, same as \\lo_list\n")); + fprintf(output, _(" \\dL[S+] [PATTERN] list procedural languages\n")); fprintf(output, _(" \\dn[+] [PATTERN] list schemas\n")); fprintf(output, _(" \\do[S] [PATTERN] list operators\n")); fprintf(output, _(" \\dp [PATTERN] list table, view, and sequence access privileges\n")); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 8c15838555..84c68a7bff 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -713,7 +713,7 @@ psql_completion(char *text, int start, int end) static const char *const backslash_commands[] = { "\\a", "\\connect", "\\conninfo", "\\C", "\\cd", "\\copy", "\\copyright", "\\d", "\\da", "\\db", "\\dc", "\\dC", "\\dd", "\\dD", "\\des", "\\det", "\\deu", "\\dew", "\\df", - "\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", + "\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL", "\\dn", "\\do", "\\dp", "\\drds", "\\ds", "\\dS", "\\dt", "\\dT", "\\dv", "\\du", "\\e", "\\echo", "\\ef", "\\encoding", "\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l", @@ -2680,6 +2680,8 @@ psql_completion(char *text, int start, int end) else if (strncmp(prev_wd, "\\di", strlen("\\di")) == 0) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + else if (strncmp(prev_wd, "\\dL", strlen("\\dL")) == 0) + COMPLETE_WITH_QUERY(Query_for_list_of_languages); else if (strncmp(prev_wd, "\\dn", strlen("\\dn")) == 0) COMPLETE_WITH_QUERY(Query_for_list_of_schemas); else if (strncmp(prev_wd, "\\dp", strlen("\\dp")) == 0