From: magnus.blaudd Date: May 11 2012 1:27pm Subject: bzr push into mysql-trunk branch (magnus.blaudd:3749 to 3750) WL#6004 List-Archive: http://lists.mysql.com/commits/143896 Message-Id: <201205111327.q4BDRBbp027361@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3750 magnus.blaudd@stripped 2012-05-11 WL#6004 - temporary hack allowing mysql.* tables in a transactional engine modified: storage/innobase/handler/ha_innodb.cc storage/innobase/row/row0mysql.cc 3749 Norvald H. Ryeng 2012-04-27 Bug#13735712 SELECT W/ SUBQUERY PRODUCES MORE ROWS WHEN USING VARIABLES Outer join queries with ALL may return incorrect results because the optimizer incorrectly rewrites them to use inner join. E.g.: SELECT * FROM t2 RIGHT JOIN t3 ON(t3.c = t2.b) WHERE t2.b < ALL(SELECT t1.a FROM t1 WHERE t1.a <= 7); is first rewritten by Item_in_subselect::single_value_transformer() into: SELECT * FROM t2 RIGHT JOIN t3 ON(t3.c = t2.b) WHERE (t2.b >= (SELECT MIN(t1.a) FROM t1 WHERE t1.a <= 7)); When simplify_joins() checks not_null_tables() on the condition to find out if the outer join can be transformed into an inner join, Item_func::not_null_tables() returns its arguments' not_null_tables(). This means that simplify_joins() is told that the condition will be false if t2.b is NULL. But the condition is actually true if t1 has no rows where t1.a <= 7. This leads to the optimizer incorrectly rewriting the query to use inner join. Fix: Let Item_func_not_all::not_null_tables() return a zero table map. @ mysql-test/include/subquery.inc Add test cases for bugs #13735712. @ mysql-test/r/subquery_all.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_all_bka.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_all_bka_nixbnl.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_nomat_nosj.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_nomat_nosj_bka.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_nomat_nosj_bka_nixbnl.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_none.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_none_bka.result Add test cases for bugs #13735712. @ mysql-test/r/subquery_none_bka_nixbnl.result Add test cases for bugs #13735712. @ sql/item_cmpfunc.h Return 0 from Item_func_not_all::not_null_tables(). modified: mysql-test/include/subquery.inc mysql-test/r/subquery_all.result mysql-test/r/subquery_all_bka.result mysql-test/r/subquery_all_bka_nixbnl.result mysql-test/r/subquery_nomat_nosj.result mysql-test/r/subquery_nomat_nosj_bka.result mysql-test/r/subquery_nomat_nosj_bka_nixbnl.result mysql-test/r/subquery_none.result mysql-test/r/subquery_none_bka.result mysql-test/r/subquery_none_bka_nixbnl.result sql/item_cmpfunc.h === modified file 'storage/innobase/handler/ha_innodb.cc' --- a/storage/innobase/handler/ha_innodb.cc 2012-04-25 15:46:11 +0000 +++ b/storage/innobase/handler/ha_innodb.cc 2012-05-11 12:58:57 +0000 @@ -2623,6 +2623,23 @@ ha_innobase::init_table_handle_for_HANDL reset_template(); } + +#ifndef TEMPORARY_HACK_FOR_WL6004 +static bool +is_supported_system_table(const char*, + const char*, + bool is_sql_layer_system_table) +{ + if (is_sql_layer_system_table) + { + /* All MySQL system tables supported */ + return true; + } + return false; +} +#endif + + /*********************************************************************//** Opens an InnoDB database. @return 0 on success, error code on failure */ @@ -2663,6 +2680,10 @@ innobase_init( innobase_hton->drop_database = innobase_drop_database; innobase_hton->panic = innobase_end; +#ifndef TEMPORARY_HACK_FOR_WL6004 + innobase_hton->is_supported_system_table = is_supported_system_table; +#endif + innobase_hton->start_consistent_snapshot = innobase_start_trx_and_assign_read_view; === modified file 'storage/innobase/row/row0mysql.cc' --- a/storage/innobase/row/row0mysql.cc 2012-04-24 06:21:11 +0000 +++ b/storage/innobase/row/row0mysql.cc 2012-05-11 12:58:57 +0000 @@ -124,9 +124,13 @@ row_mysql_is_system_table( return(FALSE); } +#ifndef TEMPORARY_HACK_FOR_WL6004 + return(FALSE); +#else return(0 == strcmp(name + 6, "host") || 0 == strcmp(name + 6, "user") || 0 == strcmp(name + 6, "db")); +#endif } /*********************************************************************//** No bundle (reason: useless for push emails).