From: Roy Lyseng Date: January 12 2011 4:12pm Subject: bzr commit into mysql-trunk branch (roy.lyseng:3322) Bug#58561 List-Archive: http://lists.mysql.com/commits/128542 X-Bug: 58561 Message-Id: <20110112161238.8B5921F2@tyr67.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5439707612041348553==" --===============5439707612041348553== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/rl136806/mysql/repo/mysql-review/ based on revid:olav.sandstaa@stripped 3322 Roy Lyseng 2011-01-12 Bug#58561: Server Crash with correlated subquery and MyISAM tables when semijoin=on The problem here is that the variable 'sargables' contains invalid data after call to update_ref_and_keys(), causing a segmentation fault. Further inspection showed that the number of conditions was calculated erroneously, and it was also noticed that it was because thd->lex->current_select was not equal to select_lex passed as argument. The culprit was found to be subselect_single_select_engine::exec() that did not restore the value of 'current_select' after an engine was changed. Problem is fixed by restoring current_select properly. We also clean up the code slightly by replacing thd->lex->current_select in update_ref_and_keys() with the passed select_lex argument. mysql-test/include/subquery.inc Added test case for bug#58561. mysql-test/r/subquery_all.result mysql-test/r/subquery_all_jcl6.result mysql-test/r/subquery_nomat_nosj.result mysql-test/r/subquery_nomat_nosj_jcl6.result mysql-test/r/subquery_none.result mysql-test/r/subquery_none_jcl6.result Added test results for bug#58561. sql/item_subselect.cc In subselect_single_select_engine::exec(), restored saved 'current_select' when an engine is changed. Implemented 'clean exit' policy as a code cleanup fix. sql/sql_select.cc In update_ref_and_keys(), replaced reference to thd->lex->current_select with the select_lex passed as argument. This is a code cleanup fix. modified: mysql-test/include/subquery.inc mysql-test/r/subquery_all.result mysql-test/r/subquery_all_jcl6.result mysql-test/r/subquery_nomat_nosj.result mysql-test/r/subquery_nomat_nosj_jcl6.result mysql-test/r/subquery_none.result mysql-test/r/subquery_none_jcl6.result sql/item_subselect.cc sql/sql_select.cc === modified file 'mysql-test/include/subquery.inc' --- a/mysql-test/include/subquery.inc 2010-11-23 15:18:44 +0000 +++ b/mysql-test/include/subquery.inc 2011-01-12 16:08:16 +0000 @@ -5067,6 +5067,65 @@ EXPLAIN SELECT * FROM t1 WHERE EXISTS (S --echo DROP TABLE t1; +--echo # +--echo # BUG#58561: Server Crash with correlated subquery and MyISAM tables +--echo # + +CREATE TABLE cc ( + pk INT, + col_int_key INT, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk), + KEY col_int_key (col_int_key), + KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); + +CREATE TABLE bb ( + pk INT, + col_date_key DATE, + PRIMARY KEY (pk), + KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); + +CREATE TABLE c ( + pk INT, + col_int_key INT, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk), + KEY col_int_key (col_int_key), + KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); + +CREATE TABLE b ( + pk INT, + col_int_key INT, + col_varchar_key VARCHAR(1), + PRIMARY KEY (pk), + KEY col_int_key (col_int_key), + KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); + +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( + SELECT parent1.pk, parent1.pk + FROM bb parent1 JOIN cc parent2 + ON parent2.col_varchar_key = parent2.col_varchar_key + WHERE granparent1.col_varchar_key IN ( + SELECT col_varchar_key + FROM c) + AND parent1.pk = granparent1.col_int_key + ORDER BY parent1.col_date_key +); + +DROP TABLE bb, b, cc, c; + --echo End of 5.6 tests --echo # === modified file 'mysql-test/r/subquery_all.result' --- a/mysql-test/r/subquery_all.result 2010-12-16 17:38:26 +0000 +++ b/mysql-test/r/subquery_all.result 2011-01-12 16:08:16 +0000 @@ -6214,6 +6214,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_all_jcl6.result' --- a/mysql-test/r/subquery_all_jcl6.result 2010-11-30 13:55:22 +0000 +++ b/mysql-test/r/subquery_all_jcl6.result 2011-01-12 16:08:16 +0000 @@ -6218,6 +6218,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_nomat_nosj.result' --- a/mysql-test/r/subquery_nomat_nosj.result 2010-11-30 13:55:22 +0000 +++ b/mysql-test/r/subquery_nomat_nosj.result 2011-01-12 16:08:16 +0000 @@ -6214,6 +6214,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_nomat_nosj_jcl6.result' --- a/mysql-test/r/subquery_nomat_nosj_jcl6.result 2010-11-30 13:55:22 +0000 +++ b/mysql-test/r/subquery_nomat_nosj_jcl6.result 2011-01-12 16:08:16 +0000 @@ -6218,6 +6218,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_none.result' --- a/mysql-test/r/subquery_none.result 2010-11-29 13:30:18 +0000 +++ b/mysql-test/r/subquery_none.result 2011-01-12 16:08:16 +0000 @@ -6213,6 +6213,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'mysql-test/r/subquery_none_jcl6.result' --- a/mysql-test/r/subquery_none_jcl6.result 2010-11-29 13:04:34 +0000 +++ b/mysql-test/r/subquery_none_jcl6.result 2011-01-12 16:08:16 +0000 @@ -6217,6 +6217,59 @@ id select_type table type possible_keys 2 SUBQUERY t1 ref a a 5 const 1 Using index DROP TABLE t1; +# +# BUG#58561: Server Crash with correlated subquery and MyISAM tables +# +CREATE TABLE cc ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO cc VALUES (10,7,'v'); +INSERT INTO cc VALUES (11,1,'r'); +CREATE TABLE bb ( +pk INT, +col_date_key DATE, +PRIMARY KEY (pk), +KEY col_date_key (col_date_key) +) ENGINE=MyISAM; +INSERT INTO bb VALUES (10,'2002-02-21'); +CREATE TABLE c ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO c VALUES (1,NULL,'w'); +INSERT INTO c VALUES (19,NULL,'f'); +CREATE TABLE b ( +pk INT, +col_int_key INT, +col_varchar_key VARCHAR(1), +PRIMARY KEY (pk), +KEY col_int_key (col_int_key), +KEY col_varchar_key (col_varchar_key,col_int_key) +) ENGINE=MyISAM; +INSERT INTO b VALUES (1,7,'f'); +SELECT col_int_key +FROM b granparent1 +WHERE (col_int_key, col_int_key) IN ( +SELECT parent1.pk, parent1.pk +FROM bb parent1 JOIN cc parent2 +ON parent2.col_varchar_key = parent2.col_varchar_key +WHERE granparent1.col_varchar_key IN ( +SELECT col_varchar_key +FROM c) +AND parent1.pk = granparent1.col_int_key +ORDER BY parent1.col_date_key +); +col_int_key +DROP TABLE bb, b, cc, c; End of 5.6 tests # # BUG#46743 "Azalea processing correlated, aggregate SELECT === modified file 'sql/item_subselect.cc' --- a/sql/item_subselect.cc 2010-12-29 00:38:59 +0000 +++ b/sql/item_subselect.cc 2011-01-12 16:08:16 +0000 @@ -2303,6 +2303,7 @@ int join_read_next_same_or_null(READ_REC int subselect_single_select_engine::exec() { DBUG_ENTER("subselect_single_select_engine::exec"); + int rc= 0; char const *save_where= thd->where; SELECT_LEX *save_select= thd->lex->current_select; thd->lex->current_select= select_lex; @@ -2313,16 +2314,19 @@ int subselect_single_select_engine::exec unit->set_limit(unit->global_parameters); if (join->optimize()) { - thd->where= save_where; - executed= 1; - thd->lex->current_select= save_select; - DBUG_RETURN(join->error ? join->error : 1); + executed= true; + rc= join->error ? join->error : 1; + goto exit; } if (save_join_if_explain()) - DBUG_RETURN(1); /* purecov: inspected */ + { + rc= 1; + goto exit; + } if (item->engine_changed) { - DBUG_RETURN(1); + rc= 1; + goto exit; } } if (select_lex->uncacheable && @@ -2331,9 +2335,8 @@ int subselect_single_select_engine::exec { if (join->reinit()) { - thd->where= save_where; - thd->lex->current_select= save_select; - DBUG_RETURN(1); + rc= 1; + goto exit; } item->reset(); item->assigned((executed= 0)); @@ -2389,14 +2392,15 @@ int subselect_single_select_engine::exec tab->read_first_record= tab->save_read_first_record; tab->read_record.read_record= tab->save_read_record; } - executed= 1; - thd->where= save_where; - thd->lex->current_select= save_select; - DBUG_RETURN(join->error||thd->is_fatal_error); + executed= true; + + rc= join->error||thd->is_fatal_error; } + +exit: thd->where= save_where; thd->lex->current_select= save_select; - DBUG_RETURN(0); + DBUG_RETURN(rc); } int subselect_union_engine::exec() === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-12-29 00:38:59 +0000 +++ b/sql/sql_select.cc 2011-01-12 16:08:16 +0000 @@ -6166,8 +6166,8 @@ update_ref_and_keys(THD *thd, DYNAMIC_AR substitutions. */ sz= max(sizeof(KEY_FIELD),sizeof(SARGABLE_PARAM))* - (((thd->lex->current_select->cond_count+1)*2 + - thd->lex->current_select->between_count)*m+1); + (((select_lex->cond_count+1)*2 + + select_lex->between_count)*m+1); if (!(key_fields=(KEY_FIELD*) thd->alloc(sz))) return TRUE; /* purecov: inspected */ and_level= 0; --===============5439707612041348553== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/roy.lyseng@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: roy.lyseng@stripped # target_branch: file:///home/rl136806/mysql/repo/mysql-review/ # testament_sha1: 5930ba01934a9e5d2d82bb462b17c425184fc19f # timestamp: 2011-01-12 17:12:38 +0100 # base_revision_id: olav.sandstaa@stripped\ # mvpa9nlv4eu063m6 # # Begin bundle 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 --===============5439707612041348553==--