mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Merge 5.3 -> 5.5
pending merges: Sergey Petrunya 2013-11-27 MDEV-5344: LEFT OUTER JOIN table data is lost...
This commit is contained in:
commit
87355a453d
3 changed files with 74 additions and 0 deletions
|
|
@ -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 #
|
||||
|
|
|
|||
|
|
@ -610,6 +610,21 @@ void eliminate_tables(JOIN *join)
|
|||
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);
|
||||
while ((item= it++))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue