diff options
author | Aleksey Midenkov <midenok@gmail.com> | 2020-07-20 18:28:08 +0300 |
---|---|---|
committer | Aleksey Midenkov <midenok@gmail.com> | 2020-07-20 18:28:08 +0300 |
commit | af83ed9f0ed10496c11bea6b054f4d86562e2349 (patch) | |
tree | ad98c4625ff8a0c79add509acb512914250cf5e3 /storage/innobase/row/row0mysql.cc | |
parent | af57c658090cc52aa20e8cde7d24a563d73ff886 (diff) | |
download | mariadb-git-af83ed9f0ed10496c11bea6b054f4d86562e2349.tar.gz |
MDEV-20661 Virtual fields are not recalculated on system fields value assignment
Fix stale virtual field value in 4 cases: when virtual field depends
on row_start/row_end in timestamp/trx_id versioned table. row_start
dep is recalculated in vers_update_fields() (SQL and InnoDB
layer). row_end dep is recalculated on history row insert.
Diffstat (limited to 'storage/innobase/row/row0mysql.cc')
-rw-r--r-- | storage/innobase/row/row0mysql.cc | 42 |
1 files changed, 2 insertions, 40 deletions
diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index d2fc63a5f38..15538ff9922 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1331,23 +1331,6 @@ row_mysql_get_table_status( return(err); } -/** Writes 8 bytes to nth tuple field -@param[in] tuple where to write -@param[in] nth index in tuple -@param[in] data what to write -@param[in] buf field data buffer */ -static -void -set_tuple_col_8(dtuple_t* tuple, int col, uint64_t data, byte* buf) { - dfield_t* dfield = dtuple_get_nth_field(tuple, col); - ut_ad(dfield->type.len == 8); - if (dfield->len == UNIV_SQL_NULL) { - dfield_set_data(dfield, buf, 8); - } - ut_ad(dfield->len == dfield->type.len && dfield->data); - mach_write_to_8(dfield->data, data); -} - /** Does an insert for MySQL. @param[in] mysql_rec row in the MySQL format @param[in,out] prebuilt prebuilt struct in MySQL handle @@ -1415,29 +1398,8 @@ row_insert_for_mysql( &blob_heap); if (ins_mode != ROW_INS_NORMAL) { -#ifndef DBUG_OFF - ut_ad(table->vers_start != table->vers_end); - const mysql_row_templ_t* t - = prebuilt->get_template_by_col(table->vers_end); - ut_ad(t); - ut_ad(t->mysql_col_len == 8); -#endif - - if (ins_mode == ROW_INS_HISTORICAL) { - set_tuple_col_8(node->row, table->vers_end, trx->id, - node->vers_end_buf); - } else /* ROW_INS_VERSIONED */ { - set_tuple_col_8(node->row, table->vers_end, TRX_ID_MAX, - node->vers_end_buf); -#ifndef DBUG_OFF - t = prebuilt->get_template_by_col(table->vers_start); - ut_ad(t); - ut_ad(t->mysql_col_len == 8); -#endif - set_tuple_col_8(node->row, table->vers_start, trx->id, - node->vers_start_buf); - } - } + node->vers_update_end(prebuilt, ins_mode == ROW_INS_HISTORICAL); + } savept = trx_savept_take(trx); |