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:
parent
a4d03bbcda
commit
91ce16a903
@ -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,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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user