A New Storage Engine for PostgreSQL to Provide Better Control Over Bloat
In-place updates will be supported except when (a) the new tuple is larger than the old tuple and the increase in size makes it impossible to fit the larger tuple onto the same page or (b) some column is modified which is covered by an index that has not been modified to support “delete-marking”. Note that the work to support delete-marking in indexes is yet to start and we intend to support it at least for btree indexes.
For in-place updates, we have to write the old tuple in the undo log and the new tuple in the zheap which help concurrent readers to read the old tuple from undo if the latest tuple is not yet visible to them.
Source: blogspot.hu