HEAP_XMAX_IS_LOCKED_ONLY(tp.t_data->t_infomask) ||
            HeapTupleHeaderIsOnlyLocked(tp.t_data))
            result = TM_Ok;
-       else if (!ItemPointerEquals(&tp.t_self, &tp.t_data->t_ctid))
+       else if (!ItemPointerEquals(&tp.t_self, &tp.t_data->t_ctid) ||
+                HeapTupleHeaderIndicatesMovedPartitions(tp.t_data))
            result = TM_Updated;
        else
            result = TM_Deleted;
 
        if (can_continue)
            result = TM_Ok;
-       else if (!ItemPointerEquals(&oldtup.t_self, &oldtup.t_data->t_ctid))
+       else if (!ItemPointerEquals(&oldtup.t_self, &oldtup.t_data->t_ctid) ||
+                HeapTupleHeaderIndicatesMovedPartitions(oldtup.t_data))
            result = TM_Updated;
        else
            result = TM_Deleted;
            HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_data->t_infomask) ||
            HeapTupleHeaderIsOnlyLocked(tuple->t_data))
            result = TM_Ok;
-       else if (!ItemPointerEquals(&tuple->t_self, &tuple->t_data->t_ctid))
+       else if (!ItemPointerEquals(&tuple->t_self, &tuple->t_data->t_ctid) ||
+                HeapTupleHeaderIndicatesMovedPartitions(tuple->t_data))
            result = TM_Updated;
        else
            result = TM_Deleted;
                                LOCKMODE_from_mxstatus(wantedstatus)))
        {
            /* bummer */
-           if (!ItemPointerEquals(&tup->t_self, &tup->t_data->t_ctid))
+           if (!ItemPointerEquals(&tup->t_self, &tup->t_data->t_ctid) ||
+               HeapTupleHeaderIndicatesMovedPartitions(tup->t_data))
                return TM_Updated;
            else
                return TM_Deleted;
 
    {
        if (HEAP_XMAX_IS_LOCKED_ONLY(tuple->t_infomask))
            return TM_Ok;
-       if (!ItemPointerEquals(&htup->t_self, &tuple->t_ctid))
+       if (!ItemPointerEquals(&htup->t_self, &tuple->t_ctid) ||
+           HeapTupleHeaderIndicatesMovedPartitions(tuple))
            return TM_Updated;  /* updated by other */
        else
            return TM_Deleted;  /* deleted by other */
 
        if (TransactionIdDidCommit(xmax))
        {
-           if (!ItemPointerEquals(&htup->t_self, &tuple->t_ctid))
+           if (!ItemPointerEquals(&htup->t_self, &tuple->t_ctid) ||
+               HeapTupleHeaderIndicatesMovedPartitions(tuple))
                return TM_Updated;
            else
                return TM_Deleted;
 
    SetHintBits(tuple, buffer, HEAP_XMAX_COMMITTED,
                HeapTupleHeaderGetRawXmax(tuple));
-   if (!ItemPointerEquals(&htup->t_self, &tuple->t_ctid))
+   if (!ItemPointerEquals(&htup->t_self, &tuple->t_ctid) ||
+       HeapTupleHeaderIndicatesMovedPartitions(tuple))
        return TM_Updated;      /* updated by other */
    else
        return TM_Deleted;      /* deleted by other */