Commit 0aad592f authored by unknown's avatar unknown

MDEV-3914 fix.

Fixed algorithm of detecting of first real table in view/subquery-in-the-FROM-clase.
parent b01fbb8e
...@@ -4568,6 +4568,30 @@ id id bbb iddqd val1 ...@@ -4568,6 +4568,30 @@ id id bbb iddqd val1
drop view v2; drop view v2;
drop table t1,t2; drop table t1,t2;
# #
# MDEV-3914: Wrong result (NULLs instead of real values)
# with INNER and RIGHT JOIN in a FROM subquery, derived_merge=on
# (fix of above MDEV-486 fix)
#
SET @save_optimizer_switch_MDEV_3914=@@optimizer_switch;
SET optimizer_switch = 'derived_merge=on';
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1),(2);
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
INSERT INTO t2 VALUES (3),(4);
CREATE TABLE t3 (c INT) ENGINE=MyISAM;
INSERT INTO t3 VALUES (5),(6);
SELECT * FROM ( SELECT c FROM ( t1 INNER JOIN t2 ) RIGHT JOIN t3 ON a = c ) AS alias;
c
5
6
SET optimizer_switch = 'derived_merge=off';
SELECT * FROM ( SELECT c FROM ( t1 INNER JOIN t2 ) RIGHT JOIN t3 ON a = c ) AS alias;
c
5
6
SET optimizer_switch=@save_optimizer_switch_MDEV_3914;
drop table t1,t2,t3;
#
# MDEV-589 (LP BUG#1007647) : # MDEV-589 (LP BUG#1007647) :
# Assertion `vcol_table == 0 || vcol_table == table' failed in # Assertion `vcol_table == 0 || vcol_table == table' failed in
# fill_record(THD*, List<Item>&, List<Item>&, bool) # fill_record(THD*, List<Item>&, List<Item>&, bool)
......
...@@ -4504,6 +4504,32 @@ select t1.*, v2.* from t1 left join v2 on t1.id = v2.id; ...@@ -4504,6 +4504,32 @@ select t1.*, v2.* from t1 left join v2 on t1.id = v2.id;
drop view v2; drop view v2;
drop table t1,t2; drop table t1,t2;
--echo #
--echo # MDEV-3914: Wrong result (NULLs instead of real values)
--echo # with INNER and RIGHT JOIN in a FROM subquery, derived_merge=on
--echo # (fix of above MDEV-486 fix)
--echo #
SET @save_optimizer_switch_MDEV_3914=@@optimizer_switch;
SET optimizer_switch = 'derived_merge=on';
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1),(2);
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
INSERT INTO t2 VALUES (3),(4);
CREATE TABLE t3 (c INT) ENGINE=MyISAM;
INSERT INTO t3 VALUES (5),(6);
SELECT * FROM ( SELECT c FROM ( t1 INNER JOIN t2 ) RIGHT JOIN t3 ON a = c ) AS alias;
SET optimizer_switch = 'derived_merge=off';
SELECT * FROM ( SELECT c FROM ( t1 INNER JOIN t2 ) RIGHT JOIN t3 ON a = c ) AS alias;
SET optimizer_switch=@save_optimizer_switch_MDEV_3914;
drop table t1,t2,t3;
--echo # --echo #
--echo # MDEV-589 (LP BUG#1007647) : --echo # MDEV-589 (LP BUG#1007647) :
--echo # Assertion `vcol_table == 0 || vcol_table == table' failed in --echo # Assertion `vcol_table == 0 || vcol_table == table' failed in
......
...@@ -4457,19 +4457,33 @@ TABLE *TABLE_LIST::get_real_join_table() ...@@ -4457,19 +4457,33 @@ TABLE *TABLE_LIST::get_real_join_table()
DBUG_ASSERT(tbl->derived == NULL || DBUG_ASSERT(tbl->derived == NULL ||
tbl->derived->first_select()->next_select() == NULL); tbl->derived->first_select()->next_select() == NULL);
if (tbl->table)
table= tbl->table;
tbl= (tbl->view != NULL ?
tbl->view->select_lex.get_table_list() :
tbl->derived->first_select()->get_table_list());
/* find left table in outer join on this level */
while(tbl->outer_join & JOIN_TYPE_RIGHT)
{ {
DBUG_ASSERT(tbl->next_local); List_iterator_fast<TABLE_LIST> ti;
tbl= tbl->next_local; {
List_iterator_fast<TABLE_LIST>
ti(tbl->view != NULL ?
tbl->view->select_lex.top_join_list :
tbl->derived->first_select()->top_join_list);
for (;;)
{
tbl= NULL;
/*
Find left table in outer join on this level
(the list is reverted).
*/
for (TABLE_LIST *t= ti++; t; t= ti++)
tbl= t;
/*
It is impossible that the list is empty
so tbl can't be NULL after above loop.
*/
if (!tbl->nested_join)
break;
/* go deeper if we've found nested join */
ti= tbl->nested_join->join_list;
}
}
} }
} }
return tbl->table; return tbl->table;
......
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