From: Date: August 9 2006 1:19pm Subject: bk commit into 5.0 tree (gkodinov:1.2235) BUG#21302 List-Archive: http://lists.mysql.com/commits/10195 X-Bug: 21302 Message-Id: <20060809111928.34C6E362695@macbook.gmz> Below is the list of changes that have just been committed into a local 5.0 repository of kgeorge. When kgeorge does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2006-08-09 14:19:10+03:00, gkodinov@stripped +4 -0 Bug #21302: Result not properly sorted when using an ORDER BY on a second table in a join The optimizer removes redundant columns in ORDER BY it is considering redundant every reference to const table column, e.g b in : create table t1 (a int, b int, primary key(a)); select 1 from t1 order by b where a = 1 But it must not remove references to const table columns if the const table is an outer table because there still can be 2 values : the const value and NULL. e.g.: create table t1 (a int, b int, primary key(a)); select t2.b c from t1 left join t1 t2 on (t1.a = t2.a and t2.a = 5) order by c; mysql-test/r/join_outer.result@stripped, 2006-08-09 14:19:03+03:00, gkodinov@stripped +1 -1 Bug #21302: Result not properly sorted when using an ORDER BY on a second table in a join - don't remove columns of const tables in ORDER BY if the const table is an outer table. mysql-test/r/order_by.result@stripped, 2006-08-09 14:19:03+03:00, gkodinov@stripped +22 -0 Bug #21302: Result not properly sorted when using an ORDER BY on a second table in a join - test case mysql-test/t/order_by.test@stripped, 2006-08-09 14:19:04+03:00, gkodinov@stripped +21 -0 Bug #21302: Result not properly sorted when using an ORDER BY on a second table in a join - test case sql/sql_select.cc@stripped, 2006-08-09 14:19:05+03:00, gkodinov@stripped +2 -1 Bug #21302: Result not properly sorted when using an ORDER BY on a second table in a join - don't remove columns of const tables in ORDER BY if the const table is an outer table. # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: gkodinov # Host: macbook.gmz # Root: /Users/kgeorge/mysql/work/B21302-5.0-opt --- 1.439/sql/sql_select.cc 2006-08-09 14:19:27 +03:00 +++ 1.440/sql/sql_select.cc 2006-08-09 14:19:27 +03:00 @@ -5976,7 +5976,8 @@ eq_ref_table(JOIN *join, ORDER *start_or if (tab->cached_eq_ref_table) // If cached return tab->eq_ref_table; tab->cached_eq_ref_table=1; - if (tab->type == JT_CONST) // We can skip const tables + // We can skip const tables only if not an outer table + if (tab->type == JT_CONST && !tab->first_inner) return (tab->eq_ref_table=1); /* purecov: inspected */ if (tab->type != JT_EQ_REF || tab->table->maybe_null) return (tab->eq_ref_table=0); // We must use this --- 1.48/mysql-test/r/join_outer.result 2006-08-09 14:19:27 +03:00 +++ 1.49/mysql-test/r/join_outer.result 2006-08-09 14:19:27 +03:00 @@ -735,7 +735,7 @@ explain select s.*, '*', m.*, (s.match_1 (t2 s left join t1 m on m.match_id = 1) order by m.match_id desc; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE s ALL NULL NULL NULL NULL 10 +1 SIMPLE s ALL NULL NULL NULL NULL 10 Using temporary; Using filesort 1 SIMPLE m const match_id,match_id_2 match_id 1 const 1 explain select s.*, '*', m.*, (s.match_1_h - m.home) UUX from (t2 s left join t1 m on m.match_id = 1) --- 1.51/mysql-test/r/order_by.result 2006-08-09 14:19:27 +03:00 +++ 1.52/mysql-test/r/order_by.result 2006-08-09 14:19:27 +03:00 @@ -852,3 +852,25 @@ b a 20 1 10 2 DROP TABLE t1; +CREATE TABLE t1 (a int, b int, PRIMARY KEY (a)); +INSERT INTO t1 VALUES (1,1), (2,2), (3,3); +explain SELECT t1.b as a, t2.b as c FROM +t1 LEFT JOIN t1 t2 ON (t1.a = t2.a AND t2.a = 2) +ORDER BY c; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using temporary; Using filesort +1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 +SELECT t1.b as a, t2.b as c FROM +t1 LEFT JOIN t1 t2 ON (t1.a = t2.a AND t2.a = 2) +ORDER BY c; +a c +1 NULL +3 NULL +2 2 +explain SELECT t1.b as a, t2.b as c FROM +t1 JOIN t1 t2 ON (t1.a = t2.a AND t2.a = 2) +ORDER BY c; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 +1 SIMPLE t2 const PRIMARY PRIMARY 4 const 1 +DROP TABLE t1; --- 1.36/mysql-test/t/order_by.test 2006-08-09 14:19:27 +03:00 +++ 1.37/mysql-test/t/order_by.test 2006-08-09 14:19:27 +03:00 @@ -578,3 +578,24 @@ INSERT INTO t1 VALUES (1,30), (2,20), (1 DROP TABLE t1; # End of 4.1 tests + +# +# Bug#21302: Result not properly sorted when using an ORDER BY on a second +# table in a join +# +CREATE TABLE t1 (a int, b int, PRIMARY KEY (a)); +INSERT INTO t1 VALUES (1,1), (2,2), (3,3); + +explain SELECT t1.b as a, t2.b as c FROM + t1 LEFT JOIN t1 t2 ON (t1.a = t2.a AND t2.a = 2) +ORDER BY c; +SELECT t1.b as a, t2.b as c FROM + t1 LEFT JOIN t1 t2 ON (t1.a = t2.a AND t2.a = 2) +ORDER BY c; + +# check that it still removes sort of const table +explain SELECT t1.b as a, t2.b as c FROM + t1 JOIN t1 t2 ON (t1.a = t2.a AND t2.a = 2) +ORDER BY c; + +DROP TABLE t1;