aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/heap/heapam.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 249fffeb061..09174b472b0 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -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));
/*