On Mon, Jul 11, 2016 at 12:42 AM, Tom Lane <[email protected]> wrote:
> If we're keeping the "Source code" column, I'd be inclined to keep
> "Language" adjacent to that. When thinking of a function as a black
> box, both language and source code are implementation details; but
> all the other properties listed here are of interest anyway.
OK, no objections to that. And this gives the attached.
> (Of course, if we were to get rid of "Source code", the point
> would be moot ...)
I still think that having source code is useful for debugging, so I
left it out. Note for the committer who will perhaps pick up this
patch: I left out "Source Code", but feel free to remove it if you
think the contrary. It is easier to remove code than adding it back.
--
Michael
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index aeffd63..e7bd2d7 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -1380,8 +1380,9 @@ testdb=>
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.
+ about each function is shown, including language, volatility,
+ parallel mode, owner, security classification, access privileges,
+ source code and description.
</para>
<tip>
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index 2cdc5ac..8559b68 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -298,7 +298,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
PQExpBufferData buf;
PGresult *res;
printQueryOpt myopt = pset.popt;
- static const bool translate_columns[] = {false, false, false, false, true, true, true, false, false, false, false};
+ static const bool translate_columns[] = {false, false, false, false, true, true, false, false, true, false, false, true, false};
if (strlen(functypes) != strspn(functypes, "antwS+"))
{
@@ -410,28 +410,42 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
gettext_noop("Type"));
if (verbose)
+ {
appendPQExpBuffer(&buf,
- ",\n CASE WHEN prosecdef THEN '%s' ELSE '%s' END AS \"%s\""
",\n CASE\n"
" WHEN p.provolatile = 'i' THEN '%s'\n"
" WHEN p.provolatile = 's' THEN '%s'\n"
" WHEN p.provolatile = 'v' THEN '%s'\n"
" END as \"%s\""
- ",\n pg_catalog.pg_get_userbyid(p.proowner) as \"%s\",\n"
- " l.lanname as \"%s\",\n"
- " p.prosrc as \"%s\",\n"
- " pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"",
- gettext_noop("definer"),
- gettext_noop("invoker"),
- gettext_noop("Security"),
+ ",\n CASE\n"
+ " WHEN p.proparallel = 'r' THEN '%s'\n"
+ " WHEN p.proparallel = 's' THEN '%s'\n"
+ " WHEN p.proparallel = 'u' THEN '%s'\n"
+ " END as \"%s\""
+ ",\n pg_catalog.pg_get_userbyid(p.proowner) as \"%s\""
+ ",\n CASE WHEN prosecdef THEN '%s' ELSE '%s' END AS \"%s\"",
gettext_noop("immutable"),
gettext_noop("stable"),
gettext_noop("volatile"),
gettext_noop("Volatility"),
+ gettext_noop("restricted"),
+ gettext_noop("safe"),
+ gettext_noop("unsafe"),
+ gettext_noop("Parallel"),
gettext_noop("Owner"),
+ gettext_noop("definer"),
+ gettext_noop("invoker"),
+ gettext_noop("Security"));
+ appendPQExpBufferStr(&buf, ",\n ");
+ printACLColumn(&buf, "p.proacl");
+ appendPQExpBuffer(&buf,
+ ",\n l.lanname as \"%s\""
+ ",\n p.prosrc as \"%s\""
+ ",\n pg_catalog.obj_description(p.oid, 'pg_proc') as \"%s\"",
gettext_noop("Language"),
gettext_noop("Source code"),
gettext_noop("Description"));
+ }
appendPQExpBufferStr(&buf,
"\nFROM pg_catalog.pg_proc p"
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers