Virtual generated columns are not stored on disk, so heap_getattr() in tuple_to_stringinfo() always returned NULL for them, producing misleading output such as
even though the user could observe a non-null value via SELECT. Stored generated columns continue to be emitted as before because their values do live in the heap tuple.
This matches the pgoutput's logicalrep_should_publish_column() which never publishes virtual generated columns. Added a regression test.