mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for BUG#12943.
The problem was that in the first production in rule 'join_table', that processes simple cross joins, the parser was processing the second join operand before the first one due to unspecified priorities of JOINs. As a result in the case of cross joins the parser constructed a tree with incorrect nesting: the expression "t1 join t2 join t3 on some_cond" was interpreted as "t1 join (t2 join t3 on some_cond)" instead of "(t1 join t2) join t3 on some_cond". Because of this incorrect nesting the method make_join_on_context picked an incorrect table as the first table of the name resolution context. The solution assignes correct priorities to the related production. mysql-test/r/select.result: Added test for BUG#12943. mysql-test/t/select.test: Added test for BUG#12943. sql/sql_parse.cc: Fixed typo. sql/sql_yacc.yy: Provide explicit priorities of the JOIN operator and the 'table_ref' rule, to enforce left-associativity of [INNER | CROSS] JOIN.
This commit is contained in:
@ -2897,3 +2897,23 @@ select * from t1 natural join t2 where a = 'b';
|
||||
a
|
||||
b
|
||||
drop table t1, t2;
|
||||
create table t1 (a int, c int);
|
||||
create table t2 (b int);
|
||||
create table t3 (b int, a int);
|
||||
create table t4 (c int);
|
||||
insert into t1 values (1,1);
|
||||
insert into t2 values (1);
|
||||
insert into t3 values (1,1);
|
||||
insert into t4 values (1);
|
||||
select * from t1 join t2 join t3 on (t2.b = t3.b and t1.a = t3.a);
|
||||
a c b b a
|
||||
1 1 1 1 1
|
||||
select * from t1, t2 join t3 on (t2.b = t3.b and t1.a = t3.a);
|
||||
ERROR 42S22: Unknown column 't1.a' in 'on clause'
|
||||
select * from t1 join t2 join t3 join t4 on (t1.a = t4.c and t2.b = t4.c);
|
||||
a c b b a c
|
||||
1 1 1 1 1 1
|
||||
select * from t1 join t2 join t4 using (c);
|
||||
c a b
|
||||
1 1 1
|
||||
drop table t1, t2, t3, t4;
|
||||
|
@ -2465,3 +2465,26 @@ insert into t2 values ('b'),('c'),('d');
|
||||
select a from t1 natural join t2;
|
||||
select * from t1 natural join t2 where a = 'b';
|
||||
drop table t1, t2;
|
||||
|
||||
#
|
||||
# Bug #12943 Incorrect nesting of [INNER| CROSS] JOIN due to unspecified
|
||||
# associativity in the parser.
|
||||
#
|
||||
|
||||
create table t1 (a int, c int);
|
||||
create table t2 (b int);
|
||||
create table t3 (b int, a int);
|
||||
create table t4 (c int);
|
||||
insert into t1 values (1,1);
|
||||
insert into t2 values (1);
|
||||
insert into t3 values (1,1);
|
||||
insert into t4 values (1);
|
||||
|
||||
select * from t1 join t2 join t3 on (t2.b = t3.b and t1.a = t3.a);
|
||||
# Notice that ',' has lower priority than 'join', thus we have that:
|
||||
# t1, t2 join t3 <==> t1, (t2 join t3).
|
||||
-- error 1054
|
||||
select * from t1, t2 join t3 on (t2.b = t3.b and t1.a = t3.a);
|
||||
select * from t1 join t2 join t3 join t4 on (t1.a = t4.c and t2.b = t4.c);
|
||||
select * from t1 join t2 join t4 using (c);
|
||||
drop table t1, t2, t3, t4;
|
||||
|
Reference in New Issue
Block a user