Commit a6c7fb45 authored by unknown's avatar unknown
Browse files

Fix bug #9728 decreased functionality in "on duplicate key update"

Remove changes made by bug fix #8147. They strips list of insert_table_list to
only insert table, which results in error reported in bug #9728.
Added flag to Item to resolve ambigous fields reported in bug #8147.


sql/item.h:
  Fix bug#9728  decreased functionality in "on duplicate key update".
sql/item.cc:
  Fix bug#9728  decreased functionality in "on duplicate key update"
sql/sql_parse.cc:
  Fix bug#9728  decreased functionality in "on duplicate key update"
sql/sql_base.cc:
  Fix bug#9728  decreased functionality in "on duplicate key update".
sql/sql_yacc.yy:
  Fix bug#9728  decreased functionality in "on duplicate key update"
mysql-test/t/insert_select.test:
  Test case for bug#9728 Decreased functionality in "on duplicate key update".
mysql-test/r/insert_select.result:
  Test case for bug#9728 Decreased functionality in "on duplicate key update".
parent d785fc60
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -634,3 +634,18 @@ ff1 ff2
1	2
2	1
drop table t1, t2;
create table t1 (a int unique);
create table t2 (a int, b int);
insert into t1 values (1),(2);
insert into t2 values (1,2);
select * from t1;
a
1
2
insert into t1 select t2.a from t2 on duplicate key update a= a + t2.b;
select * from t1;
a
2
3
drop table t1;
drop table t2;
+14 −0
Original line number Diff line number Diff line
@@ -175,3 +175,17 @@ insert into t1 values (1),(1),(2);
insert into t2(ff1) select f1 from t1 on duplicate key update ff2=ff2+1;
select * from t2;
drop table t1, t2;
#
# BUGS #9728 - 'Decreased functionality in "on duplicate key update"' 
#      #8147 - 'a column proclaimed ambigous in INSERT ... SELECT .. ON
#      DUPLICATE'
#
create table t1 (a int unique);
create table t2 (a int, b int);
insert into t1 values (1),(2);
insert into t2 values (1,2);
select * from t1;
insert into t1 select t2.a from t2 on duplicate key update a= a + t2.b;
select * from t1;
drop table t1;
drop table t2; 
+3 −1
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ Item::Item():
	place == IN_HAVING)
      thd->lex->current_select->select_n_having_items++;
  }
  item_flags= 0;
}

/*
@@ -83,7 +84,8 @@ Item::Item(THD *thd, Item *item):
  unsigned_flag(item->unsigned_flag),
  with_sum_func(item->with_sum_func),
  fixed(item->fixed),
  collation(item->collation)
  collation(item->collation),
  item_flags(item->item_flags)
{
  next= thd->free_list;				// Put in free list
  thd->free_list= this;
+11 −0
Original line number Diff line number Diff line
@@ -107,6 +107,11 @@ class DTCollation {

typedef bool (Item::*Item_processor)(byte *arg);

/*
 See comments for sql_yacc.yy: insert_update_elem rule
 */
#define MY_ITEM_PREFER_1ST_TABLE 1

class Item {
  Item(const Item &);			/* Prevent use of these */
  void operator=(Item &);
@@ -142,6 +147,7 @@ class Item {
  my_bool with_sum_func;
  my_bool fixed;                        /* If item fixed with fix_fields */
  DTCollation collation;
  uint8 item_flags;		/* Flags on how item should be processed */

  // alloc & destruct is done as start of select using sql_alloc
  Item();
@@ -327,6 +333,11 @@ class Item {
    cleanup();
    delete this;
  }
  virtual bool set_flags_processor(byte *args)
  {
    this->item_flags|= *((uint8*)args);
    return true;
  }
};


+5 −2
Original line number Diff line number Diff line
@@ -2086,7 +2086,8 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables,
    return (Field*) 0;
  }
  bool allow_rowid= tables && !tables->next;	// Only one table
  for (; tables ; tables=tables->next)
  uint table_idx= 0;
  for (; tables ; tables=tables->next, table_idx++)
  {
    if (!tables->table)
    {
@@ -2115,6 +2116,8 @@ find_field_in_tables(THD *thd, Item_ident *item, TABLE_LIST *tables,
	return (Field*) 0;
      }
      found= field;
      if (table_idx == 0 && item->item_flags & MY_ITEM_PREFER_1ST_TABLE) 
        break;
    }
  }
  if (found)
Loading