Hello Igor, Ok to push. I'm sorry for the delay.
On Sun, Jul 25, 2010 at 10:50:03PM -0700, Igor Babaev wrote: > #At lp:maria based on revid:mo...@askmonty.org-20100615220051-2xp3g51fysxle1r1 > > 2869 Igor Babaev 2010-07-25 > Fixed bug #52005. > Corrected coding for Warshall's algorithm. > modified: > mysql-test/r/join_outer.result > mysql-test/t/join_outer.test > sql/sql_select.cc > > === modified file 'mysql-test/r/join_outer.result' > --- a/mysql-test/r/join_outer.result 2010-03-19 06:21:37 +0000 > +++ b/mysql-test/r/join_outer.result 2010-07-26 05:49:51 +0000 > @@ -1308,4 +1308,63 @@ WHERE (COALESCE(t1.f1, t2.f1), f3) IN (( > f1 f2 f3 f1 f2 > 1 NULL 3 NULL NULL > DROP TABLE t1, t2; > +# > +# Bug#46091 STRAIGHT_JOIN + RIGHT JOIN returns different result > +# > +CREATE TABLE t1 (f1 INT NOT NULL); > +INSERT INTO t1 VALUES (9),(0); > +CREATE TABLE t2 (f1 INT NOT NULL); > +INSERT INTO t2 VALUES > +(5),(3),(0),(3),(1),(0),(1),(7),(1),(0),(0),(8),(4),(9),(0),(2),(0),(8),(5),(1); > +SELECT STRAIGHT_JOIN COUNT(*) FROM t1 TA1 > +RIGHT JOIN t2 TA2 JOIN t2 TA3 ON TA2.f1 ON TA3.f1; > +COUNT(*) > +476 > +EXPLAIN SELECT STRAIGHT_JOIN COUNT(*) FROM t1 TA1 > +RIGHT JOIN t2 TA2 JOIN t2 TA3 ON TA2.f1 ON TA3.f1; > +id select_type table type possible_keys key key_len ref > rows Extra > +1 SIMPLE TA2 ALL NULL NULL NULL NULL 20 Using > where > +1 SIMPLE TA3 ALL NULL NULL NULL NULL 20 Using > join buffer > +1 SIMPLE TA1 ALL NULL NULL NULL NULL 2 > +DROP TABLE t1, t2; > +# > +# Bug#48971 Segfault in add_found_match_trig_cond () at sql_select.cc:5990 > +# > +CREATE TABLE t1(f1 INT, PRIMARY KEY (f1)); > +INSERT INTO t1 VALUES (1),(2); > +EXPLAIN EXTENDED SELECT STRAIGHT_JOIN jt1.f1 FROM t1 AS jt1 > +LEFT JOIN t1 AS jt2 > +RIGHT JOIN t1 AS jt3 > +JOIN t1 AS jt4 ON 1 > +LEFT JOIN t1 AS jt5 ON 1 > +ON 1 > +RIGHT JOIN t1 AS jt6 ON jt6.f1 > +ON 1; > +id select_type table type possible_keys key key_len ref > rows filtered Extra > +1 SIMPLE jt1 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt6 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt3 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt4 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt5 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt2 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +Warnings: > +Note 1003 select straight_join `test`.`jt1`.`f1` AS `f1` from `test`.`t1` > `jt1` left join (`test`.`t1` `jt6` left join (`test`.`t1` `jt3` join > `test`.`t1` `jt4` left join `test`.`t1` `jt5` on(1) left join `test`.`t1` > `jt2` on(1)) on((`test`.`jt6`.`f1` and 1))) on(1) where 1 > +EXPLAIN EXTENDED SELECT STRAIGHT_JOIN jt1.f1 FROM t1 AS jt1 > +RIGHT JOIN t1 AS jt2 > +RIGHT JOIN t1 AS jt3 > +JOIN t1 AS jt4 ON 1 > +LEFT JOIN t1 AS jt5 ON 1 > +ON 1 > +RIGHT JOIN t1 AS jt6 ON jt6.f1 > +ON 1; > +id select_type table type possible_keys key key_len ref > rows filtered Extra > +1 SIMPLE jt6 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt3 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt4 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt5 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt2 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +1 SIMPLE jt1 index NULL PRIMARY 4 NULL 2 100.00 > Using index > +Warnings: > +Note 1003 select straight_join `test`.`jt1`.`f1` AS `f1` from `test`.`t1` > `jt6` left join (`test`.`t1` `jt3` join `test`.`t1` `jt4` left join > `test`.`t1` `jt5` on(1) left join `test`.`t1` `jt2` on(1)) > on((`test`.`jt6`.`f1` and 1)) left join `test`.`t1` `jt1` on(1) where 1 > +DROP TABLE t1; > End of 5.1 tests > > === modified file 'mysql-test/t/join_outer.test' > --- a/mysql-test/t/join_outer.test 2010-03-19 06:21:37 +0000 > +++ b/mysql-test/t/join_outer.test 2010-07-26 05:49:51 +0000 > @@ -913,4 +913,48 @@ WHERE (COALESCE(t1.f1, t2.f1), f3) IN (( > > DROP TABLE t1, t2; > > +--echo # > +--echo # Bug#46091 STRAIGHT_JOIN + RIGHT JOIN returns different result > +--echo # > +CREATE TABLE t1 (f1 INT NOT NULL); > +INSERT INTO t1 VALUES (9),(0); > + > +CREATE TABLE t2 (f1 INT NOT NULL); > +INSERT INTO t2 VALUES > +(5),(3),(0),(3),(1),(0),(1),(7),(1),(0),(0),(8),(4),(9),(0),(2),(0),(8),(5),(1); > + > +SELECT STRAIGHT_JOIN COUNT(*) FROM t1 TA1 > +RIGHT JOIN t2 TA2 JOIN t2 TA3 ON TA2.f1 ON TA3.f1; > + > +EXPLAIN SELECT STRAIGHT_JOIN COUNT(*) FROM t1 TA1 > +RIGHT JOIN t2 TA2 JOIN t2 TA3 ON TA2.f1 ON TA3.f1; > + > +DROP TABLE t1, t2; > + > +--echo # > +--echo # Bug#48971 Segfault in add_found_match_trig_cond () at > sql_select.cc:5990 > +--echo # > +CREATE TABLE t1(f1 INT, PRIMARY KEY (f1)); > +INSERT INTO t1 VALUES (1),(2); > + > +EXPLAIN EXTENDED SELECT STRAIGHT_JOIN jt1.f1 FROM t1 AS jt1 > + LEFT JOIN t1 AS jt2 > + RIGHT JOIN t1 AS jt3 > + JOIN t1 AS jt4 ON 1 > + LEFT JOIN t1 AS jt5 ON 1 > + ON 1 > + RIGHT JOIN t1 AS jt6 ON jt6.f1 > + ON 1; > + > +EXPLAIN EXTENDED SELECT STRAIGHT_JOIN jt1.f1 FROM t1 AS jt1 > + RIGHT JOIN t1 AS jt2 > + RIGHT JOIN t1 AS jt3 > + JOIN t1 AS jt4 ON 1 > + LEFT JOIN t1 AS jt5 ON 1 > + ON 1 > + RIGHT JOIN t1 AS jt6 ON jt6.f1 > + ON 1; > + > +DROP TABLE t1; > + > --echo End of 5.1 tests > > === modified file 'sql/sql_select.cc' > --- a/sql/sql_select.cc 2010-05-26 18:55:40 +0000 > +++ b/sql/sql_select.cc 2010-07-26 05:49:51 +0000 > @@ -2717,15 +2717,29 @@ make_join_statistics(JOIN *join, TABLE_L > as well as allow us to catch illegal cross references/ > Warshall's algorithm is used to build the transitive closure. > As we use bitmaps to represent the relation the complexity > - of the algorithm is O((number of tables)^2). > + of the algorithm is O((number of tables)^2). > + > + The classic form of the Warshall's algorithm would look like: > + for (i= 0; i < table_count; i++) > + { > + for (j= 0; j < table_count; j++) > + { > + for (k= 0; k < table_count; k++) > + { > + if (bitmap_is_set(stat[j], i) && bitmap_is_set(stat[i], k) > + bitmap_set_bit(stat[j], k); > + } > + } > + } > */ > for (i= 0, s= stat ; i < table_count ; i++, s++) > { > - for (uint j= 0 ; j < table_count ; j++) > + table= s->table; > + JOIN_TAB *t; > + for (uint j= 0, t= stat ; j < table_count ; j++, t++) > { > - table= stat[j].table; > - if (s->dependent & table->map) > - s->dependent |= table->reginfo.join_tab->dependent; > + if (t->dependent & table->map) > + t->dependent |= table->reginfo.join_tab->dependent; > } > if (outer_join & s->table->map) > s->table->maybe_null= 1; > @@ -8784,6 +8798,7 @@ simplify_joins(JOIN *join, List<TABLE_LI > NESTED_JOIN *nested_join; > TABLE_LIST *prev_table= 0; > List_iterator<TABLE_LIST> li(*join_list); > + bool straight_join= test(join->select_options & SELECT_STRAIGHT_JOIN); > DBUG_ENTER("simplify_joins"); > > /* > @@ -8896,7 +8911,7 @@ simplify_joins(JOIN *join, List<TABLE_LI > if (prev_table) > { > /* The order of tables is reverse: prev_table follows table */ > - if (prev_table->straight) > + if (prev_table->straight || straight_join) > prev_table->dep_tables|= used_tables; > if (prev_table->on_expr) > { > BR Sergey -- Sergey Petrunia, Software Developer Monty Program AB, http://askmonty.org Blog: http://s.petrunia.net/blog _______________________________________________ Mailing list: https://launchpad.net/~maria-developers Post to : maria-developers@lists.launchpad.net Unsubscribe : https://launchpad.net/~maria-developers More help : https://help.launchpad.net/ListHelp