Commit e0f158fa authored by Alexander Barkov's avatar Alexander Barkov

Merge 5.3 -> 5.5

pending merges:
  Sergey Petrunya 2013-11-27 MDEV-5344: LEFT OUTER JOIN table data is lost...
parents 2a2f5740 c7360a74
......@@ -610,6 +610,34 @@ id select_type table type possible_keys key key_len ref rows Extra
drop view v1;
DROP TABLE t1,t2,t3;
#
# MDEV-5344: LEFT OUTER JOIN table data is lost in ON DUPLICATE KEY UPDATE section
#
create table t1 (
id int(10) unsigned NOT NULL DEFAULT '0',
v int(10) unsigned DEFAULT '0',
PRIMARY KEY (id)
);
create table t2 (
id int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (id)
) ;
create table t3 (
id int(10) unsigned NOT NULL DEFAULT '0',
v int(10) unsigned DEFAULT '0',
PRIMARY KEY (id)
);
insert into t1 values (1, 10), (2, 10);
insert into t2 values (1), (2);
insert into t3 values (1, 20);
insert into t1
select t2.id, 5 from t2 LEFT OUTER JOIN t3 ON t2.id = t3.id
on duplicate key update t1.v = t3.v;
select * from t1;
id v
1 20
2 NULL
drop table t1,t2,t3;
#
# BUG#919878: Assertion `!eliminated_tables...
#
CREATE TABLE t1 ( a INT );
......
......@@ -543,6 +543,37 @@ EXPLAIN SELECT alias1.* FROM t3 LEFT JOIN v1 as alias1 ON ( t3.a = alias1.b );
drop view v1;
DROP TABLE t1,t2,t3;
--echo #
--echo # MDEV-5344: LEFT OUTER JOIN table data is lost in ON DUPLICATE KEY UPDATE section
--echo #
create table t1 (
id int(10) unsigned NOT NULL DEFAULT '0',
v int(10) unsigned DEFAULT '0',
PRIMARY KEY (id)
);
create table t2 (
id int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (id)
) ;
create table t3 (
id int(10) unsigned NOT NULL DEFAULT '0',
v int(10) unsigned DEFAULT '0',
PRIMARY KEY (id)
);
insert into t1 values (1, 10), (2, 10);
insert into t2 values (1), (2);
insert into t3 values (1, 20);
insert into t1
select t2.id, 5 from t2 LEFT OUTER JOIN t3 ON t2.id = t3.id
on duplicate key update t1.v = t3.v;
select * from t1;
drop table t1,t2,t3;
--echo #
--echo # BUG#919878: Assertion `!eliminated_tables...
--echo #
......
......@@ -609,6 +609,21 @@ void eliminate_tables(JOIN *join)
/* Find the tables that are referred to from WHERE/HAVING */
used_tables= (join->conds? join->conds->used_tables() : 0) |
(join->having? join->having->used_tables() : 0);
/*
For "INSERT ... SELECT ... ON DUPLICATE KEY UPDATE column = val"
we should also take into account tables mentioned in "val".
*/
if (join->thd->lex->sql_command == SQLCOM_INSERT_SELECT &&
join->select_lex == &thd->lex->select_lex)
{
List_iterator<Item> val_it(thd->lex->value_list);
while ((item= val_it++))
{
DBUG_ASSERT(item->fixed);
used_tables |= item->used_tables();
}
}
/* Add tables referred to from the select list */
List_iterator<Item> it(join->fields_list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment