summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoracurtis@xiphis.org <>2005-08-10 22:17:53 +0100
committeracurtis@xiphis.org <>2005-08-10 22:17:53 +0100
commit445bc1336ece8428a3db3374c1d2b3ce57a61ede (patch)
treee56c88e5c44e91416f40652b7af3a1165c35b4ba
parent9125477df54aff3f7cdaf64637f5867cc8a8d75d (diff)
parent015447b21191ee5dce8f08631ff111595b3533ea (diff)
downloadmariadb-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.result6
-rw-r--r--mysql-test/t/insert_update.test14
-rw-r--r--sql/sql_insert.cc31
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);