diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 6085c241f4..abed81cf82 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -22,7 +22,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.226 2001/08/27 01:09:59 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.227 2001/08/27 20:33:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -400,77 +400,105 @@ dumpClasses_dumpData(Archive *fout, char *oid, void *dctxv)
 
 	if (fout->remoteVersion >= 70100)
 	{
-		appendPQExpBuffer(q, "SELECT * FROM ONLY %s", fmtId(classname, force_quotes));
+		appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT * FROM ONLY %s", fmtId(classname, force_quotes));
 	} else {
-		appendPQExpBuffer(q, "SELECT * FROM %s", fmtId(classname, force_quotes));
+		appendPQExpBuffer(q, "DECLARE _pg_dump_cursor CURSOR FOR SELECT * FROM %s", fmtId(classname, force_quotes));
 	}
 
 	res = PQexec(g_conn, q->data);
 	if (!res ||
-		PQresultStatus(res) != PGRES_TUPLES_OK)
+		PQresultStatus(res) != PGRES_COMMAND_OK)
 	{
 		write_msg(NULL, "dumpClasses(): SQL command failed\n");
 		write_msg(NULL, "Error message from server: %s", PQerrorMessage(g_conn));
 		write_msg(NULL, "The command was: %s\n", q->data);
 		exit_nicely();
 	}
-	for (tuple = 0; tuple < PQntuples(res); tuple++)
-	{
-		archprintf(fout, "INSERT INTO %s ", fmtId(classname, force_quotes));
-		if (attrNames == true)
+	
+	do {
+		PQclear(res);
+
+		res = PQexec(g_conn, "FETCH 100 FROM _pg_dump_cursor");
+		if (!res ||
+			PQresultStatus(res) != PGRES_TUPLES_OK)
 		{
-			resetPQExpBuffer(q);
-			appendPQExpBuffer(q, "(");
+			write_msg(NULL, "dumpClasses(): SQL command failed\n");
+			write_msg(NULL, "Error message from server: %s", PQerrorMessage(g_conn));
+			write_msg(NULL, "The command was: FETCH 100 FROM _pg_dump_cursor\n");
+			exit_nicely();
+		}
+
+		for (tuple = 0; tuple < PQntuples(res); tuple++)
+		{
+			archprintf(fout, "INSERT INTO %s ", fmtId(classname, force_quotes));
+			if (attrNames == true)
+			{
+				resetPQExpBuffer(q);
+				appendPQExpBuffer(q, "(");
+				for (field = 0; field < PQnfields(res); field++)
+				{
+					if (field > 0)
+						appendPQExpBuffer(q, ",");
+					appendPQExpBuffer(q, fmtId(PQfname(res, field), force_quotes));
+				}
+				appendPQExpBuffer(q, ") ");
+				archprintf(fout, "%s", q->data);
+			}
+			archprintf(fout, "VALUES (");
 			for (field = 0; field < PQnfields(res); field++)
 			{
 				if (field > 0)
-					appendPQExpBuffer(q, ",");
-				appendPQExpBuffer(q, fmtId(PQfname(res, field), force_quotes));
+					archprintf(fout, ",");
+				if (PQgetisnull(res, tuple, field))
+				{
+					archprintf(fout, "NULL");
+					continue;
+				}
+				switch (PQftype(res, field))
+				{
+					case INT2OID:
+					case INT4OID:
+					case OIDOID:	/* int types */
+					case FLOAT4OID:
+					case FLOAT8OID:/* float types */
+						/* These types are printed without quotes */
+						archprintf(fout, "%s",
+								   PQgetvalue(res, tuple, field));
+						break;
+					case BITOID:
+					case VARBITOID:
+						archprintf(fout, "B'%s'",
+								   PQgetvalue(res, tuple, field));
+						break;
+					default:
+	
+						/*
+						 * All other types are printed as string literals,
+						 * with appropriate escaping of special characters.
+						 */
+						resetPQExpBuffer(q);
+						formatStringLiteral(q, PQgetvalue(res, tuple, field), CONV_ALL);
+						archprintf(fout, "%s", q->data);
+						break;
+				}
 			}
-			appendPQExpBuffer(q, ") ");
-			archprintf(fout, "%s", q->data);
+			archprintf(fout, ");\n");
 		}
-		archprintf(fout, "VALUES (");
-		for (field = 0; field < PQnfields(res); field++)
-		{
-			if (field > 0)
-				archprintf(fout, ",");
-			if (PQgetisnull(res, tuple, field))
-			{
-				archprintf(fout, "NULL");
-				continue;
-			}
-			switch (PQftype(res, field))
-			{
-				case INT2OID:
-				case INT4OID:
-				case OIDOID:	/* int types */
-				case FLOAT4OID:
-				case FLOAT8OID:/* float types */
-					/* These types are printed without quotes */
-					archprintf(fout, "%s",
-							   PQgetvalue(res, tuple, field));
-					break;
-				case BITOID:
-				case VARBITOID:
-					archprintf(fout, "B'%s'",
-							   PQgetvalue(res, tuple, field));
-					break;
-				default:
 
-					/*
-					 * All other types are printed as string literals,
-					 * with appropriate escaping of special characters.
-					 */
-					resetPQExpBuffer(q);
-					formatStringLiteral(q, PQgetvalue(res, tuple, field), CONV_ALL);
-					archprintf(fout, "%s", q->data);
-					break;
-			}
-		}
-		archprintf(fout, ");\n");
+	} while( PQntuples(res) > 0 );
+	PQclear(res);
+
+	res = PQexec(g_conn, "CLOSE _pg_dump_cursor");
+	if (!res ||
+		PQresultStatus(res) != PGRES_COMMAND_OK)
+	{
+		write_msg(NULL, "dumpClasses(): SQL command failed\n");
+		write_msg(NULL, "Error message from server: %s", PQerrorMessage(g_conn));
+		write_msg(NULL, "The command was: CLOSE _pg_dump_cursor\n");
+		exit_nicely();
 	}
 	PQclear(res);
+
 	destroyPQExpBuffer(q);
 	return 1;
 }