mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
WL#2486 - natural and using join according to SQL:2003
- fixed a problem with RIGHT JOIN ON and enabled corresponding tests in select.test - fixed a memory leak
This commit is contained in:
@ -2218,6 +2218,23 @@ a
|
|||||||
1
|
1
|
||||||
2
|
2
|
||||||
3
|
3
|
||||||
|
select * from (t1 as t2 left join t1 as t3 using (a)) right join t1 on t1.a>1;
|
||||||
|
a a
|
||||||
|
NULL 1
|
||||||
|
1 2
|
||||||
|
2 2
|
||||||
|
3 2
|
||||||
|
1 3
|
||||||
|
2 3
|
||||||
|
3 3
|
||||||
|
select * from t1 right join (t1 as t2 left join t1 as t3 using (a)) on t1.a>1;
|
||||||
|
a a
|
||||||
|
2 1
|
||||||
|
3 1
|
||||||
|
2 2
|
||||||
|
3 2
|
||||||
|
2 3
|
||||||
|
3 3
|
||||||
select * from (t1 as t2 left join t1 as t3 using (a)) right outer join t1 using ( a );
|
select * from (t1 as t2 left join t1 as t3 using (a)) right outer join t1 using ( a );
|
||||||
a
|
a
|
||||||
1
|
1
|
||||||
|
@ -1850,10 +1850,8 @@ select * from t1 left join (t1 as t2 left join t1 as t3 using (a)) using ( a );
|
|||||||
select * from (t1 as t2 left join t1 as t3 using (a)) natural left join t1;
|
select * from (t1 as t2 left join t1 as t3 using (a)) natural left join t1;
|
||||||
select * from t1 natural left join (t1 as t2 left join t1 as t3 using (a));
|
select * from t1 natural left join (t1 as t2 left join t1 as t3 using (a));
|
||||||
# right join on
|
# right join on
|
||||||
# TODO: WL#2486 - there is a problem in the order of tables in RIGHT JOIN
|
select * from (t1 as t2 left join t1 as t3 using (a)) right join t1 on t1.a>1;
|
||||||
# check how we set next_name_resolution_table
|
select * from t1 right join (t1 as t2 left join t1 as t3 using (a)) on t1.a>1;
|
||||||
# select * from (t1 as t2 left join t1 as t3 using (a)) right join t1 on t1.a>1;
|
|
||||||
# select * from t1 right join (t1 as t2 left join t1 as t3 using (a)) on t1.a>1;
|
|
||||||
# right [outer] joing using
|
# right [outer] joing using
|
||||||
select * from (t1 as t2 left join t1 as t3 using (a)) right outer join t1 using ( a );
|
select * from (t1 as t2 left join t1 as t3 using (a)) right outer join t1 using ( a );
|
||||||
select * from t1 right outer join (t1 as t2 left join t1 as t3 using (a)) using ( a );
|
select * from t1 right outer join (t1 as t2 left join t1 as t3 using (a)) using ( a );
|
||||||
|
@ -3790,10 +3790,29 @@ store_top_level_join_columns(THD *thd, TABLE_LIST *table_ref,
|
|||||||
{
|
{
|
||||||
TABLE_LIST *cur_table_ref= cur_left_neighbor;
|
TABLE_LIST *cur_table_ref= cur_left_neighbor;
|
||||||
cur_left_neighbor= nested_it++;
|
cur_left_neighbor= nested_it++;
|
||||||
if (cur_table_ref->nested_join &&
|
/*
|
||||||
store_top_level_join_columns(thd, cur_table_ref,
|
The order of RIGHT JOIN operands is reversed in 'join list' to
|
||||||
cur_left_neighbor, cur_right_neighbor))
|
transform it into a LEFT JOIN. However, in this procedure we need
|
||||||
DBUG_RETURN(TRUE);
|
the join operands in their lexical order, so below we reverse the
|
||||||
|
join operands. Notice that this happens only in the first loop, and
|
||||||
|
not in the second one, as in the second loop cur_left_neighbor == NULL.
|
||||||
|
This is the correct behavior, because the second loop
|
||||||
|
sets cur_table_ref reference correctly after the join operands are
|
||||||
|
swapped in the first loop.
|
||||||
|
*/
|
||||||
|
if (cur_left_neighbor &&
|
||||||
|
cur_table_ref->outer_join & JOIN_TYPE_RIGHT)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(cur_table_ref);
|
||||||
|
/* This can happen only for JOIN ... ON. */
|
||||||
|
DBUG_ASSERT(table_ref->nested_join->join_list.elements == 2);
|
||||||
|
swap_variables(TABLE_LIST*, cur_left_neighbor, cur_table_ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur_table_ref->nested_join &&
|
||||||
|
store_top_level_join_columns(thd, cur_table_ref,
|
||||||
|
cur_left_neighbor, cur_right_neighbor))
|
||||||
|
DBUG_RETURN(TRUE);
|
||||||
cur_right_neighbor= cur_table_ref;
|
cur_right_neighbor= cur_table_ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -374,7 +374,7 @@ struct Field_translator
|
|||||||
Field (for tables), or a Field_translator (for views).
|
Field (for tables), or a Field_translator (for views).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Natural_join_column
|
class Natural_join_column: public Sql_alloc
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Field_translator *view_field; /* Column reference of merge view. */
|
Field_translator *view_field; /* Column reference of merge view. */
|
||||||
|
Reference in New Issue
Block a user