diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/psql/command.c | 23 | ||||
-rw-r--r-- | src/bin/psql/describe.c | 14 | ||||
-rw-r--r-- | src/bin/psql/describe.h | 2 |
3 files changed, 22 insertions, 17 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 00b89d941b8..b5201edf555 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -140,7 +140,8 @@ static backslashResult exec_command_write(PsqlScanState scan_state, bool active_ static backslashResult exec_command_watch(PsqlScanState scan_state, bool active_branch, PQExpBuffer query_buf, PQExpBuffer previous_buf); static backslashResult exec_command_x(PsqlScanState scan_state, bool active_branch); -static backslashResult exec_command_z(PsqlScanState scan_state, bool active_branch); +static backslashResult exec_command_z(PsqlScanState scan_state, bool active_branch, + const char *cmd); static backslashResult exec_command_shell_escape(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_slash_command_help(PsqlScanState scan_state, bool active_branch); static char *read_connect_arg(PsqlScanState scan_state); @@ -413,8 +414,8 @@ exec_command(const char *cmd, query_buf, previous_buf); else if (strcmp(cmd, "x") == 0) status = exec_command_x(scan_state, active_branch); - else if (strcmp(cmd, "z") == 0) - status = exec_command_z(scan_state, active_branch); + else if (strcmp(cmd, "z") == 0 || strcmp(cmd, "zS") == 0) + status = exec_command_z(scan_state, active_branch, cmd); else if (strcmp(cmd, "!") == 0) status = exec_command_shell_escape(scan_state, active_branch); else if (strcmp(cmd, "?") == 0) @@ -875,7 +876,7 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) success = listCollations(pattern, show_verbose, show_system); break; case 'p': - success = permissionsList(pattern); + success = permissionsList(pattern, show_system); break; case 'P': { @@ -2822,16 +2823,22 @@ exec_command_x(PsqlScanState scan_state, bool active_branch) * \z -- list table privileges (equivalent to \dp) */ static backslashResult -exec_command_z(PsqlScanState scan_state, bool active_branch) +exec_command_z(PsqlScanState scan_state, bool active_branch, const char *cmd) { bool success = true; if (active_branch) { - char *pattern = psql_scan_slash_option(scan_state, - OT_NORMAL, NULL, true); + char *pattern; + bool show_system; + + pattern = psql_scan_slash_option(scan_state, + OT_NORMAL, NULL, true); + + show_system = strchr(cmd, 'S') ? true : false; + + success = permissionsList(pattern, show_system); - success = permissionsList(pattern); free(pattern); } else diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 523fab61b90..e280b6f76c2 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -1002,7 +1002,7 @@ listAllDbs(const char *pattern, bool verbose) * \z (now also \dp -- perhaps more mnemonic) */ bool -permissionsList(const char *pattern) +permissionsList(const char *pattern, bool showSystem) { PQExpBufferData buf; PGresult *res; @@ -1121,15 +1121,13 @@ permissionsList(const char *pattern) CppAsString2(RELKIND_FOREIGN_TABLE) "," CppAsString2(RELKIND_PARTITIONED_TABLE) ")\n"); - /* - * Unless a schema pattern is specified, we suppress system and temp - * tables, since they normally aren't very interesting from a permissions - * point of view. You can see 'em by explicit request though, eg with \z - * pg_catalog.* - */ + if (!showSystem && !pattern) + appendPQExpBufferStr(&buf, " AND n.nspname <> 'pg_catalog'\n" + " AND n.nspname <> 'information_schema'\n"); + if (!validateSQLNamePattern(&buf, pattern, true, false, "n.nspname", "c.relname", NULL, - "n.nspname !~ '^pg_' AND pg_catalog.pg_table_is_visible(c.oid)", + "pg_catalog.pg_table_is_visible(c.oid)", NULL, 3)) goto error_return; diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 15f62b91d1a..554fe867255 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -38,7 +38,7 @@ extern bool describeRoles(const char *pattern, bool verbose, bool showSystem); extern bool listDbRoleSettings(const char *pattern, const char *pattern2); /* \z (or \dp) */ -extern bool permissionsList(const char *pattern); +extern bool permissionsList(const char *pattern, bool showSystem); /* \ddp */ extern bool listDefaultACLs(const char *pattern); |