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.
This commit is contained in:
parent
998ed51497
commit
928543ca6c
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user