maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #04739
Re: Please review: [Commits] Rev 3535: Fix for bug lp:1006231 in file:///home/tsk/mprog/src/5.3/
Hi Timour,
As discussed on the phone call:
- Let's add a separate MDEV item to add "the assert".
- Ok to push tis patch.
On Wed, May 30, 2012 at 07:12:33PM +0300, Timour Katchaounov wrote:
> Sergey,
>
> Could you please review yet another bug fix for expensive subqueries
> executed during optimiziation.
>
> Timour
>
> ------------------------------------------------------------
> revno: 3535
> revision-id: timour@xxxxxxxxxxxx-20120530161018-kgsiqesmnohtnbc6
> parent: holyfoot@xxxxxxxxxxxx-20120529045925-h35akgdit83ql5yq
> fixes bug(s): https://launchpad.net/bugs/1006231
> committer: timour@xxxxxxxxxxxx
> branch nick: 5.3
> timestamp: Wed 2012-05-30 19:10:18 +0300
> message:
> Fix for bug lp:1006231
>
> Analysis:
>
> When a subquery that needs a temp table is executed during
> the prepare or optimize phase of the outer query, at the end
> of the subquery execution all the JOIN_TABs of the subquery
> are replaced by a new JOIN_TAB that selects from the temp table.
> However that temp table has no corresponding TABLE_LIST.
> Once EXPLAIN execution reaches its last phase, it tries to print
> the names of the subquery tables through its TABLE_LISTs, but in
> the case of this bug there is no such TABLE_LIST (it is NULL),
> hence a crash.
>
> Solution:
> The fix is to block subquery evaluation inside
> Item_func_like::fix_fields and Item_func_like::select_optimize()
> using the Item::is_expensive() test.
> === modified file 'mysql-test/r/subselect_innodb.result'
> --- a/mysql-test/r/subselect_innodb.result 2012-05-20 12:57:29 +0000
> +++ b/mysql-test/r/subselect_innodb.result 2012-05-30 16:10:18 +0000
> @@ -365,4 +365,19 @@ GROUP BY 1
> MAX( f1 )
> NULL
> drop table t1, t2, t3;
> +#
> +# LP BUG#1006231 crash in select_describe
> +#
> +create table t1(a1 int) ENGINE=InnoDB;
> +insert into t1 values (1);
> +explain
> +select 1 from t1 where 1 like (select 1 from t1 where 1 <=> (select 1 from t1 group by a1));
> +id select_type table type possible_keys key key_len ref rows Extra
> +1 PRIMARY t1 ALL NULL NULL NULL NULL 1
> +2 SUBQUERY t1 ALL NULL NULL NULL NULL 1
> +3 SUBQUERY t1 ALL NULL NULL NULL NULL 1 Using temporary; Using filesort
> +select 1 from t1 where 1 like (select 1 from t1 where 1 <=> (select 1 from t1 group by a1));
> +1
> +1
> +drop table t1;
> set optimizer_switch=@subselect_innodb_tmp;
>
> === modified file 'mysql-test/t/subselect_innodb.test'
> --- a/mysql-test/t/subselect_innodb.test 2012-05-20 12:57:29 +0000
> +++ b/mysql-test/t/subselect_innodb.test 2012-05-30 16:10:18 +0000
> @@ -356,4 +356,16 @@ WHERE f2 >= (
>
> drop table t1, t2, t3;
>
> +--echo #
> +--echo # LP BUG#1006231 crash in select_describe
> +--echo #
> +
> +create table t1(a1 int) ENGINE=InnoDB;
> +insert into t1 values (1);
> +explain
> +select 1 from t1 where 1 like (select 1 from t1 where 1 <=> (select 1 from t1 group by a1));
> +select 1 from t1 where 1 like (select 1 from t1 where 1 <=> (select 1 from t1 group by a1));
> +drop table t1;
> +
> +
> set optimizer_switch=@subselect_innodb_tmp;
>
> === modified file 'sql/item_cmpfunc.cc'
> --- a/sql/item_cmpfunc.cc 2012-05-20 12:57:29 +0000
> +++ b/sql/item_cmpfunc.cc 2012-05-30 16:10:18 +0000
> @@ -4656,7 +4656,7 @@ longlong Item_func_like::val_int()
>
> Item_func::optimize_type Item_func_like::select_optimize() const
> {
> - if (args[1]->const_item())
> + if (args[1]->const_item() && !args[1]->is_expensive())
> {
> String* res2= args[1]->val_str((String *)&cmp.value2);
> const char *ptr2;
> @@ -4743,7 +4743,8 @@ bool Item_func_like::fix_fields(THD *thd
> We could also do boyer-more for non-const items, but as we would have to
> recompute the tables for each row it's not worth it.
> */
> - if (args[1]->const_item() && !use_strnxfrm(collation.collation))
> + if (args[1]->const_item() && !use_strnxfrm(collation.collation) &&
> + !args[1]->is_expensive())
> {
> String* res2 = args[1]->val_str(&cmp.value2);
> if (!res2)
>
> _______________________________________________
> commits mailing list
> commits@xxxxxxxxxxx
> https://lists.askmonty.org/cgi-bin/mailman/listinfo/commits
--
BR
Sergei
--
Sergei Petrunia, Software Developer
Monty Program AB, http://askmonty.org
Blog: http://s.petrunia.net/blog