mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-04 23:56:51 +02:00
Consistently use multi-line formatting for all ACL columns printed by psql's
various display commands, not only for \z. In passing, fix some infelicities in the newly added \d commands for SQL-MED catalogs. Andreas Scherbaum and Tom Lane
This commit is contained in:
parent
26ce4e85a1
commit
6672daace1
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
* Copyright (c) 2000-2008, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.190 2008/12/19 16:25:18 petere Exp $
|
* $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.191 2008/12/31 18:07:47 tgl Exp $
|
||||||
*/
|
*/
|
||||||
#include "postgres_fe.h"
|
#include "postgres_fe.h"
|
||||||
|
|
||||||
@ -37,6 +37,7 @@ static bool listTSConfigsVerbose(const char *pattern);
|
|||||||
static bool describeOneTSConfig(const char *oid, const char *nspname,
|
static bool describeOneTSConfig(const char *oid, const char *nspname,
|
||||||
const char *cfgname,
|
const char *cfgname,
|
||||||
const char *pnspname, const char *prsname);
|
const char *pnspname, const char *prsname);
|
||||||
|
static void printACLColumn(PQExpBuffer buf, const char *colname);
|
||||||
|
|
||||||
|
|
||||||
/*----------------
|
/*----------------
|
||||||
@ -142,9 +143,11 @@ describeTablespaces(const char *pattern, bool verbose)
|
|||||||
gettext_noop("Location"));
|
gettext_noop("Location"));
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
appendPQExpBuffer(&buf,
|
{
|
||||||
",\n spcacl AS \"%s\"",
|
appendPQExpBuffer(&buf, ",\n ");
|
||||||
gettext_noop("Access privileges"));
|
printACLColumn(&buf, "spcacl");
|
||||||
|
}
|
||||||
|
|
||||||
if (verbose && pset.sversion >= 80200)
|
if (verbose && pset.sversion >= 80200)
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf,
|
||||||
",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"",
|
",\n pg_catalog.shobj_description(oid, 'pg_tablespace') AS \"%s\"",
|
||||||
@ -464,9 +467,8 @@ listAllDbs(bool verbose)
|
|||||||
" d.datctype as \"%s\",\n",
|
" d.datctype as \"%s\",\n",
|
||||||
gettext_noop("Collation"),
|
gettext_noop("Collation"),
|
||||||
gettext_noop("Ctype"));
|
gettext_noop("Ctype"));
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf, " ");
|
||||||
" d.datacl as \"%s\"",
|
printACLColumn(&buf, "d.datacl");
|
||||||
gettext_noop("Access Privileges"));
|
|
||||||
if (verbose && pset.sversion >= 80200)
|
if (verbose && pset.sversion >= 80200)
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf,
|
||||||
",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n"
|
",\n CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')\n"
|
||||||
@ -524,20 +526,14 @@ permissionsList(const char *pattern)
|
|||||||
printfPQExpBuffer(&buf,
|
printfPQExpBuffer(&buf,
|
||||||
"SELECT n.nspname as \"%s\",\n"
|
"SELECT n.nspname as \"%s\",\n"
|
||||||
" c.relname as \"%s\",\n"
|
" c.relname as \"%s\",\n"
|
||||||
" CASE c.relkind WHEN 'r' THEN '%s' WHEN 'v' THEN '%s' WHEN 'S' THEN '%s' END as \"%s\",\n",
|
" CASE c.relkind WHEN 'r' THEN '%s' WHEN 'v' THEN '%s' WHEN 'S' THEN '%s' END as \"%s\",\n"
|
||||||
|
" ",
|
||||||
gettext_noop("Schema"),
|
gettext_noop("Schema"),
|
||||||
gettext_noop("Name"),
|
gettext_noop("Name"),
|
||||||
gettext_noop("table"), gettext_noop("view"), gettext_noop("sequence"),
|
gettext_noop("table"), gettext_noop("view"), gettext_noop("sequence"),
|
||||||
gettext_noop("Type"));
|
gettext_noop("Type"));
|
||||||
|
printACLColumn(&buf, "c.relacl");
|
||||||
if (pset.sversion >= 80100)
|
appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_class c\n"
|
||||||
appendPQExpBuffer(&buf, " pg_catalog.array_to_string(c.relacl, E'\\n') as \"%s\"\n",
|
|
||||||
gettext_noop("Access privileges"));
|
|
||||||
else
|
|
||||||
appendPQExpBuffer(&buf, " pg_catalog.array_to_string(c.relacl, '\\n') as \"%s\"\n",
|
|
||||||
gettext_noop("Access privileges"));
|
|
||||||
|
|
||||||
appendPQExpBuffer(&buf, "FROM pg_catalog.pg_class c\n"
|
|
||||||
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
|
" LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n"
|
||||||
"WHERE c.relkind IN ('r', 'v', 'S')\n");
|
"WHERE c.relkind IN ('r', 'v', 'S')\n");
|
||||||
|
|
||||||
@ -2188,11 +2184,13 @@ listSchemas(const char *pattern, bool verbose)
|
|||||||
gettext_noop("Owner"));
|
gettext_noop("Owner"));
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
|
{
|
||||||
|
appendPQExpBuffer(&buf, ",\n ");
|
||||||
|
printACLColumn(&buf, "n.nspacl");
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf,
|
||||||
",\n n.nspacl as \"%s\","
|
",\n pg_catalog.obj_description(n.oid, 'pg_namespace') AS \"%s\"",
|
||||||
" pg_catalog.obj_description(n.oid, 'pg_namespace') as \"%s\"",
|
|
||||||
gettext_noop("Access privileges"),
|
|
||||||
gettext_noop("Description"));
|
gettext_noop("Description"));
|
||||||
|
}
|
||||||
|
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf,
|
||||||
"\nFROM pg_catalog.pg_namespace n\n"
|
"\nFROM pg_catalog.pg_namespace n\n"
|
||||||
@ -2803,21 +2801,23 @@ listForeignDataWrappers(const char *pattern, bool verbose)
|
|||||||
printfPQExpBuffer(&buf,
|
printfPQExpBuffer(&buf,
|
||||||
"SELECT fdwname AS \"%s\",\n"
|
"SELECT fdwname AS \"%s\",\n"
|
||||||
" pg_catalog.pg_get_userbyid(fdwowner) AS \"%s\",\n"
|
" pg_catalog.pg_get_userbyid(fdwowner) AS \"%s\",\n"
|
||||||
" fdwlibrary AS \"%s\"\n",
|
" fdwlibrary AS \"%s\"",
|
||||||
gettext_noop("Name"),
|
gettext_noop("Name"),
|
||||||
gettext_noop("Owner"),
|
gettext_noop("Owner"),
|
||||||
gettext_noop("Library"));
|
gettext_noop("Library"));
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
|
{
|
||||||
|
appendPQExpBuffer(&buf, ",\n ");
|
||||||
|
printACLColumn(&buf, "fdwacl");
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf,
|
||||||
",\n fdwacl AS \"%s\","
|
",\n fdwoptions AS \"%s\"",
|
||||||
" fdwoptions AS \"%s\"",
|
|
||||||
gettext_noop("Access privileges"),
|
|
||||||
gettext_noop("Options"));
|
gettext_noop("Options"));
|
||||||
|
}
|
||||||
|
|
||||||
appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_foreign_data_wrapper WHERE 1=1\n");
|
appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_foreign_data_wrapper\n");
|
||||||
|
|
||||||
processSQLNamePattern(pset.db, &buf, pattern, true, false,
|
processSQLNamePattern(pset.db, &buf, pattern, false, false,
|
||||||
NULL, "fdwname", NULL, NULL);
|
NULL, "fdwname", NULL, NULL);
|
||||||
|
|
||||||
appendPQExpBuffer(&buf, "ORDER BY 1;");
|
appendPQExpBuffer(&buf, "ORDER BY 1;");
|
||||||
@ -2840,7 +2840,7 @@ listForeignDataWrappers(const char *pattern, bool verbose)
|
|||||||
/*
|
/*
|
||||||
* \des
|
* \des
|
||||||
*
|
*
|
||||||
* Describes servers.
|
* Describes foreign-data servers.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
listForeignServers(const char *pattern, bool verbose)
|
listForeignServers(const char *pattern, bool verbose)
|
||||||
@ -2853,27 +2853,30 @@ listForeignServers(const char *pattern, bool verbose)
|
|||||||
printfPQExpBuffer(&buf,
|
printfPQExpBuffer(&buf,
|
||||||
"SELECT s.srvname AS \"%s\",\n"
|
"SELECT s.srvname AS \"%s\",\n"
|
||||||
" pg_catalog.pg_get_userbyid(s.srvowner) AS \"%s\",\n"
|
" pg_catalog.pg_get_userbyid(s.srvowner) AS \"%s\",\n"
|
||||||
" f.fdwname AS \"%s\"\n",
|
" f.fdwname AS \"%s\"",
|
||||||
gettext_noop("Name"),
|
gettext_noop("Name"),
|
||||||
gettext_noop("Owner"),
|
gettext_noop("Owner"),
|
||||||
gettext_noop("Foreign-data wrapper"));
|
gettext_noop("Foreign-data wrapper"));
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
|
{
|
||||||
|
appendPQExpBuffer(&buf, ",\n ");
|
||||||
|
printACLColumn(&buf, "s.srvacl");
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf,
|
||||||
",\n s.srvacl AS \"%s\","
|
",\n"
|
||||||
" s.srvtype AS \"%s\","
|
" s.srvtype AS \"%s\",\n"
|
||||||
" s.srvversion AS \"%s\","
|
" s.srvversion AS \"%s\",\n"
|
||||||
" s.srvoptions AS \"%s\"",
|
" s.srvoptions AS \"%s\"",
|
||||||
gettext_noop("Access privileges"),
|
|
||||||
gettext_noop("Type"),
|
gettext_noop("Type"),
|
||||||
gettext_noop("Version"),
|
gettext_noop("Version"),
|
||||||
gettext_noop("Options"));
|
gettext_noop("Options"));
|
||||||
|
}
|
||||||
|
|
||||||
appendPQExpBuffer(&buf,
|
appendPQExpBuffer(&buf,
|
||||||
"\nFROM pg_foreign_server s\n"
|
"\nFROM pg_catalog.pg_foreign_server s\n"
|
||||||
" JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid=s.srvfdw\n");
|
" JOIN pg_catalog.pg_foreign_data_wrapper f ON f.oid=s.srvfdw\n");
|
||||||
|
|
||||||
processSQLNamePattern(pset.db, &buf, pattern, true, false,
|
processSQLNamePattern(pset.db, &buf, pattern, false, false,
|
||||||
NULL, "s.srvname", NULL, NULL);
|
NULL, "s.srvname", NULL, NULL);
|
||||||
|
|
||||||
appendPQExpBuffer(&buf, "ORDER BY 1;");
|
appendPQExpBuffer(&buf, "ORDER BY 1;");
|
||||||
@ -2917,9 +2920,9 @@ listUserMappings(const char *pattern, bool verbose)
|
|||||||
",\n um.umoptions AS \"%s\"",
|
",\n um.umoptions AS \"%s\"",
|
||||||
gettext_noop("Options"));
|
gettext_noop("Options"));
|
||||||
|
|
||||||
appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_user_mappings um WHERE 1=1\n");
|
appendPQExpBuffer(&buf, "\nFROM pg_catalog.pg_user_mappings um\n");
|
||||||
|
|
||||||
processSQLNamePattern(pset.db, &buf, pattern, true, false,
|
processSQLNamePattern(pset.db, &buf, pattern, false, false,
|
||||||
NULL, "um.srvname", "um.usename", NULL);
|
NULL, "um.srvname", "um.usename", NULL);
|
||||||
|
|
||||||
appendPQExpBuffer(&buf, "ORDER BY 1, 2;");
|
appendPQExpBuffer(&buf, "ORDER BY 1, 2;");
|
||||||
@ -2938,3 +2941,23 @@ listUserMappings(const char *pattern, bool verbose)
|
|||||||
PQclear(res);
|
PQclear(res);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* printACLColumn
|
||||||
|
*
|
||||||
|
* Helper function for consistently formatting ACL (privilege) columns.
|
||||||
|
* The proper targetlist entry is appended to buf. Note lack of any
|
||||||
|
* whitespace or comma decoration.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
printACLColumn(PQExpBuffer buf, const char *colname)
|
||||||
|
{
|
||||||
|
if (pset.sversion >= 80100)
|
||||||
|
appendPQExpBuffer(buf,
|
||||||
|
"pg_catalog.array_to_string(%s, E'\\n') AS \"%s\"",
|
||||||
|
colname, gettext_noop("Access privileges"));
|
||||||
|
else
|
||||||
|
appendPQExpBuffer(buf,
|
||||||
|
"pg_catalog.array_to_string(%s, '\\n') AS \"%s\"",
|
||||||
|
colname, gettext_noop("Access privileges"));
|
||||||
|
}
|
||||||
|
@ -372,14 +372,16 @@ GRANT USAGE ON FOREIGN SERVER s6 TO regress_test_role2 WITH GRANT OPTION;
|
|||||||
\des+
|
\des+
|
||||||
List of foreign servers
|
List of foreign servers
|
||||||
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | Options
|
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | Options
|
||||||
------+-------------------+----------------------+---------------------------------------------------------------------------------+--------+---------+------------------------------
|
------+-------------------+----------------------+-----------------------------------------+--------+---------+------------------------------
|
||||||
S6 | foreign_data_user | foo | | | | {mixed_case_names=true}
|
S6 | foreign_data_user | foo | | | | {mixed_case_names=true}
|
||||||
s1 | foreign_data_user | foo | {foreign_data_user=U/foreign_data_user,regress_test_role=U/foreign_data_user} | | 1.0 | {servername=s1}
|
s1 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user | | 1.0 | {servername=s1}
|
||||||
|
: regress_test_role=U/foreign_data_user
|
||||||
s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b}
|
s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b}
|
||||||
s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521}
|
s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521}
|
||||||
s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b}
|
s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b}
|
||||||
s5 | foreign_data_user | foo | | | 15.0 |
|
s5 | foreign_data_user | foo | | | 15.0 |
|
||||||
s6 | foreign_data_user | foo | {foreign_data_user=U/foreign_data_user,regress_test_role2=U*/foreign_data_user} | | 16.0 | {host=a,dbname=b}
|
s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user | | 16.0 | {host=a,dbname=b}
|
||||||
|
: regress_test_role2=U*/foreign_data_user
|
||||||
s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b}
|
s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b}
|
||||||
s8 | foreign_data_user | postgresql | | | | {host=localhost,dbname=s8db}
|
s8 | foreign_data_user | postgresql | | | | {host=localhost,dbname=s8db}
|
||||||
st1 | regress_test_role | foo | | | |
|
st1 | regress_test_role | foo | | | |
|
||||||
@ -422,14 +424,16 @@ access to foreign-data wrapper foo
|
|||||||
\des+
|
\des+
|
||||||
List of foreign servers
|
List of foreign servers
|
||||||
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | Options
|
Name | Owner | Foreign-data wrapper | Access privileges | Type | Version | Options
|
||||||
------+-----------------------+----------------------+---------------------------------------------------------------------------------+--------+---------+---------------------------------
|
------+-----------------------+----------------------+-----------------------------------------+--------+---------+---------------------------------
|
||||||
S6 | foreign_data_user | foo | | | | {mixed_case_names=true}
|
S6 | foreign_data_user | foo | | | | {mixed_case_names=true}
|
||||||
s1 | regress_test_indirect | foo | {foreign_data_user=U/foreign_data_user,regress_test_role=U/foreign_data_user} | | 1.1 | {servername=s1}
|
s1 | regress_test_indirect | foo | foreign_data_user=U/foreign_data_user | | 1.1 | {servername=s1}
|
||||||
|
: regress_test_role=U/foreign_data_user
|
||||||
s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b}
|
s2 | foreign_data_user | foo | | | 1.1 | {host=a,dbname=b}
|
||||||
s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521}
|
s3 | foreign_data_user | foo | | oracle | | {tnsname=orcl,port=1521}
|
||||||
s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b}
|
s4 | foreign_data_user | foo | | oracle | | {host=a,dbname=b}
|
||||||
s5 | foreign_data_user | foo | | | 15.0 |
|
s5 | foreign_data_user | foo | | | 15.0 |
|
||||||
s6 | foreign_data_user | foo | {foreign_data_user=U/foreign_data_user,regress_test_role2=U*/foreign_data_user} | | 16.0 | {host=a,dbname=b}
|
s6 | foreign_data_user | foo | foreign_data_user=U/foreign_data_user | | 16.0 | {host=a,dbname=b}
|
||||||
|
: regress_test_role2=U*/foreign_data_user
|
||||||
s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b}
|
s7 | foreign_data_user | foo | | oracle | 17.0 | {host=a,dbname=b}
|
||||||
s8 | foreign_data_user | postgresql | | | | {dbname=db1,connect_timeout=30}
|
s8 | foreign_data_user | postgresql | | | | {dbname=db1,connect_timeout=30}
|
||||||
st1 | regress_test_role | foo | | | |
|
st1 | regress_test_role | foo | | | |
|
||||||
|
Loading…
Reference in New Issue
Block a user