*
  * Copyright (c) 2000-2006, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.51 2006/03/05 15:58:51 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.52 2006/03/06 04:45:21 momjian Exp $
  */
 #include "postgres_fe.h"
 
 
 /* Put the line in the history buffer and also add the trailing \n */
 void
-pgadd_history(char *s, PQExpBuffer history_buf)
+pg_append_history(char *s, PQExpBuffer history_buf)
 {
 #ifdef USE_READLINE
 
 }
 
 
-/* Feed the contents of the history buffer to readline */
+/*
+ * Feed the string to readline
+ */
 void
-pgflush_history(PQExpBuffer history_buf)
+pg_write_history(char *s)
 {
-#ifdef USE_READLINE    
-   char *s;
+#ifdef USE_READLINE
    static char *prev_hist;
    int slen, i;
    
    {
        enum histcontrol HC;
        
-       s = history_buf->data;
        prev_hist = NULL;
            
        HC = GetHistControlConfig();
            prev_hist = pg_strdup(s);
            add_history(s);
        }
-       
-       resetPQExpBuffer(history_buf);
    }
 #endif
 }
 
 void
-pgclear_history(PQExpBuffer history_buf)
+pg_clear_history(PQExpBuffer history_buf)
 {
 #ifdef USE_READLINE    
    if (useReadline && useHistory)
 
  *
  * Copyright (c) 2000-2006, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/input.h,v 1.25 2006/03/05 15:58:51 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/input.h,v 1.26 2006/03/06 04:45:21 momjian Exp $
  */
 #ifndef INPUT_H
 #define INPUT_H
 void       initializeInput(int flags);
 bool       saveHistory(char *fname);
 
-void pgadd_history(char *s, PQExpBuffer history_buf);
-void pgclear_history(PQExpBuffer history_buf);
-void pgflush_history(PQExpBuffer history_buf);
+void pg_append_history(char *s, PQExpBuffer history_buf);
+void pg_clear_history(PQExpBuffer history_buf);
+void pg_write_history(char *s);
 
 
 #endif   /* INPUT_H */
 
  *
  * Copyright (c) 2000-2006, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/mainloop.c,v 1.71 2006/03/05 15:58:51 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/mainloop.c,v 1.72 2006/03/06 04:45:21 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "mainloop.h"
    char       *line;           /* current line of input */
    int         added_nl_pos;
    bool        success;
+   bool        first_query_scan;
+   
    volatile int successResult = EXIT_SUCCESS;
    volatile backslashResult slashCmdStatus = PSQL_CMD_UNKNOWN;
    volatile promptStatus_t prompt_status = PROMPT_READY;
                successResult = EXIT_USER;
                break;
            }
-           pgclear_history(history_buf);           
+           pg_clear_history(history_buf);          
            cancel_pressed = false;
        }
 
            slashCmdStatus = PSQL_CMD_UNKNOWN;
            prompt_status = PROMPT_READY;
            if (pset.cur_cmd_interactive)
-               pgclear_history(history_buf);           
+               pg_clear_history(history_buf);          
 
            if (pset.cur_cmd_interactive)
                putc('\n', stdout);
            prompt_status = PROMPT_READY;
            
            if (pset.cur_cmd_interactive)
+           {
                /*
                 *  Pass all the contents of history_buf to readline
                 *  and free the history buffer.
                 */
-               pgflush_history(history_buf);
+               pg_write_history(history_buf->data);
+               pg_clear_history(history_buf);
+           }
        }
        /* otherwise, get another line */
        else if (pset.cur_cmd_interactive)
         */
        psql_scan_setup(scan_state, line, strlen(line));
        success = true;
-       
-       if (pset.cur_cmd_interactive)
-           /* Put current line in the history buffer */
-           pgadd_history(line, history_buf);
+       first_query_scan = true;
        
        while (success || !die_on_error)
        {
            scan_result = psql_scan(scan_state, query_buf, &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
             * single-line mode.
        }
        
        if (pset.cur_cmd_interactive && prompt_status != PROMPT_CONTINUE)
+       {
            /*
             *  Pass all the contents of history_buf to readline
             *  and free the history buffer.
             */
-           pgflush_history(history_buf);
+           pg_write_history(history_buf->data);
+           pg_clear_history(history_buf);
+       }
 
        psql_scan_finish(scan_state);
        free(line);