diff --git a/src/interfaces/jdbc/org/postgresql/Driver.java.in b/src/interfaces/jdbc/org/postgresql/Driver.java.in
index 5263cf9d0b6e14681d0a1ef843f3ce35e9c5011e..a6d0fb03a257332a819443545e0f8ae9cfcabd6e 100644
--- a/src/interfaces/jdbc/org/postgresql/Driver.java.in
+++ b/src/interfaces/jdbc/org/postgresql/Driver.java.in
@@ -27,11 +27,13 @@ import org.postgresql.util.PSQLException;
 public class Driver implements java.sql.Driver
 {
 
-	protected static final int DEBUG = 0;
-	protected static final int INFO = 1;
-	protected static final int WARN = 2;
-	protected static final int ERROR = 3;
-	protected static final int FATAL = 4;
+	// make these public so they can be used in setLogLevel below
+
+	public static final int DEBUG = 0;
+	public static final int INFO = 1;
+	public static final int WARN = 2;
+	public static final int ERROR = 3;
+	public static final int FATAL = 4;
 
 	private static int logLevel = FATAL;
 
@@ -439,6 +441,18 @@ public class Driver implements java.sql.Driver
 	{
 		return new PSQLException("postgresql.unimplemented");
 	}
+
+	/**
+	*	used to turn logging on to a certain level, can be called 
+	*	by specifying fully qualified class ie org.postgresql.Driver.setLogLevel()
+	*	@param int logLevel sets the level which logging will respond to
+	* 	FATAL being almost no messages
+	*	DEBUG most verbose
+	*/
+	public static void setLogLevel(int logLevel)
+	{
+		Driver.logLevel = logLevel;
+	}
 	/*
 	 * logging message at the debug level
 	 * messages will be printed if the logging level is less or equal to DEBUG
diff --git a/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java b/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java
index f5b9aef492fc5b4e262223f70ed8815ff8415ca1..72877e5e4ce4aec77eb83471042cf9887aa17dfb 100644
--- a/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java
+++ b/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java
@@ -13,7 +13,7 @@ import org.postgresql.util.PSQLException;
  * <p>The lifetime of a QueryExecutor object is from sending the query
  * until the response has been received from the backend.
  *
- * $Id: QueryExecutor.java,v 1.8 2002/03/05 20:11:57 davec Exp $
+ * $Id: QueryExecutor.java,v 1.9 2002/03/16 02:15:23 davec Exp $
  */
 
 public class QueryExecutor
@@ -58,6 +58,8 @@ public class QueryExecutor
 		int fqp = 0;
 		boolean hfr = false;
 
+		StringBuffer errorMessage = null;
+
 		synchronized (pg_stream)
 		{
 
@@ -91,7 +93,19 @@ public class QueryExecutor
 						receiveTuple(false);
 						break;
 					case 'E':	// Error Message
-						throw new SQLException(pg_stream.ReceiveString(connection.getEncoding()));
+
+						// it's possible to get more than one error message for a query
+						// see libpq comments wrt backend closing a connection 
+						// so, append messages to a string buffer and keep processing
+						// check at the bottom to see if we need to throw an exception
+						
+						if ( errorMessage == null )
+							errorMessage = new StringBuffer();
+
+						errorMessage.append(pg_stream.ReceiveString(connection.getEncoding()));
+						// keep processing
+						break;
+
 					case 'I':	// Empty Query
 						int t = pg_stream.ReceiveChar();
 						if (t != 0)
@@ -117,6 +131,10 @@ public class QueryExecutor
 						throw new PSQLException("postgresql.con.type",
 												new Character((char) c));
 				}
+
+				// did we get an error during this query?
+				if ( errorMessage != null )
+					throw new SQLException( errorMessage.toString() );
 			}
 			return connection.getResultSet(connection, statement, fields, tuples, status, update_count, insert_oid, binaryCursor);
 		}