Commit 5329be86 authored by unknown's avatar unknown
Browse files

Merge xiphis.org:/usr/home/antony/work2/p2-bug10109.3

into  xiphis.org:/usr/home/antony/work2/p2-bug10109.4


mysql-test/t/insert_update.test:
  Auto merged
mysql-test/r/insert_update.result:
  Auto merged
sql/sql_class.h:
  discard bug10109 changes from 4.1
sql/sql_insert.cc:
  merge bug10109 from 4.1 to 5.0
sql/sql_parse.cc:
  discard bug10109 changes from 4.1
parents 42fec6b6 fdb4d307
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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;
+14 −0
Original line number Diff line number Diff line
@@ -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
+25 −6
Original line number Diff line number Diff line
@@ -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);