Hi Sanja, Sergey,

I think Sergey might have mean the same thing but it is not clear to me.
in_optimize never gets set to true. By mentioning that it is redundant that
means that it can be removed from the current code right?

Also, I would put the "return true" conditions after the "return false"
conditions. Makes the code slightly easier to follow.

Vicentiu

On Wed, 4 May 2016 at 18:59 Sergey Petrunia <ser...@mariadb.com> wrote:

> Hi Sanja,
>
> I have one comment: the patch introduces JOIN::in_optimize which can have
> values of 1) not initialized and 2) false. This is clearly redundant.
>
> Ok to push after the above is addressed.
>
> On Sun, Feb 21, 2016 at 10:12:25PM +0100, OleksandrByelkin wrote:
> > revision-id: b1ddc7d546e6b147838af72dd03f86a8b272fdf0
> (mariadb-10.1.11-18-gb1ddc7d)
> > parent(s): fd8e846a3b049903706267d58e6d8e61eea97df8
> > committer: Oleksandr Byelkin
> > timestamp: 2016-02-21 22:12:25 +0100
> > message:
> >
> > MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops with
> UNION in ALL subquery
> >
> > Do not mark subquery as inexpensive when it is not optimized.
> >
> > ---
> >  mysql-test/r/derived_view.result              |  6 +++---
> >  mysql-test/r/subselect.result                 | 20 +++++++++++++++++---
> >  mysql-test/r/subselect_no_exists_to_in.result | 20 +++++++++++++++++---
> >  mysql-test/r/subselect_no_mat.result          | 20 +++++++++++++++++---
> >  mysql-test/r/subselect_no_opts.result         | 20 +++++++++++++++++---
> >  mysql-test/r/subselect_no_scache.result       | 20 +++++++++++++++++---
> >  mysql-test/r/subselect_no_semijoin.result     | 20 +++++++++++++++++---
> >  mysql-test/r/type_year.result                 |  1 +
> >  mysql-test/t/subselect.test                   | 11 +++++++++++
> >  sql/item_subselect.cc                         | 20 ++++++++++++++++----
> >  sql/sql_select.h                              |  2 ++
> >  11 files changed, 135 insertions(+), 25 deletions(-)
> >
> > diff --git a/mysql-test/r/derived_view.result
> b/mysql-test/r/derived_view.result
> > index 639942f..5783247 100644
> > --- a/mysql-test/r/derived_view.result
> > +++ b/mysql-test/r/derived_view.result
> > @@ -1101,7 +1101,7 @@ id      select_type     table   type
> possible_keys   key     key_len ref     rows    filtered        Extra
> >  1    PRIMARY t3      system  NULL    NULL    NULL    NULL    1
>  100.00
> >  2    SUBQUERY        NULL    NULL    NULL    NULL    NULL    NULL
> NULL    NULL    No tables used
> >  Warnings:
> > -Note 1003    select 6 AS `a`,5 AS `b` from `test`.`t3` where
> (not(<expr_cache><6,5>(<in_optimizer>((6,5),<exists>(select 7,5 having
> (trigcond(((<cache>(6) = 7) or isnull(7))) and trigcond(((<cache>(5) = 5)
> or isnull(5))) and trigcond(<is_not_null_test>(7)) and
> trigcond(<is_not_null_test>(5))))))))
> > +Note 1003    select 6 AS `a`,5 AS `b` from `test`.`t3` where 1
> >  SELECT t.a,t.b FROM t3 RIGHT JOIN ((SELECT * FROM t1) AS t, t2) ON t2.b
> != 0
> >  WHERE (t.a,t.b) NOT IN (SELECT 7, 5);
> >  a    b
> > @@ -1115,7 +1115,7 @@ id      select_type     table   type
> possible_keys   key     key_len ref     rows    filtered        Extra
> >  1    PRIMARY t3      system  NULL    NULL    NULL    NULL    1
>  100.00
> >  3    SUBQUERY        NULL    NULL    NULL    NULL    NULL    NULL
> NULL    NULL    No tables used
> >  Warnings:
> > -Note 1003    select 6 AS `a`,5 AS `b` from `test`.`t3` where
> (not(<expr_cache><6,5>(<in_optimizer>((6,5),<exists>(select 7,5 having
> (trigcond(((<cache>(6) = 7) or isnull(7))) and trigcond(((<cache>(5) = 5)
> or isnull(5))) and trigcond(<is_not_null_test>(7)) and
> trigcond(<is_not_null_test>(5))))))))
> > +Note 1003    select 6 AS `a`,5 AS `b` from `test`.`t3` where 1
> >  SELECT t.a,t.b FROM t3 RIGHT JOIN (v1 AS t, t2) ON t2.b != 0
> >  WHERE (t.a,t.b) NOT IN (SELECT 7, 5);
> >  a    b
> > @@ -1129,7 +1129,7 @@ id      select_type     table   type
> possible_keys   key     key_len ref     rows    filtered        Extra
> >  1    PRIMARY t3      system  NULL    NULL    NULL    NULL    1
>  100.00
> >  2    SUBQUERY        NULL    NULL    NULL    NULL    NULL    NULL
> NULL    NULL    No tables used
> >  Warnings:
> > -Note 1003    select 6 AS `a`,5 AS `b` from `test`.`t3` where
> (not(<expr_cache><6,5>(<in_optimizer>((6,5),<exists>(select 7,5 having
> (trigcond(((<cache>(6) = 7) or isnull(7))) and trigcond(((<cache>(5) = 5)
> or isnull(5))) and trigcond(<is_not_null_test>(7)) and
> trigcond(<is_not_null_test>(5))))))))
> > +Note 1003    select 6 AS `a`,5 AS `b` from `test`.`t3` where 1
> >  DROP VIEW v1;
> >  DROP TABLE t1,t2,t3;
> >  #
> > diff --git a/mysql-test/r/subselect.result
> b/mysql-test/r/subselect.result
> > index 75c8597..90d8f9f 100644
> > --- a/mysql-test/r/subselect.result
> > +++ b/mysql-test/r/subselect.result
> > @@ -6805,7 +6805,9 @@ FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR alias1.a = 'y'
> >  HAVING field>'B' AND ( 'Moscow' ) IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY NULL    NULL    NULL    NULL    NULL    NULL    NULL
> Impossible HAVING
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> > +1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a ) AS field
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> > @@ -6817,8 +6819,8 @@ SELECT MAX( alias2.a )
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR ('Moscow') IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY alias1  index   a       a       19      NULL    11
> Using where; Using index
> > -1    PRIMARY alias2  ref     a       a       19      test.alias1.a   2
>      Using index
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> >  1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a )
> > @@ -7133,3 +7135,15 @@ sq
> >  NULL
> >  drop view v2;
> >  drop table t1,t2;
> > +#
> > +# MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops
> > +# with UNION in ALL subquery
> > +#
> > +SET NAMES utf8;
> > +CREATE TABLE t1 (f VARCHAR(8)) ENGINE=MyISAM;
> > +INSERT INTO t1 VALUES ('foo');
> > +SELECT f FROM t1 WHERE f > ALL ( SELECT 'bar' UNION SELECT 'baz' );
> > +f
> > +foo
> > +drop table t1;
> > +SET NAMES default;
> > diff --git a/mysql-test/r/subselect_no_exists_to_in.result
> b/mysql-test/r/subselect_no_exists_to_in.result
> > index e6238af..dcceb61 100644
> > --- a/mysql-test/r/subselect_no_exists_to_in.result
> > +++ b/mysql-test/r/subselect_no_exists_to_in.result
> > @@ -6805,7 +6805,9 @@ FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR alias1.a = 'y'
> >  HAVING field>'B' AND ( 'Moscow' ) IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY NULL    NULL    NULL    NULL    NULL    NULL    NULL
> Impossible HAVING
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> > +1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a ) AS field
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> > @@ -6817,8 +6819,8 @@ SELECT MAX( alias2.a )
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR ('Moscow') IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY alias1  index   a       a       19      NULL    11
> Using where; Using index
> > -1    PRIMARY alias2  ref     a       a       19      test.alias1.a   2
>      Using index
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> >  1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a )
> > @@ -7133,6 +7135,18 @@ sq
> >  NULL
> >  drop view v2;
> >  drop table t1,t2;
> > +#
> > +# MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops
> > +# with UNION in ALL subquery
> > +#
> > +SET NAMES utf8;
> > +CREATE TABLE t1 (f VARCHAR(8)) ENGINE=MyISAM;
> > +INSERT INTO t1 VALUES ('foo');
> > +SELECT f FROM t1 WHERE f > ALL ( SELECT 'bar' UNION SELECT 'baz' );
> > +f
> > +foo
> > +drop table t1;
> > +SET NAMES default;
> >  set optimizer_switch=default;
> >  select @@optimizer_switch like '%exists_to_in=off%';
> >  @@optimizer_switch like '%exists_to_in=off%'
> > diff --git a/mysql-test/r/subselect_no_mat.result
> b/mysql-test/r/subselect_no_mat.result
> > index 70edc64..4e9f750 100644
> > --- a/mysql-test/r/subselect_no_mat.result
> > +++ b/mysql-test/r/subselect_no_mat.result
> > @@ -6800,7 +6800,9 @@ FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR alias1.a = 'y'
> >  HAVING field>'B' AND ( 'Moscow' ) IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY NULL    NULL    NULL    NULL    NULL    NULL    NULL
> Impossible HAVING
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> > +1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a ) AS field
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> > @@ -6812,8 +6814,8 @@ SELECT MAX( alias2.a )
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR ('Moscow') IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY alias1  index   a       a       19      NULL    11
> Using where; Using index
> > -1    PRIMARY alias2  ref     a       a       19      test.alias1.a   2
>      Using index
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> >  1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a )
> > @@ -7126,6 +7128,18 @@ sq
> >  NULL
> >  drop view v2;
> >  drop table t1,t2;
> > +#
> > +# MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops
> > +# with UNION in ALL subquery
> > +#
> > +SET NAMES utf8;
> > +CREATE TABLE t1 (f VARCHAR(8)) ENGINE=MyISAM;
> > +INSERT INTO t1 VALUES ('foo');
> > +SELECT f FROM t1 WHERE f > ALL ( SELECT 'bar' UNION SELECT 'baz' );
> > +f
> > +foo
> > +drop table t1;
> > +SET NAMES default;
> >  set optimizer_switch=default;
> >  select @@optimizer_switch like '%materialization=on%';
> >  @@optimizer_switch like '%materialization=on%'
> > diff --git a/mysql-test/r/subselect_no_opts.result
> b/mysql-test/r/subselect_no_opts.result
> > index c89fd13..4b09fd2 100644
> > --- a/mysql-test/r/subselect_no_opts.result
> > +++ b/mysql-test/r/subselect_no_opts.result
> > @@ -6796,7 +6796,9 @@ FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR alias1.a = 'y'
> >  HAVING field>'B' AND ( 'Moscow' ) IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY NULL    NULL    NULL    NULL    NULL    NULL    NULL
> Impossible HAVING
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> > +1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a ) AS field
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> > @@ -6808,8 +6810,8 @@ SELECT MAX( alias2.a )
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR ('Moscow') IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY alias1  index   a       a       19      NULL    11
> Using where; Using index
> > -1    PRIMARY alias2  ref     a       a       19      test.alias1.a   2
>      Using index
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> >  1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a )
> > @@ -7124,4 +7126,16 @@ sq
> >  NULL
> >  drop view v2;
> >  drop table t1,t2;
> > +#
> > +# MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops
> > +# with UNION in ALL subquery
> > +#
> > +SET NAMES utf8;
> > +CREATE TABLE t1 (f VARCHAR(8)) ENGINE=MyISAM;
> > +INSERT INTO t1 VALUES ('foo');
> > +SELECT f FROM t1 WHERE f > ALL ( SELECT 'bar' UNION SELECT 'baz' );
> > +f
> > +foo
> > +drop table t1;
> > +SET NAMES default;
> >  set @optimizer_switch_for_subselect_test=null;
> > diff --git a/mysql-test/r/subselect_no_scache.result
> b/mysql-test/r/subselect_no_scache.result
> > index b12bf21..322e64d 100644
> > --- a/mysql-test/r/subselect_no_scache.result
> > +++ b/mysql-test/r/subselect_no_scache.result
> > @@ -6811,7 +6811,9 @@ FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR alias1.a = 'y'
> >  HAVING field>'B' AND ( 'Moscow' ) IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY NULL    NULL    NULL    NULL    NULL    NULL    NULL
> Impossible HAVING
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> > +1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a ) AS field
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> > @@ -6823,8 +6825,8 @@ SELECT MAX( alias2.a )
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR ('Moscow') IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY alias1  index   a       a       19      NULL    11
> Using where; Using index
> > -1    PRIMARY alias2  ref     a       a       19      test.alias1.a   2
>      Using index
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> >  1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a )
> > @@ -7139,6 +7141,18 @@ sq
> >  NULL
> >  drop view v2;
> >  drop table t1,t2;
> > +#
> > +# MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops
> > +# with UNION in ALL subquery
> > +#
> > +SET NAMES utf8;
> > +CREATE TABLE t1 (f VARCHAR(8)) ENGINE=MyISAM;
> > +INSERT INTO t1 VALUES ('foo');
> > +SELECT f FROM t1 WHERE f > ALL ( SELECT 'bar' UNION SELECT 'baz' );
> > +f
> > +foo
> > +drop table t1;
> > +SET NAMES default;
> >  set optimizer_switch=default;
> >  select @@optimizer_switch like '%subquery_cache=on%';
> >  @@optimizer_switch like '%subquery_cache=on%'
> > diff --git a/mysql-test/r/subselect_no_semijoin.result
> b/mysql-test/r/subselect_no_semijoin.result
> > index 54f145d..d380528 100644
> > --- a/mysql-test/r/subselect_no_semijoin.result
> > +++ b/mysql-test/r/subselect_no_semijoin.result
> > @@ -6796,7 +6796,9 @@ FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR alias1.a = 'y'
> >  HAVING field>'B' AND ( 'Moscow' ) IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY NULL    NULL    NULL    NULL    NULL    NULL    NULL
> Impossible HAVING
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> > +1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a ) AS field
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> > @@ -6808,8 +6810,8 @@ SELECT MAX( alias2.a )
> >  FROM t1 AS alias1, t1 AS alias2, t1 AS alias3
> >  WHERE alias1.a = alias2.a OR ('Moscow') IN ( SELECT a FROM t1 );
> >  id   select_type     table   type    possible_keys   key     key_len
> ref     rows    Extra
> > -1    PRIMARY alias1  index   a       a       19      NULL    11
> Using where; Using index
> > -1    PRIMARY alias2  ref     a       a       19      test.alias1.a   2
>      Using index
> > +1    PRIMARY alias1  index   a       a       19      NULL    11
> Using index
> > +1    PRIMARY alias2  index   a       a       19      NULL    11
> Using where; Using index; Using join buffer (flat, BNL join)
> >  1    PRIMARY alias3  index   NULL    a       19      NULL    11
> Using index; Using join buffer (flat, BNL join)
> >  2    SUBQUERY        t1      index_subquery  a       a       19
> const   1       Using index; Using where
> >  SELECT MAX( alias2.a )
> > @@ -7124,5 +7126,17 @@ sq
> >  NULL
> >  drop view v2;
> >  drop table t1,t2;
> > +#
> > +# MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops
> > +# with UNION in ALL subquery
> > +#
> > +SET NAMES utf8;
> > +CREATE TABLE t1 (f VARCHAR(8)) ENGINE=MyISAM;
> > +INSERT INTO t1 VALUES ('foo');
> > +SELECT f FROM t1 WHERE f > ALL ( SELECT 'bar' UNION SELECT 'baz' );
> > +f
> > +foo
> > +drop table t1;
> > +SET NAMES default;
> >  set @optimizer_switch_for_subselect_test=null;
> >  set @join_cache_level_for_subselect_test=NULL;
> > diff --git a/mysql-test/r/type_year.result
> b/mysql-test/r/type_year.result
> > index 842a16e..204cec2 100644
> > --- a/mysql-test/r/type_year.result
> > +++ b/mysql-test/r/type_year.result
> > @@ -387,6 +387,7 @@ a
> >  00
> >  select a from t1 where a=(select 2000 from dual where 1);
> >  a
> > +00
> >  select a from t1 where a=y2k();
> >  a
> >  00
> > diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test
> > index a862870..f71c215 100644
> > --- a/mysql-test/t/subselect.test
> > +++ b/mysql-test/t/subselect.test
> > @@ -5989,3 +5989,14 @@ SELECT ( SELECT MIN(v2.f2) FROM t1 ) AS sq FROM
> v2 GROUP BY sq;
> >
> >  drop view v2;
> >  drop table t1,t2;
> > +
> > +--echo #
> > +--echo # MDEV-9487: Server crashes in
> Time_and_counter_tracker::incr_loops
> > +--echo # with UNION in ALL subquery
> > +--echo #
> > +SET NAMES utf8;
> > +CREATE TABLE t1 (f VARCHAR(8)) ENGINE=MyISAM;
> > +INSERT INTO t1 VALUES ('foo');
> > +SELECT f FROM t1 WHERE f > ALL ( SELECT 'bar' UNION SELECT 'baz' );
> > +drop table t1;
> > +SET NAMES default;
> > diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc
> > index d4e3e6c..f45d83d 100644
> > --- a/sql/item_subselect.cc
> > +++ b/sql/item_subselect.cc
> > @@ -561,22 +561,34 @@ bool Item_subselect::is_expensive()
> >    for (SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
> >    {
> >      JOIN *cur_join= sl->join;
> > +
> > +    /* not optimized subquery */
> >      if (!cur_join)
> > -      continue;
> > +      return true;
> > +
> > +    /* very simple subquery */
> > +    if (!cur_join->tables_list && !sl->first_inner_unit())
> > +      return false;
> > +
> > +    /*
> > +      If the subquery is not optimised or in the process of optimization
> > +      it supposed to be expensive
> > +    */
> > +    if (!cur_join->optimized || cur_join->in_optimize)
> > +      return true;
> >
> >      /*
> >        Subqueries whose result is known after optimization are not
> expensive.
> >        Such subqueries have all tables optimized away, thus have no join
> plan.
> >      */
> > -    if (cur_join->optimized &&
> > -        (cur_join->zero_result_cause || !cur_join->tables_list))
> > +    if ((cur_join->zero_result_cause || !cur_join->tables_list))
> >        return false;
> >
> >      /*
> >        If a subquery is not optimized we cannot estimate its cost. A
> subquery is
> >        considered optimized if it has a join plan.
> >      */
> > -    if (!(cur_join->optimized && cur_join->join_tab))
> > +    if (!cur_join->join_tab)
> >        return true;
> >
> >      if (sl->first_inner_unit())
> > diff --git a/sql/sql_select.h b/sql/sql_select.h
> > index 9f90473..e57844fd 100644
> > --- a/sql/sql_select.h
> > +++ b/sql/sql_select.h
> > @@ -1292,6 +1292,7 @@ class JOIN :public Sql_alloc
> >                                   OPTIMIZATION_IN_PROGRESS=1,
> >                                   OPTIMIZATION_DONE=2};
> >    bool optimized; ///< flag to avoid double optimization in EXPLAIN
> > +  bool in_optimize;
> >    bool initialized; ///< flag to avoid double init_execution calls
> >
> >    Explain_select *explain;
> > @@ -1380,6 +1381,7 @@ class JOIN :public Sql_alloc
> >      ref_pointer_array_size= 0;
> >      zero_result_cause= 0;
> >      optimized= 0;
> > +    in_optimize= 0;
> >      have_query_plan= QEP_NOT_PRESENT_YET;
> >      initialized= 0;
> >      cleaned= 0;
>
> BR
>  Sergei
> --
> Sergei Petrunia, Software Developer
> MariaDB Corporation | Skype: sergefp | Blog: http://s.petrunia.net/blog
>
>
>
> _______________________________________________
> Mailing list: https://launchpad.net/~maria-developers
> Post to     : maria-developers@lists.launchpad.net
> Unsubscribe : https://launchpad.net/~maria-developers
> More help   : https://help.launchpad.net/ListHelp
>
_______________________________________________
Mailing list: https://launchpad.net/~maria-developers
Post to     : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to