diff options
author | acurtis@xiphis.org <> | 2005-08-10 22:17:53 +0100 |
---|---|---|
committer | acurtis@xiphis.org <> | 2005-08-10 22:17:53 +0100 |
commit | 445bc1336ece8428a3db3374c1d2b3ce57a61ede (patch) | |
tree | e56c88e5c44e91416f40652b7af3a1165c35b4ba | |
parent | 9125477df54aff3f7cdaf64637f5867cc8a8d75d (diff) | |
parent | 015447b21191ee5dce8f08631ff111595b3533ea (diff) | |
download | mariadb-git-445bc1336ece8428a3db3374c1d2b3ce57a61ede.tar.gz |
Merge xiphis.org:/usr/home/antony/work2/p2-bug10109.3
into xiphis.org:/usr/home/antony/work2/p2-bug10109.4
-rw-r--r-- | mysql-test/r/insert_update.result | 6 | ||||
-rw-r--r-- | mysql-test/t/insert_update.test | 14 | ||||
-rw-r--r-- | sql/sql_insert.cc | 31 |
3 files changed, 45 insertions, 6 deletions
diff --git a/mysql-test/r/insert_update.result b/mysql-test/r/insert_update.result index fc157093a7f..dbe5d600a95 100644 --- a/mysql-test/r/insert_update.result +++ b/mysql-test/r/insert_update.result @@ -191,3 +191,9 @@ ERROR 23000: Column 'a' in field list is ambiguous insert ignore into t1 select a from t1 on duplicate key update a=t1.a+1 ; ERROR 23000: Column 't1.a' in field list is ambiguous drop table t1; +CREATE TABLE t1 ( +a BIGINT(20) NOT NULL DEFAULT 0, +PRIMARY KEY (a) +) ENGINE=MyISAM; +INSERT INTO t1 ( a ) SELECT 0 ON DUPLICATE KEY UPDATE a = a + VALUES (a) ; +DROP TABLE t1; diff --git a/mysql-test/t/insert_update.test b/mysql-test/t/insert_update.test index 5948f92d4e0..eda768be1bc 100644 --- a/mysql-test/t/insert_update.test +++ b/mysql-test/t/insert_update.test @@ -101,4 +101,18 @@ insert into t1 select a from t1 on duplicate key update a=a+1 ; insert ignore into t1 select a from t1 on duplicate key update a=t1.a+1 ; drop table t1; +# +# Bug#10109 - INSERT .. SELECT ... ON DUPLICATE KEY UPDATE fails +# Bogus "Duplicate columns" error message +# + +CREATE TABLE t1 ( + a BIGINT(20) NOT NULL DEFAULT 0, + PRIMARY KEY (a) +) ENGINE=MyISAM; + +INSERT INTO t1 ( a ) SELECT 0 ON DUPLICATE KEY UPDATE a = a + VALUES (a) ; + +DROP TABLE t1; + # End of 4.1 tests diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 27342287fcd..f9923283911 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -808,11 +808,11 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, table_list->next_local= 0; select_lex->context.resolve_in_table_list_only(table_list); - if ((values && check_insert_fields(thd, table_list, fields, *values, - !insert_into_view)) || - (values && setup_fields(thd, 0, *values, 0, 0, 0))) - res= TRUE; - else if (duplic == DUP_UPDATE) + if (values && + !(res= check_insert_fields(thd, table_list, fields, *values, + !insert_into_view) || + setup_fields(thd, 0, *values, 0, 0, 0)) && + duplic == DUP_UPDATE) { select_lex->no_wrap_view_item= TRUE; res= check_update_fields(thd, table_list, update_fields); @@ -2089,7 +2089,26 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u) */ lex->current_select= &lex->select_lex; res= check_insert_fields(thd, table_list, *fields, values, - !insert_into_view); + !insert_into_view) || + setup_fields(thd, 0, values, 0, 0, 0); + if (info.handle_duplicates == DUP_UPDATE) + { + TABLE_LIST *save_next_local= table_list->next_local; + table_list->next_local= 0; + lex->select_lex.context.resolve_in_table_list_only(table_list); + lex->select_lex.no_wrap_view_item= TRUE; + res= res || check_update_fields(thd, table_list, *info.update_fields); + lex->select_lex.no_wrap_view_item= FALSE; + + /* + When we are not using GROUP BY we can refer to other tables in the + ON DUPLICATE KEY part + */ + if (!lex->select_lex.group_list.elements) + table_list->next_local= save_next_local; + res= res || setup_fields(thd, 0, *info.update_values, 1, 0, 0); + table_list->next_local= save_next_local; + } lex->current_select= lex_current_select_save; if (res) DBUG_RETURN(1); |