On Tue, Jan 18, 2011 at 1:35 PM, Andreas Karlsson <andr...@proxel.se> wrote:
> Hi Josh,
>
> Nope, I do not have any better ideas than "DO Blocks?".
>
> Everything looks good with the exception one bug now.
>
> \dL foo
> ********* QUERY **********
> SELECT l.lanname AS "Name",
>       pg_catalog.pg_get_userbyid(l.lanowner) as "\Owner",
>       l.lanpltrusted AS "Trusted"
> FROM pg_catalog.pg_language lWHERE l.lanname ~ '^(foo)$'
>
> ORDER BY 1;
> **************************
>
> ERROR:  syntax error at or near "l"
> LINE 4: FROM pg_catalog.pg_language lWHERE l.lanname ~ '^(foo)$'
>
>
> I believe the fix is to move \n from before the WHERE clause to after
> the FROM, and from before ORDER BY to after WHERE.

Whoops, good you caught that. Should be fixed now.

> Fix this bug and I believe this patch is ready for a committer.
>
> PS. You added some trailing withspace after printACLColumn, A
> recommendation if you want to avoid it is to either have a git commit
> hook which checks for that and/or have colouring of git diffs so you can
> see it marked in red. I use both. :)

Got that now too. I lost my ~/.emacs file recently, which is mostly
why I'm making whitespace mistakes. Rebuilding slowly though;
(setq-default show-trailing-whitespace t) is what I needed.

I left the "Call Handler" and "Validator" columns in the verbose
output since I haven't heard otherwise.

Josh
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 5f61561..30d4507 100644
*** a/doc/src/sgml/ref/psql-ref.sgml
--- b/doc/src/sgml/ref/psql-ref.sgml
*************** testdb=&gt;
*** 1249,1254 ****
--- 1249,1269 ----
          </listitem>
        </varlistentry>
  
+       <varlistentry>
+         <term><literal>\dL[S+] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
+         <listitem>
+         <para>
+         Lists all procedural languages. If <replaceable
+         class="parameter">pattern</replaceable>
+         is specified, only languages whose names match the pattern are listed.
+         By default, only user-created languages
+         are shown; supply the <literal>S</literal> modifier to include system
+         objects. If <literal>+</literal> is appended to the command name, each
+         language is listed with its call handler, validator, access privileges,
+         and whether it is a system object.
+         </para>
+         </listitem>
+       </varlistentry>
  
        <varlistentry>
          <term><literal>\dn[S+] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 962c13c..301dc11 100644
*** a/src/bin/psql/command.c
--- b/src/bin/psql/command.c
*************** exec_command(const char *cmd,
*** 416,421 ****
--- 416,424 ----
  			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 205190f..abfd854 100644
*** a/src/bin/psql/describe.c
--- b/src/bin/psql/describe.c
*************** listTables(const char *tabtypes, const c
*** 2566,2571 ****
--- 2566,2638 ----
  }
  
  
+ /* \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       l.lanplcallfoid::regprocedure AS \"%s\",\n"
+ 							  "       l.lanvalidator::regprocedure AS \"%s\",\n"
+ 							  "       NOT l.lanispl AS \"%s\",\n       ",
+ 							  gettext_noop("Call Handler"),
+ 							  gettext_noop("Validator"),
+ 							  gettext_noop("System Language"));
+ 			if (pset.sversion >= 90000)
+ 				appendPQExpBuffer(&buf, "l.laninline != 0 AS \"%s\",\n       ",
+ 								  gettext_noop("DO Blocks?"));
+ 			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 2029ef8..4e80bcf 100644
*** a/src/bin/psql/describe.h
--- b/src/bin/psql/describe.h
*************** extern bool listUserMappings(const char
*** 84,88 ****
--- 84,90 ----
  /* \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 96c85a2..bd5c4b7 100644
*** a/src/bin/psql/help.c
--- b/src/bin/psql/help.c
*************** slashUsage(unsigned short int pager)
*** 211,216 ****
--- 211,217 ----
  	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 8c15838..84c68a7 100644
*** a/src/bin/psql/tab-complete.c
--- b/src/bin/psql/tab-complete.c
*************** psql_completion(char *text, int start, i
*** 713,719 ****
  	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",
  		"\\dn", "\\do", "\\dp", "\\drds", "\\ds", "\\dS", "\\dt", "\\dT", "\\dv", "\\du",
  		"\\e", "\\echo", "\\ef", "\\encoding",
  		"\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l",
--- 713,719 ----
  	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", "\\dL",
  		"\\dn", "\\do", "\\dp", "\\drds", "\\ds", "\\dS", "\\dt", "\\dT", "\\dv", "\\du",
  		"\\e", "\\echo", "\\ef", "\\encoding",
  		"\\f", "\\g", "\\h", "\\help", "\\H", "\\i", "\\l",
*************** psql_completion(char *text, int start, i
*** 2680,2685 ****
--- 2680,2687 ----
  
  	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
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to