psql: treat "--" comments between queries as separate history entries.
authorTom Lane <[email protected]>
Wed, 1 Dec 2021 17:18:25 +0000 (12:18 -0500)
committerTom Lane <[email protected]>
Wed, 1 Dec 2021 17:18:25 +0000 (12:18 -0500)
If we've not yet collected any non-whitespace, non-comment token for a
new query, flush the current input line to history before reading
another line.  This aligns psql's history behavior with the observation
that lines containing only comments are generally not thought of as
being part of the next query.  psql's prompting behavior is consistent
with that view, too, since it won't change the prompt until you
enter something that's neither whitespace nor a "--" comment.

Greg Nancarrow, simplified a bit by me

Discussion: https://postgr.es/m/CAJcOf-cAdMVr7azeYR7nWKsNp7qhORzc84rV6d7m7knG5Hrtsw@mail.gmail.com

src/bin/psql/mainloop.c

index e49ed022938b17147221adeb254a94a021951828..3b7b4ad4a2ac4435e7d2455762f03f0a1c4c6a02 100644 (file)
@@ -564,9 +564,20 @@ MainLoop(FILE *source)
                                break;
                }
 
-               /* Add line to pending history if we didn't execute anything yet */
-               if (pset.cur_cmd_interactive && !line_saved_in_history)
-                       pg_append_history(line, history_buf);
+               /*
+                * Add line to pending history if we didn't do so already.  Then, if
+                * the query buffer is still empty, flush out any unsent history
+                * entry.  This means that empty lines (containing only whitespace and
+                * perhaps a dash-dash comment) that precede a query will be recorded
+                * as separate history entries, not as part of that query.
+                */
+               if (pset.cur_cmd_interactive)
+               {
+                       if (!line_saved_in_history)
+                               pg_append_history(line, history_buf);
+                       if (query_buf->len == 0)
+                               pg_send_history(history_buf);
+               }
 
                psql_scan_finish(scan_state);
                free(line);