@@ -2209,21 +2209,52 @@ psql_completion(char *text, int start, int end)
2209
2209
COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_foreign_tables , NULL );
2210
2210
2211
2211
/* GRANT && REVOKE */
2212
- /* Complete GRANT/REVOKE with a list of privileges */
2212
+ /* Complete GRANT/REVOKE with a list of roles and privileges */
2213
2213
else if (pg_strcasecmp (prev_wd , "GRANT" ) == 0 ||
2214
2214
pg_strcasecmp (prev_wd , "REVOKE" ) == 0 )
2215
2215
{
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 */
2224
2232
else if (pg_strcasecmp (prev2_wd , "GRANT" ) == 0 ||
2225
2233
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
+ }
2227
2258
2228
2259
/*
2229
2260
* Complete GRANT/REVOKE <sth> ON with a list of tables, views, sequences,
@@ -2304,6 +2335,18 @@ psql_completion(char *text, int start, int end)
2304
2335
COMPLETE_WITH_CONST ("FROM" );
2305
2336
}
2306
2337
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
+
2307
2350
/* GROUP BY */
2308
2351
else if (pg_strcasecmp (prev3_wd , "FROM" ) == 0 &&
2309
2352
pg_strcasecmp (prev_wd , "GROUP" ) == 0 )
0 commit comments