Fix psql to support \dec command, which shows list of foreign table
authorShigeru Hanada <hanada@metrosystems.co.jp>
Fri, 3 Jun 2011 06:40:27 +0000 (15:40 +0900)
committerShigeru Hanada <shigeru.hanada@gmail.com>
Mon, 20 Jun 2011 04:32:02 +0000 (13:32 +0900)
columns.

doc/src/sgml/ref/psql-ref.sgml
src/bin/psql/command.c
src/bin/psql/describe.c
src/bin/psql/describe.h
src/bin/psql/help.c

index 132a7b354b625826c2f5769cc3ab14bfecfa9d8f..ff09e88bbcea09c6f6252e64ba05bd8cebd3c41d 100644 (file)
@@ -1108,6 +1108,20 @@ testdb=&gt;
       </varlistentry>
 
 
+      <varlistentry>
+        <term><literal>\dec[+] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
+        <listitem>
+        <para>
+        Lists foreign table columns (mnemonic: <quote>external columns</quote>).
+        If <replaceable class="parameter">pattern</replaceable> is
+        specified, only entries whose table name or schema name matches
+        the pattern are listed.  If the form <literal>\dec+</literal>
+        is used, generic options are also displayed.
+        </para>
+        </listitem>
+      </varlistentry>
+
+
       <varlistentry>
         <term><literal>\deu[+] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
         <listitem>
index 378330b96aedc0dc38434526b37d90b0d2c49cc8..bd1ec80bae4b51b0d3f2c5d820cf5499390f97f6 100644 (file)
@@ -493,6 +493,9 @@ exec_command(const char *cmd,
                    case 't':
                        success = listForeignTables(pattern, show_verbose);
                        break;
+                   case 'c':
+                       success = listForeignTableColumns(pattern, show_verbose);
+                       break;
                    default:
                        status = PSQL_CMD_UNKNOWN;
                        break;
index 7f9e1fe8440150476def4eff95e273b143c1ac17..1008c035d668beff35ee20e66654b829dd50a76f 100644 (file)
@@ -3823,6 +3823,73 @@ listForeignTables(const char *pattern, bool verbose)
    return true;
 }
 
+/*
+ * \dec
+ *
+ * Describes foreign table columns.
+ */
+bool
+listForeignTableColumns(const char *pattern, bool verbose)
+{
+   PQExpBufferData buf;
+   PGresult   *res;
+   printQueryOpt myopt = pset.popt;
+
+   /* FIXME should be modified to 90200 before posting patch */
+   if (pset.sversion < 90100)
+   {
+       fprintf(stderr, _("The server (version %d.%d) does not support foreign table column options.\n"),
+               pset.sversion / 10000, (pset.sversion / 100) % 100);
+       return true;
+   }
+
+   initPQExpBuffer(&buf);
+   printfPQExpBuffer(&buf,
+                     "SELECT n.nspname AS \"%s\",\n"
+                     "  c.relname AS \"%s\",\n"
+                     "  a.attname AS \"%s\","
+                     "  s.srvname AS \"%s\"",
+                     gettext_noop("Schema"),
+                     gettext_noop("Table"),
+                     gettext_noop("Column"),
+                     gettext_noop("Server"));
+
+   if (verbose)
+       appendPQExpBuffer(&buf,
+                         ",\n  a.attfdwoptions AS \"%s\"",
+                         gettext_noop("Options"));
+
+   appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_foreign_table ft,");
+   appendPQExpBuffer(&buf, "\n pg_catalog.pg_class c,");
+   appendPQExpBuffer(&buf, "\n pg_catalog.pg_namespace n,");
+   appendPQExpBuffer(&buf, "\n pg_catalog.pg_foreign_server s,");
+   appendPQExpBuffer(&buf, "\n pg_catalog.pg_attribute a\n");
+   appendPQExpBuffer(&buf, "\nWHERE c.oid = ft.ftrelid");
+   appendPQExpBuffer(&buf, "\nAND s.oid = ft.ftserver\n");
+   appendPQExpBuffer(&buf, "\nAND n.oid = c.relnamespace\n");
+   appendPQExpBuffer(&buf, "\nAND a.attrelid= c.oid\n");
+   appendPQExpBuffer(&buf, "\nAND a.attnum > 0\n");
+
+   processSQLNamePattern(pset.db, &buf, pattern, true, false,
+                         NULL, "n.nspname", "c.relname", NULL);
+
+   appendPQExpBuffer(&buf, "ORDER BY 1, 2, a.attnum;");
+
+   res = PSQLexec(buf.data, false);
+   termPQExpBuffer(&buf);
+   if (!res)
+       return false;
+
+   myopt.nullPrint = NULL;
+   myopt.title = _("List of foreign table columns");
+   myopt.translate_header = true;
+
+   printQuery(res, &myopt, pset.queryFout, pset.logfile);
+
+   PQclear(res);
+   return true;
+}
+
 /*
  * \dx
  *
index fb86d1e487d98e9e55bce8a01ae112f7be70d03d..b6bc472cee2de873e1fe821af69b82a803de678c 100644 (file)
@@ -87,6 +87,9 @@ extern bool listUserMappings(const char *pattern, bool verbose);
 /* \det */
 extern bool listForeignTables(const char *pattern, bool verbose);
 
+/* \dec */
+extern bool listForeignTableColumns(const char *pattern, bool verbose);
+
 /* \dL */
 extern bool listLanguages(const char *pattern, bool verbose, bool showSystem);
 
index ac5edca65dd42a37531f8d8bf84afdbcaae33eda..0c8d011f0ffe7da7a4a38a86169fbdc62fa56a14 100644 (file)
@@ -200,6 +200,7 @@ slashUsage(unsigned short int pager)
    fprintf(output, _("  \\ddp    [PATTERN]      list default privileges\n"));
    fprintf(output, _("  \\dD[S]  [PATTERN]      list domains\n"));
    fprintf(output, _("  \\det[+] [PATTERN]      list foreign tables\n"));
+   fprintf(output, _("  \\dec[+] [PATTERN]      list foreign table columns\n"));
    fprintf(output, _("  \\des[+] [PATTERN]      list foreign servers\n"));
    fprintf(output, _("  \\deu[+] [PATTERN]      list user mappings\n"));
    fprintf(output, _("  \\dew[+] [PATTERN]      list foreign-data wrappers\n"));