From 91389228a1007fa3845e29e17568e52ab1726d5d Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Mon, 12 Feb 2018 01:27:06 -0500 Subject: [PATCH] psql: give ^D hint for \q in place where \q is ignored Also add comment on why exit/quit are not documented. Discussion: https://postgr.es/m/20180202053928.GA13472@momjian.us --- src/bin/psql/mainloop.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c index a3ef15058f..c06ce3ca09 100644 --- a/src/bin/psql/mainloop.c +++ b/src/bin/psql/mainloop.c @@ -223,6 +223,7 @@ MainLoop(FILE *source) char *rest_of_line = NULL; bool found_help = false; bool found_exit_or_quit = false; + bool found_q = false; /* Search for the words we recognize; must be first word */ if (pg_strncasecmp(first_word, "help", 4) == 0) @@ -237,10 +238,18 @@ MainLoop(FILE *source) found_exit_or_quit = true; } + else if (strncmp(first_word, "\\q", 2) == 0) + { + rest_of_line = first_word + 2; + found_q = true; + } + /* * If we found a command word, check whether the rest of the line * contains only whitespace plus maybe one semicolon. If not, - * ignore the command word after all. + * ignore the command word after all. These commands are only + * for compatibility with other SQL clients and are not + * documented. */ if (rest_of_line != NULL) { @@ -288,6 +297,7 @@ MainLoop(FILE *source) continue; } } + /* * "quit" and "exit" are only commands when the query buffer is * empty, but we emit a one-line message even when it isn't to @@ -318,6 +328,21 @@ MainLoop(FILE *source) break; } } + + /* + * If they typed "\q" in a place where "\q" is not active, + * supply a hint. The text is still added to the query + * buffer. + */ + if (found_q && query_buf->len != 0 && + prompt_status != PROMPT_READY && + prompt_status != PROMPT_CONTINUE && + prompt_status != PROMPT_PAREN) +#ifndef WIN32 + puts(_("Use control-D to quit.")); +#else + puts(_("Use control-C to quit.")); +#endif } /* echo back if flag is set, unless interactive */