I believe that if I UPDATE a row with the same values that it already has, this still dirties pages, writes the row, generates a WAL entry. There is no shortcut in the processing that's "hey, there's not really a change here, we'll just leave storage alone".
Is this correct?
Correct, but it can be avoided.
No update occurs in this case:.
update foo
set data = ‘hello world’
where id = 33
and data is distinct from ‘hello world’
;