summaryrefslogtreecommitdiff
path: root/storage/innobase/row/row0ins.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/row/row0ins.cc')
-rw-r--r--storage/innobase/row/row0ins.cc20
1 files changed, 17 insertions, 3 deletions
diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc
index 97b79b705b2..470d5a9bd15 100644
--- a/storage/innobase/row/row0ins.cc
+++ b/storage/innobase/row/row0ins.cc
@@ -944,6 +944,9 @@ row_ins_foreign_fill_virtual(
rec_get_offsets(rec, index, offsets_, true,
ULINT_UNDEFINED, &cascade->heap);
mem_heap_t* v_heap = NULL;
+ TABLE* mysql_table= NULL;
+ VCOL_STORAGE* vcol_storage= NULL;
+ byte* record;
upd_t* update = cascade->update;
ulint n_v_fld = index->table->n_v_def;
ulint n_diff;
@@ -963,6 +966,14 @@ row_ins_foreign_fill_virtual(
innobase_init_vc_templ(index->table);
}
+ if (innobase_allocate_row_for_vcol(thd, index, &v_heap,
+ &mysql_table,
+ &record, &vcol_storage))
+ {
+ *err = DB_OUT_OF_MEMORY;
+ goto func_exit;
+ }
+
for (ulint i = 0; i < n_v_fld; i++) {
dict_v_col_t* col = dict_table_get_nth_v_col(
@@ -976,8 +987,8 @@ row_ins_foreign_fill_virtual(
dfield_t* vfield = innobase_get_computed_value(
update->old_vrow, col, index,
- &v_heap, update->heap, NULL, thd, NULL,
- NULL, NULL, NULL);
+ &v_heap, update->heap, NULL, thd, mysql_table,
+ record, NULL, NULL, NULL);
if (vfield == NULL) {
*err = DB_COMPUTE_VALUE_FAILED;
@@ -1007,7 +1018,8 @@ row_ins_foreign_fill_virtual(
dfield_t* new_vfield = innobase_get_computed_value(
update->old_vrow, col, index,
&v_heap, update->heap, NULL, thd,
- NULL, NULL, node->update, foreign);
+ mysql_table, record, NULL,
+ node->update, foreign);
if (new_vfield == NULL) {
*err = DB_COMPUTE_VALUE_FAILED;
@@ -1025,6 +1037,8 @@ row_ins_foreign_fill_virtual(
func_exit:
if (v_heap) {
+ if (vcol_storage)
+ innobase_free_row_for_vcol(vcol_storage);
mem_heap_free(v_heap);
}
}