Commit 5e3bcac1 authored by Bruce Momjian's avatar Bruce Momjian

Fix psql history handling so 'execute' backslash commands (\g)

remain as part of the multi-line query.
parent 2f01703f
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2006, PostgreSQL Global Development Group * Copyright (c) 2000-2006, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/mainloop.c,v 1.72 2006/03/06 04:45:21 momjian Exp $ * $PostgreSQL: pgsql/src/bin/psql/mainloop.c,v 1.73 2006/03/06 15:09:04 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "mainloop.h" #include "mainloop.h"
...@@ -236,23 +236,6 @@ MainLoop(FILE *source) ...@@ -236,23 +236,6 @@ MainLoop(FILE *source)
scan_result = psql_scan(scan_state, query_buf, &prompt_tmp); scan_result = psql_scan(scan_state, query_buf, &prompt_tmp);
prompt_status = prompt_tmp; prompt_status = prompt_tmp;
/*
* If we append to history a backslash command that is inside
* a multi-line query, then when we recall the history, the
* backslash command will make the query invalid, so we write
* backslash commands immediately rather than keeping them
* as part of the current multi-line query.
*/
if (first_query_scan && pset.cur_cmd_interactive)
{
if (scan_result == PSCAN_BACKSLASH && query_buf->len != 0)
pg_write_history(line);
else
pg_append_history(line, history_buf);
}
first_query_scan = false;
/* /*
* Send command if semicolon found, or if end of line and we're in * Send command if semicolon found, or if end of line and we're in
* single-line mode. * single-line mode.
...@@ -309,13 +292,31 @@ MainLoop(FILE *source) ...@@ -309,13 +292,31 @@ MainLoop(FILE *source)
/* flush any paren nesting info after forced send */ /* flush any paren nesting info after forced send */
psql_scan_reset(scan_state); psql_scan_reset(scan_state);
} }
}
if (slashCmdStatus == PSQL_CMD_TERMINATE) /*
break; * If we append to history a backslash command that is inside
* a multi-line query, then when we recall the history, the
* backslash command will make the query invalid, so we write
* backslash commands immediately rather than keeping them
* as part of the current multi-line query. We do the test
* down here so we can check for \g and other 'execute'
* backslash commands, which should be appended.
*/
if (first_query_scan && pset.cur_cmd_interactive)
{
/* Sending a command (PSQL_CMD_SEND) zeros the length */
if (scan_result == PSCAN_BACKSLASH && query_buf->len != 0)
pg_write_history(line);
else
pg_append_history(line, history_buf);
} }
/* fall out of loop if lexer reached EOL */ first_query_scan = false;
if (scan_result == PSCAN_INCOMPLETE ||
/* fall out of loop on \q or if lexer reached EOL */
if (slashCmdStatus == PSQL_CMD_TERMINATE ||
scan_result == PSCAN_INCOMPLETE ||
scan_result == PSCAN_EOL) scan_result == PSCAN_EOL)
break; break;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment