Allow rewriting ALTER TABLE to skip WAL logging.
authorHeikki Linnakangas
Wed, 4 Nov 2009 12:24:23 +0000 (12:24 +0000)
committerHeikki Linnakangas
Wed, 4 Nov 2009 12:24:23 +0000 (12:24 +0000)
Itagaki Takahiro, with small changes by me and Simon.

src/backend/commands/tablecmds.c

index 24cbe1dd9427f4f2e11154cc41aaa7e43fa3a244..3e0c8191c7ec43a15ca4f7b920882f6ff36c0563 100644 (file)
@@ -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);
+   }
 }
 
 /*