Preserve tuple OIDs during ATRewriteTable. Per gripe from Duncan Crombie.
authorTom Lane
Mon, 3 Oct 2005 02:45:12 +0000 (02:45 +0000)
committerTom Lane
Mon, 3 Oct 2005 02:45:12 +0000 (02:45 +0000)
src/backend/commands/tablecmds.c

index b2877cebb760adc18c8b5353d3dd84426ca44831..7df645af9d36a40e22edacf500830633fdedd1d7 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.172 2005/10/02 23:50:08 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.173 2005/10/03 02:45:12 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2509,8 +2509,12 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
        {
            if (newrel)
            {
+               Oid     tupOid = InvalidOid;
+
                /* Extract data from old tuple */
                heap_deform_tuple(tuple, oldTupDesc, values, isnull);
+               if (oldTupDesc->tdhasoid)
+                   tupOid = HeapTupleGetOid(tuple);
 
                /* Set dropped attributes to null in new tuple */
                foreach (lc, dropped_attrs)
@@ -2539,6 +2543,10 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
                 * be reset shortly.
                 */
                tuple = heap_form_tuple(newTupDesc, values, isnull);
+
+               /* Preserve OID, if any */
+               if (newTupDesc->tdhasoid)
+                   HeapTupleSetOid(tuple, tupOid);
            }
 
            /* Now check any constraints on the possibly-changed tuple */