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