diff options
-rw-r--r-- | mysql-test/r/loaddata.result | 12 | ||||
-rw-r--r-- | mysql-test/t/loaddata.test | 13 | ||||
-rw-r--r-- | sql/log_event.cc | 2 | ||||
-rw-r--r-- | sql/mysql_priv.h | 2 | ||||
-rw-r--r-- | sql/sql_load.cc | 4 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 22 |
7 files changed, 38 insertions, 19 deletions
diff --git a/mysql-test/r/loaddata.result b/mysql-test/r/loaddata.result index 562b855f3e3..d76fff372f5 100644 --- a/mysql-test/r/loaddata.result +++ b/mysql-test/r/loaddata.result @@ -1,4 +1,4 @@ -drop table if exists t1; +drop table if exists t1, t2; create table t1 (a date, b date, c date not null, d date); load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ','; Warnings: @@ -111,4 +111,12 @@ a b c 5 6 5+6+123+6+NIL load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, @b); ERROR HY000: Can't load value from file with fixed size rows to variable -drop table t1; +create table t2 (num int primary key, str varchar(10)); +insert into t2 values (10,'Ten'), (15,'Fifteen'); +truncate table t1; +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@dummy,@n) set a= @n, c= (select str from t2 where num=@n); +select * from t1; +a b c +10 NULL Ten +15 NULL Fifteen +drop table t1, t2; diff --git a/mysql-test/t/loaddata.test b/mysql-test/t/loaddata.test index d384b955212..14ef749c802 100644 --- a/mysql-test/t/loaddata.test +++ b/mysql-test/t/loaddata.test @@ -3,7 +3,7 @@ # --disable_warnings -drop table if exists t1; +drop table if exists t1, t2; --enable_warnings create table t1 (a date, b date, c date not null, d date); @@ -64,4 +64,13 @@ select * from t1; # and this should bark --error 1409 load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, @b); -drop table t1; + +# Now let us test LOAD DATA with subselect +create table t2 (num int primary key, str varchar(10)); +insert into t2 values (10,'Ten'), (15,'Fifteen'); +truncate table t1; +load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@dummy,@n) set a= @n, c= (select str from t2 where num=@n); +select * from t1; + +# cleanup +drop table t1, t2; diff --git a/sql/log_event.cc b/sql/log_event.cc index a943181e999..3176cdfd5cb 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -2713,7 +2713,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, update it inside mysql_load(). */ if (mysql_load(thd, &ex, &tables, field_list, set_fields, set_fields, - handle_dup, ignore, net != 0, TL_WRITE)) + handle_dup, ignore, net != 0)) thd->query_error= 1; if (thd->cuted_fields) { diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 3fe77e29193..876f932759e 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -945,7 +945,7 @@ bool mysql_load(THD *thd, sql_exchange *ex, TABLE_LIST *table_list, List<Item> &fields_vars, List<Item> &set_fields, List<Item> &set_values_list, enum enum_duplicates handle_duplicates, bool ignore, - bool local_file, thr_lock_type lock_type); + bool local_file); int write_record(THD *thd, TABLE *table, COPY_INFO *info); /* sql_manager.cc */ diff --git a/sql/sql_load.cc b/sql/sql_load.cc index b27ba9c095f..e2f7c9d62c8 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -99,7 +99,6 @@ static int read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list, replace row if we will meet duplicates. ignore - - indicates whenever we should ignore duplicates read_file_from_client - is this LOAD DATA LOCAL ? - lock_type - what type of concurrency do we allow then we are inserting data RETURN VALUES TRUE - error / FALSE - success @@ -109,7 +108,7 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, List<Item> &fields_vars, List<Item> &set_fields, List<Item> &set_values, enum enum_duplicates handle_duplicates, bool ignore, - bool read_file_from_client, thr_lock_type lock_type) + bool read_file_from_client) { char name[FN_REFLEN]; File file; @@ -143,7 +142,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list, MYF(0)); DBUG_RETURN(TRUE); } - table_list->lock_type= lock_type; if (open_and_lock_tables(thd, table_list)) DBUG_RETURN(TRUE); if (setup_tables(thd, table_list, &unused_conds, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 77580512c5a..ca8414f9d54 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3355,7 +3355,7 @@ unsent_create_error: res= mysql_load(thd, lex->exchange, first_table, lex->field_list, lex->update_list, lex->value_list, lex->duplicates, - lex->ignore, (bool) lex->local_file, lex->lock_option); + lex->ignore, (bool) lex->local_file); break; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index e2d0dba7a24..ef5cbb3c79b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -6437,16 +6437,20 @@ load_data: { LEX *lex=Lex; lex->fname_end= lex->ptr; - lex->field_list.empty(); - lex->update_list.empty(); - lex->value_list.empty(); - } - TABLE_SYM table_ident opt_field_term opt_line_term - opt_ignore_lines opt_field_or_var_spec opt_load_data_set_spec - { - if (!Select->add_table_to_list(YYTHD, $10, NULL, TL_OPTION_UPDATING)) - YYABORT; } + TABLE_SYM table_ident + { + LEX *lex=Lex; + if (!Select->add_table_to_list(YYTHD, $10, NULL, TL_OPTION_UPDATING, + lex->lock_option)) + YYABORT; + lex->field_list.empty(); + lex->update_list.empty(); + lex->value_list.empty(); + } + opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec + opt_load_data_set_spec + {} | FROM MASTER_SYM { |