diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index 867f77076d074af13215c9c4d8afc15f8bbbcd87..de3695c7e05f3981119afdf9c996856b198ac33e 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -22,7 +22,6 @@
 #include "access/htup.h"
 #include "access/itup.h"
 #include "access/tupdesc.h"
-#include "access/xact.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/catalog.h"
 #include "catalog/heap.h"
@@ -49,6 +48,7 @@
 #include "storage/off.h"
 #include "storage/smgr.h"
 #include "tcop/dest.h"
+#include "utils/memutils.h"
 #include "utils/rel.h"
 
 
@@ -63,19 +63,27 @@
 #define YYMALLOC palloc
 #define YYFREE   pfree
 
+static MemoryContext per_line_ctx = NULL;
+
 static void
 do_start(void)
 {
-	StartTransactionCommand();
-	elog(DEBUG4, "start transaction");
+	Assert(CurrentMemoryContext == CurTransactionContext);
+	/* First time through, create the per-line working context */
+	if (per_line_ctx == NULL)
+		per_line_ctx = AllocSetContextCreate(CurTransactionContext,
+											 "bootstrap per-line processing",
+											 ALLOCSET_DEFAULT_SIZES);
+	MemoryContextSwitchTo(per_line_ctx);
 }
 
 
 static void
 do_end(void)
 {
-	CommitTransactionCommand();
-	elog(DEBUG4, "commit transaction");
+	/* Reclaim memory allocated while processing this line */
+	MemoryContextSwitchTo(CurTransactionContext);
+	MemoryContextReset(per_line_ctx);
 	CHECK_FOR_INTERRUPTS();		/* allow SIGINT to kill bootstrap run */
 	if (isatty(0))
 	{
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 46c207c86c8fd6d8feaf7ab36c0f2647bb7d6da8..4c28b2b821a767ef7a262312b6102bc844244f30 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -18,6 +18,7 @@
 #include <signal.h>
 
 #include "access/htup_details.h"
+#include "access/xact.h"
 #include "bootstrap/bootstrap.h"
 #include "catalog/index.h"
 #include "catalog/pg_collation.h"
@@ -496,7 +497,9 @@ BootstrapModeMain(void)
 	/*
 	 * Process bootstrap input.
 	 */
+	StartTransactionCommand();
 	boot_yyparse();
+	CommitTransactionCommand();
 
 	/*
 	 * We should now know about all mapped relations, so it's okay to write