Under wal_level=logical, when saving old tuples, always save OID.
authorRobert Haas <rhaas@postgresql.org>
Wed, 11 Dec 2013 18:17:44 +0000 (13:17 -0500)
committerRobert Haas <rhaas@postgresql.org>
Wed, 11 Dec 2013 18:19:31 +0000 (13:19 -0500)
There's no real point in not doing this.  It doesn't cost anything
in performance or space.  So let's go wild.

Andres Freund, with substantial editing as to style by me.

src/backend/access/heap/heapam.c

index 249fffeb0615ae5d07598d9693f25ef2ad4ce00e..09174b472b06a00b6aa74db9b7f1690e7a34eafb 100644 (file)
@@ -6638,7 +6638,6 @@ ExtractReplicaIdentity(Relation relation, HeapTuple tp, bool key_changed, bool *
    TupleDesc   idx_desc;
    char        replident = relation->rd_rel->relreplident;
    HeapTuple   key_tuple = NULL;
-   bool        copy_oid = false;
    bool        nulls[MaxHeapAttributeNumber];
    Datum       values[MaxHeapAttributeNumber];
    int         natt;
@@ -6697,20 +6696,30 @@ ExtractReplicaIdentity(Relation relation, HeapTuple tp, bool key_changed, bool *
    {
        int attno = idx_rel->rd_index->indkey.values[natt];
 
-       if (attno == ObjectIdAttributeNumber)
-           copy_oid = true;
-       else if (attno < 0)
+       if (attno < 0)
+       {
+           /*
+            * The OID column can appear in an index definition, but that's
+            * OK, becuse we always copy the OID if present (see below).
+            * Other system columns may not.
+            */
+           if (attno == ObjectIdAttributeNumber)
+               continue;
            elog(ERROR, "system column in index");
-       else
-           nulls[attno - 1] = false;
+       }
+       nulls[attno - 1] = false;
    }
 
    key_tuple = heap_form_tuple(desc, values, nulls);
    *copy = true;
    RelationClose(idx_rel);
 
-   /* XXX: we could also do this unconditionally, the space is used anyway */
-   if (copy_oid)
+   /*
+    * Always copy oids if the table has them, even if not included in the
+    * index. The space in the logged tuple is used anyway, so there's little
+    * point in not including the information.
+    */
+   if (relation->rd_rel->relhasoids)
        HeapTupleSetOid(key_tuple, HeapTupleGetOid(tp));
 
    /*