summaryrefslogtreecommitdiff
path: root/storage/innobase/row/row0mysql.cc
diff options
context:
space:
mode:
authorAleksey Midenkov <midenok@gmail.com>2020-07-20 18:28:08 +0300
committerAleksey Midenkov <midenok@gmail.com>2020-07-20 18:28:08 +0300
commitaf83ed9f0ed10496c11bea6b054f4d86562e2349 (patch)
treead98c4625ff8a0c79add509acb512914250cf5e3 /storage/innobase/row/row0mysql.cc
parentaf57c658090cc52aa20e8cde7d24a563d73ff886 (diff)
downloadmariadb-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.cc42
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);