diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index db9e52c0c3d9b423b4b58179309bcd94c58dbcfa..a14292a6d9a60d15f3a8694fa90e49ca9905b5b4 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -29,7 +29,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *	$Id: pqcomm.c,v 1.130 2002/04/03 00:44:27 tgl Exp $
+ *	$Id: pqcomm.c,v 1.131 2002/04/20 23:35:43 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -569,20 +569,37 @@ pq_getbytes(char *s, size_t len)
 int
 pq_getstring(StringInfo s)
 {
-	int			c;
+	int			i;
 
 	/* Reset string to empty */
 	s->len = 0;
 	s->data[0] = '\0';
 
 	/* Read until we get the terminating '\0' */
-	while ((c = pq_getbyte()) != EOF && c != '\0')
-		appendStringInfoCharMacro(s, c);
+	for(;;)
+	{
+		while (PqRecvPointer >= PqRecvLength)
+		{
+			if (pq_recvbuf())		/* If nothing in buffer, then recv some */
+				return EOF;			/* Failed to recv data */
+		}
 
-	if (c == EOF)
-		return EOF;
+		for (i = PqRecvPointer; i < PqRecvLength; i++)
+			if (PqRecvBuffer[i] == '\0')
+			{
+				/* does not copy the \0 */
+				appendBinaryStringInfo(s, PqRecvBuffer + PqRecvPointer,
+									   i - PqRecvPointer);
+				PqRecvPointer += i + 1;
+				return 0;
+			}
 
-	return 0;
+		/* If we're here we haven't got the \0 in the buffer yet. */
+
+		appendBinaryStringInfo(s, PqRecvBuffer + PqRecvPointer,
+							   PqRecvLength - PqRecvPointer);
+		PqRecvPointer = PqRecvLength;
+	}
 }