From 91ce16a9035120d41f28f54df28d03d75211287d Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Wed, 4 Nov 2009 12:24:23 +0000 Subject: [PATCH] Allow rewriting ALTER TABLE to skip WAL logging. Itagaki Takahiro, with small changes by me and Simon. --- src/backend/commands/tablecmds.c | 38 ++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 24cbe1dd94..3e0c8191c7 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.304 2009/10/14 22:14:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.305 2009/11/04 12:24:23 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -3037,6 +3037,9 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) int i; ListCell *l; EState *estate; + CommandId mycid; + BulkInsertState bistate; + int hi_options; /* * Open the relation(s). We have surely already locked the existing @@ -3051,6 +3054,29 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) else newrel = NULL; + /* + * Prepare a BulkInsertState and options for heap_insert. Because + * we're building a new heap, we can skip WAL-logging and fsync it + * to disk at the end instead (unless WAL-logging is required for + * archiving). The FSM is empty too, so don't bother using it. + */ + if (newrel) + { + mycid = GetCurrentCommandId(true); + bistate = GetBulkInsertState(); + + hi_options = HEAP_INSERT_SKIP_FSM; + if (!XLogArchivingActive()) + hi_options |= HEAP_INSERT_SKIP_WAL; + } + else + { + /* keep compiler quiet about using these uninitialized */ + mycid = 0; + bistate = NULL; + hi_options = 0; + } + /* * If we need to rewrite the table, the operation has to be propagated to * tables that use this table's rowtype as a column type. @@ -3252,7 +3278,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) /* Write the tuple out to the new relation */ if (newrel) - simple_heap_insert(newrel, tuple); + heap_insert(newrel, tuple, mycid, hi_options, bistate); ResetExprContext(econtext); @@ -3270,7 +3296,15 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) heap_close(oldrel, NoLock); if (newrel) + { + FreeBulkInsertState(bistate); + + /* If we skipped writing WAL, then we need to sync the heap. */ + if (hi_options & HEAP_INSERT_SKIP_WAL) + heap_sync(newrel); + heap_close(newrel, NoLock); + } } /*