From: Tor Didriksen Date: March 30 2011 1:31pm Subject: bzr commit into mysql-5.1 branch (tor.didriksen:3644) Bug#11765713 List-Archive: http://lists.mysql.com/commits/134261 X-Bug: 11765713 Message-Id: <20110330133201.00AC237EE@atum07.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8257605315213405880==" --===============8257605315213405880== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///export/home/didrik/repo/5.1-foo/ based on revid:sergey.glukhov@stripped 3644 Tor Didriksen 2011-03-30 Bug #11765713 58705: OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES CREATED BY OPT_SUM_QU @ mysql-test/r/subselect.result New test case. @ mysql-test/t/subselect.test New test case. @ sql/opt_sum.cc Add thd to opt_sum_query, enabling it to test for errors. Return with error code if thd->is_error() rather than continuing to read the index. @ sql/sql_select.cc Add thd to opt_sum_query, enabling it to test for errors. @ sql/sql_select.h Add thd to opt_sum_query, enabling it to test for errors. modified: mysql-test/r/subselect.result mysql-test/t/subselect.test sql/opt_sum.cc sql/sql_select.cc sql/sql_select.h === modified file 'mysql-test/r/subselect.result' --- a/mysql-test/r/subselect.result 2010-11-08 10:55:43 +0000 +++ b/mysql-test/r/subselect.result 2011-03-30 13:31:54 +0000 @@ -4734,3 +4734,16 @@ SELECT * FROM t2 UNION SELECT * FROM t2 ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE)); DROP TABLE t1,t2; End of 5.1 tests +# +# Bug #11765713 58705: +# OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES +# CREATED BY OPT_SUM_QUERY +# +CREATE TABLE t1(a INT NOT NULL, KEY (a)); +INSERT INTO t1 VALUES (0), (1); +SELECT 1 FROM t1 WHERE a < SOME +(SELECT a FROM t1 WHERE a <=> +(SELECT a FROM t1) +); +ERROR 21000: Subquery returns more than 1 row +DROP TABLE t1; === modified file 'mysql-test/t/subselect.test' --- a/mysql-test/t/subselect.test 2010-11-08 10:55:43 +0000 +++ b/mysql-test/t/subselect.test 2011-03-30 13:31:54 +0000 @@ -3726,3 +3726,20 @@ DROP TABLE t1,t2; --enable_result_log --echo End of 5.1 tests + +--echo # +--echo # Bug #11765713 58705: +--echo # OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES +--echo # CREATED BY OPT_SUM_QUERY +--echo # + +CREATE TABLE t1(a INT NOT NULL, KEY (a)); +INSERT INTO t1 VALUES (0), (1); + +--error ER_SUBQUERY_NO_1_ROW +SELECT 1 FROM t1 WHERE a < SOME + (SELECT a FROM t1 WHERE a <=> + (SELECT a FROM t1) + ); + +DROP TABLE t1; === modified file 'sql/opt_sum.cc' --- a/sql/opt_sum.cc 2010-06-11 07:38:29 +0000 +++ b/sql/opt_sum.cc 2011-03-30 13:31:54 +0000 @@ -211,6 +211,7 @@ static int get_index_max_value(TABLE *ta /** Substitutes constants for some COUNT(), MIN() and MAX() functions. + @param thd thread handler @param tables list of leaves of join table tree @param all_fields All fields to be returned @param conds WHERE clause @@ -230,7 +231,8 @@ static int get_index_max_value(TABLE *ta HA_ERR_... if a deadlock or a lock wait timeout happens, for example */ -int opt_sum_query(TABLE_LIST *tables, List &all_fields,COND *conds) +int opt_sum_query(THD *thd, + TABLE_LIST *tables, List &all_fields, COND *conds) { List_iterator_fast it(all_fields); int const_result= 1; @@ -242,6 +244,8 @@ int opt_sum_query(TABLE_LIST *tables, Li Item *item; int error; + DBUG_ENTER("opt_sum_query"); + if (conds) where_tables= conds->used_tables(); @@ -269,7 +273,7 @@ int opt_sum_query(TABLE_LIST *tables, Li WHERE t2.field IS NULL; */ if (tl->table->map & where_tables) - return 0; + DBUG_RETURN(0); } else used_tables|= tl->table->map; @@ -297,7 +301,7 @@ int opt_sum_query(TABLE_LIST *tables, Li { tl->table->file->print_error(error, MYF(0)); tl->table->in_use->fatal_error(); - return error; + DBUG_RETURN(error); } count*= tl->table->file->stats.records; } @@ -374,6 +378,14 @@ int opt_sum_query(TABLE_LIST *tables, Li const_result= 0; break; } + + if (thd->is_error()) + { + // See @note for find_key_for_maxmin. + table->set_keyread(false); + DBUG_RETURN(thd->main_da.sql_errno()); + } + table->file->ha_index_init((uint) ref.key, 1); error= is_max ? @@ -390,10 +402,10 @@ int opt_sum_query(TABLE_LIST *tables, Li if (error) { if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE) - return HA_ERR_KEY_NOT_FOUND; // No rows matching WHERE + DBUG_RETURN(HA_ERR_KEY_NOT_FOUND); // No rows matching WHERE /* HA_ERR_LOCK_DEADLOCK or some other error */ table->file->print_error(error, MYF(0)); - return(error); + DBUG_RETURN(error); } removed_tables|= table->map; } @@ -446,7 +458,7 @@ int opt_sum_query(TABLE_LIST *tables, Li */ if (removed_tables && used_tables != removed_tables) const_result= 0; // We didn't remove all tables - return const_result; + DBUG_RETURN(const_result); } @@ -802,8 +814,9 @@ static bool matching_cond(bool max_fl, T @param[out] prefix_len Length of prefix for the search range @note - This function may set table->key_read to 1, which must be reset after - index is used! (This can only happen when function returns 1) + This function may set field->table->key_read to true, + which must be reset after index is used! + (This can only happen when function returns 1) @retval 0 Index can not be used to optimize MIN(field)/MAX(field) @@ -818,7 +831,9 @@ static bool find_key_for_maxmin(bool max uint *range_fl, uint *prefix_len) { if (!(field->flags & PART_KEY_FLAG)) - return 0; // Not key field + return false; // Not key field + + DBUG_ENTER("find_key_for_maxmin"); TABLE *table= field->table; uint idx= 0; @@ -843,7 +858,7 @@ static bool find_key_for_maxmin(bool max part++, jdx++, key_part_to_use= (key_part_to_use << 1) | 1) { if (!(table->file->index_flags(idx, jdx, 0) & HA_READ_ORDER)) - return 0; + DBUG_RETURN(false); /* Check whether the index component is partial */ Field *part_field= table->field[part->fieldnr-1]; @@ -892,12 +907,12 @@ static bool find_key_for_maxmin(bool max */ if (field->part_of_key.is_set(idx)) table->set_keyread(TRUE); - return 1; + DBUG_RETURN(true); } } } } - return 0; + DBUG_RETURN(false); } === modified file 'sql/sql_select.cc' --- a/sql/sql_select.cc 2011-02-22 21:03:32 +0000 +++ b/sql/sql_select.cc 2011-03-30 13:31:54 +0000 @@ -961,7 +961,7 @@ JOIN::optimize() If all items were resolved by opt_sum_query, there is no need to open any tables. */ - if ((res=opt_sum_query(select_lex->leaf_tables, all_fields, conds))) + if ((res=opt_sum_query(thd, select_lex->leaf_tables, all_fields, conds))) { if (res == HA_ERR_KEY_NOT_FOUND) { === modified file 'sql/sql_select.h' --- a/sql/sql_select.h 2011-01-07 14:06:24 +0000 +++ b/sql/sql_select.h 2011-03-30 13:31:54 +0000 @@ -612,7 +612,8 @@ Field* create_tmp_field_from_field(THD * /* functions from opt_sum.cc */ bool simple_pred(Item_func *func_item, Item **args, bool *inv_order); -int opt_sum_query(TABLE_LIST *tables, List &all_fields,COND *conds); +int opt_sum_query(THD* thd, + TABLE_LIST *tables, List &all_fields, COND *conds); /* from sql_delete.cc, used by opt_range.cc */ extern "C" int refpos_order_cmp(void* arg, const void *a,const void *b); --===============8257605315213405880== 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\ # pijww9y932p2uj8e # target_branch: file:///export/home/didrik/repo/5.1-foo/ # testament_sha1: dd24c49c2db69fc2862e7713df1872f5c656a9a1 # timestamp: 2011-03-30 15:32:00 +0200 # base_revision_id: sergey.glukhov@stripped\ # f715tu7n1tmwno8x # # Begin bundle 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 --===============8257605315213405880==--