@@ -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" ))
0 commit comments