Commit 395affb8 authored by gkodinov@mysql.com's avatar gkodinov@mysql.com

Bug #15355: Common natural join column not resolved in prepared statement nested

  query
Problem:
There was a wrong context assigned to the columns that were added in insert_fields()
when expanding a '*'. When this is done in a prepared statement it causes 
fix_fields() to fail to find the table that these columns reference.
Actually the right context is set in setup_natural_join_row_types() called at the 
end of setup_tables(). However when executed in a context of a prepared statement
setup_tables() resets the context, but setup_natural_join_row_types() was not
setting it to the correct value assuming it has already done so.

Solution:
The top-most, left-most NATURAL/USING join must be set as a 
first_name_resolution_table in context even when operating on prepared statements.
parent fdc2b921
...@@ -744,3 +744,23 @@ select a2 from ((t1 natural join t2) join t3 on b=c1) natural join t4; ...@@ -744,3 +744,23 @@ select a2 from ((t1 natural join t2) join t3 on b=c1) natural join t4;
a2 a2
1 1
drop table t1,t2,t3,t4; drop table t1,t2,t3,t4;
create table t1 (c int, b int);
create table t2 (a int, b int);
create table t3 (b int, c int);
create table t4 (y int, c int);
create table t5 (y int, z int);
insert into t1 values (3,2);
insert into t2 values (1,2);
insert into t3 values (2,3);
insert into t4 values (1,3);
insert into t5 values (1,4);
prepare stmt1 from "select * from ((t3 natural join (t1 natural join t2))
natural join t4) natural join t5";
execute stmt1;
y c b a z
1 3 2 1 4
select * from ((t3 natural join (t1 natural join t2)) natural join t4)
natural join t5;
y c b a z
1 3 2 1 4
drop table t1, t2, t3, t4, t5;
...@@ -563,4 +563,29 @@ select a2 from ((t1 natural join t2) join t3 on b=c1) natural join t4; ...@@ -563,4 +563,29 @@ select a2 from ((t1 natural join t2) join t3 on b=c1) natural join t4;
drop table t1,t2,t3,t4; drop table t1,t2,t3,t4;
#
# BUG#15355: Common natural join column not resolved in prepared statement nested query
#
create table t1 (c int, b int);
create table t2 (a int, b int);
create table t3 (b int, c int);
create table t4 (y int, c int);
create table t5 (y int, z int);
insert into t1 values (3,2);
insert into t2 values (1,2);
insert into t3 values (2,3);
insert into t4 values (1,3);
insert into t5 values (1,4);
-- this fails
prepare stmt1 from "select * from ((t3 natural join (t1 natural join t2))
natural join t4) natural join t5";
execute stmt1;
-- this works
select * from ((t3 natural join (t1 natural join t2)) natural join t4)
natural join t5;
drop table t1, t2, t3, t4, t5;
# End of tests for WL#2486 - natural/using join # End of tests for WL#2486 - natural/using join
...@@ -4184,10 +4184,6 @@ static bool setup_natural_join_row_types(THD *thd, ...@@ -4184,10 +4184,6 @@ static bool setup_natural_join_row_types(THD *thd,
if (from_clause->elements == 0) if (from_clause->elements == 0)
return FALSE; /* We come here in the case of UNIONs. */ return FALSE; /* We come here in the case of UNIONs. */
/* For stored procedures do not redo work if already done. */
if (!context->select_lex->first_execution)
return FALSE;
List_iterator_fast<TABLE_LIST> table_ref_it(*from_clause); List_iterator_fast<TABLE_LIST> table_ref_it(*from_clause);
TABLE_LIST *table_ref; /* Current table reference. */ TABLE_LIST *table_ref; /* Current table reference. */
/* Table reference to the left of the current. */ /* Table reference to the left of the current. */
...@@ -4200,14 +4196,18 @@ static bool setup_natural_join_row_types(THD *thd, ...@@ -4200,14 +4196,18 @@ static bool setup_natural_join_row_types(THD *thd,
{ {
table_ref= left_neighbor; table_ref= left_neighbor;
left_neighbor= table_ref_it++; left_neighbor= table_ref_it++;
if (store_top_level_join_columns(thd, table_ref, /* For stored procedures do not redo work if already done. */
left_neighbor, right_neighbor)) if (context->select_lex->first_execution)
return TRUE;
if (left_neighbor)
{ {
TABLE_LIST *first_leaf_on_the_right; if (store_top_level_join_columns(thd, table_ref,
first_leaf_on_the_right= table_ref->first_leaf_for_name_resolution(); left_neighbor, right_neighbor))
left_neighbor->next_name_resolution_table= first_leaf_on_the_right; return TRUE;
if (left_neighbor)
{
TABLE_LIST *first_leaf_on_the_right;
first_leaf_on_the_right= table_ref->first_leaf_for_name_resolution();
left_neighbor->next_name_resolution_table= first_leaf_on_the_right;
}
} }
right_neighbor= table_ref; right_neighbor= table_ref;
} }
......
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