• Andres Freund's avatar
    Fix off-by-one in decoding causing one-record events to be skipped. · fe7337f2
    Andres Freund authored
    A ReorderBufferTransaction's end_lsn, the sentPtr advocated by
    walsender keepalive messages, and the end location remembered by the
    decoding get_*changes* SQL functions all use the location of the last
    read record + 1. I.e. the LSN points to the beginning of the next
    record. That cannot realistically be changed without changing the
    replication protocol because that's how keepalive messages have worked
    since 9.0.
    The bug is that the logic inside the snapshot builder, which decides
    whether a transaction's contents should be decoded, assumed the start
    location would point towards the last byte of the last record. The
    reason this didn't actually cause visible problems is that currently
    that decision is only made for commit records. Since interesting
    transactions always have at least one additional record - containing
    actual data - we'd never skip a transaction.
    But if there ever were transactions, or other events, with just one
    record containing important information, we'd skip them after stopping
    and restarting logical decoding.
    fe7337f2
snapbuild.c 57.8 KB