From cf30074c3ff6815d85bbd864b28adfe7949d340c Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 27 Jul 2015 12:50:51 +0200 Subject: [PATCH] MDEV-7968 Virtual column set to NULL using load data infile Don't forget to set thd->lex->unit.insert_table_with_stored_vcol in the mysql_load(). Othewise virtual columns will not be updated. --- mysql-test/suite/vcol/r/load_data.result | 20 ++++++++++++++++++++ mysql-test/suite/vcol/t/load_data.test | 13 +++++++++++++ sql/sql_load.cc | 12 ++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 mysql-test/suite/vcol/r/load_data.result create mode 100644 mysql-test/suite/vcol/t/load_data.test diff --git a/mysql-test/suite/vcol/r/load_data.result b/mysql-test/suite/vcol/r/load_data.result new file mode 100644 index 00000000000..9769b55ac9a --- /dev/null +++ b/mysql-test/suite/vcol/r/load_data.result @@ -0,0 +1,20 @@ +create table t1 ( c1 varchar(10), c2 varchar(10), c3 int ); +insert into t1 values ("a" , "b", 1), ("a" , "b", 2); +create table t2 like t1 ; +alter table t2 add column c4 bigint unsigned as (CONV(LEFT(MD5(concat(c1,c2,c3)), 16), 16, 10)) persistent unique key; +select * into outfile 't1.csv' from t1; +load data infile 't1.csv' into table t2 ; +Warnings: +Warning 1261 Row 1 doesn't contain data for all columns +Warning 1261 Row 2 doesn't contain data for all columns +select * from t2; +c1 c2 c3 c4 +a b 1 7545402351885872315 +a b 2 6048842355806993119 +insert into t2 (c1,c2,c3) values ("a" , "b", 4); +select * from t2; +c1 c2 c3 c4 +a b 1 7545402351885872315 +a b 2 6048842355806993119 +a b 4 15541743660496249717 +drop table t1, t2; diff --git a/mysql-test/suite/vcol/t/load_data.test b/mysql-test/suite/vcol/t/load_data.test new file mode 100644 index 00000000000..4db3c77244e --- /dev/null +++ b/mysql-test/suite/vcol/t/load_data.test @@ -0,0 +1,13 @@ +# +# MDEV-7968 Virtual column set to NULL using load data infile +# +create table t1 ( c1 varchar(10), c2 varchar(10), c3 int ); +insert into t1 values ("a" , "b", 1), ("a" , "b", 2); +create table t2 like t1 ; +alter table t2 add column c4 bigint unsigned as (CONV(LEFT(MD5(concat(c1,c2,c3)), 16), 16, 10)) persistent unique key; +select * into outfile 't1.csv' from t1; +load data infile 't1.csv' into table t2 ; +select * from t2; +insert into t2 (c1,c2,c3) values ("a" , "b", 4); +select * from t2; +drop table t1, t2; diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 6ecdddc3008..503cc579dd7 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -314,6 +314,18 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, table->prepare_triggers_for_insert_stmt_or_event(); table->mark_columns_needed_for_insert(); + if (table->vfield) + { + for (Field **vfield_ptr= table->vfield; *vfield_ptr; vfield_ptr++) + { + if ((*vfield_ptr)->stored_in_db) + { + thd->lex->unit.insert_table_with_stored_vcol= table; + break; + } + } + } + uint tot_length=0; bool use_blobs= 0, use_vars= 0; List_iterator_fast it(fields_vars);