@@ -2209,21 +2209,52 @@ psql_completion(char *text, int start, int end)
22092209 COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_foreign_tables , NULL );
22102210
22112211/* GRANT && REVOKE */
2212- /* Complete GRANT/REVOKE with a list of privileges */
2212+ /* Complete GRANT/REVOKE with a list of roles and privileges */
22132213 else if (pg_strcasecmp (prev_wd , "GRANT" ) == 0 ||
22142214 pg_strcasecmp (prev_wd , "REVOKE" ) == 0 )
22152215 {
2216- static const char * const list_privilege [] =
2217- {"SELECT" , "INSERT" , "UPDATE" , "DELETE" , "TRUNCATE" , "REFERENCES" ,
2218- "TRIGGER" , "CREATE" , "CONNECT" , "TEMPORARY" , "EXECUTE" , "USAGE" ,
2219- "ALL" , NULL };
2220-
2221- COMPLETE_WITH_LIST (list_privilege );
2222- }
2223- /* Complete GRANT/REVOKE <sth> with "ON" */
2216+ COMPLETE_WITH_QUERY (Query_for_list_of_roles
2217+ " UNION SELECT 'SELECT'"
2218+ " UNION SELECT 'INSERT'"
2219+ " UNION SELECT 'UPDATE'"
2220+ " UNION SELECT 'DELETE'"
2221+ " UNION SELECT 'TRUNCATE'"
2222+ " UNION SELECT 'REFERENCES'"
2223+ " UNION SELECT 'TRIGGER'"
2224+ " UNION SELECT 'CREATE'"
2225+ " UNION SELECT 'CONNECT'"
2226+ " UNION SELECT 'TEMPORARY'"
2227+ " UNION SELECT 'EXECUTE'"
2228+ " UNION SELECT 'USAGE'"
2229+ " UNION SELECT 'ALL'" );
2230+ }
2231+ /* Complete GRANT/REVOKE <privilege> with "ON", GRANT/REVOKE <role> with TO/FROM */
22242232 else if (pg_strcasecmp (prev2_wd , "GRANT" ) == 0 ||
22252233 pg_strcasecmp (prev2_wd , "REVOKE" ) == 0 )
2226- COMPLETE_WITH_CONST ("ON" );
2234+ {
2235+ if (pg_strcasecmp (prev_wd , "SELECT" ) == 0
2236+ || pg_strcasecmp (prev_wd , "INSERT" ) == 0
2237+ || pg_strcasecmp (prev_wd , "UPDATE" ) == 0
2238+ || pg_strcasecmp (prev_wd , "DELETE" ) == 0
2239+ || pg_strcasecmp (prev_wd , "TRUNCATE" ) == 0
2240+ || pg_strcasecmp (prev_wd , "REFERENCES" ) == 0
2241+ || pg_strcasecmp (prev_wd , "TRIGGER" ) == 0
2242+ || pg_strcasecmp (prev_wd , "CREATE" ) == 0
2243+ || pg_strcasecmp (prev_wd , "CONNECT" ) == 0
2244+ || pg_strcasecmp (prev_wd , "TEMPORARY" ) == 0
2245+ || pg_strcasecmp (prev_wd , "TEMP" ) == 0
2246+ || pg_strcasecmp (prev_wd , "EXECUTE" ) == 0
2247+ || pg_strcasecmp (prev_wd , "USAGE" ) == 0
2248+ || pg_strcasecmp (prev_wd , "ALL" ) == 0 )
2249+ COMPLETE_WITH_CONST ("ON" );
2250+ else
2251+ {
2252+ if (pg_strcasecmp (prev2_wd , "GRANT" ) == 0 )
2253+ COMPLETE_WITH_CONST ("TO" );
2254+ else
2255+ COMPLETE_WITH_CONST ("FROM" );
2256+ }
2257+ }
22272258
22282259 /*
22292260 * Complete GRANT/REVOKE <sth> ON with a list of tables, views, sequences,
@@ -2304,6 +2335,18 @@ psql_completion(char *text, int start, int end)
23042335 COMPLETE_WITH_CONST ("FROM" );
23052336 }
23062337
2338+ /* Complete "GRANT/REVOKE * TO/FROM" with username, GROUP, or PUBLIC */
2339+ else if (pg_strcasecmp (prev3_wd , "GRANT" ) == 0 &&
2340+ pg_strcasecmp (prev_wd , "TO" ) == 0 )
2341+ {
2342+ COMPLETE_WITH_QUERY (Query_for_list_of_grant_roles );
2343+ }
2344+ else if (pg_strcasecmp (prev3_wd , "REVOKE" ) == 0 &&
2345+ pg_strcasecmp (prev_wd , "FROM" ) == 0 )
2346+ {
2347+ COMPLETE_WITH_QUERY (Query_for_list_of_grant_roles );
2348+ }
2349+
23072350/* GROUP BY */
23082351 else if (pg_strcasecmp (prev3_wd , "FROM" ) == 0 &&
23092352 pg_strcasecmp (prev_wd , "GROUP" ) == 0 )
0 commit comments