From 515d2c596c1b6b95d020d14edaab0d233d5d9ea9 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 16 Jan 2014 15:29:18 -0500 Subject: [PATCH] Add display of oprcode (the underlying function's name) to psql's \do+. 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 | 18 +++++++++++------- src/bin/psql/command.c | 2 +- src/bin/psql/describe.c | 22 +++++++++++++++------- src/bin/psql/describe.h | 2 +- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index c666f714c3..7ed20e4dd9 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1199,12 +1199,13 @@ testdb=> n, t, or w to the command. If pattern is specified, only - functions whose names match the pattern are shown. If the - form \df+ 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 S modifier to include system objects. + If the form \df+ is used, additional information + about each function is shown, including security classification, + volatility, owner, language, source code and description. @@ -1337,15 +1338,18 @@ testdb=> - \do[S] [ pattern ] + \do[S+] [ pattern ] - Lists operators with their operand and return types. + Lists operators with their operand and result types. If pattern 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 S modifier to include system objects. + If + is appended to the command name, + additional information about each operator is shown, currently just + the name of the underlying function. diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index f8572951f1..49f389071a 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -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); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index dedb0362d6..0d4b151679 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -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) diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 86b86f6828..491de920af 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -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);