Commit072ee847adtaught logical decoding to discard the changes of a transaction that is already known to be aborted when it is picked for eviction. That path reuses ReorderBufferTruncateTXN(), which marks every subtransaction that still has in-memory changes as streamed. Since nothing is streamed in that path, and the top-level transaction is never marked, a subtransaction ends up flagged as streamed even though the output plugin has never seen it. Decoding the subsequent abort record then makes ReorderBufferAbort() invoke the stream_abort callback for that subtransaction. For pgoutput this sends a Stream Abort ('A') message to a subscriber that requested streaming = off, and it does so regardless of the negotiated protocol version, so even a client speaking a version that predates transaction streaming receives a message it cannot parse. test_decoding dereferences a NULL pointer and crashes, since it allocates its per-transaction state in the begin or stream start callback, neither of which runs for a transaction discarded as aborted. This commit fixes this by marking a subtransaction as streamed only when it has changes and its top-level transaction is already marked as streamed. All streaming call sites mark the top-level transaction before truncating it, so their behavior is unchanged, while the abort-discard path never marks the top-level transaction and therefore now leaves its subtransactions unmarked. Backpatch to v18, where commit072ee847adwas introduced. Bug: #19616 Reported-by: Tyler Smart <tyler@smarts.io> Author: Andrey Rachitskiy <pl0h0yp1@gmail.com> Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com> Reviewed-by: Fujii Masao <masao.fujii@gmail.com> Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Discussion: https://postgr.es/m/19616-f6153af509910853@postgresql.org Backpatch-through: 18
PostgreSQL Database Management System
This directory contains the source code distribution of the PostgreSQL database management system.
PostgreSQL is an advanced object-relational database management system that supports an extended subset of the SQL standard, including transactions, foreign keys, subqueries, triggers, user-defined types and functions. This distribution also contains C language bindings.
Copyright and license information can be found in the file COPYRIGHT.
General documentation about this version of PostgreSQL can be found at https://www.postgresql.org/docs/devel/. In particular, information about building PostgreSQL from the source code can be found at https://www.postgresql.org/docs/devel/installation.html.
The latest version of this software, and related software, may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.