@@ -1143,6 +1143,12 @@ static const SchemaQuery Query_for_trigger_of_table = {
1143
1143
" FROM pg_catalog.pg_timezone_names() "\
1144
1144
" WHERE pg_catalog.quote_literal(pg_catalog.lower(name)) LIKE pg_catalog.lower('%s')"
1145
1145
1146
+ /* Privilege options shared between GRANT and REVOKE */
1147
+ #define Privilege_options_of_grant_and_revoke \
1148
+ "SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", \
1149
+ "CREATE", "CONNECT", "TEMPORARY", "EXECUTE", "USAGE", "SET", "ALTER SYSTEM", \
1150
+ "ALL"
1151
+
1146
1152
/*
1147
1153
* These object types were introduced later than our support cutoff of
1148
1154
* server version 9.2. We use the VersionedQuery infrastructure so that
@@ -3767,7 +3773,7 @@ psql_completion(const char *text, int start, int end)
3767
3773
*/
3768
3774
/* Complete GRANT/REVOKE with a list of roles and privileges */
3769
3775
else if (TailMatches ("GRANT|REVOKE" )||
3770
- TailMatches ("REVOKE" ,"GRANT" ,"OPTION" ,"FOR" ))
3776
+ TailMatches ("REVOKE" ,"ADMIN| GRANT|INHERIT " ,"OPTION" ,"FOR" ))
3771
3777
{
3772
3778
/*
3773
3779
* With ALTER DEFAULT PRIVILEGES, restrict completion to grantable
@@ -3776,32 +3782,22 @@ psql_completion(const char *text, int start, int end)
3776
3782
if (HeadMatches ("ALTER" ,"DEFAULT" ,"PRIVILEGES" ))
3777
3783
COMPLETE_WITH ("SELECT" ,"INSERT" ,"UPDATE" ,
3778
3784
"DELETE" ,"TRUNCATE" ,"REFERENCES" ,"TRIGGER" ,
3779
- "EXECUTE" ,"USAGE" ,"ALL" );
3780
- else
3785
+ "CREATE" ,"EXECUTE" ,"USAGE" ,"ALL" );
3786
+ else if (TailMatches ("GRANT" ))
3787
+ COMPLETE_WITH_QUERY_PLUS (Query_for_list_of_roles ,
3788
+ Privilege_options_of_grant_and_revoke );
3789
+ else if (TailMatches ("REVOKE" ))
3781
3790
COMPLETE_WITH_QUERY_PLUS (Query_for_list_of_roles ,
3782
- "GRANT" ,
3783
- "SELECT" ,
3784
- "INSERT" ,
3785
- "UPDATE" ,
3786
- "DELETE" ,
3787
- "TRUNCATE" ,
3788
- "REFERENCES" ,
3789
- "TRIGGER" ,
3790
- "CREATE" ,
3791
- "CONNECT" ,
3792
- "TEMPORARY" ,
3793
- "EXECUTE" ,
3794
- "USAGE" ,
3795
- "SET" ,
3796
- "ALTER SYSTEM" ,
3797
- "ALL" );
3791
+ Privilege_options_of_grant_and_revoke ,
3792
+ "GRANT OPTION FOR" ,
3793
+ "ADMIN OPTION FOR" ,
3794
+ "INHERIT OPTION FOR" );
3795
+ else if (TailMatches ("REVOKE" ,"GRANT" ,"OPTION" ,"FOR" ))
3796
+ COMPLETE_WITH (Privilege_options_of_grant_and_revoke );
3797
+ else if (TailMatches ("REVOKE" ,"ADMIN|INHERIT" ,"OPTION" ,"FOR" ))
3798
+ COMPLETE_WITH_QUERY (Query_for_list_of_roles );
3798
3799
}
3799
3800
3800
- else if (TailMatches ("REVOKE" ,"GRANT" ))
3801
- COMPLETE_WITH ("OPTION FOR" );
3802
- else if (TailMatches ("REVOKE" ,"GRANT" ,"OPTION" ))
3803
- COMPLETE_WITH ("FOR" );
3804
-
3805
3801
else if (TailMatches ("GRANT|REVOKE" ,"ALTER" )||
3806
3802
TailMatches ("REVOKE" ,"GRANT" ,"OPTION" ,"FOR" ,"ALTER" ))
3807
3803
COMPLETE_WITH ("SYSTEM" );
@@ -3943,12 +3939,17 @@ psql_completion(const char *text, int start, int end)
3943
3939
* Offer grant options after that.
3944
3940
*/
3945
3941
else if (HeadMatches ("GRANT" )&& TailMatches ("TO" ,MatchAny ))
3946
- COMPLETE_WITH ("WITH ADMIN OPTION" ,
3942
+ COMPLETE_WITH ("WITH ADMIN" ,
3943
+ "WITH INHERIT" ,
3947
3944
"WITH GRANT OPTION" ,
3948
3945
"GRANTED BY" );
3949
3946
else if (HeadMatches ("GRANT" )&& TailMatches ("TO" ,MatchAny ,"WITH" ))
3950
- COMPLETE_WITH ("ADMIN OPTION" ,
3947
+ COMPLETE_WITH ("ADMIN" ,
3948
+ "INHERIT" ,
3951
3949
"GRANT OPTION" );
3950
+ else if (HeadMatches ("GRANT" )&&
3951
+ (TailMatches ("TO" ,MatchAny ,"WITH" ,"ADMIN|INHERIT" )))
3952
+ COMPLETE_WITH ("OPTION" ,"TRUE" ,"FALSE" );
3952
3953
else if (HeadMatches ("GRANT" )&& TailMatches ("TO" ,MatchAny ,"WITH" ,MatchAny ,"OPTION" ))
3953
3954
COMPLETE_WITH ("GRANTED BY" );
3954
3955
else if (HeadMatches ("GRANT" )&& TailMatches ("TO" ,MatchAny ,"WITH" ,MatchAny ,"OPTION" ,"GRANTED" ,"BY" ))