--- pgsql_orig/src/bin/psql/input.c	2005-10-15 04:49:40.000000000 +0200
+++ pgsql/src/bin/psql/input.c	2005-10-30 02:30:05.000000000 +0100
@@ -90,17 +90,57 @@
 #ifdef USE_READLINE
 	char	   *s;
 
-	static char *prev_hist = NULL;
-
 	if (useReadline)
 		/* On some platforms, readline is declared as readline(char *) */
 		s = readline((char *) prompt);
 	else
 		s = gets_basic(prompt);
 
-	if (useHistory && s && s[0])
+	return s;
+#else
+	return gets_basic(prompt);
+#endif
+}
+
+/* Put the line in the history buffer and also add the trailing \n */
+char *pgadd_history(char *s, char *history_buf, int *cur_len)
+{
+#ifdef USE_READLINE
+
+	int slen;
+	char *history_buf1;
+	if (useReadline && useHistory && s && s[0])
 	{
+		slen = strlen(s);
+		history_buf1 = history_buf;
+		history_buf1 = realloc(history_buf1, (*cur_len + slen + 2) * sizeof(char));
+		strcpy(history_buf1 + *cur_len, s);
+		*cur_len += (slen + 1);
+		history_buf1[*cur_len - 1] = '\n';
+		history_buf1[*cur_len] = 0;
+	}	
+	return history_buf1;
+#endif	
+}
+
+/* Feed the contents of the history buffer to readline */
+void pgflush_history(char **history_buf, int *cur_len)
+{
+
+#ifdef USE_READLINE
+	
+	char *s;
+	static char *prev_hist;
+	
+	if (useReadline && useHistory && ((*cur_len) > 0))
+	{
+
 		enum histcontrol HC;
+		
+		s = *history_buf;
+		prev_hist = NULL;
+			
+		s[(*cur_len) - 1] = 0;
 
 		HC = GetHistControlConfig();
 
@@ -115,14 +155,14 @@
 			prev_hist = pg_strdup(s);
 			add_history(s);
 		}
+		
+		free(s);
+		*history_buf = 0;
+		*cur_len = 0;
 	}
-
-	return s;
-#else
-	return gets_basic(prompt);
 #endif
-}
 
+}
 
 
 /*
--- pgsql_orig/src/bin/psql/input.h	2005-01-01 06:43:08.000000000 +0100
+++ pgsql/src/bin/psql/input.h	2005-10-30 02:50:08.000000000 +0200
@@ -39,4 +39,7 @@
 void		initializeInput(int flags);
 bool		saveHistory(char *fname);
 
+char *pgadd_history(char *s, char *history_buf, int *cur_len);
+void pgflush_history(char **history_buf, int *cur_len);
+
 #endif   /* INPUT_H */
--- pgsql_orig/src/bin/psql/mainloop.c	2005-10-15 04:49:40.000000000 +0200
+++ pgsql/src/bin/psql/mainloop.c	2005-10-30 02:32:19.000000000 +0100
@@ -38,6 +38,8 @@
 	PQExpBuffer previous_buf;	/* if there isn't anything in the new buffer
 								 * yet, use this one for \e, etc. */
 	char	   *line;			/* current line of input */
+	char		*history_buf = 0;
+	int		history_buf_len = 0;
 	int			added_nl_pos;
 	bool		success;
 	volatile int successResult = EXIT_SUCCESS;
@@ -212,7 +214,13 @@
 		 */
 		psql_scan_setup(scan_state, line, strlen(line));
 		success = true;
-
+		
+		if (pset.cur_cmd_interactive)
+		{
+			/* Put current line in the history buffer */
+			history_buf = pgadd_history(line, history_buf, &history_buf_len);
+		}
+		
 		while (success || !die_on_error)
 		{
 			PsqlScanResult scan_result;
@@ -229,6 +237,7 @@
 				(scan_result == PSCAN_EOL &&
 				 GetVariableBool(pset.vars, "SINGLELINE")))
 			{
+				
 				/* execute query */
 				success = SendQuery(query_buf->data);
 				slashCmdStatus = success ? CMD_SEND : CMD_ERROR;
@@ -249,10 +258,13 @@
 				 * newline again.  This avoids any change to query_buf when a
 				 * line contains only a backslash command.
 				 */
+
+
 				if (query_buf->len == added_nl_pos)
 					query_buf->data[--query_buf->len] = '\0';
 				added_nl_pos = -1;
 
+
 				slashCmdStatus = HandleSlashCmds(scan_state,
 												 query_buf->len > 0 ?
 												 query_buf : previous_buf);
@@ -266,6 +278,7 @@
 					appendPQExpBufferStr(query_buf, previous_buf->data);
 				}
 
+
 				if (slashCmdStatus == CMD_SEND)
 				{
 					success = SendQuery(query_buf->data);
@@ -287,6 +300,14 @@
 				scan_result == PSCAN_EOL)
 				break;
 		}
+		
+		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, &history_buf_len);
+		}
 
 		psql_scan_finish(scan_state);
 		free(line);
