diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index e6742a4769f6575972564fb446e403deae0290b1..4e9b1530d37b8985fbf5de42a5c6b3d6b7876c9f 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.70 1998/11/18 00:47:28 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.71 1998/11/29 01:53:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -343,17 +343,23 @@ addTuple(PGresult *res, PGresAttValue *tup)
 		 *
 		 * We can use realloc because shallow copying of the structure is
 		 * okay.  Note that the first time through, res->tuples is NULL.
-		 * realloc is supposed to do the right thing in that case. Also,
-		 * on failure realloc is supposed to return NULL without damaging
+		 * While ANSI says that realloc() should act like malloc() in that
+		 * case, some old C libraries (like SunOS 4.1.x) coredump instead.
+		 * On failure realloc is supposed to return NULL without damaging
 		 * the existing allocation.
 		 * Note that the positions beyond res->ntups are garbage, not
 		 * necessarily NULL.
 		 */
 		int newSize = (res->tupArrSize > 0) ? res->tupArrSize * 2 : 128;
-		PGresAttValue ** newTuples = (PGresAttValue **)
-			realloc(res->tuples, newSize * sizeof(PGresAttValue *));
+		PGresAttValue ** newTuples;
+		if (res->tuples == NULL)
+			newTuples = (PGresAttValue **)
+				malloc(newSize * sizeof(PGresAttValue *));
+		else
+			newTuples = (PGresAttValue **)
+				realloc(res->tuples, newSize * sizeof(PGresAttValue *));
 		if (! newTuples)
-			return FALSE;		/* realloc failed */
+			return FALSE;		/* malloc or realloc failed */
 		res->tupArrSize = newSize;
 		res->tuples = newTuples;
 	}