On Fri, Feb 2, 2018 at 12:39:28AM -0500, Bruce Momjian wrote:
> I just thought of an inconsistency. First, we now consistently exit with
> 'exit', 'quit', and '\q' if used in an empty psql query buffer. Also, we now
> hint when 'exit' and 'quit' are used in non-empty query buffers:
>
> test=> SELECT
> test-> exit
> --> Use \q to quit.
>
> We obviously don't need to hint for '\q' since it works in this context.
>
> Where it is odd is that we hint for 'exit' and 'quit' in places that
> '\q' doesn't work, but we don't hint for '\q' in the same contexts.
> Here is the hint for 'exit' and 'quit':
>
> test=> SELECT '
> test'> exit
> --> Use control-D to quit.
>
> but we don't hint for '\q':
>
> test=> SELECT '
> test'> \q
> --> test'>
>
> Should we give the same "Use control-D to quit." hint here for '\q'?
> I think it is logical that we should.
I have applied the attached patch giving a ^D/^C hint where \q is
ignored, and add C comment documenting why exit/quit is not documented.
I consider this issue closed, or quited, or exited. :-)
--
Bruce Momjian <[email protected]> http://momjian.us
EnterpriseDB http://enterprisedb.com
+ As you are, so once was I. As I am, so you will be. +
+ Ancient Roman grave inscription +
diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
new file mode 100644
index a3ef150..c06ce3c
*** a/src/bin/psql/mainloop.c
--- b/src/bin/psql/mainloop.c
*************** MainLoop(FILE *source)
*** 223,228 ****
--- 223,229 ----
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)
*************** MainLoop(FILE *source)
*** 237,246 ****
found_exit_or_quit = 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.
*/
if (rest_of_line != NULL)
{
--- 238,255 ----
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. These commands are only
! * for compatibility with other SQL clients and are not
! * documented.
*/
if (rest_of_line != NULL)
{
*************** MainLoop(FILE *source)
*** 288,293 ****
--- 297,303 ----
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
*************** MainLoop(FILE *source)
*** 318,323 ****
--- 328,348 ----
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 */