@@ -1024,11 +1024,28 @@ psql_completion(char *text, int start, int end)
10241024"ENCRYPTED" ,"INHERIT" ,"LOGIN" ,"NOCREATEDB" ,"NOCREATEROLE" ,
10251025"NOCREATEUSER" ,"NOINHERIT" ,"NOLOGIN" ,"NOREPLICATION" ,
10261026"NOSUPERUSER" ,"RENAME TO" ,"REPLICATION" ,"RESET" ,"SET" ,
1027- "SUPERUSER" ,"UNENCRYPTED" ,"VALID UNTIL" ,NULL };
1027+ "SUPERUSER" ,"UNENCRYPTED" ,"VALID UNTIL" ,"WITH" , NULL };
10281028
10291029COMPLETE_WITH_LIST (list_ALTERUSER );
10301030}
10311031
1032+ /* ALTER USER,ROLE <name> WITH */
1033+ else if ((pg_strcasecmp (prev4_wd ,"ALTER" )== 0 &&
1034+ (pg_strcasecmp (prev3_wd ,"USER" )== 0 ||
1035+ pg_strcasecmp (prev3_wd ,"ROLE" )== 0 )&&
1036+ pg_strcasecmp (prev_wd ,"WITH" )== 0 ))
1037+ {
1038+ /* Similar to the above, but don't complete "WITH" again. */
1039+ static const char * const list_ALTERUSER_WITH []=
1040+ {"CONNECTION LIMIT" ,"CREATEDB" ,"CREATEROLE" ,"CREATEUSER" ,
1041+ "ENCRYPTED" ,"INHERIT" ,"LOGIN" ,"NOCREATEDB" ,"NOCREATEROLE" ,
1042+ "NOCREATEUSER" ,"NOINHERIT" ,"NOLOGIN" ,"NOREPLICATION" ,
1043+ "NOSUPERUSER" ,"RENAME TO" ,"REPLICATION" ,"RESET" ,"SET" ,
1044+ "SUPERUSER" ,"UNENCRYPTED" ,"VALID UNTIL" ,NULL };
1045+
1046+ COMPLETE_WITH_LIST (list_ALTERUSER_WITH );
1047+ }
1048+
10321049/* complete ALTER USER,ROLE <name> ENCRYPTED,UNENCRYPTED with PASSWORD */
10331050else if (pg_strcasecmp (prev4_wd ,"ALTER" )== 0 &&
10341051 (pg_strcasecmp (prev3_wd ,"ROLE" )== 0 || pg_strcasecmp (prev3_wd ,"USER" )== 0 )&&
@@ -1947,7 +1964,7 @@ psql_completion(char *text, int start, int end)
19471964prev2_wd [0 ]!= '\0' )
19481965COMPLETE_WITH_CONST ("PROCEDURE" );
19491966
1950- /* CREATE ROLE,USER,GROUP */
1967+ /* CREATE ROLE,USER,GROUP<name> */
19511968else if (pg_strcasecmp (prev3_wd ,"CREATE" )== 0 &&
19521969 !(pg_strcasecmp (prev2_wd ,"USER" )== 0 && pg_strcasecmp (prev_wd ,"MAPPING" )== 0 )&&
19531970 (pg_strcasecmp (prev2_wd ,"ROLE" )== 0 ||
@@ -1958,11 +1975,29 @@ psql_completion(char *text, int start, int end)
19581975"ENCRYPTED" ,"IN" ,"INHERIT" ,"LOGIN" ,"NOCREATEDB" ,
19591976"NOCREATEROLE" ,"NOCREATEUSER" ,"NOINHERIT" ,"NOLOGIN" ,
19601977"NOREPLICATION" ,"NOSUPERUSER" ,"REPLICATION" ,"ROLE" ,
1961- "SUPERUSER" ,"SYSID" ,"UNENCRYPTED" ,"VALID UNTIL" ,NULL };
1978+ "SUPERUSER" ,"SYSID" ,"UNENCRYPTED" ,"VALID UNTIL" ,"WITH" , NULL };
19621979
19631980COMPLETE_WITH_LIST (list_CREATEROLE );
19641981}
19651982
1983+ /* CREATE ROLE,USER,GROUP <name> WITH */
1984+ else if ((pg_strcasecmp (prev4_wd ,"CREATE" )== 0 &&
1985+ (pg_strcasecmp (prev3_wd ,"ROLE" )== 0 ||
1986+ pg_strcasecmp (prev3_wd ,"GROUP" )== 0 ||
1987+ pg_strcasecmp (prev3_wd ,"USER" )== 0 )&&
1988+ pg_strcasecmp (prev_wd ,"WITH" )== 0 ))
1989+ {
1990+ /* Similar to the above, but don't complete "WITH" again. */
1991+ static const char * const list_CREATEROLE_WITH []=
1992+ {"ADMIN" ,"CONNECTION LIMIT" ,"CREATEDB" ,"CREATEROLE" ,"CREATEUSER" ,
1993+ "ENCRYPTED" ,"IN" ,"INHERIT" ,"LOGIN" ,"NOCREATEDB" ,
1994+ "NOCREATEROLE" ,"NOCREATEUSER" ,"NOINHERIT" ,"NOLOGIN" ,
1995+ "NOREPLICATION" ,"NOSUPERUSER" ,"REPLICATION" ,"ROLE" ,
1996+ "SUPERUSER" ,"SYSID" ,"UNENCRYPTED" ,"VALID UNTIL" ,NULL };
1997+
1998+ COMPLETE_WITH_LIST (list_CREATEROLE_WITH );
1999+ }
2000+
19662001/*
19672002 * complete CREATE ROLE,USER,GROUP <name> ENCRYPTED,UNENCRYPTED with
19682003 * PASSWORD