Add display of oprcode (the underlying function's name) to psql's \do+.
authorTom Lane <[email protected]>
Thu, 16 Jan 2014 20:29:18 +0000 (15:29 -0500)
committerTom Lane <[email protected]>
Thu, 16 Jan 2014 20:29:33 +0000 (15:29 -0500)
The + modifier of \do didn't use to do anything, but now it adds an oprcode
column.  This is useful both as an additional form of documentation of what
the operator does, and to save a step when finding out properties of the
underlying function.

Marko Tiikkaja, reviewed by Rushabh Lathia, adjusted a bit by me

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

index c666f714c3b449329cec36e684e47ee22925c2c9..7ed20e4dd9adba314ec515ee12029486c498de6b 100644 (file)
@@ -1199,12 +1199,13 @@ testdb=&gt;
         <literal>n</>, <literal>t</>, or <literal>w</> to the command.
         If <replaceable
         class="parameter">pattern</replaceable> is specified, only
-        functions whose names match the pattern are shown.  If the
-        form <literal>\df+</literal> is used, additional information
-        about each function, including security, volatility, language, source
-        code and description, is shown.  By default, only user-created
+        functions whose names match the pattern are shown.
+        By default, only user-created
         objects are shown; supply a pattern or the <literal>S</literal>
         modifier to include system objects.
+        If the form <literal>\df+</literal> is used, additional information
+        about each function is shown, including security classification,
+        volatility, owner, language, source code and description.
         </para>
 
         <tip>
@@ -1337,15 +1338,18 @@ testdb=&gt;
 
 
       <varlistentry>
-        <term><literal>\do[S] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
+        <term><literal>\do[S+] [ <link linkend="APP-PSQL-patterns"><replaceable class="parameter">pattern</replaceable></link> ]</literal></term>
         <listitem>
         <para>
-        Lists operators with their operand and return types.
+        Lists operators with their operand and result types.
         If <replaceable class="parameter">pattern</replaceable> is
         specified, only operators whose names match the pattern are listed.
-        By default, only user-created objects are shown;  supply a
+        By default, only user-created objects are shown; supply a
         pattern or the <literal>S</literal> modifier to include system
         objects.
+        If <literal>+</literal> is appended to the command name,
+        additional information about each operator is shown, currently just
+        the name of the underlying function.
         </para>
         </listitem>
       </varlistentry>
index f8572951f18b113c19fe1603fb4e12502116e4c3..49f389071a16d86598248fd9fe3e2eb962bbdd05 100644 (file)
@@ -410,7 +410,7 @@ exec_command(const char *cmd,
                                success = listSchemas(pattern, show_verbose, show_system);
                                break;
                        case 'o':
-                               success = describeOperators(pattern, show_system);
+                               success = describeOperators(pattern, show_verbose, show_system);
                                break;
                        case 'O':
                                success = listCollations(pattern, show_verbose, show_system);
index dedb0362d6687cd9681e41d91ee8104b9f06c2f7..0d4b151679a3b1169824d892084cfd32c9e5b0f3 100644 (file)
@@ -577,9 +577,10 @@ describeTypes(const char *pattern, bool verbose, bool showSystem)
 
 
 /* \do
+ * Describe operators
  */
 bool
-describeOperators(const char *pattern, bool showSystem)
+describeOperators(const char *pattern, bool verbose, bool showSystem)
 {
        PQExpBufferData buf;
        PGresult   *res;
@@ -605,16 +606,23 @@ describeOperators(const char *pattern, bool showSystem)
                                          "  o.oprname AS \"%s\",\n"
                                          "  CASE WHEN o.oprkind='l' THEN NULL ELSE pg_catalog.format_type(o.oprleft, NULL) END AS \"%s\",\n"
                                          "  CASE WHEN o.oprkind='r' THEN NULL ELSE pg_catalog.format_type(o.oprright, NULL) END AS \"%s\",\n"
-                                  "  pg_catalog.format_type(o.oprresult, NULL) AS \"%s\",\n"
-                        "  coalesce(pg_catalog.obj_description(o.oid, 'pg_operator'),\n"
-       "           pg_catalog.obj_description(o.oprcode, 'pg_proc')) AS \"%s\"\n"
-                                         "FROM pg_catalog.pg_operator o\n"
-         "     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
+                                 "  pg_catalog.format_type(o.oprresult, NULL) AS \"%s\",\n",
                                          gettext_noop("Schema"),
                                          gettext_noop("Name"),
                                          gettext_noop("Left arg type"),
                                          gettext_noop("Right arg type"),
-                                         gettext_noop("Result type"),
+                                         gettext_noop("Result type"));
+
+       if (verbose)
+               appendPQExpBuffer(&buf,
+                                                 "  o.oprcode AS \"%s\",\n",
+                                                 gettext_noop("Function"));
+
+       appendPQExpBuffer(&buf,
+                        "  coalesce(pg_catalog.obj_description(o.oid, 'pg_operator'),\n"
+       "           pg_catalog.obj_description(o.oprcode, 'pg_proc')) AS \"%s\"\n"
+                                         "FROM pg_catalog.pg_operator o\n"
+         "     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace\n",
                                          gettext_noop("Description"));
 
        if (!showSystem && !pattern)
index 86b86f682899f5c343e9de90a1c8028d8e8133f2..491de920af610c689fb5331737e1248803f7c9c8 100644 (file)
@@ -22,7 +22,7 @@ extern bool describeFunctions(const char *functypes, const char *pattern, bool v
 extern bool describeTypes(const char *pattern, bool verbose, bool showSystem);
 
 /* \do */
-extern bool describeOperators(const char *pattern, bool showSystem);
+extern bool describeOperators(const char *pattern, bool verbose, bool showSystem);
 
 /* \du, \dg */
 extern bool describeRoles(const char *pattern, bool verbose);