diff --git a/mysql-test/suite/vcol/r/update.result b/mysql-test/suite/vcol/r/update.result index d2b67cefbd0..dd864e4a7e2 100644 --- a/mysql-test/suite/vcol/r/update.result +++ b/mysql-test/suite/vcol/r/update.result @@ -35,3 +35,11 @@ index(c(100), d(20))); insert t1 (a,b,h) values (repeat('g', 10000), repeat('x', 2800), 1); update t1 set a = repeat(cast(1 as char), 2000); drop table t1; +create table t1(a blob not null, b int, c varbinary (10) generated always as (a) virtual, unique (c(9))); +insert t1 (a,b) values ('a', 1); +replace t1 set a = 'a',b =1; +insert t1 (a,b) values ('a', 1) on duplicate key update a='b', b=2; +select * from t1; +a b c +b 2 b +drop table t1; diff --git a/mysql-test/suite/vcol/t/update.test b/mysql-test/suite/vcol/t/update.test index c0dbcaf6afd..f840c277cd1 100644 --- a/mysql-test/suite/vcol/t/update.test +++ b/mysql-test/suite/vcol/t/update.test @@ -46,3 +46,12 @@ create table t1 ( insert t1 (a,b,h) values (repeat('g', 10000), repeat('x', 2800), 1); update t1 set a = repeat(cast(1 as char), 2000); drop table t1; +# +# UPDATE disguised as INSERT +# +create table t1(a blob not null, b int, c varbinary (10) generated always as (a) virtual, unique (c(9))); +insert t1 (a,b) values ('a', 1); +replace t1 set a = 'a',b =1; +insert t1 (a,b) values ('a', 1) on duplicate key update a='b', b=2; +select * from t1; +drop table t1; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index aa5b5ac756b..955a66958fe 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1696,6 +1696,12 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info) HA_READ_KEY_EXACT)))) goto err; } + if (table->vfield) + { + table->move_fields(table->field, table->record[1], table->record[0]); + table->update_virtual_fields(VCOL_UPDATE_INDEXED); + table->move_fields(table->field, table->record[0], table->record[1]); + } if (info->handle_duplicates == DUP_UPDATE) { int res= 0;