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
This commit is contained in:
Bruce Momjian 2018-02-12 01:27:06 -05:00
parent 5c9f2564fa
commit 91389228a1
1 changed files with 26 additions and 1 deletions

View File

@ -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 */