forked frompostgres/postgres
- Notifications
You must be signed in to change notification settings - Fork6
Commit5d3fcb5
committed
Fix bogus tuple-slot management in logical replication UPDATE handling.
slot_modify_cstrings seriously abused the TupleTableSlot API by relyingon a slot's underlying data to stay valid across ExecClearTuple. Sincethis abuse was also quite undocumented, it's little surprise that thecase got broken during the v12 slot rewrites. As reported in bug #16129from Ondřej Jirman, this could lead to crashes or data corruption whena logical replication subscriber processes a row update. Problems wouldonly arise if the subscriber's table contained columns of pass-by-reftypes that were not being copied from the publisher.Fix by explicitly copying the datum/isnull arrays from the source slotthat the old row was in already. This ends up being about the samething that happened pre-v12, but hopefully in a less opaque andfragile way.We might've caught the problem sooner if there were any test casesdealing with updates involving non-replicated or dropped columns.Now there are.Back-patch to v10 where this code came in. Even though the failuredoes not manifest before v12, IMO this code is too fragile to leaveas-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.org1 parentb9f3d7a commit5d3fcb5
File tree
2 files changed
+72
-17
lines changed- src
- backend/replication/logical
- test/subscription/t
2 files changed
+72
-17
lines changedLines changed: 24 additions & 8 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
377 | 377 |
| |
378 | 378 |
| |
379 | 379 |
| |
380 |
| - | |
| 380 | + | |
381 | 381 |
| |
382 |
| - | |
383 |
| - | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
384 | 389 |
| |
385 | 390 |
| |
386 |
| - | |
| 391 | + | |
| 392 | + | |
387 | 393 |
| |
388 | 394 |
| |
389 | 395 |
| |
390 | 396 |
| |
391 | 397 |
| |
392 | 398 |
| |
393 | 399 |
| |
394 |
| - | |
| 400 | + | |
395 | 401 |
| |
396 | 402 |
| |
397 |
| - | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
398 | 413 |
| |
399 | 414 |
| |
400 | 415 |
| |
| |||
442 | 457 |
| |
443 | 458 |
| |
444 | 459 |
| |
| 460 | + | |
445 | 461 |
| |
446 | 462 |
| |
447 | 463 |
| |
| |||
752 | 768 |
| |
753 | 769 |
| |
754 | 770 |
| |
755 |
| - | |
756 |
| - | |
| 771 | + | |
| 772 | + | |
757 | 773 |
| |
758 | 774 |
| |
759 | 775 |
| |
|
Lines changed: 48 additions & 9 deletions
Original file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
3 | 3 |
| |
4 | 4 |
| |
5 | 5 |
| |
6 |
| - | |
| 6 | + | |
7 | 7 |
| |
8 | 8 |
| |
9 | 9 |
| |
| |||
28 | 28 |
| |
29 | 29 |
| |
30 | 30 |
| |
31 |
| - | |
| 31 | + | |
32 | 32 |
| |
33 |
| - | |
| 33 | + | |
34 | 34 |
| |
35 | 35 |
| |
36 | 36 |
| |
| |||
42 | 42 |
| |
43 | 43 |
| |
44 | 44 |
| |
45 |
| - | |
| 45 | + | |
| 46 | + | |
46 | 47 |
| |
47 | 48 |
| |
48 | 49 |
| |
| |||
91 | 92 |
| |
92 | 93 |
| |
93 | 94 |
| |
94 |
| - | |
| 95 | + | |
95 | 96 |
| |
96 | 97 |
| |
97 | 98 |
| |
| |||
104 | 105 |
| |
105 | 106 |
| |
106 | 107 |
| |
107 |
| - | |
108 |
| - | |
109 |
| - | |
110 |
| - | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
111 | 111 |
| |
112 | 112 |
| |
113 | 113 |
| |
| |||
126 | 126 |
| |
127 | 127 |
| |
128 | 128 |
| |
| 129 | + | |
129 | 130 |
| |
130 | 131 |
| |
131 | 132 |
| |
132 | 133 |
| |
133 | 134 |
| |
| 135 | + | |
| 136 | + | |
134 | 137 |
| |
135 | 138 |
| |
136 | 139 |
| |
| |||
148 | 151 |
| |
149 | 152 |
| |
150 | 153 |
| |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
151 | 190 |
| |
152 | 191 |
| |
153 | 192 |
| |
|
0 commit comments
Comments
(0)