diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c new file mode 100644 index 975d655..90bbfb7 *** a/src/bin/psql/tab-complete.c --- b/src/bin/psql/tab-complete.c *************** psql_completion(char *text, int start, i *** 999,1015 **** } /* ALTER USER,ROLE */ ! else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 && ! !(pg_strcasecmp(prev2_wd, "USER") == 0 && pg_strcasecmp(prev_wd, "MAPPING") == 0) && ! (pg_strcasecmp(prev2_wd, "USER") == 0 || ! pg_strcasecmp(prev2_wd, "ROLE") == 0)) { static const char *const list_ALTERUSER[] = {"CONNECTION LIMIT", "CREATEDB", "CREATEROLE", "CREATEUSER", "ENCRYPTED", "INHERIT", "LOGIN", "NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NOINHERIT", "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "RENAME TO", "REPLICATION", "RESET", "SET", ! "SUPERUSER", "UNENCRYPTED", "VALID UNTIL", NULL}; COMPLETE_WITH_LIST(list_ALTERUSER); } --- 999,1019 ---- } /* ALTER USER,ROLE */ ! else if ((pg_strcasecmp(prev3_wd, "ALTER") == 0 && ! !(pg_strcasecmp(prev2_wd, "USER") == 0 && pg_strcasecmp(prev_wd, "MAPPING") == 0) && ! (pg_strcasecmp(prev2_wd, "USER") == 0 || ! pg_strcasecmp(prev2_wd, "ROLE") == 0)) || ! (pg_strcasecmp(prev4_wd, "ALTER") == 0 && ! (pg_strcasecmp(prev3_wd, "USER") == 0 || ! pg_strcasecmp(prev3_wd, "ROLE") == 0) && ! pg_strcasecmp(prev_wd, "WITH") == 0)) { static const char *const list_ALTERUSER[] = {"CONNECTION LIMIT", "CREATEDB", "CREATEROLE", "CREATEUSER", "ENCRYPTED", "INHERIT", "LOGIN", "NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NOINHERIT", "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "RENAME TO", "REPLICATION", "RESET", "SET", ! "SUPERUSER", "UNENCRYPTED", "VALID UNTIL", "WITH", NULL}; COMPLETE_WITH_LIST(list_ALTERUSER); } *************** psql_completion(char *text, int start, i *** 1933,1949 **** COMPLETE_WITH_CONST("PROCEDURE"); /* CREATE ROLE,USER,GROUP */ ! else if (pg_strcasecmp(prev3_wd, "CREATE") == 0 && !(pg_strcasecmp(prev2_wd, "USER") == 0 && pg_strcasecmp(prev_wd, "MAPPING") == 0) && (pg_strcasecmp(prev2_wd, "ROLE") == 0 || ! pg_strcasecmp(prev2_wd, "GROUP") == 0 || pg_strcasecmp(prev2_wd, "USER") == 0)) { static const char *const list_CREATEROLE[] = {"ADMIN", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE", "CREATEUSER", "ENCRYPTED", "IN", "INHERIT", "LOGIN", "NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NOINHERIT", "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "REPLICATION", "ROLE", ! "SUPERUSER", "SYSID", "UNENCRYPTED", "VALID UNTIL", NULL}; COMPLETE_WITH_LIST(list_CREATEROLE); } --- 1937,1958 ---- COMPLETE_WITH_CONST("PROCEDURE"); /* CREATE ROLE,USER,GROUP */ ! else if ((pg_strcasecmp(prev3_wd, "CREATE") == 0 && !(pg_strcasecmp(prev2_wd, "USER") == 0 && pg_strcasecmp(prev_wd, "MAPPING") == 0) && (pg_strcasecmp(prev2_wd, "ROLE") == 0 || ! pg_strcasecmp(prev2_wd, "GROUP") == 0 || pg_strcasecmp(prev2_wd, "USER") == 0)) || ! (pg_strcasecmp(prev4_wd, "CREATE") == 0 && ! (pg_strcasecmp(prev3_wd, "ROLE") == 0 || ! pg_strcasecmp(prev3_wd, "GROUP") == 0 || ! pg_strcasecmp(prev3_wd, "USER") == 0) && ! pg_strcasecmp(prev_wd, "WITH") == 0)) { static const char *const list_CREATEROLE[] = {"ADMIN", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE", "CREATEUSER", "ENCRYPTED", "IN", "INHERIT", "LOGIN", "NOCREATEDB", "NOCREATEROLE", "NOCREATEUSER", "NOINHERIT", "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "REPLICATION", "ROLE", ! "SUPERUSER", "SYSID", "UNENCRYPTED", "VALID UNTIL", "WITH", NULL}; COMPLETE_WITH_LIST(list_CREATEROLE); }