diff options
| author | Marko Mäkelä <marko.makela@mariadb.com> | 2023-03-22 14:31:00 +0200 |
|---|---|---|
| committer | Marko Mäkelä <marko.makela@mariadb.com> | 2023-03-22 14:31:00 +0200 |
| commit | ff3d4395d808b6421d2e0714e10d48c7aa2f3c3a (patch) | |
| tree | 123bf2a8a509716d707c376c2b28b326716f7d5b /sql/sql_repl.cc | |
| parent | 7c91082e393f1817401b334b3d3584b401d909d7 (diff) | |
| download | mariadb-git-ff3d4395d808b6421d2e0714e10d48c7aa2f3c3a.tar.gz | |
MDEV-30882 Crash on ROLLBACK in a ROW_FORMAT=COMPRESSED table
row_upd_rec_in_place(): Avoid calling page_zip_write_rec() if we
are not modifying any fields that are stored in compressed format.
btr_cur_update_in_place_zip_check(): New function to check if a
ROW_FORMAT=COMPRESSED record can actually be updated in place.
btr_cur_pessimistic_update(): If the BTR_KEEP_POS_FLAG is not set
(we are in a ROLLBACK and cannot write any BLOBs), ignore the potential
overflow and let page_zip_reorganize() or page_zip_compress() handle it.
This avoids a failure when an attempted UPDATE of an NULL column to 0 is
rolled back. During the ROLLBACK, we would try to move a non-updated
long column to off-page storage in order to avoid a compression failure
of the ROW_FORMAT=COMPRESSED page.
page_zip_write_trx_id_and_roll_ptr(): Remove an assertion that would fail
in row_upd_rec_in_place() because the uncompressed page would already
have been modified there.
Thanks to Jean-François Gagné for providing a copy of a page that
triggered these bugs on the ROLLBACK of UPDATE and DELETE.
A 10.6 version of this was tested by Matthias Leich using
cmake -DWITH_INNODB_EXTRA_DEBUG=ON a.k.a. UNIV_ZIP_DEBUG.
Diffstat (limited to 'sql/sql_repl.cc')
0 files changed, 0 insertions, 0 deletions
