summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/loaddata.result12
-rw-r--r--mysql-test/t/loaddata.test13
-rw-r--r--sql/log_event.cc2
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/sql_load.cc4
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_yacc.yy22
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
{