• Marko Mäkelä's avatar
    MDEV-15165 InnoDB purge for index on virtual column is trying to access an incomplete record · 44314c76
    Marko Mäkelä authored
    The algorithm change is based on a MySQL 8.0 fix for
    BUG #26818787: ASSERTION: DATA0DATA.IC:430:TUPLE
    by Krzysztof Kapuścik
    https://github.com/mysql/mysql-server/commit/ee606e62bbddd7ac3579b4a20ef8684fa7cd83fe
    
    If a record had been inserted in place of a delete-marked purgeable
    record by modifying that record, and purge was accessing that record
    before the off-page columns were written, row_build_index_entry()
    would have returned NULL, causing a crash.
    
    row_vers_non_virtual_fields_equal(): Check whether all non-virtual fields
    of an index are equal. Replaces row_vers_non_vc_match(). A more complex
    version of this function was called row_vers_non_vc_index_entry_match()
    in the MySQL 8.0 fix.
    
    row_vers_impl_x_locked_low(): This change is not directly related to
    the reported problem, but apparently to the removal of the function
    row_vers_non_vc_match(). This function checks if a secondary index
    record was modified by a transaction that has not been committed yet.
    For comparing the non-virtual columns, construct a secondary index
    tuple from the table row.
    
    row_vers_vc_matches_cluster(): Replace row_vers_non_vc_match() with
    code that is equivalent to the row_vers_non_vc_index_entry_match()
    in the MySQL 8.0 fix. Also, deduplicate some code by using goto.
    44314c76
row0vers.cc 37.8 KB