mirror of
https://github.com/postgres/postgres.git
synced 2026-03-20 17:44:08 -04:00
slot_modify_cstrings seriously abused the TupleTableSlot API by relying on a slot's underlying data to stay valid across ExecClearTuple. Since this abuse was also quite undocumented, it's little surprise that the case got broken during the v12 slot rewrites. As reported in bug #16129 from Ondřej Jirman, this could lead to crashes or data corruption when a logical replication subscriber processes a row update. Problems would only arise if the subscriber's table contained columns of pass-by-ref types that were not being copied from the publisher. Fix by explicitly copying the datum/isnull arrays from the source slot that the old row was in already. This ends up being about the same thing that happened pre-v12, but hopefully in a less opaque and fragile way. We might've caught the problem sooner if there were any test cases dealing with updates involving non-replicated or dropped columns. Now there are. Back-patch to v10 where this code came in. Even though the failure does not manifest before v12, IMO this code is too fragile to leave as-is. In any case we certainly want the additional test coverage. Patch by me; thanks to Tomas Vondra for initial investigation. Discussion: https://postgr.es/m/16129-a0c0f48e71741e5f@postgresql.org |
||
|---|---|---|
| .. | ||
| t | ||
| .gitignore | ||
| Makefile | ||
| README | ||
src/test/subscription/README
Regression tests for subscription/logical replication
=====================================================
This directory contains a test suite for subscription/logical replication.
Running the tests
=================
NOTE: You must have given the --enable-tap-tests argument to configure.
Run
make check
or
make installcheck
You can use "make installcheck" if you previously did "make install"
(including installing the hstore extension). In that case, the code
in the installation tree is tested. With "make check", a temporary
installation tree is built from the current sources and then tested.
Either way, this test initializes, starts, and stops several test Postgres
clusters.