• Marko Mäkelä's avatar
    MDEV-16131 Assertion failed in dict_index_t::instant_field_value() · 255328d3
    Marko Mäkelä authored
    During a table-rebuilding online ALTER TABLE, if
    dict_index_t::remove_instant() was invoked on the source table
    (because it became empty), we would inadvertently change the way
    how log records are written and parsed. We must keep the online_log
    format unchanged throughout the whole table-rebuilding operation.
    
    dict_col_t::def_t: Name the type of dict_col_t::def_val.
    
    rec_get_n_add_field_len(), rec_set_n_add_field(): Define globally,
    because these will be needed in row_log_table_low().
    
    rec_init_offsets_temp(), rec_init_offsets_comp_ordinary(): Add
    the parameter def_val for explicitly passing the default values
    of the instantly added columns of the source table, so that
    dict_index_t::instant_field_value() will not be called during
    row_log_table_apply(). This allows us to consistently parse the
    online_log records, even if the source table was converted
    to the canonical non-instant format during the rebuild operation.
    
    row_log_t::non_core_fields[]: The default values of the
    instantly added columns on the source table; copied
    during ha_innobase::prepare_inplace_alter_table()
    while the table is exclusively locked.
    
    row_log_t::instant_field_value(): Accessor to non_core_fields[],
    analogous to dict_index_t::instant_field_value().
    
    row_log_table_low(): Add fake_extra_size bytes to the record
    header if the source table was converted to the canonical format
    during the operation.
    
    row_log_allocate(): Initialize row_log_t::non_core_fields.
    255328d3
rem0rec.cc 72.6 KB