From: Tor Didriksen Date: December 9 2010 11:54am Subject: bzr commit into mysql-trunk-bugfixing branch (tor.didriksen:3257) Bug#58756 Bug#58761 List-Archive: http://lists.mysql.com/commits/126409 X-Bug: 58756,58761 Message-Id: <20101209115444.E5663ADC@atum07.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4858962835176961353==" --===============4858962835176961353== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/didrik/repo/next-mr-opt-team-wl1393-merge/ based on revid:tor.didriksen@stripped 3257 Tor Didriksen 2010-12-09 Bug #58756 Crash in heap_rrnd on query with HAVING ... IN (subquery) + LIMIT allocated too few record pointers in save_index() Bug #58761 Crash in Field::is_null in field.h on subquery in WHERE clause table->sort.found_records was wrong @ mysql-test/include/order_by.inc New test case @ mysql-test/r/order_by_icp_mrr.result New test case. @ mysql-test/r/order_by_none.result New test case. @ mysql-test/r/subselect_innodb.result New test case. @ mysql-test/t/subselect_innodb.test New test case. @ sql/filesort.cc In save_index: allocate and copy pointers for all records returned by find_all_keys() @ sql/sql_select.cc table->sort.found_records is used in init_read_record(), don't set it to found_rows. Instead: Always use tab->records to set thd->limit_found_rows, since filesort() now always returns number of found_rows. modified: mysql-test/include/order_by.inc mysql-test/r/order_by_icp_mrr.result mysql-test/r/order_by_none.result mysql-test/r/subselect_innodb.result mysql-test/t/subselect_innodb.test sql/filesort.cc sql/sql_select.cc === modified file 'mysql-test/include/order_by.inc' --- a/mysql-test/include/order_by.inc 2010-11-30 11:54:00 +0000 +++ b/mysql-test/include/order_by.inc 2010-12-09 11:54:39 +0000 @@ -1522,6 +1522,46 @@ DROP VIEW v1, v2; --echo # end of WL#1393 - Optimizing filesort with small limit +--echo # +--echo # Bug #58761 +--echo # Crash in Field::is_null in field.h on subquery in WHERE clause +--echo # + +CREATE TABLE t1 ( + pk INT NOT NULL AUTO_INCREMENT, + col_int_key INT DEFAULT NULL, + col_varchar_key VARCHAR(1) DEFAULT NULL, + PRIMARY KEY (pk), + KEY col_varchar_key (col_varchar_key,col_int_key) +); + +INSERT INTO t1 VALUES (27,7,'x'); +INSERT INTO t1 VALUES (28,6,'m'); +INSERT INTO t1 VALUES (29,4,'c'); + +CREATE TABLE where_subselect + SELECT DISTINCT `pk` AS field1 , `pk` AS field2 + FROM t1 AS alias1 + WHERE alias1 . `col_int_key` > 229 + OR alias1 . `col_varchar_key` IS NOT NULL + GROUP BY field1, field2 +; + +SELECT * +FROM where_subselect +WHERE (field1, field2) IN ( + SELECT DISTINCT `pk` AS field1 , `pk` AS field2 + FROM t1 AS alias1 + WHERE alias1 . `col_int_key` > 229 + OR alias1 . `col_varchar_key` IS NOT NULL + GROUP BY field1, field2 +); + +DROP TABLE t1; +DROP TABLE where_subselect; + +--echo # End of Bug #58761 + # # Bug#35844: Covering index for ref access not compatible with ORDER BY list # === modified file 'mysql-test/r/order_by_icp_mrr.result' --- a/mysql-test/r/order_by_icp_mrr.result 2010-12-07 10:27:02 +0000 +++ b/mysql-test/r/order_by_icp_mrr.result 2010-12-09 11:54:39 +0000 @@ -2352,6 +2352,41 @@ ERROR 21000: Subquery returns more than DROP TABLE t1, tmp; DROP VIEW v1, v2; # end of WL#1393 - Optimizing filesort with small limit +# +# Bug #58761 +# Crash in Field::is_null in field.h on subquery in WHERE clause +# +CREATE TABLE t1 ( +pk INT NOT NULL AUTO_INCREMENT, +col_int_key INT DEFAULT NULL, +col_varchar_key VARCHAR(1) DEFAULT NULL, +PRIMARY KEY (pk), +KEY col_varchar_key (col_varchar_key,col_int_key) +); +INSERT INTO t1 VALUES (27,7,'x'); +INSERT INTO t1 VALUES (28,6,'m'); +INSERT INTO t1 VALUES (29,4,'c'); +CREATE TABLE where_subselect +SELECT DISTINCT `pk` AS field1 , `pk` AS field2 +FROM t1 AS alias1 +WHERE alias1 . `col_int_key` > 229 +OR alias1 . `col_varchar_key` IS NOT NULL +GROUP BY field1, field2 +; +SELECT * +FROM where_subselect +WHERE (field1, field2) IN ( +SELECT DISTINCT `pk` AS field1 , `pk` AS field2 +FROM t1 AS alias1 +WHERE alias1 . `col_int_key` > 229 +OR alias1 . `col_varchar_key` IS NOT NULL +GROUP BY field1, field2 +); +field1 field2 +27 27 +DROP TABLE t1; +DROP TABLE where_subselect; +# End of Bug #58761 CREATE TABLE t1 ( id1 INT NULL, id2 INT NOT NULL, === modified file 'mysql-test/r/order_by_none.result' --- a/mysql-test/r/order_by_none.result 2010-12-06 15:21:08 +0000 +++ b/mysql-test/r/order_by_none.result 2010-12-09 11:54:39 +0000 @@ -2351,6 +2351,41 @@ ERROR 21000: Subquery returns more than DROP TABLE t1, tmp; DROP VIEW v1, v2; # end of WL#1393 - Optimizing filesort with small limit +# +# Bug #58761 +# Crash in Field::is_null in field.h on subquery in WHERE clause +# +CREATE TABLE t1 ( +pk INT NOT NULL AUTO_INCREMENT, +col_int_key INT DEFAULT NULL, +col_varchar_key VARCHAR(1) DEFAULT NULL, +PRIMARY KEY (pk), +KEY col_varchar_key (col_varchar_key,col_int_key) +); +INSERT INTO t1 VALUES (27,7,'x'); +INSERT INTO t1 VALUES (28,6,'m'); +INSERT INTO t1 VALUES (29,4,'c'); +CREATE TABLE where_subselect +SELECT DISTINCT `pk` AS field1 , `pk` AS field2 +FROM t1 AS alias1 +WHERE alias1 . `col_int_key` > 229 +OR alias1 . `col_varchar_key` IS NOT NULL +GROUP BY field1, field2 +; +SELECT * +FROM where_subselect +WHERE (field1, field2) IN ( +SELECT DISTINCT `pk` AS field1 , `pk` AS field2 +FROM t1 AS alias1 +WHERE alias1 . `col_int_key` > 229 +OR alias1 . `col_varchar_key` IS NOT NULL +GROUP BY field1, field2 +); +field1 field2 +27 27 +DROP TABLE t1; +DROP TABLE where_subselect; +# End of Bug #58761 CREATE TABLE t1 ( id1 INT NULL, id2 INT NOT NULL, === modified file 'mysql-test/r/subselect_innodb.result' --- a/mysql-test/r/subselect_innodb.result 2010-12-06 12:55:03 +0000 +++ b/mysql-test/r/subselect_innodb.result 2010-12-09 11:54:39 +0000 @@ -392,3 +392,44 @@ and t2.a='1' AND t1.a=t3.b) > 0; a 2 DROP TABLE t1,t2,t3; +# +# Bug #58756 +# Crash in heap_rrnd on query with HAVING ... IN (subquery) + LIMIT +# +CREATE TABLE t1 ( +col_time_key time DEFAULT NULL, +col_datetime_key datetime DEFAULT NULL, +col_varchar_nokey varchar(1) DEFAULT NULL, +KEY col_time_key (col_time_key), +KEY col_datetime_key (col_datetime_key) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES ('17:53:30','2005-11-10 12:40:29','h'); +INSERT INTO t1 VALUES ('11:35:49','2009-04-25 00:00:00','b'); +INSERT INTO t1 VALUES (NULL,'2002-11-27 00:00:00','s'); +INSERT INTO t1 VALUES ('06:01:40','2004-01-26 20:32:32','e'); +INSERT INTO t1 VALUES ('05:45:11','2007-10-26 11:41:40','j'); +INSERT INTO t1 VALUES ('00:00:00','2005-10-07 00:00:00','e'); +INSERT INTO t1 VALUES ('00:00:00','2000-07-15 05:00:34','f'); +INSERT INTO t1 VALUES ('06:11:01','2000-04-03 16:33:32','v'); +INSERT INTO t1 VALUES ('13:02:46',NULL,'x'); +INSERT INTO t1 VALUES ('21:44:25','2001-04-25 01:26:12','m'); +INSERT INTO t1 VALUES ('22:43:58','2000-12-27 00:00:00','c'); +CREATE TABLE t2 ( +col_time_key time DEFAULT NULL, +col_datetime_key datetime DEFAULT NULL, +col_varchar_nokey varchar(1) DEFAULT NULL, +KEY col_time_key (col_time_key), +KEY col_datetime_key (col_datetime_key) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +INSERT INTO t2 VALUES ('11:28:45','2004-10-11 18:13:16','w'); +SELECT col_time_key, col_datetime_key +FROM +( SELECT * FROM t1 ) AS table1 +HAVING ( 'r' , 'e' ) IN +( SELECT col_varchar_nokey , col_varchar_nokey FROM t2 ) +ORDER BY col_datetime_key +LIMIT 10; +col_time_key col_datetime_key +DROP TABLE t1; +DROP TABLE t2; +# End of Bug #58756 === modified file 'mysql-test/t/subselect_innodb.test' --- a/mysql-test/t/subselect_innodb.test 2010-08-14 07:28:31 +0000 +++ b/mysql-test/t/subselect_innodb.test 2010-12-09 11:54:39 +0000 @@ -402,3 +402,50 @@ SELECT t1.* FROM t1 WHERE (SELECT COUNT( DROP TABLE t1,t2,t3; +--echo # +--echo # Bug #58756 +--echo # Crash in heap_rrnd on query with HAVING ... IN (subquery) + LIMIT +--echo # + +CREATE TABLE t1 ( + col_time_key time DEFAULT NULL, + col_datetime_key datetime DEFAULT NULL, + col_varchar_nokey varchar(1) DEFAULT NULL, + KEY col_time_key (col_time_key), + KEY col_datetime_key (col_datetime_key) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO t1 VALUES ('17:53:30','2005-11-10 12:40:29','h'); +INSERT INTO t1 VALUES ('11:35:49','2009-04-25 00:00:00','b'); +INSERT INTO t1 VALUES (NULL,'2002-11-27 00:00:00','s'); +INSERT INTO t1 VALUES ('06:01:40','2004-01-26 20:32:32','e'); +INSERT INTO t1 VALUES ('05:45:11','2007-10-26 11:41:40','j'); +INSERT INTO t1 VALUES ('00:00:00','2005-10-07 00:00:00','e'); +INSERT INTO t1 VALUES ('00:00:00','2000-07-15 05:00:34','f'); +INSERT INTO t1 VALUES ('06:11:01','2000-04-03 16:33:32','v'); +INSERT INTO t1 VALUES ('13:02:46',NULL,'x'); +INSERT INTO t1 VALUES ('21:44:25','2001-04-25 01:26:12','m'); +INSERT INTO t1 VALUES ('22:43:58','2000-12-27 00:00:00','c'); + +CREATE TABLE t2 ( + col_time_key time DEFAULT NULL, + col_datetime_key datetime DEFAULT NULL, + col_varchar_nokey varchar(1) DEFAULT NULL, + KEY col_time_key (col_time_key), + KEY col_datetime_key (col_datetime_key) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO t2 VALUES ('11:28:45','2004-10-11 18:13:16','w'); + +SELECT col_time_key, col_datetime_key +FROM +( SELECT * FROM t1 ) AS table1 +HAVING ( 'r' , 'e' ) IN + ( SELECT col_varchar_nokey , col_varchar_nokey FROM t2 ) +ORDER BY col_datetime_key +LIMIT 10; + +DROP TABLE t1; +DROP TABLE t2; + +--echo # End of Bug #58756 === modified file 'sql/filesort.cc' --- a/sql/filesort.cc 2010-12-06 09:46:49 +0000 +++ b/sql/filesort.cc 2010-12-09 11:54:39 +0000 @@ -404,6 +404,8 @@ static void make_char_array(FILESORT_INF { DBUG_ENTER("make_char_array"); + DBUG_PRINT("info", ("num_records %u length %u", num_records, length)); + if (!info->sort_keys) info->sort_keys= (uchar**) my_malloc(num_records * (length + sizeof(uchar*)), MYF(0)); @@ -1094,8 +1096,6 @@ static bool save_index(Sort_param *param my_string_ptr_sort((uchar*) sort_keys, count, param->sort_length); res_length= param->res_length; offset= param->rec_length-res_length; - if ((ha_rows) count > param->max_rows && param->max_rows > 0) - count=(uint) param->max_rows; if (!(to= table_sort->record_pointers= (uchar*) my_malloc(res_length*count, MYF(MY_WME)))) DBUG_RETURN(1); /* purecov: inspected */ === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2010-12-06 15:21:08 +0000 +++ b/sql/sql_select.cc 2010-12-09 11:54:39 +0000 @@ -3276,6 +3276,15 @@ JOIN::exec() select_options & OPTION_FOUND_ROWS ? HA_POS_ERROR : unit->select_limit_cnt; + DBUG_PRINT("info", ("has_group_by %d " + "curr_join->tables %d " + "curr_join->m_select_limit %d " + "unit->select_limit_cnt %d", + has_group_by, + curr_join->tables, + (int) curr_join->m_select_limit, + (int) unit->select_limit_cnt)); + if (create_sort_index(thd, curr_join, order_arg, @@ -3314,8 +3323,7 @@ JOIN::exec() error= do_select(curr_join, curr_fields_list, NULL, procedure); thd->limit_found_rows= curr_join->send_records; if (curr_join->order && - curr_join->sortorder && - curr_join->select_options & OPTION_FOUND_ROWS) + curr_join->sortorder) { /* Use info provided by filesort. */ DBUG_ASSERT(curr_join->tables > curr_join->const_tables); @@ -20205,7 +20213,7 @@ create_sort_index(THD *thd, JOIN *join, filesort_retval= filesort(thd, table, join->sortorder, length, select, filesort_limit, 0, &examined_rows, &found_rows); - table->sort.found_records= found_rows; + table->sort.found_records= filesort_retval; tab->records= found_rows; // For SQL_CALC_ROWS if (select) { --===============4858962835176961353== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/tor.didriksen@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: tor.didriksen@stripped\ # 5o7wqmgguqthpzet # target_branch: file:///export/home/didrik/repo/next-mr-opt-team-\ # wl1393-merge/ # testament_sha1: e5c00e9efaa953f137c75e777fc7c743ad4b9111 # timestamp: 2010-12-09 12:54:44 +0100 # source_branch: bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-\ # next-mr-opt-team/ # base_revision_id: tor.didriksen@stripped\ # oxzr5ub4qw49w1jl # # Begin bundle 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 BUIHKEr2GsH3uVq21/xdyRThQkEKA98Q --===============4858962835176961353==--