1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-22 23:02:54 +03:00

Allow rewriting ALTER TABLE to skip WAL logging.

Itagaki Takahiro, with small changes by me and Simon.
This commit is contained in:
Heikki Linnakangas 2009-11-04 12:24:23 +00:00
parent a4d03bbcda
commit 91ce16a903

View File

@ -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)
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)
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)
/* 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,8 +3296,16 @@ 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);
} }
}
/* /*
* ATGetQueueEntry: find or create an entry in the ALTER TABLE work queue * ATGetQueueEntry: find or create an entry in the ALTER TABLE work queue