Commit 91ce16a9 authored by Heikki Linnakangas's avatar Heikki Linnakangas

Allow rewriting ALTER TABLE to skip WAL logging.

Itagaki Takahiro, with small changes by me and Simon.
parent a4d03bbc
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -3037,6 +3037,9 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
int i; int i;
ListCell *l; ListCell *l;
EState *estate; EState *estate;
CommandId mycid;
BulkInsertState bistate;
int hi_options;
/* /*
* Open the relation(s). We have surely already locked the existing * Open the relation(s). We have surely already locked the existing
...@@ -3051,6 +3054,29 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) ...@@ -3051,6 +3054,29 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
else else
newrel = NULL; 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 * 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. * tables that use this table's rowtype as a column type.
...@@ -3252,7 +3278,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) ...@@ -3252,7 +3278,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
/* Write the tuple out to the new relation */ /* Write the tuple out to the new relation */
if (newrel) if (newrel)
simple_heap_insert(newrel, tuple); heap_insert(newrel, tuple, mycid, hi_options, bistate);
ResetExprContext(econtext); ResetExprContext(econtext);
...@@ -3270,7 +3296,15 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap) ...@@ -3270,7 +3296,15 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
heap_close(oldrel, NoLock); heap_close(oldrel, NoLock);
if (newrel) 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); heap_close(newrel, NoLock);
}
} }
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment