psql: give ^D hint for \q in place where \q is ignored
authorBruce Momjian <bruce@momjian.us>
Mon, 12 Feb 2018 06:27:06 +0000 (01:27 -0500)
committerBruce Momjian <bruce@momjian.us>
Mon, 12 Feb 2018 06:27:06 +0000 (01:27 -0500)
Also add comment on why exit/quit are not documented.

Discussion: https://postgr.es/m/20180202053928.GA13472@momjian.us

src/bin/psql/mainloop.c

index a3ef15058fcb66c3968c3e6f3a77632dbef2d6fd..c06ce3ca09cd028cdbe2fb2f32ce93a8df01a530 100644 (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 */