From: Oystein Grovlen Date: September 8 2010 8:24am Subject: bzr push into mysql-next-mr-bugfixing branch (oystein.grovlen:3237 to 3238) Bug#52344 List-Archive: http://lists.mysql.com/commits/117754 X-Bug: 52344 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1988808699==" --===============1988808699== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3238 Oystein Grovlen 2010-09-08 BUG#52344 - Subquery materialization: Assertion if subquery in on-clause of outer join Problem: If tables of an outer join are constant tables, the associated on-clause will be evaluated in the optimization phase. If the on-clause contains a query that is to be executed with subquery materialization, this will not work since the infrastructure for such execution is not yet set up. Solution: Do not evaluate on-clause in optimization phase if is_expensive() returns true for this clause. This is how the problem is currently avoided for where-clauses. This works because, Item_in_subselect::is_expensive_processor returns true if query is to be executed with subquery materialization. @ mysql-test/include/subquery_mat.inc Added test case for BUG#52344. @ mysql-test/r/subquery_mat.result Updated result file with test case for BUG#52344. @ mysql-test/r/subquery_mat_all.result Updated result file with test case for BUG#52344. @ mysql-test/r/subquery_mat_none.result Updated result file with test case for BUG#52344. @ sql/sql_select.cc Do not evaluate on-clause in optimization phase if is_expensive() returns true for this clause. This prevents executing materialized subqueries in optimization phase. (Proper setup for such execution has not been done at this stage.) modified: mysql-test/include/subquery_mat.inc mysql-test/r/subquery_mat.result mysql-test/r/subquery_mat_all.result mysql-test/r/subquery_mat_none.result sql/sql_select.cc 3237 oystein.grovlen@stripped 2010-09-07 Bug#48213 - Materialized subselect crashes if using GEOMETRY type Addendum: Move existing tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc. This way, these tests will also be run for more cases involving semijoin materialization. @ mysql-test/include/subquery_mat.inc Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/include/subquery_sj.inc Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_mat.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_mat_all.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_mat_none.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_all.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_all_jcl6.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_all_jcl7.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_dupsweed.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_dupsweed_jcl6.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_dupsweed_jcl7.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_firstmatch.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_firstmatch_jcl6.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_firstmatch_jcl7.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_loosescan.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_loosescan_jcl6.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_loosescan_jcl7.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_mat.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_mat_jcl6.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_mat_jcl7.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_mat_nosj.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_none.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_none_jcl6.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. @ mysql-test/r/subquery_sj_none_jcl7.result Moved tests for subqueries involving BLOB columns from subquery_mat.inc to subquery_sj.inc to get better coverage for semijoin materialization. modified: mysql-test/include/subquery_mat.inc mysql-test/include/subquery_sj.inc mysql-test/r/subquery_mat.result mysql-test/r/subquery_mat_all.result mysql-test/r/subquery_mat_none.result mysql-test/r/subquery_sj_all.result mysql-test/r/subquery_sj_all_jcl6.result mysql-test/r/subquery_sj_all_jcl7.result mysql-test/r/subquery_sj_dupsweed.result mysql-test/r/subquery_sj_dupsweed_jcl6.result mysql-test/r/subquery_sj_dupsweed_jcl7.result mysql-test/r/subquery_sj_firstmatch.result mysql-test/r/subquery_sj_firstmatch_jcl6.result mysql-test/r/subquery_sj_firstmatch_jcl7.result mysql-test/r/subquery_sj_loosescan.result mysql-test/r/subquery_sj_loosescan_jcl6.result mysql-test/r/subquery_sj_loosescan_jcl7.result mysql-test/r/subquery_sj_mat.result mysql-test/r/subquery_sj_mat_jcl6.result mysql-test/r/subquery_sj_mat_jcl7.result mysql-test/r/subquery_sj_mat_nosj.result mysql-test/r/subquery_sj_none.result mysql-test/r/subquery_sj_none_jcl6.result mysql-test/r/subquery_sj_none_jcl7.result === modified file 'mysql-test/include/subquery_mat.inc' --- a/mysql-test/include/subquery_mat.inc 2010-09-07 19:39:01 +0000 +++ b/mysql-test/include/subquery_mat.inc 2010-09-08 08:19:03 +0000 @@ -662,6 +662,33 @@ FROM t2); --echo # DROP TABLE IF EXISTS t1,t2,t3,empty1; + +--echo # +--echo # BUG#52344 - Subquery materialization: +--echo # Assertion if subquery in on-clause of outer join +--echo # + +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 VALUES (10); + +CREATE TABLE t2 (j INTEGER); +INSERT INTO t2 VALUES (5); + +CREATE TABLE t3 (k INTEGER); + +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); + +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); + +DROP TABLE t1, t2, t3; + +--echo # End BUG#52344 + + # # Bug #52538 Valgrind bug: Item_in_subselect::init_left_expr_cache() # @@ -767,3 +794,5 @@ DROP TABLE t1,t2,t3; --echo # End BUG#54511 + + === modified file 'mysql-test/r/subquery_mat.result' --- a/mysql-test/r/subquery_mat.result 2010-09-07 19:39:01 +0000 +++ b/mysql-test/r/subquery_mat.result 2010-09-08 08:19:03 +0000 @@ -958,6 +958,35 @@ id select_type table type possible_keys # Cleanup for BUG#46680 # DROP TABLE IF EXISTS t1,t2,t3,empty1; +# +# BUG#52344 - Subquery materialization: +# Assertion if subquery in on-clause of outer join +# +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 VALUES (10); +CREATE TABLE t2 (j INTEGER); +INSERT INTO t2 VALUES (5); +CREATE TABLE t3 (k INTEGER); +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 +1 PRIMARY t2 system NULL NULL NULL NULL 1 +2 SUBQUERY t3 system NULL NULL NULL NULL 0 const row not found +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); +i +10 +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 +1 PRIMARY t2 system NULL NULL NULL NULL 1 +2 SUBQUERY t3 system NULL NULL NULL NULL 0 const row not found +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); +i +10 +DROP TABLE t1, t2, t3; +# End BUG#52344 CREATE TABLE t1 ( pk INTEGER AUTO_INCREMENT, col_int_nokey INTEGER, === modified file 'mysql-test/r/subquery_mat_all.result' --- a/mysql-test/r/subquery_mat_all.result 2010-09-07 19:39:01 +0000 +++ b/mysql-test/r/subquery_mat_all.result 2010-09-08 08:19:03 +0000 @@ -957,6 +957,35 @@ id select_type table type possible_keys # Cleanup for BUG#46680 # DROP TABLE IF EXISTS t1,t2,t3,empty1; +# +# BUG#52344 - Subquery materialization: +# Assertion if subquery in on-clause of outer join +# +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 VALUES (10); +CREATE TABLE t2 (j INTEGER); +INSERT INTO t2 VALUES (5); +CREATE TABLE t3 (k INTEGER); +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 +1 PRIMARY t2 system NULL NULL NULL NULL 1 +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); +i +10 +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 +1 PRIMARY t2 system NULL NULL NULL NULL 1 +2 SUBQUERY t3 system NULL NULL NULL NULL 0 const row not found +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); +i +10 +DROP TABLE t1, t2, t3; +# End BUG#52344 CREATE TABLE t1 ( pk INTEGER AUTO_INCREMENT, col_int_nokey INTEGER, === modified file 'mysql-test/r/subquery_mat_none.result' --- a/mysql-test/r/subquery_mat_none.result 2010-09-07 19:39:01 +0000 +++ b/mysql-test/r/subquery_mat_none.result 2010-09-08 08:19:03 +0000 @@ -957,6 +957,35 @@ id select_type table type possible_keys # Cleanup for BUG#46680 # DROP TABLE IF EXISTS t1,t2,t3,empty1; +# +# BUG#52344 - Subquery materialization: +# Assertion if subquery in on-clause of outer join +# +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 VALUES (10); +CREATE TABLE t2 (j INTEGER); +INSERT INTO t2 VALUES (5); +CREATE TABLE t3 (k INTEGER); +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 +1 PRIMARY t2 system NULL NULL NULL NULL 1 +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT k FROM t3); +i +10 +EXPLAIN +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 +1 PRIMARY t2 system NULL NULL NULL NULL 1 +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table +SELECT i FROM t1 LEFT JOIN t2 ON (j) IN (SELECT max(k) FROM t3); +i +10 +DROP TABLE t1, t2, t3; +# End BUG#52344 CREATE TABLE t1 ( pk INTEGER AUTO_INCREMENT, col_int_nokey INTEGER, === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-09-07 19:07:18 +0000 +++ b/sql/sql_select.cc 2010-09-08 08:19:03 +0000 @@ -17617,7 +17617,15 @@ join_read_const_table(JOIN_TAB *tab, POS DBUG_RETURN(error); } } - if (*tab->on_expr_ref && !table->null_row) + /* We will evaluate on-expressions here only if it is not considered + expensive. This also prevents executing materialized subqueries + in optimization phase. This is necessary since proper setup for + such execution has not been done at this stage. + (See comment in internal_remove_eq_conds() tagged + DontEvaluateMaterializedSubqueryTooEarly). + */ + if (*tab->on_expr_ref && !table->null_row && + !(*tab->on_expr_ref)->is_expensive()) { if ((table->null_row= test((*tab->on_expr_ref)->val_int() == 0))) mark_as_null_row(table); --===============1988808699== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/oystein.grovlen@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: oystein.grovlen@stripped\ # ny1hot0nd2tk749w # target_branch: file:///home/og136792/mysql/mysql-next-mr-opt-\ # backporting/ # testament_sha1: 9e777b8d785002ff79dbac9b921af85c4d11de96 # timestamp: 2010-09-08 10:24:08 +0200 # base_revision_id: oystein.grovlen@stripped\ # fv1i4atwq0pgeq3x # # Begin bundle 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 nChIP7AhowA= --===============1988808699==--