Commit 928543ca authored by Sergey Petrunya's avatar Sergey Petrunya

MDEV-5344: LEFT OUTER JOIN table data is lost in ON DUPLICATE KEY UPDATE section

- For INSERT ... SELECT ... ON DUPLICATE KEY UPDATE, table elimination should 
  check which tables are referenced in the ON DUPLICATE KEY UPDATE clause.
parent 998ed514
......@@ -609,4 +609,32 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using where; Using index
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;
SET optimizer_switch=@save_optimizer_switch;
......@@ -543,6 +543,35 @@ 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;
SET optimizer_switch=@save_optimizer_switch;
......@@ -594,6 +594,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