From 95c63b5e3209cfc8d91d7956407032fc6fe89640 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 21 Jan 2012 19:46:55 +0200 Subject: [PATCH] psql: Add support for tab completion of GRANT/REVOKE role Previously, only GRANT/REVOKE privilege was supported. reviewed by Pavel Stehule --- src/bin/psql/tab-complete.c | 61 +++++++++++++++++++++++++++++++------ 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index a27ef699f6..6efc0ce0c0 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2209,21 +2209,52 @@ psql_completion(char *text, int start, int end) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, NULL); /* GRANT && REVOKE */ - /* Complete GRANT/REVOKE with a list of privileges */ + /* Complete GRANT/REVOKE with a list of roles and privileges */ else if (pg_strcasecmp(prev_wd, "GRANT") == 0 || pg_strcasecmp(prev_wd, "REVOKE") == 0) { - static const char *const list_privilege[] = - {"SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", - "TRIGGER", "CREATE", "CONNECT", "TEMPORARY", "EXECUTE", "USAGE", - "ALL", NULL}; - - COMPLETE_WITH_LIST(list_privilege); + COMPLETE_WITH_QUERY(Query_for_list_of_roles + " UNION SELECT 'SELECT'" + " UNION SELECT 'INSERT'" + " UNION SELECT 'UPDATE'" + " UNION SELECT 'DELETE'" + " UNION SELECT 'TRUNCATE'" + " UNION SELECT 'REFERENCES'" + " UNION SELECT 'TRIGGER'" + " UNION SELECT 'CREATE'" + " UNION SELECT 'CONNECT'" + " UNION SELECT 'TEMPORARY'" + " UNION SELECT 'EXECUTE'" + " UNION SELECT 'USAGE'" + " UNION SELECT 'ALL'"); } - /* Complete GRANT/REVOKE with "ON" */ + /* Complete GRANT/REVOKE with "ON", GRANT/REVOKE with TO/FROM */ else if (pg_strcasecmp(prev2_wd, "GRANT") == 0 || pg_strcasecmp(prev2_wd, "REVOKE") == 0) - COMPLETE_WITH_CONST("ON"); + { + if (pg_strcasecmp(prev_wd, "SELECT") == 0 + || pg_strcasecmp(prev_wd, "INSERT") == 0 + || pg_strcasecmp(prev_wd, "UPDATE") == 0 + || pg_strcasecmp(prev_wd, "DELETE") == 0 + || pg_strcasecmp(prev_wd, "TRUNCATE") == 0 + || pg_strcasecmp(prev_wd, "REFERENCES") == 0 + || pg_strcasecmp(prev_wd, "TRIGGER") == 0 + || pg_strcasecmp(prev_wd, "CREATE") == 0 + || pg_strcasecmp(prev_wd, "CONNECT") == 0 + || pg_strcasecmp(prev_wd, "TEMPORARY") == 0 + || pg_strcasecmp(prev_wd, "TEMP") == 0 + || pg_strcasecmp(prev_wd, "EXECUTE") == 0 + || pg_strcasecmp(prev_wd, "USAGE") == 0 + || pg_strcasecmp(prev_wd, "ALL") == 0) + COMPLETE_WITH_CONST("ON"); + else + { + if (pg_strcasecmp(prev2_wd, "GRANT") == 0) + COMPLETE_WITH_CONST("TO"); + else + COMPLETE_WITH_CONST("FROM"); + } + } /* * Complete GRANT/REVOKE ON with a list of tables, views, sequences, @@ -2304,6 +2335,18 @@ psql_completion(char *text, int start, int end) COMPLETE_WITH_CONST("FROM"); } + /* Complete "GRANT/REVOKE * TO/FROM" with username, GROUP, or PUBLIC */ + else if (pg_strcasecmp(prev3_wd, "GRANT") == 0 && + pg_strcasecmp(prev_wd, "TO") == 0) + { + COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + } + else if (pg_strcasecmp(prev3_wd, "REVOKE") == 0 && + pg_strcasecmp(prev_wd, "FROM") == 0) + { + COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + } + /* GROUP BY */ else if (pg_strcasecmp(prev3_wd, "FROM") == 0 && pg_strcasecmp(prev_wd, "GROUP") == 0)