[Commits] 586870f9eff: Merge 10.2->10.3

psergey sergey at mariadb.com
Wed Jun 30 15:07:05 EEST 2021


revision-id: 586870f9effa48831fda2590f2aee2b95b30be39 (mariadb-10.3.30-13-g586870f9eff)
parent(s): 29098083f7ac3b445ee59c3e765eb634ec70b947 eb20c91b55e4b51be533314994b36bf9b24016f3
author: Sergei Petrunia
committer: Sergei Petrunia
timestamp: 2021-06-30 15:06:54 +0300
message:

Merge 10.2->10.3


 .gitignore                                         |   2 +
 cmake/cpack_rpm.cmake                              |   6 +-
 mysql-test/main/cte_nonrecursive.result            |  55 ++++++++
 mysql-test/main/cte_nonrecursive.test              |  29 ++++
 mysql-test/main/derived_cond_pushdown.result       | 146 +++++++++++++++++++++
 mysql-test/main/derived_cond_pushdown.test         |  70 ++++++++++
 mysql-test/main/gis-json.result                    |  10 ++
 mysql-test/main/gis-json.test                      |   7 +
 mysql-test/main/information_schema.result          |   2 +
 .../main/information_schema_all_engines.result     |  12 +-
 mysql-test/suite/funcs_1/r/is_columns_is.result    |   4 +
 .../suite/funcs_1/r/is_columns_is_embedded.result  |   4 +
 mysql-test/suite/funcs_1/r/is_tables_is.result     |  92 +++++++++++++
 .../suite/funcs_1/r/is_tables_is_embedded.result   |  92 +++++++++++++
 mysql-test/suite/galera/r/lp1376747-4.result       |   2 +-
 mysql-test/suite/galera/t/lp1376747-4.test         |   2 +-
 sql/handler.h                                      |   2 +
 sql/item_create.cc                                 |   5 +-
 sql/lex.h                                          |   7 +-
 sql/spatial.cc                                     |   6 +
 sql/sql_derived.cc                                 |  79 ++++++++++-
 sql/sql_show.cc                                    |  83 ++++++++++++
 storage/innobase/os/os0file.cc                     |  38 +++++-
 23 files changed, 736 insertions(+), 19 deletions(-)

diff --cc mysql-test/main/cte_nonrecursive.result
index 0992c97a857,00000000000..550864b20c6
mode 100644,000000..100644
--- a/mysql-test/main/cte_nonrecursive.result
+++ b/mysql-test/main/cte_nonrecursive.result
@@@ -1,2077 -1,0 +1,2132 @@@
 +create table t1 (a int, b  varchar(32));
 +insert into t1 values
 +(4,'aaaa' ), (7,'bb'), (1,'ccc'), (4,'dd');
 +insert into t1 values
 +(3,'eee'), (7,'bb'), (1,'fff'), (4,'ggg');
 +create table t2 (c int);
 +insert into t2 values
 +(2), (4), (5), (3);
 +# select certain field in the specification of t
 +with t as (select a from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.a;
 +c	a
 +4	4
 +3	3
 +4	4
 +select * from t2, (select a from t1 where b >= 'c') as t
 +where t2.c=t.a;
 +c	a
 +4	4
 +3	3
 +4	4
 +explain 
 +with t as (select a from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain
 +select * from t2, (select a from t1 where b >= 'c') as t
 +where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# select '*' in the specification of t
 +with t as (select * from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.a;
 +c	a	b
 +4	4	dd
 +3	3	eee
 +4	4	ggg
 +select * from t2, (select * from t1 where b >= 'c') as t
 +where t2.c=t.a;
 +c	a	b
 +4	4	dd
 +3	3	eee
 +4	4	ggg
 +explain
 +with t as (select * from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain
 +select * from t2, (select * from t1 where b >= 'c') as t
 +where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# rename fields returned by the specication when defining t
 +with t(f1,f2) as (select * from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.f1;
 +c	f1	f2
 +4	4	dd
 +3	3	eee
 +4	4	ggg
 +explain
 +with t(f1,f2) as (select * from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.f1;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# materialized query specifying t
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 +select * from t2,t where t2.c=t.a;
 +c	a	count(*)
 +4	4	2
 +3	3	1
 +select * from t2, (select a, count(*) from t1 where b >= 'c' group by a) as t 
 +where t2.c=t.a;
 +c	a	count(*)
 +4	4	2
 +3	3	1
 +explain
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 +select * from t2,t where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.c	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary; Using filesort
 +explain
 +select * from t2, (select a, count(*) from t1 where b >= 'c' group by a) as t 
 +where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.c	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary; Using filesort
 +# specivication of t contains having
 +with t as (select a, count(*) from t1 where b >= 'c'
 +             group by a having count(*)=1 ) 
 +select * from t2,t where t2.c=t.a;
 +c	a	count(*)
 +3	3	1
 +select * from t2, (select a, count(*) from t1 where b >= 'c'
 +                      group by a having count(*)=1) t
 +where t2.c=t.a;
 +c	a	count(*)
 +3	3	1
 +# main query contains having
 +with t as (select * from t2 where c <= 4) 
 +select a, count(*) from t1,t where t1.a=t.c group by a having count(*)=1;
 +a	count(*)
 +3	1
 +select a, count(*) from t1, (select * from t2 where c <= 4) t 
 +where t1.a=t.c group by a having count(*)=1;
 +a	count(*)
 +3	1
 +# main query contains group by + order by
 +with t as (select * from t2 where c <= 4 ) 
 +select a, count(*) from t1,t where t1.a=t.c group by a order by count(*);
 +a	count(*)
 +3	1
 +4	3
 +select a, count(*) from t1, (select * from t2 where c <= 4 ) t
 +where t1.a=t.c group by a order by count(*);
 +a	count(*)
 +3	1
 +4	3
 +# main query contains group by + order by + limit
 +with t as (select * from t2 where c <= 4 ) 
 +select a, count(*) from t1,t
 +where t1.a=t.c group by a order by count(*) desc limit 1;
 +a	count(*)
 +4	3
 +select a, count(*) from t1, (select * from t2 where c <= 4 ) t
 +where t1.a=t.c group by a order by count(*) desc limit 1;
 +a	count(*)
 +4	3
 +# t is used in a subquery
 +with t as (select a from t1 where a<5)
 +select * from t2 where c in (select a from t);
 +c
 +4
 +3
 +select * from t2 
 +where c in (select a from (select a from t1 where a<5) as t);
 +c
 +4
 +3
 +explain
 +with t as (select a from t1 where a<5)
 +select * from t2 where c in (select a from t);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	PRIMARY	<subquery3>	eq_ref	distinct_key	distinct_key	4	func	1	
 +3	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +explain
 +select * from t2 
 +where c in (select a from (select a from t1 where a<5) as t);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 +2	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +# materialized t is used in a subquery
 +with t as (select count(*) as c from t1 where b >= 'c' group by a)
 +select * from t2 where c in (select c from t);
 +c
 +2
 +select * from t2
 +where c in (select c from (select count(*) as c from t1
 +where b >= 'c' group by a) as t);
 +c
 +2
 +explain
 +with t as (select count(*) as c from t1 where b >= 'c' group by a)
 +select * from t2 where c in (select c from t);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	8	test.t2.c	2	Using where; FirstMatch(t2)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary; Using filesort
 +explain
 +select * from t2
 +where c in (select c from (select count(*) as c from t1
 +where b >= 'c' group by a) as t);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<derived3>	ref	key0	key0	8	test.t2.c	2	Using where; FirstMatch(t2)
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary; Using filesort
 +# two references to t specified by a query
 +# selecting a field:  both in main query
 +with t as (select a from t1 where b >= 'c')
 +select * from t as r1, t as r2 where r1.a=r2.a;
 +a	a
 +1	1
 +1	1
 +4	4
 +4	4
 +3	3
 +1	1
 +1	1
 +4	4
 +4	4
 +select * from (select a from t1 where b >= 'c') as r1,
 +(select a from t1 where b >= 'c') as r2 
 +where r1.a=r2.a;
 +a	a
 +1	1
 +1	1
 +4	4
 +4	4
 +3	3
 +1	1
 +1	1
 +4	4
 +4	4
 +explain
 +with t as (select a from t1 where b >= 'c')
 +select * from t as r1, t as r2 where r1.a=r2.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain
 +select * from (select a from t1 where b >= 'c') as r1,
 +(select a from t1 where b >= 'c') as r2 
 +where r1.a=r2.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# two references to materialized t: both in main query
 +with t as (select distinct a from t1 where b >= 'c')
 +select * from t as r1, t as r2 where r1.a=r2.a;
 +a	a
 +1	1
 +4	4
 +3	3
 +select * from (select distinct a from t1 where b >= 'c') as r1,
 +(select distinct a from t1 where b >= 'c') as r2 
 +where r1.a=r2.a;
 +a	a
 +1	1
 +4	4
 +3	3
 +explain
 +with t as (select distinct a from t1 where b >= 'c')
 +select * from t as r1, t as r2 where r1.a=r2.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	PRIMARY	<derived3>	ref	key0	key0	5	r1.a	1	
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary
 +explain
 +select * from (select distinct a from t1 where b >= 'c') as r1,
 +(select distinct a from t1 where b >= 'c') as r2 
 +where r1.a=r2.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	PRIMARY	<derived3>	ref	key0	key0	5	r1.a	1	
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary
 +# two references to t specified by a query
 +# selecting all fields:  both in main query
 +with t as (select * from t1 where b >= 'c')
 +select * from t as r1, t as r2 where r1.a=r2.a;
 +a	b	a	b
 +1	ccc	1	ccc
 +1	fff	1	ccc
 +4	dd	4	dd
 +4	ggg	4	dd
 +3	eee	3	eee
 +1	ccc	1	fff
 +1	fff	1	fff
 +4	dd	4	ggg
 +4	ggg	4	ggg
 +select * from (select * from t1 where b >= 'c') as r1,
 +(select * from t1 where b >= 'c') as r2
 +where r1.a=r2.a;
 +a	b	a	b
 +1	ccc	1	ccc
 +1	fff	1	ccc
 +4	dd	4	dd
 +4	ggg	4	dd
 +3	eee	3	eee
 +1	ccc	1	fff
 +1	fff	1	fff
 +4	dd	4	ggg
 +4	ggg	4	ggg
 +explain
 +with t as (select * from t1 where b >= 'c')
 +select * from t as r1, t as r2 where r1.a=r2.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain
 +select * from (select * from t1 where b >= 'c') as r1,
 +(select * from t1 where b >= 'c') as r2
 +where r1.a=r2.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# two references to t specifying explicitly column names
 +with t(c) as (select a from t1 where b >= 'c')
 +select * from t r1, t r2 where r1.c=r2.c;
 +c	c
 +1	1
 +1	1
 +4	4
 +4	4
 +3	3
 +1	1
 +1	1
 +4	4
 +4	4
 +# t two references of t used in different parts of a union
 +with t as (select a from t1 where b >= 'c')
 +select * from t where a < 2
 +union
 +select * from t where a >= 4;
 +a
 +1
 +4
 +select * from (select a from t1 where b >= 'c') as t
 +where t.a < 2
 +union
 +select * from (select a from t1 where b >= 'c') as t
 +where t.a >= 4;
 +a
 +1
 +4
 +explain
 +with t as (select a from t1 where b >= 'c')
 +select * from t where a < 2
 +union
 +select * from t where a >= 4;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +NULL	UNION RESULT	<union1,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain
 +select * from (select a from t1 where b >= 'c') as t
 +where t.a < 2
 +union
 +select * from (select a from t1 where b >= 'c') as t
 +where t.a >= 4;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +NULL	UNION RESULT	<union1,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +# specification of t contains union
 +with t as (select a from t1 where b >= 'f' 
 +union
 +select c as a from t2 where c < 4) 
 +select * from t2,t where t2.c=t.a;
 +c	a
 +2	2
 +4	4
 +3	3
 +select * from t2, 
 +(select a from t1 where b >= 'f' 
 +union
 +select c as a from t2 where c < 4) as t 
 +where t2.c=t.a;
 +c	a
 +2	2
 +4	4
 +3	3
 +explain
 +with t as (select a from t1 where b >= 'f' 
 +union
 +select c as a from t2 where c < 4) 
 +select * from t2,t where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.c	1	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +3	UNION	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain
 +select * from t2, 
 +(select a from t1 where b >= 'f' 
 +union
 +select c as a from t2 where c < 4) as t 
 +where t2.c=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.c	1	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +3	UNION	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +# t is defined in the with clause of a subquery
 +select t1.a,t1.b from t1,t2
 +where t1.a>t2.c and
 +t2.c in (with t as (select * from t1 where t1.a<5)
 +select t2.c from t2,t where t2.c=t.a);
 +a	b
 +4	aaaa
 +7	bb
 +7	bb
 +4	dd
 +7	bb
 +7	bb
 +4	ggg
 +select t1.a,t1.b from t1,t2
 +where t1.a>t2.c and
 +t2.c in (select t2.c
 +from t2,(select * from t1 where t1.a<5) as t
 +where t2.c=t.a);
 +a	b
 +4	aaaa
 +7	bb
 +7	bb
 +4	dd
 +7	bb
 +7	bb
 +4	ggg
 +explain
 +select t1.a,t1.b from t1,t2
 +where t1.a>t2.c and
 +t2.c in (with t as (select * from t1 where t1.a<5)
 +select t2.c from t2,t where t2.c=t.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +2	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +2	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain
 +select t1.a,t1.b from t1,t2
 +where t1.a>t2.c and
 +t2.c in (select t2.c
 +from t2,(select * from t1 where t1.a<5) as t
 +where t2.c=t.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	4	func	1	
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +2	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +2	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# two different definitions of t: one in the with clause of the main query,
 +# the other in the with clause of a subquery 
 +with t as (select c from t2 where c >= 4)
 +select t1.a,t1.b from t1,t
 +where t1.a=t.c and
 +t.c in (with t as (select * from t1 where t1.a<5)
 +select t2.c from t2,t where t2.c=t.a);
 +a	b
 +4	aaaa
 +4	dd
 +4	ggg
 +select t1.a,t1.b from t1, (select c from t2 where c >= 4) as t
 +where t1.a=t.c and
 +t.c in (select t2.c from t2,  (select * from t1 where t1.a<5) as t
 +where t2.c=t.a);
 +a	b
 +4	aaaa
 +4	dd
 +4	ggg
 +explain
 +with t as (select c from t2 where c >= 4)
 +select t1.a,t1.b from t1,t
 +where t1.a=t.c and
 +t.c in (with t as (select * from t1 where t1.a<5)
 +select t2.c from t2,t where t2.c=t.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<subquery3>	eq_ref	distinct_key	distinct_key	4	func	1	
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +3	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +3	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain
 +select t1.a,t1.b from t1, (select c from t2 where c >= 4) as t
 +where t1.a=t.c and
 +t.c in (select t2.c from t2,  (select * from t1 where t1.a<5) as t
 +where t2.c=t.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<subquery3>	eq_ref	distinct_key	distinct_key	4	func	1	
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +3	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +3	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# another with table tt is defined in the with clause of a subquery
 +# from the specification of t
 +with t as (select * from t1
 +where a>2 and
 +b in (with tt as (select * from t2 where t2.c<5)
 +select t1.b from t1,tt where t1.a=tt.c))
 +select t.a, count(*) from t1,t where t1.a=t.a  group by t.a;
 +a	count(*)
 +3	1
 +4	9
 +select t.a, count(*)
 +from t1,
 +(select * from t1
 +where a>2 and
 +b in (select t1.b
 +from t1,
 +(select * from t2 where t2.c<5) as tt
 +where t1.a=tt.c)) as t
 +where t1.a=t.a  group by t.a;
 +a	count(*)
 +3	1
 +4	9
 +explain
 +with t as (select * from t1
 +where a>2 and
 +b in (with tt as (select * from t2 where t2.c<5)
 +select t1.b from t1,tt where t1.a=tt.c))
 +select t.a, count(*) from t1,t where t1.a=t.a  group by t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary; Using filesort
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<subquery3>	eq_ref	distinct_key	distinct_key	35	func	1	
 +3	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +3	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain
 +select t.a, count(*)
 +from t1,
 +(select * from t1
 +where a>2 and
 +b in (select t1.b
 +from t1,
 +(select * from t2 where t2.c<5) as tt
 +where t1.a=tt.c)) as t
 +where t1.a=t.a  group by t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary; Using filesort
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<subquery3>	eq_ref	distinct_key	distinct_key	35	func	1	
 +3	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +3	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# with clause in the specification of a derived table
 +select *
 +from t1, 
 +(with t as (select a from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.a) as tt
 +where t1.b > 'f' and tt.a=t1.a;
 +a	b	c	a
 +4	ggg	4	4
 +4	ggg	4	4
 +select *
 +from t1, 
 +(select * from t2,
 +(select a from t1 where b >= 'c') as t
 +where t2.c=t.a) as tt
 +where t1.b > 'f' and tt.a=t1.a;
 +a	b	c	a
 +4	ggg	4	4
 +4	ggg	4	4
 +explain
 +select *
 +from t1, 
 +(with t as (select a from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.a) as tt
 +where t1.b > 'f' and tt.a=t1.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (incremental, BNL join)
 +explain
 +select *
 +from t1, 
 +(select * from t2,
 +(select a from t1 where b >= 'c') as t
 +where t2.c=t.a) as tt
 +where t1.b > 'f' and tt.a=t1.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (incremental, BNL join)
 +# with claused in the specification of a view
 +create view v1 as 
 +with t as (select a from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.a;
 +show create view v1;
 +View	Create View	character_set_client	collation_connection
 +v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS with t as (select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`b` >= 'c')select `test`.`t2`.`c` AS `c`,`t`.`a` AS `a` from (`test`.`t2` join `t`) where `test`.`t2`.`c` = `t`.`a`	latin1	latin1_swedish_ci
 +select * from v1;
 +c	a
 +4	4
 +3	3
 +4	4
 +explain
 +select * from v1;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# with claused in the specification of a materialized view
 +create view v2 as 
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 +select * from t2,t where t2.c=t.a;
 +show create view v2;
 +View	Create View	character_set_client	collation_connection
 +v2	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS with t as (select `test`.`t1`.`a` AS `a`,count(0) AS `count(*)` from `test`.`t1` where `test`.`t1`.`b` >= 'c' group by `test`.`t1`.`a`)select `test`.`t2`.`c` AS `c`,`t`.`a` AS `a`,`t`.`count(*)` AS `count(*)` from (`test`.`t2` join `t`) where `test`.`t2`.`c` = `t`.`a`	latin1	latin1_swedish_ci
 +select * from v2;
 +c	a	count(*)
 +4	4	2
 +3	3	1
 +explain
 +select * from v2;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	Using where
 +1	PRIMARY	<derived3>	ref	key0	key0	5	test.t2.c	2	
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using temporary; Using filesort
 +# with clause in the specification of a view that whose definition
 +# table alias for a with table
 +create view v3 as
 +with t(c) as (select a from t1 where b >= 'c')
 +select * from t r1 where r1.c=4;
 +show create view v3;
 +View	Create View	character_set_client	collation_connection
 +v3	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS with t(c) as (select `test`.`t1`.`a` AS `c` from `test`.`t1` where `test`.`t1`.`b` >= 'c')select `r1`.`c` AS `c` from `t` `r1` where `r1`.`c` = 4	latin1	latin1_swedish_ci
 +select * from v3;
 +c
 +4
 +4
 +# with clause in the specification of a view that whose definition
 +# two table aliases for for the same with table
 +create view v4(c,d) as
 +with t(c) as (select a from t1 where b >= 'c')
 +select * from t r1, t r2 where r1.c=r2.c and r2.c=4;
 +show create view v4;
 +View	Create View	character_set_client	collation_connection
 +v4	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v4` AS with t(c) as (select `test`.`t1`.`a` AS `c` from `test`.`t1` where `test`.`t1`.`b` >= 'c')select `r1`.`c` AS `c`,`r2`.`c` AS `d` from (`t` `r1` join `t` `r2`) where `r1`.`c` = `r2`.`c` and `r2`.`c` = 4	latin1	latin1_swedish_ci
 +select * from v4;
 +c	d
 +4	4
 +4	4
 +4	4
 +4	4
 +explain
 +select * from v4;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +drop view v1,v2,v3,v4;
 +# currently any views containing with clause are not updatable
 +create view v1(a) as 
 +with t as (select a from t1 where b >= 'c') 
 +select t.a from t2,t where t2.c=t.a;
 +update v1 set a=0 where a > 4;
 +ERROR HY000: The target table v1 of the UPDATE is not updatable
 +drop view v1;
 +# prepare of a query containing a definition of a with table t
 +prepare stmt1 from "
 +with t as (select a from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.a;
 +";
 +execute stmt1;
 +c	a
 +4	4
 +3	3
 +4	4
 +execute stmt1;
 +c	a
 +4	4
 +3	3
 +4	4
 +deallocate prepare stmt1;
 +# prepare of a query containing a definition of a materialized t
 +prepare stmt1 from "
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 + select * from t2,t where t2.c=t.a;
 +";
 +execute stmt1;
 +c	a	count(*)
 +4	4	2
 +3	3	1
 +execute stmt1;
 +c	a	count(*)
 +4	4	2
 +3	3	1
 +deallocate prepare stmt1;
 +# prepare of a query containing two references to with table t
 +prepare stmt1 from "
 +with t as (select * from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +";
 +execute stmt1;
 +a	b	a	b
 +1	ccc	1	ccc
 +1	fff	1	ccc
 +4	dd	4	dd
 +4	ggg	4	dd
 +3	eee	3	eee
 +1	ccc	1	fff
 +1	fff	1	fff
 +4	dd	4	ggg
 +4	ggg	4	ggg
 +execute stmt1;
 +a	b	a	b
 +1	ccc	1	ccc
 +1	fff	1	ccc
 +4	dd	4	dd
 +4	ggg	4	dd
 +3	eee	3	eee
 +1	ccc	1	fff
 +1	fff	1	fff
 +4	dd	4	ggg
 +4	ggg	4	ggg
 +deallocate prepare stmt1;
 +with t(f) as (select * from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.f1;
 +ERROR HY000: WITH column list and SELECT field list have different column counts
 +with t(f1,f1) as (select * from t1 where b >= 'c') 
 +select * from t2,t where t2.c=t.f1;
 +ERROR 42S21: Duplicate column name 'f1'
 +with t as (select * from t2 where c>3),
 +t as (select a from t1 where a>2)
 +select * from t,t1 where t1.a=t.c;
 +ERROR HY000: Duplicate query name `t` in WITH clause
 +with t as (select a from s where a<5),
 +s as (select a from t1 where b>='d')
 +select * from t,s where t.a=s.a;
 +ERROR 42S02: Table 'test.s' doesn't exist
 +with recursive
 +t as (select a from s where a<5),
 +s as (select a from t1 where b>='d')
 +select * from t,s where t.a=s.a;
 +a	a
 +4	4
 +4	4
 +3	3
 +1	1
 +4	4
 +4	4
 +with recursive t as (select * from s where a>2),
 +s as (select a from t1,r where t1.a>r.c), 
 +r as (select c from t,t2 where t.a=t2.c) 
 +select * from r where r.c<7;
 +ERROR HY000: No anchors for recursive WITH element 't'
 +with recursive
 +t as (select * from s where a>2),
 +s as (select a from t1,r where t1.a>r.c), 
 +r as (select c from t,t2 where t.a=t2.c) 
 +select * from r where r.c<7;
 +ERROR HY000: No anchors for recursive WITH element 't'
 +with recursive
 +t as (select * from t1
 +where a in (select c from s where b<='ccc') and  b>'b'),
 +s as (select * from t1,t2
 +where t1.a=t2.c and t1.c in (select a from t where a<5))
 +select * from s where s.b>'aaa';
 +ERROR HY000: No anchors for recursive WITH element 't'
 +with recursive 
 +t as (select * from t1 where b>'aaa' and b <='d') 
 +select t.b from t,t2
 +where t.a=t2.c and
 +t2.c in (with recursive
 +s as (select t1.a from s,t1 where t1.a=s.a and t1.b<'c')
 +select * from s);
 +ERROR HY000: No anchors for recursive WITH element 's'
 +#erroneous definition of unreferenced with table t
 +with t as (select count(*) from t1 where d>='f' group by a)
 +select t1.b from t2,t1 where t1.a = t2.c;
 +ERROR 42S22: Unknown column 'd' in 'where clause'
 +with t as (select count(*) from t1 where b>='f' group by a)
 +select t1.b from t2,t1 where t1.a = t2.c;
 +b
 +aaaa
 +dd
 +eee
 +ggg
 +#erroneous definition of s referring to unreferenced t
 +with t(d) as (select count(*) from t1 where b<='ccc' group by b),
 +s as (select * from t1 where a in (select t2.d from t2,t where t2.c=t.d))
 +select t1.b from t1,t2 where t1.a=t2.c;
 +ERROR 42S22: Unknown column 't2.d' in 'field list'
 +with t(d) as (select count(*) from t1 where b<='ccc' group by b),
 +s as (select * from t1 where a in (select t2.c from t2,t where t2.c=t.c))
 +select t1.b from t1,t2 where t1.a=t2.c;
 +ERROR 42S22: Unknown column 't.c' in 'where clause'
 +with t(d) as (select count(*) from t1 where b<='ccc' group by b),
 +s as (select * from t1 where a in (select t2.c from t2,t where t2.c=t.d))
 +select t1.b from t1,t2 where t1.a=t2.c;
 +b
 +aaaa
 +dd
 +eee
 +ggg
 +#erroneous definition of unreferenced with table t
 +with t(f) as (select * from t1 where b >= 'c') 
 +select t1.b from t2,t1 where t1.a = t2.c;
 +ERROR HY000: WITH column list and SELECT field list have different column counts
 +#erroneous definition of unreferenced with table t
 +with t(f1,f1) as (select * from t1 where b >= 'c') 
 +select t1.b from t2,t1 where t1.a = t2.c;
 +ERROR 42S21: Duplicate column name 'f1'
 +# explain for query with unreferenced with table
 +explain 
 +with t as (select a from t1 where b >= 'c') 
 +select t1.b from t2,t1 where t1.a = t2.c;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +explain 
 +with t as (select a, count(*) from t1 where b >= 'c' group by a)
 +select t1.b from t2,t1 where t1.a = t2.c;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	4	
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where; Using join buffer (flat, BNL join)
 +# too many with elements in with clause
 +with s65 as (select * from t1), s64 as (select * from t1) , s63 as (select * from t1) , s62 as (select * from t1) , s61 as (select * from t1) , s60 as (select * from t1) , s59 as (select * from t1) , s58 as (select * from t1) , s57 as (select * from t1) , s56 as (select * from t1) , s55 as (select * from t1) , s54 as (select * from t1) , s53 as (select * from t1) , s52 as (select * from t1) , s51 as (select * from t1) , s50 as (select * from t1) , s49 as (select * from t1) , s48 as (select * from t1) , s47 as (select * from t1) , s46 as (select * from t1) , s45 as (select * from t1) , s44 as (select * from t1) , s43 as (select * from t1) , s42 as (select * from t1) , s41 as (select * from t1) , s40 as (select * from t1) , s39 as (select * from t1) , s38 as (select * from t1) , s37 as (select * from t1) , s36 as (select * from t1) , s35 as (select * from t1) , s34 as (select * from t1) , s33 as (select * from t1) , s32 as (select * from t1) , s31 as (select * from t1) , s30 as (sele
 ct * from t1) , s29 as (select * from t1) , s28 as (select * from t1) , s27 as (select * from t1) , s26 as (select * from t1) , s25 as (select * from t1) , s24 as (select * from t1) , s23 as (select * from t1) , s22 as (select * from t1) , s21 as (select * from t1) , s20 as (select * from t1) , s19 as (select * from t1) , s18 as (select * from t1) , s17 as (select * from t1) , s16 as (select * from t1) , s15 as (select * from t1) , s14 as (select * from t1) , s13 as (select * from t1) , s12 as (select * from t1) , s11 as (select * from t1) , s10 as (select * from t1) , s9 as (select * from t1) , s8 as (select * from t1) , s7 as (select * from t1) , s6 as (select * from t1) , s5 as (select * from t1) , s4 as (select * from t1) , s3 as (select * from t1) , s2 as (select * from t1) , s1 as (select * from t1)  select * from s65;
 +ERROR HY000: Too many WITH elements in WITH clause
 +drop table t1,t2;
 +#
 +# Bug mdev-9937: View used in the specification of with table 
 +#                refers to the base table with the same name 
 +#
 +create table t1 (a int);
 +insert into t1 values (20), (30), (10);
 +create view v1 as select * from t1 where a > 10;
 +with t1 as (select * from v1) select * from t1;
 +a
 +20
 +30
 +drop view v1;
 +drop table t1;
 +#
 +# Bug mdev-10058: Invalid derived table with WITH clause  
 +#                 
 +CREATE TABLE t1 (a INT);
 +CREATE TABLE t2 (a INT);
 +CREATE TABLE t3 (a INT);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +INSERT INTO t2 VALUES (1),(2),(3);
 +INSERT INTO t3 VALUES (1),(2),(3);
 +SELECT * FROM (WITH a AS (SELECT * FROM t1) (t2 NATURAL JOIN t3));
 +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't2 NATURAL JOIN t3))' at line 1
 +SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT * FROM t2 NATURAL JOIN t3) AS d1;
 +a
 +1
 +2
 +3
 +DROP TABLE t1,t2,t3;
 +#
 +# Bug mdev-10344: the WITH clause of the query refers to a view that uses 
 +#     a base table with the same name as a  CTE table from the clause 
 +#
 +create table ten(a int primary key);
 +insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
 +create table one_k(a int primary key);
 +insert into one_k select A.a + B.a* 10 + C.a * 100 from ten A, ten B, ten C;
 +create view v1 as select * from ten;
 +select * from v1;
 +a
 +0
 +1
 +2
 +3
 +4
 +5
 +6
 +7
 +8
 +9
 +drop view v1;
 +drop table ten, one_k;
 +#
 +# MDEV-10057 : Crash with EXPLAIN + WITH + constant query
 +#
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT 1) AS t1;
 +1
 +1
 +EXPLAIN SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT 1) AS t1;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	system	NULL	NULL	NULL	NULL	1	
 +2	SUBQUERY	NULL	NULL	NULL	NULL	NULL	NULL	NULL	No tables used
 +DROP TABLE t1;
 +#
 +# MDEV-10058: Suspicious EXPLAIN output for a derived table + WITH + joined table	
 +#
 +CREATE TABLE t1 (a INT);
 +CREATE TABLE t2 (a INT);
 +CREATE TABLE t3 (a INT);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +INSERT INTO t2 VALUES (1),(2),(3);
 +INSERT INTO t3 VALUES (1),(2),(3);
 +EXPLAIN SELECT * FROM (WITH a AS (SELECT * FROM t1) (t2 NATURAL JOIN t3));
 +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't2 NATURAL JOIN t3))' at line 1
 +explain SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT * FROM t2 NATURAL JOIN t3) AS d1;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	3	
 +1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	3	Using where; Using join buffer (flat, BNL join)
 +DROP TABLE t1,t2,t3;
 +#
 +# MDEV-10729: Server crashes in st_select_lex::set_explain_type
 +#
 +CREATE TABLE t1 (i1 INT, KEY(i1)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (4),(8);
 +CREATE TABLE t2 (a2 INT, b2 INT, KEY(b2)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (8,7);
 +CREATE TABLE t3 (i3 INT) ENGINE=MyISAM;
 +INSERT INTO t3 VALUES (2),(6);
 +SELECT * FROM t1, t2 WHERE a2 = i1 and b2 >= i1 AND i1 IN ( SELECT i3 FROM t3 )
 +UNION
 +SELECT * FROM t1, t2 WHERE a2 = i1 and b2 >= i1 AND i1 IN ( SELECT i3 FROM t3 )
 +;
 +i1	a2	b2
 +DROP TABLE t1,t2,t3;
 +#
 +# MDEV-10923: mergeable CTE used twice in the query
 +#
 +create table employees (
 +name varchar(32),
 +dept varchar(32),
 +country varchar(8)
 +);
 +insert into employees 
 +values 
 +('Sergei Golubchik', 'Development', 'DE'),
 +('Claudio Nanni', 'Support', 'ES'),
 +('Sergei Petrunia', 'Development', 'RU');
 +with eng as 
 +(
 +select * from employees
 +where dept in ('Development','Support')
 +),
 +eu_eng  as 
 +(
 +select * from eng where country IN ('DE','ES','RU')
 +)
 +select * from eu_eng T1 
 +where 
 +not exists (select 1 from eu_eng T2 
 +where T2.country=T1.country
 +and T2.name <> T1.name);
 +name	dept	country
 +Sergei Golubchik	Development	DE
 +Claudio Nanni	Support	ES
 +Sergei Petrunia	Development	RU
 +drop table employees;
 +#
 +# MDEV-11818: EXPLAIN EXTENDED for a query with optimized away CTE table
 +#
 +CREATE TABLE t1 (i INT, c VARCHAR(3));
 +INSERT INTO t1 VALUES (1,'foo');
 +EXPLAIN EXTENDED
 +WITH cte AS ( SELECT * FROM t1 ) SELECT i FROM cte;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	SIMPLE	t1	system	NULL	NULL	NULL	NULL	1	100.00	
 +Warnings:
 +Note	1003	with cte as (select `test`.`t1`.`i` AS `i`,`test`.`t1`.`c` AS `c` from `test`.`t1`)select 1 AS `i` from dual
 +DROP TABLE t1;
 +#
 +# MDEV-12185: view defintion contains WITH clause with 
 +#             several specifications of CTE
 +#
 +with
 +alias1 as (select 1 as one),
 +alias2 as (select 2 as two)
 +select one, two from alias1, alias2;
 +one	two
 +1	2
 +create view v1 as 
 +with
 +alias1 as (select 1 as one),
 +alias2 as (select 2 as two)
 +select one, two from alias1, alias2;
 +select * from v1;
 +one	two
 +1	2
 +show create view v1;
 +View	Create View	character_set_client	collation_connection
 +v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS with alias1 as (select 1 AS `one`), alias2 as (select 2 AS `two`)select `alias1`.`one` AS `one`,`alias2`.`two` AS `two` from (`alias1` join `alias2`)	latin1	latin1_swedish_ci
 +drop view v1;
 +#
 +# MDEV-12440: the same CTE table is used twice
 +#
 +create table t1 (a int, b  varchar(32));
 +insert into t1 values
 +(4,'aaaa' ), (7,'bb'), (1,'ccc'), (4,'dd');
 +# cte2 is used in the main query and in the spec for ct3
 +with
 +cte1 as (select * from t1 where  b >= 'c'),
 +cte2 as (select * from cte1 where a < 7),
 +cte3 as (select * from cte2 where a > 1)
 +select * from cte2, cte3 where cte2.a = cte3.a;
 +a	b	a	b
 +4	dd	4	dd
 +# cte2 is used twice in the spec for ct3
 +with
 +cte1 as (select * from t1 where  b >= 'b'),
 +cte2 as (select * from cte1 where b > 'c'),
 +cte3 as (select * from cte2 where a > 1 union select * from cte2 where a > 1)
 +select * from cte3;
 +a	b
 +4	dd
 +drop table t1;
 +#
 +# MDEV-12558: CTE with the same name as temporary table
 +#
 +CREATE TABLE t ENGINE=MyISAM AS SELECT 1 AS i;
 +CREATE TEMPORARY TABLE cte ENGINE=MyISAM AS SELECT 2 AS f;
 +WITH cte AS ( SELECT i FROM t ) SELECT * FROM cte;
 +i
 +1
 +WITH cte AS ( SELECT i FROM t GROUP BY i) SELECT * FROM cte;
 +i
 +1
 +SELECT * FROM cte;
 +f
 +2
 +DROP TABLE cte;
 +DROP TABLE t;
 +#
 +# MDEV-13107: SHOW TABLE STATUS, SHOW CREATE VIEW 
 +#             for CTEs that use derived tables
 +#
 +create table t1(a int) engine=myisam;
 +insert into t1 values (3), (1), (2);
 +create table t2 (b int) engine=myisam;
 +insert into t2 values (2), (10);
 +create view v1 as
 +with t as (select s.a from (select t1.a from t1) s),
 +r as(select t.a from t2, t where t2.b=t.a)
 +select a from r;
 +create view v2 as
 +with t as (select s.a from (select t1.a from t1) s),
 +r as(select t.a from t2, t where t2.b=t.a)
 +select a from t1;
 +show table status;
 +show create view v1;
 +View	Create View	character_set_client	collation_connection
 +v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS with t as (select `s`.`a` AS `a` from (select `test`.`t1`.`a` AS `a` from `test`.`t1`) `s`), r as (select `t`.`a` AS `a` from (`test`.`t2` join `t`) where `test`.`t2`.`b` = `t`.`a`)select `r`.`a` AS `a` from `r`	latin1	latin1_swedish_ci
 +show create view v2;
 +View	Create View	character_set_client	collation_connection
 +v2	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS with t as (select `s`.`a` AS `a` from (select `test`.`t1`.`a` AS `a` from `test`.`t1`) `s`), r as (select `t`.`a` AS `a` from (`test`.`t2` join `t`) where `test`.`t2`.`b` = `t`.`a`)select `test`.`t1`.`a` AS `a` from `test`.`t1`	latin1	latin1_swedish_ci
 +select * from v1;
 +a
 +2
 +select * from v2;
 +a
 +3
 +1
 +2
 +prepare stmt1 from "select * from v1";
 +execute stmt1;
 +a
 +2
 +execute stmt1;
 +a
 +2
 +prepare stmt2 from "select * from v2";
 +execute stmt2;
 +a
 +3
 +1
 +2
 +execute stmt2;
 +a
 +3
 +1
 +2
 +deallocate prepare stmt1;
 +deallocate prepare stmt2;
 +drop view v1,v2;
 +drop table t1,t2;
 +#
 +# MDEV-13796: UNION of two materialized CTEs
 +#
 +CREATE TABLE t1 (id int, k int);
 +CREATE TABLE t2 (id int);
 +INSERT INTO t1 VALUES (3,5), (1,7), (4,3);
 +INSERT INTO t2 VALUES (4), (3), (2);
 +WITH d1 AS (SELECT SUM(k) FROM t1, t2 as t2 WHERE t1.id = t2.id),
 +d2 AS (SELECT SUM(k) FROM t1, t2 as t2 WHERE t1.id = t2.id)
 +SELECT * FROM d1 UNION  SELECT * FROM d2;
 +SUM(k)
 +8
 +explain WITH d1 AS (SELECT SUM(k) FROM t1, t2 as t2 WHERE t1.id = t2.id),
 +d2 AS (SELECT SUM(k) FROM t1, t2 as t2 WHERE t1.id = t2.id)
 +SELECT * FROM d1 UNION  SELECT * FROM d2;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	9	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	3	
 +2	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	3	Using where; Using join buffer (flat, BNL join)
 +4	UNION	<derived3>	ALL	NULL	NULL	NULL	NULL	9	
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	3	
 +3	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	3	Using where; Using join buffer (flat, BNL join)
 +NULL	UNION RESULT	<union1,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +DROP TABLE t1,t2;
 +#
 +# MDEV-13780: tower of embedding CTEs with multiple usage of them
 +#
 +create table t1 (a int);
 +insert into t1 values (3), (2), (4), (7), (1), (2), (5);
 +with cte_e as
 +(
 +with cte_o as
 +(
 +with cte_i as (select * from t1 where a < 7)
 +select * from cte_i where a > 1
 +)
 +select * from cte_o as cto_o1 where a < 3
 +union
 +select * from cte_o as cto_o2 where a > 4
 +)
 +select * from cte_e as cte_e1 where a > 1
 +union
 +select * from cte_e as cte_e2;
 +a
 +2
 +5
 +explain extended with cte_e as
 +(
 +with cte_o as
 +(
 +with cte_i as (select * from t1 where a < 7)
 +select * from cte_i where a > 1
 +)
 +select * from cte_o as cto_o1 where a < 3
 +union
 +select * from cte_o as cto_o2 where a > 4
 +)
 +select * from cte_e as cte_e1 where a > 1
 +union
 +select * from cte_e as cte_e2;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	14	100.00	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	7	100.00	Using where
 +5	UNION	t1	ALL	NULL	NULL	NULL	NULL	7	100.00	Using where
 +NULL	UNION RESULT	<union2,5>	ALL	NULL	NULL	NULL	NULL	NULL	NULL	
 +6	UNION	<derived14>	ALL	NULL	NULL	NULL	NULL	14	100.00	
 +14	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	7	100.00	Using where
 +11	UNION	t1	ALL	NULL	NULL	NULL	NULL	7	100.00	Using where
 +NULL	UNION RESULT	<union14,11>	ALL	NULL	NULL	NULL	NULL	NULL	NULL	
 +NULL	UNION RESULT	<union1,6>	ALL	NULL	NULL	NULL	NULL	NULL	NULL	
 +Warnings:
 +Note	1003	with cte_e as (with cte_o as (with cte_i as (/* select#4 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` < 7)/* select#3 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 1)/* select#2 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` < 3 and `test`.`t1`.`a` > 1 and `test`.`t1`.`a` < 7 and `test`.`t1`.`a` > 1 union /* select#5 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 4 and `test`.`t1`.`a` > 1 and `test`.`t1`.`a` < 7 and `test`.`t1`.`a` > 1)/* select#1 */ select `cte_e1`.`a` AS `a` from `cte_e` `cte_e1` where `cte_e1`.`a` > 1 union /* select#6 */ select `cte_e2`.`a` AS `a` from `cte_e` `cte_e2`
 +drop table t1;
 +#
 +# MDEV-13753: embedded CTE in a VIEW created in prepared statement
 +#
 +SET @sql_query = "
 +  CREATE OR REPLACE VIEW cte_test AS
 +   WITH  cte1  AS ( SELECT 1 as a from dual )
 +    ,    cte2  AS ( SELECT * FROM cte1 )
 +    SELECT * FROM cte2;
 +";
 +PREPARE stmt FROM @sql_query;
 +EXECUTE stmt;
 +DEALLOCATE PREPARE stmt;
 +SHOW CREATE VIEW cte_test;
 +View	Create View	character_set_client	collation_connection
 +cte_test	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `cte_test` AS with cte1 as (select 1 AS `a`), cte2 as (select `cte1`.`a` AS `a` from `cte1`)select `cte2`.`a` AS `a` from `cte2`	latin1	latin1_swedish_ci
 +SELECT * FROM cte_test;
 +a
 +1
 +DROP VIEW cte_test;
 +#
 +# mdev-14755 : PS for query using CTE in select with subquery
 +#
 +create table t1 (a int);
 +insert into t1 values
 +(7), (2), (8), (1), (3), (2), (7), (5), (4), (7), (9), (8);
 +with cte as
 +(select a from t1 where a between 4 and 7 group by a)
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ))
 +union
 +(select a from t1 where a < 2);
 +a
 +4
 +5
 +7
 +1
 +prepare stmt from "with cte as
 +(select a from t1 where a between 4 and 7 group by a)
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ))
 +union
 +(select a from t1 where a < 2)";
 +execute stmt;
 +a
 +4
 +5
 +7
 +1
 +execute stmt;
 +a
 +4
 +5
 +7
 +1
 +deallocate prepare stmt;
 +with cte as
 +(select a from t1 where a between 4 and 7 group by a)
 +(select a from t1 where a < 2)
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ));
 +a
 +1
 +4
 +5
 +7
 +prepare stmt from "with cte as
 +(select a from t1 where a between 4 and 7 group by a)
 +(select a from t1 where a < 2)
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ))";
 +execute stmt;
 +a
 +1
 +4
 +5
 +7
 +execute stmt;
 +a
 +1
 +4
 +5
 +7
 +deallocate prepare stmt;
 +with cte as
 +(select a from t1 where a between 4 and 7)
 +(select a from t1 where a < 2)
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ));
 +a
 +1
 +7
 +5
 +4
 +prepare stmt from "with cte as
 +(select a from t1 where a between 4 and 7)
 +(select a from t1 where a < 2)
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ))";
 +execute stmt;
 +a
 +1
 +7
 +5
 +4
 +execute stmt;
 +a
 +1
 +7
 +5
 +4
 +deallocate prepare stmt;
 +with cte as
 +(select a from t1 where a between 4 and 7)
 +(select a from cte
 +where exists( select a from t1 where t1.a < 2 and cte.a=t1.a ))
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ));
 +a
 +7
 +5
 +4
 +prepare stmt from "with cte as
 +(select a from t1 where a between 4 and 7)
 +(select a from cte
 +where exists( select a from t1 where t1.a < 2 and cte.a=t1.a ))
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ))";
 +execute stmt;
 +a
 +7
 +5
 +4
 +execute stmt;
 +a
 +7
 +5
 +4
 +deallocate prepare stmt;
 +drop table t1;
 +#
 +# MDEV-14852: CTE using temporary table in query
 +#             with two references to the CTE
 +#
 +create temporary table t1 (i int);
 +insert into t1 values (5),(4),(1),(2),(3);
 +with
 +c1 as (select i from t1),
 +c2 as (select i from c1 where c1.i=2)
 +select i from c1 where i > 3 union  select i from c2;
 +i
 +5
 +4
 +2
 +drop table t1;
 +create table t1 (term char(10));
 +create temporary table t2 (term char(10));
 +insert into t1 values ('TERM01'),('TERM02'),('TERM03');
 +insert into t2 values ('TERM02'),('TERM03'),('TERM04');
 +with c1 as (select * from t1), c2 as (select * from t2)
 +(select * from c1 left outer join c2 on c1.term = c2.term)
 +union all
 +(select * from c1 right outer join c2 on c1.term = c2.term
 +where c1.term is null);
 +term	term
 +TERM02	TERM02
 +TERM03	TERM03
 +TERM01	NULL
 +NULL	TERM04
 +drop table t1,t2;
 +#
 +# MDEV-14969: view using subquery with attached CTE
 +#
 +create table region (
 +r_regionkey int,
 +r_name char(25),
 +primary key (r_regionkey)
 +);
 +insert into region values
 +(0,'AFRICA'), (1,'AMERICA'), (2,'ASIA'), (3,'EUROPE'), (4,'MIDDLE EAST');
 +create table nation (
 +n_nationkey int,
 +n_name char(25),
 +n_regionkey int,
 +primary key (n_nationkey),
 +key i_n_regionkey (n_regionkey)
 +);
 +insert into nation values
 +(0,'ALGERIA',0), (1,'ARGENTINA',1), (2,'BRAZIL',1), (3,'CANADA',1),
 +(4,'EGYPT',4), (5,'ETHIOPIA',0), (6,'FRANCE',3), (7,'GERMANY',3),
 +(8,'INDIA',2), (9,'INDONESIA',2), (10,'IRAN',4), (11,'IRAQ',4),
 +(12,'JAPAN',2), (13,'JORDAN',4), (14,'KENYA',0), (15,'MOROCCO',0),
 +(16,'MOZAMBIQUE',0), (17,'PERU',1), (18,'CHINA',2), (19,'ROMANIA',3),
 +(20,'SAUDI ARABIA',4), (21,'VIETNAM',2), (22,'RUSSIA',3),
 +(23,'UNITED KINGDOM',3), (24,'UNITED STATES',1);
 +select * from nation n ,region r
 +where n.n_regionkey = r.r_regionkey and
 +r.r_regionkey in
 +(with t as (select * from region where r_regionkey <= 3 )
 +select r_regionkey from t where r_name <> "ASIA");
 +n_nationkey	n_name	n_regionkey	r_regionkey	r_name
 +0	ALGERIA	0	0	AFRICA
 +5	ETHIOPIA	0	0	AFRICA
 +14	KENYA	0	0	AFRICA
 +15	MOROCCO	0	0	AFRICA
 +16	MOZAMBIQUE	0	0	AFRICA
 +1	ARGENTINA	1	1	AMERICA
 +2	BRAZIL	1	1	AMERICA
 +3	CANADA	1	1	AMERICA
 +17	PERU	1	1	AMERICA
 +24	UNITED STATES	1	1	AMERICA
 +6	FRANCE	3	3	EUROPE
 +7	GERMANY	3	3	EUROPE
 +19	ROMANIA	3	3	EUROPE
 +22	RUSSIA	3	3	EUROPE
 +23	UNITED KINGDOM	3	3	EUROPE
 +create view v as
 +select * from nation n ,region r
 +where n.n_regionkey = r.r_regionkey and
 +r.r_regionkey in
 +(with t as (select * from region where r_regionkey <= 3)
 +select r_regionkey from t where r_name <> "ASIA");
 +show create view v;
 +View	Create View	character_set_client	collation_connection
 +v	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `n`.`n_nationkey` AS `n_nationkey`,`n`.`n_name` AS `n_name`,`n`.`n_regionkey` AS `n_regionkey`,`r`.`r_regionkey` AS `r_regionkey`,`r`.`r_name` AS `r_name` from (`test`.`nation` `n` join `test`.`region` `r`) where `n`.`n_regionkey` = `r`.`r_regionkey` and `r`.`r_regionkey` in (with t as (select `test`.`region`.`r_regionkey` AS `r_regionkey`,`test`.`region`.`r_name` AS `r_name` from `test`.`region` where `test`.`region`.`r_regionkey` <= 3)select `t`.`r_regionkey` from `t` where `t`.`r_name` <> 'ASIA')	latin1	latin1_swedish_ci
 +select * from v;
 +n_nationkey	n_name	n_regionkey	r_regionkey	r_name
 +0	ALGERIA	0	0	AFRICA
 +5	ETHIOPIA	0	0	AFRICA
 +14	KENYA	0	0	AFRICA
 +15	MOROCCO	0	0	AFRICA
 +16	MOZAMBIQUE	0	0	AFRICA
 +1	ARGENTINA	1	1	AMERICA
 +2	BRAZIL	1	1	AMERICA
 +3	CANADA	1	1	AMERICA
 +17	PERU	1	1	AMERICA
 +24	UNITED STATES	1	1	AMERICA
 +6	FRANCE	3	3	EUROPE
 +7	GERMANY	3	3	EUROPE
 +19	ROMANIA	3	3	EUROPE
 +22	RUSSIA	3	3	EUROPE
 +23	UNITED KINGDOM	3	3	EUROPE
 +drop view v;
 +drop table region, nation;
 +#
 +# MDEV-15120: cte name used with database name
 +#
 +WITH cte AS (SELECT 1 AS a) SELECT test.cte.a FROM test.cte;
 +ERROR 42S02: Table 'test.cte' doesn't exist
 +CREATE DATABASE db1;
 +USE db1;
 +WITH cte AS (SELECT 1 AS a) SELECT db1.cte.a FROM db1.cte;
 +ERROR 42S02: Table 'db1.cte' doesn't exist
 +DROP DATABASE db1;
 +USE test;
 +#
 +# MDEV-15119: CTE c2 specified after CTE c1 and is used in
 +#             CTE c3 that is embedded into the spec of c1
 +#
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +WITH c1 AS (WITH c3 AS (SELECT * FROM c2) SELECT * FROM c3),
 +c2 AS (SELECT * FROM t1)
 +SELECT * FROM c1;
 +ERROR 42S02: Table 'test.c2' doesn't exist
 +WITH RECURSIVE c1 AS (WITH c3 AS (SELECT * FROM c2) SELECT * FROM c3),
 +c2 AS (SELECT * FROM t1)
 +SELECT * FROM c1;
 +i
 +1
 +2
 +3
 +DROP TABLE t1;
 +#
 +# MDEV-14297: Lost name of a explicitly named CTE column used in
 +#             the non-recursive CTE via prepared statement
 +#
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +PREPARE stmt FROM "WITH cte(a) AS (SELECT 1) SELECT * FROM cte";
 +EXECUTE stmt;
 +a
 +1
 +DEALLOCATE PREPARE stmt;
 +PREPARE stmt FROM "CREATE VIEW v1 AS WITH cte(a) AS (SELECT 1) SELECT * FROM cte";
 +EXECUTE stmt;
 +SELECT * FROM v1;
 +a
 +1
 +DEALLOCATE PREPARE stmt;
 +PREPARE stmt FROM "CREATE VIEW v2 AS WITH cte(a) AS (SELECT * FROM t1) SELECT * FROM cte";
 +EXECUTE stmt;
 +SELECT * FROM v2;
 +a
 +1
 +2
 +3
 +DEALLOCATE PREPARE stmt;
 +DROP TABLE t1;
 +DROP VIEW v1,v2;
 +#
 +# MDEV-15478: Lost name of a explicitly named CTE column used in
 +#             the non-recursive CTE defined with UNION
 +#
 +CREATE TABLE t1 (x int, y int);
 +INSERT INTO t1 VALUES (1,2),(2,7),(3,3);
 +WITH cte(a) AS (SELECT 1 UNION SELECT 2) SELECT * FROM cte;
 +a
 +1
 +2
 +WITH cte(a) AS (SELECT 1 UNION SELECT 2) SELECT a FROM cte;
 +a
 +1
 +2
 +WITH cte(a) AS (SELECT 1 UNION ALL SELECT 1) SELECT a FROM cte;
 +a
 +1
 +1
 +WITH cte(a) AS (SELECT x from t1 UNION SELECT 4) SELECT a FROM cte;
 +a
 +1
 +2
 +3
 +4
 +WITH cte(a) AS (SELECT 4 UNION SELECT x FROM t1 UNION SELECT 5)
 +SELECT a FROM cte;
 +a
 +4
 +1
 +2
 +3
 +5
 +WITH cte(a,b) AS (SELECT 4,5 UNION SELECT 4,3) SELECT a,b FROM cte;
 +a	b
 +4	5
 +4	3
 +DROP TABLE t1;
 +#
 +# MDEV-16353: unreferenced CTE specified by query with UNION
 +#
 +with cte as
 +(select 1 union select 2 union select 3)
 +select 1 as f;
 +f
 +1
 +create table t1 (a int);
 +insert into t1 values (2), (1), (7), (1), (4);
 +with cte as
 +(select * from t1 where a < 2 union select * from t1 where a > 5)
 +select 2 as f;
 +f
 +2
 +drop table t1;
 +#
 +# MDEV-16473: query with CTE when no database is set
 +#
 +create database db_mdev_16473;
 +use db_mdev_16473;
 +drop database db_mdev_16473;
 +# Now no default database is set
 +select database();
 +database()
 +NULL
 +with cte as (select 1 as a) select * from cte;
 +a
 +1
 +create database db_mdev_16473;
 +create table db_mdev_16473.t1 (a int);
 +insert into db_mdev_16473.t1 values (2), (7), (3), (1);
 +with cte as (select * from db_mdev_16473.t1) select * from cte;
 +a
 +2
 +7
 +3
 +1
 +with cte as (select * from db_mdev_16473.t1)
 +select * from cte, t1 as t where cte.a=t.a;
 +ERROR 3D000: No database selected
 +with cte as (select * from db_mdev_16473.t1)
 +select * from cte, db_mdev_16473.t1 as t where cte.a=t.a;
 +a	a
 +2	2
 +7	7
 +3	3
 +1	1
 +drop database db_mdev_16473;
 +use test;
 +#
 +# MDEV-17154: using parameter markers for PS within CTEs more than once
 +#             using local variables in SP within CTEs more than once
 +#
 +prepare stmt from "
 +with cte(c) as (select ? ) select r.c, s.c+10  from cte as r, cte as s;
 +";
 +set @a=2;
 +execute stmt using @a;
 +c	s.c+10
 +2	12
 +set @a=5;
 +execute stmt using @a;
 +c	s.c+10
 +5	15
 +deallocate prepare stmt;
 +prepare stmt from "
 +with cte(c) as (select ? ) select c from cte union select c+10 from cte;
 +";
 +set @a=2;
 +execute stmt using @a;
 +c
 +2
 +12
 +set @a=5;
 +execute stmt using @a;
 +c
 +5
 +15
 +deallocate prepare stmt;
 +prepare stmt from "
 +with cte_e(a,b) as
 +(
 +  with cte_o(c) as (select ?)
 +  select r.c+10, s.c+20 from cte_o as r, cte_o as s
 +)
 +select * from cte_e as cte_e1 where a > 12
 +union all
 +select * from cte_e as cte_e2;
 +";
 +set @a=2;
 +execute stmt using @a;
 +a	b
 +12	22
 +set @a=5;
 +execute stmt using @a;
 +a	b
 +15	25
 +15	25
 +deallocate prepare stmt;
 +create table t1 (a int, b int);
 +insert into t1 values
 +(3,33), (1,17), (7,72), (4,45), (2,27), (3,35), (4,47), (3,38), (2,22);
 +prepare stmt from "
 +with cte as (select * from t1 where a < ? and b > ?)
 +  select r.a, r.b+10, s.a, s.b+20 from cte as r, cte as s where r.a=s.a+1;
 +";
 +set @a=4, @b=20;
 +execute stmt using @a, at b;
 +a	r.b+10	a	s.b+20
 +3	43	2	47
 +3	45	2	47
 +3	48	2	47
 +3	43	2	42
 +3	45	2	42
 +3	48	2	42
 +set @a=5, @b=20;
 +execute stmt using @a, at b;
 +a	r.b+10	a	s.b+20
 +4	55	3	53
 +4	57	3	53
 +3	43	2	47
 +3	45	2	47
 +3	48	2	47
 +4	55	3	55
 +4	57	3	55
 +4	55	3	58
 +4	57	3	58
 +3	43	2	42
 +3	45	2	42
 +3	48	2	42
 +deallocate prepare stmt;
 +create procedure p1()
 +begin
 +declare i int;
 +set i = 0;
 +while i < 4 do
 +insert into t1
 +with cte(a) as (select i) select r.a-1, s.a+1 from cte as r, cte as s;
 +set i = i+1;
 +end while;
 +end|
 +create procedure p2(in i int)
 +begin
 +insert into t1
 +with cte(a) as (select i) select r.a-1, s.a+1 from cte as r, cte as s;
 +end|
 +delete from t1;
 +call p1();
 +select * from t1;
 +a	b
 +-1	1
 +0	2
 +1	3
 +2	4
 +call p1();
 +select * from t1;
 +a	b
 +-1	1
 +0	2
 +1	3
 +2	4
 +-1	1
 +0	2
 +1	3
 +2	4
 +delete from t1;
 +call p2(3);
 +select * from t1;
 +a	b
 +2	4
 +call p2(7);
 +select * from t1;
 +a	b
 +2	4
 +6	8
 +drop procedure p1;
 +drop procedure p2;
 +drop table t1;
 +#
 +# MDEV-17107: PS for CREATE OR REPLACE VIEW defined by SELECT with CTEs
 +#
 +create table t1(a int);
 +insert into t1 values (3), (1), (2);
 +create table t2 (b int);
 +insert into t2 values (2), (10);
 +prepare stmt from
 +"create or replace view v1 as
 + with t as (select s.a from (select t1.a from t1) s),
 +      r as(select t.a from t2, t where t2.b=t.a)
 + select a from r;";
 +execute stmt;
 +select * from v1;
 +a
 +2
 +drop view v1;
 +drop table t1,t2;
 +#
 +# MDEV-19112: CTE usage when information_schema is set as default db
 +#
 +with t as (select 1 as t ) select * from t;
 +t
 +1
 +use information_schema;
 +with t as (select 1 as t) select * from t;
 +t
 +1
 +with columns as (select 1 as t) select * from columns;
 +t
 +1
 +use test;
 +#
 +# MDEV-18460: Server crashed in strmake / tdc_create_key /
 +# THD::create_tmp_table_def_key
 +#
 +connect con1,localhost,root,,;
 +CREATE TEMPORARY TABLE test.t (a INT);
 +WITH cte AS (SELECT 1) SELECT * FROM cte;
 +1
 +1
 +WITH t AS (SELECT 1) SELECT * FROM t;
 +1
 +1
 +WITH cte AS (SELECT 1) SELECT * FROM t;
 +ERROR 3D000: No database selected
 +DROP TABLE test.t;
 +connection default;
 +disconnect con1;
 +#
 +# MDEV-22781: create view with CTE without default database
 +#
 +drop database test;
 +create database db1;
 +create table db1.t1 (a int);
 +insert into db1.t1 values (3),(7),(1);
 +create view db1.v1 as with t as (select * from db1.t1) select * from t;
 +show create view db1.v1;
 +View	Create View	character_set_client	collation_connection
 +v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `db1`.`v1` AS with t as (select `db1`.`t1`.`a` AS `a` from `db1`.`t1`)select `t`.`a` AS `a` from `t`	latin1	latin1_swedish_ci
 +select * from db1.v1;
 +a
 +3
 +7
 +1
 +drop view db1.v1;
 +prepare stmt from "
 +create view db1.v1 as with t as (select * from db1.t1) select * from t;
 +";
 +execute stmt;
 +deallocate prepare stmt;
 +show create view db1.v1;
 +View	Create View	character_set_client	collation_connection
 +v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `db1`.`v1` AS with t as (select `db1`.`t1`.`a` AS `a` from `db1`.`t1`)select `t`.`a` AS `a` from `t`	latin1	latin1_swedish_ci
 +select * from db1.v1;
 +a
 +3
 +7
 +1
 +drop view db1.v1;
 +drop table db1.t1;
 +drop database db1;
 +create database test;
 +use test;
 +#
 +# MDEV-24597: CTE with union used multiple times in query
 +#
 +with cte(a) as
 +(select 1 as d union select 2 as d)
 +select a from cte as r1
 +union
 +select a from cte as r2;
 +a
 +1
 +2
 +create table t1 (a int, b int) engine=myisam;
 +insert into t1 values
 +(3,30), (7,70), (1,10), (7,71), (2,20), (7,72), (3,33), (4,44),
 +(5,50), (4,40), (3,33), (4,42), (4,43), (5,51);
 +with cte(c) as
 +(select a from t1 where b < 30 union select a from t1 where b > 40)
 +select * from cte as r1, cte as r2 where r1.c = r2.c;
 +c	c
 +1	1
 +2	2
 +7	7
 +4	4
 +5	5
 +with cte(a,c) as
 +(
 +select a, count(*) from t1 group by a having count(*) = 1
 +union
 +select a, count(*) from t1 group by a having count(*) = 3
 +)
 +select a, c from cte as r1 where a < 3
 +union
 +select a, c from cte as r2 where a > 4;
 +a	c
 +1	1
 +2	1
 +7	3
 +drop table t1;
 +#
 +# MDEV-23886: Stored Function returning the result of a query
 +#             that uses CTE over a table twice
 +#
 +create table t1 (c1 int);
 +insert into t1 values (1),(2),(6);
 +create function f1() returns int return
 +( with cte1 as (select c1 from t1)
 +select sum(c1) from
 +(select * from cte1 union all select * from cte1) dt
 +);
 +select f1();
 +f1()
 +18
 +create function f2() returns int return
 +( with cte1 as (select c1 from t1)
 +select sum(s.c1) from cte1 as s, cte1 as t where s.c1=t.c1
 +);
 +select f2();
 +f2()
 +9
 +create function f3() returns int return
 +( with cte1 as (select c1 from t1)
 +select
 +case
 +when exists(select 1 from cte1 where c1 between 1 and 2) then 1
 +when exists(select 1 from cte1 where c1 between 5 and 6) then 2
 +else 0
 +end
 +);
 +select f3();
 +f3()
 +1
 +create view v1 as (select c1 from t1);
 +create function f4() returns int return
 +( select sum(c1) from
 +(select * from v1 union all select * from v1) dt
 +);
 +select f4();
 +f4()
 +18
 +create function f5() returns int return
 +( select sum(s.c1) from v1 as s, v1 as t where s.c1=t.c1
 +);
 +select f5();
 +f5()
 +9
 +create view v2(s) as
 +with cte1 as (select c1 from t1)
 +select sum(c1) from (select * from cte1 union all select * from cte1) dt;
 +create function f6() returns int return
 +(select s from v2);
 +select f6();
 +f6()
 +18
 +create function f7() returns int return
 +( select r.s from v2 as r, v2 as t where r.s=t.s
 +);
 +select f7();
 +f7()
 +18
 +select f5() + f6();
 +f5() + f6()
 +27
 +prepare stmt from "select f5() + f6();";
 +execute stmt;
 +f5() + f6()
 +27
 +execute stmt;
 +f5() + f6()
 +27
 +deallocate prepare stmt;
 +drop function f1;
 +drop function f2;
 +drop function f3;
 +drop function f4;
 +drop function f5;
 +drop function f6;
 +drop function f7;
 +drop view v1;
 +drop view v2;
 +create table t2 (a int, b int);
 +insert into t2
 +with cte1 as (select c1 from t1)
 +select * from cte1 as s, cte1 as t where s.c1=t.c1 and s.c1 > 5;
 +select * from t2;
 +a	b
 +6	6
 +create procedure p1()
 +begin
 +insert into t2
 +with cte1 as (select c1 from t1)
 +select * from cte1 as s, cte1 as t where s.c1=t.c1 and s.c1 <= 2 and t.c1 >= 2;
 +end |
 +call p1();
 +select * from t2;
 +a	b
 +6	6
 +2	2
 +drop procedure p1;
 +# checking CTE resolution for queries with hanging CTEs
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where a >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.b)
 +select * from cte3;
 +a	b
 +1	2
 +select * from t2;
 +a	b
 +6	6
 +2	2
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where a >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.b)
 +select * from t2;
 +a	b
 +6	6
 +2	2
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where c1 >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.b)
 +select * from t2;
 +ERROR 42S22: Unknown column 'c1' in 'where clause'
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where a >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.c1)
 +select * from t2;
 +ERROR 42S22: Unknown column 'cte2.c1' in 'where clause'
 +with
 +cte1 as (select * from t1 where c1 <= 2),
 +cte2(a,b) as (select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +select * from cte2;
 +a	b
 +1	1
 +2	2
 +with
 +cte1 as (select * from t1 where c1 <= 2),
 +cte2(a,b) as (select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +select * from t2;
 +a	b
 +6	6
 +2	2
 +with
 +cte1 as (select * from t1 where c1 <= 2),
 +cte2(a,b) as (select * from cte1 as s1, cte1 as s2 where s1.c1=c1)
 +select * from t2;
 +ERROR 23000: Column 'c1' in where clause is ambiguous
 +with cte3 as
 +( with cte2(a,b) as
 +( with cte1 as (select * from t1 where c1 <= 2)
 +select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +select r1.a,r2.b from cte2 as r1, cte2 as r2)
 +select * from cte3;
 +a	b
 +1	1
 +2	1
 +1	2
 +2	2
 +with cte3 as
 +( with cte2(a,b) as
 +( with cte1 as (select * from t1 where c1 <= 2)
 +select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +select r1.a,r2.b from cte2 as r1, cte2 as r2)
 +select * from t2;
 +a	b
 +6	6
 +2	2
 +with cte3 as
 +( with cte2(a,b) as
 +( with cte1 as (select * from t1 where c1 <= 2)
 +select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +select r1.c1,r2.c1 from cte2 as r1, cte2 as r2)
 +select * from t2;
 +ERROR 42S22: Unknown column 'r1.c1' in 'field list'
 +create procedure p1()
 +begin
 +insert into t2
 +with cte1 as (select c1 from t1)
 +select * from t1 as s, t1 as t where s.c1=t.c1 and s.c1 <= 2 and t.c1 >= 2;
 +end |
 +call p1();
 +select * from t2;
 +a	b
 +6	6
 +2	2
 +2	2
 +drop procedure p1;
 +create procedure p1()
 +begin
 +insert into t2
 +with cte1 as (select a from t1)
 +select * from t1 as s, t1 as t where s.c1=t.c1 and s.c1 <= 2 and t.c1 >= 2;
 +end |
 +call p1();
 +ERROR 42S22: Unknown column 'a' in 'field list'
 +drop procedure p1;
 +drop table t1,t2;
++#
++# MDEV-20411: SP containing only one SELECT with WITH clause
++#
++create procedure sp1 ()
++with cte as (select 1 as a) select * from cte;
++call sp1();
++a
++1
++call sp1();
++a
++1
++create table t1 (a int);
++insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5);
++create procedure sp2 ()
++with cte as (select * from t1) select * from cte;
++call sp2();
++a
++3
++7
++1
++7
++1
++1
++3
++1
++5
++call sp2();
++a
++3
++7
++1
++7
++1
++1
++3
++1
++5
++create procedure sp3 ()
++with cte as (select * from t1 group by a) select * from cte;
++call sp3();
++a
++1
++3
++5
++7
++call sp3();
++a
++1
++3
++5
++7
++drop procedure sp1;
++drop procedure sp2;
++drop procedure sp3;
++drop table t1;
 +# End of 10.2 tests
 +#
 +# MDEV-21673: several references to CTE that uses
 +#             local variables / parameters of SP
 +#
 +CREATE TABLE t1 (col1 int);
 +CREATE TABLE t2 (col1 int, col2 date, col3 varchar(16), col4 int);
 +CREATE TABLE t3 (col1 int, col2 date);
 +CREATE TABLE t4 (col1 int, col2 date);
 +INSERT INTO t1 VALUES (3), (7), (9), (1);
 +INSERT INTO t2 VALUES
 +(3,'2019-09-01','AAA',2), (7,'2019-10-01','AAA',4), (3,'2019-10-01','AAA',8),
 +(1,'2019-10-01','BBB',9), (1,'2019-10-01','AAA',4), (1,'2019-10-01','AAA',6);
 +INSERT INTO t3 VALUES
 +(4,'2018-10-01'), (6,'2018-10-01'), (4,'2017-10-01'), (7,'2017-10-01');
 +INSERT INTO t4 VALUES
 +(5,'2018-10-01'), (8,'2017-10-01'), (4,'2017-10-01');
 +CREATE OR REPLACE PROCEDURE SP1()
 +BEGIN
 +DECLARE p_date date;
 +DECLARE p_var2 varchar(16);
 +SET p_date='2019-10-01';
 +SET p_var2='AAA';
 +WITH cte_first(col) AS
 +(
 +SELECT DISTINCT col4
 +FROM t1, t2
 +WHERE t2.col1 = t1.col1 AND t2.col2 = p_date AND t2.col3 = p_var2
 +),
 +cte2 AS
 +(
 +SELECT DISTINCT col2
 +FROM t3
 +WHERE col1 IN ( SELECT col FROM cte_first )
 +),
 +cte3 AS (
 +SELECT distinct t4.col1
 +FROM cte2, t4
 +WHERE t4.col2 = cte2.col2 AND t4.col1 IN ( SELECT col FROM cte_first )
 +)
 +SELECT * FROM cte3;
 +END|
 +CREATE PROCEDURE SP2(IN d date)
 +BEGIN
 +DECLARE p_var2 varchar(16);
 +SET p_var2='AAA';
 +WITH cte_first(col) AS
 +(
 +SELECT DISTINCT col4
 +FROM t1, t2
 +WHERE t2.col1 = t1.col1 AND t2.col2 = d AND t2.col3 = p_var2
 +),
 +cte2 AS
 +(
 +SELECT DISTINCT col2
 +FROM t3
 +WHERE col1 IN ( SELECT col FROM cte_first )
 +),
 +cte3 AS (
 +SELECT distinct t4.col1
 +FROM cte2, t4
 +WHERE t4.col2 = cte2.col2 AND t4.col1 IN ( SELECT col FROM cte_first )
 +)
 +SELECT * FROM cte3;
 +END|
 +CREATE TABLE t AS
 +SELECT col4 AS col
 +FROM t1, t2
 +WHERE t2.col1 = t1.col1 AND t2.col2 ='2019-10-01' AND t2.col3 = 'AAA';
 +SELECT * FROM t;
 +col
 +4
 +8
 +4
 +6
 +CREATE TABLE tt AS
 +SELECT col2
 +FROM t3
 +WHERE col1 IN ( SELECT col FROM t );
 +SELECT * FROM tt;
 +col2
 +2018-10-01
 +2018-10-01
 +2017-10-01
 +SELECT t4.col1
 +FROM tt, t4
 +WHERE t4.col2 = tt.col2 AND t4.col1 IN ( SELECT col FROM t );
 +col1
 +8
 +4
 +DROP TABLE t,tt;
 +CALL SP1();
 +col1
 +8
 +4
 +CALL SP1();
 +col1
 +8
 +4
 +CALL SP2('2019-10-01');
 +col1
 +8
 +4
 +CALL SP2('2019-10-01');
 +col1
 +8
 +4
 +DROP PROCEDURE SP1;
 +DROP PROCEDURE SP2;
 +DROP TABLE t1,t2,t3,t4;
 +# End of 10.3 tests
diff --cc mysql-test/main/cte_nonrecursive.test
index dcb76e47034,00000000000..ac74683ad44
mode 100644,000000..100644
--- a/mysql-test/main/cte_nonrecursive.test
+++ b/mysql-test/main/cte_nonrecursive.test
@@@ -1,1569 -1,0 +1,1598 @@@
 +--source include/default_optimizer_switch.inc
 +
 +create table t1 (a int, b  varchar(32));
 +insert into t1 values
 +  (4,'aaaa' ), (7,'bb'), (1,'ccc'), (4,'dd');  
 +insert into t1 values
 +  (3,'eee'), (7,'bb'), (1,'fff'), (4,'ggg');
 +create table t2 (c int);
 +insert into t2 values
 +  (2), (4), (5), (3);  
 +
 +--echo # select certain field in the specification of t
 +with t as (select a from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.a;
 +select * from t2, (select a from t1 where b >= 'c') as t
 +   where t2.c=t.a;
 +explain 
 +with t as (select a from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.a;
 +explain
 +select * from t2, (select a from t1 where b >= 'c') as t
 +   where t2.c=t.a;
 +
 +--echo # select '*' in the specification of t
 +with t as (select * from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.a;
 +select * from t2, (select * from t1 where b >= 'c') as t
 +   where t2.c=t.a;
 +explain
 +with t as (select * from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.a;
 +explain
 +select * from t2, (select * from t1 where b >= 'c') as t
 +   where t2.c=t.a;
 +
 +--echo # rename fields returned by the specication when defining t
 +with t(f1,f2) as (select * from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.f1;
 +explain
 +with t(f1,f2) as (select * from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.f1;
 +
 +--echo # materialized query specifying t
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 + select * from t2,t where t2.c=t.a;
 +select * from t2, (select a, count(*) from t1 where b >= 'c' group by a) as t 
 + where t2.c=t.a;
 +explain
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 + select * from t2,t where t2.c=t.a;
 +explain
 +select * from t2, (select a, count(*) from t1 where b >= 'c' group by a) as t 
 +  where t2.c=t.a;
 +
 +--echo # specivication of t contains having
 +with t as (select a, count(*) from t1 where b >= 'c'
 +             group by a having count(*)=1 ) 
 + select * from t2,t where t2.c=t.a; 
 +select * from t2, (select a, count(*) from t1 where b >= 'c'
 +                      group by a having count(*)=1) t
 + where t2.c=t.a; 
 +
 +--echo # main query contains having
 +with t as (select * from t2 where c <= 4) 
 +  select a, count(*) from t1,t where t1.a=t.c group by a having count(*)=1; 
 +select a, count(*) from t1, (select * from t2 where c <= 4) t 
 +  where t1.a=t.c group by a having count(*)=1; 
 +
 +--echo # main query contains group by + order by
 +with t as (select * from t2 where c <= 4 ) 
 +  select a, count(*) from t1,t where t1.a=t.c group by a order by count(*); 
 +select a, count(*) from t1, (select * from t2 where c <= 4 ) t
 +  where t1.a=t.c group by a order by count(*); 
 +
 +--echo # main query contains group by + order by + limit
 +with t as (select * from t2 where c <= 4 ) 
 +  select a, count(*) from t1,t
 +    where t1.a=t.c group by a order by count(*) desc limit 1; 
 +select a, count(*) from t1, (select * from t2 where c <= 4 ) t
 +  where t1.a=t.c group by a order by count(*) desc limit 1; 
 +
 +
 +--echo # t is used in a subquery
 +with t as (select a from t1 where a<5)
 +  select * from t2 where c in (select a from t);
 +select * from t2 
 +  where c in (select a from (select a from t1 where a<5) as t);
 +explain
 +with t as (select a from t1 where a<5)
 +  select * from t2 where c in (select a from t);
 +explain
 +select * from t2 
 +  where c in (select a from (select a from t1 where a<5) as t);
 +
 +--echo # materialized t is used in a subquery
 +with t as (select count(*) as c from t1 where b >= 'c' group by a)
 +  select * from t2 where c in (select c from t);
 +select * from t2
 +  where c in (select c from (select count(*) as c from t1
 +                               where b >= 'c' group by a) as t);
 +explain
 +with t as (select count(*) as c from t1 where b >= 'c' group by a)
 +  select * from t2 where c in (select c from t);
 +explain
 +select * from t2
 +  where c in (select c from (select count(*) as c from t1
 +                               where b >= 'c' group by a) as t);
 +
 +--echo # two references to t specified by a query
 +--echo # selecting a field:  both in main query
 +with t as (select a from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +select * from (select a from t1 where b >= 'c') as r1,
 +              (select a from t1 where b >= 'c') as r2 
 +  where r1.a=r2.a;
 +explain
 +with t as (select a from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +explain
 +select * from (select a from t1 where b >= 'c') as r1,
 +              (select a from t1 where b >= 'c') as r2 
 +  where r1.a=r2.a;
 +
 +--echo # two references to materialized t: both in main query
 +with t as (select distinct a from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +select * from (select distinct a from t1 where b >= 'c') as r1,
 +              (select distinct a from t1 where b >= 'c') as r2 
 +  where r1.a=r2.a;
 +explain
 +with t as (select distinct a from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +explain
 +select * from (select distinct a from t1 where b >= 'c') as r1,
 +              (select distinct a from t1 where b >= 'c') as r2 
 +  where r1.a=r2.a;
 +
 +--echo # two references to t specified by a query
 +--echo # selecting all fields:  both in main query
 +with t as (select * from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +select * from (select * from t1 where b >= 'c') as r1,
 +              (select * from t1 where b >= 'c') as r2
 +  where r1.a=r2.a;
 +explain
 +with t as (select * from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +explain
 +select * from (select * from t1 where b >= 'c') as r1,
 +              (select * from t1 where b >= 'c') as r2
 +  where r1.a=r2.a;
 +
 +--echo # two references to t specifying explicitly column names
 +with t(c) as (select a from t1 where b >= 'c')
 +  select * from t r1, t r2 where r1.c=r2.c;
 +
 +--echo # t two references of t used in different parts of a union
 +with t as (select a from t1 where b >= 'c')
 +  select * from t where a < 2
 +  union
 +  select * from t where a >= 4;
 +select * from (select a from t1 where b >= 'c') as t
 +  where t.a < 2
 +union
 +select * from (select a from t1 where b >= 'c') as t
 +  where t.a >= 4;
 +explain
 +with t as (select a from t1 where b >= 'c')
 +  select * from t where a < 2
 +  union
 +  select * from t where a >= 4;
 +explain
 +select * from (select a from t1 where b >= 'c') as t
 +  where t.a < 2
 +union
 +select * from (select a from t1 where b >= 'c') as t
 +  where t.a >= 4;
 +
 +--echo # specification of t contains union
 +with t as (select a from t1 where b >= 'f' 
 +           union
 +           select c as a from t2 where c < 4) 
 +  select * from t2,t where t2.c=t.a;
 +select * from t2, 
 +              (select a from t1 where b >= 'f' 
 +               union
 +               select c as a from t2 where c < 4) as t 
 + where t2.c=t.a;
 +explain
 +with t as (select a from t1 where b >= 'f' 
 +           union
 +           select c as a from t2 where c < 4) 
 +  select * from t2,t where t2.c=t.a;
 +explain
 +select * from t2, 
 +              (select a from t1 where b >= 'f' 
 +               union
 +               select c as a from t2 where c < 4) as t 
 + where t2.c=t.a;
 +
 +--echo # t is defined in the with clause of a subquery
 +select t1.a,t1.b from t1,t2
 +  where t1.a>t2.c and
 +        t2.c in (with t as (select * from t1 where t1.a<5)
 +                   select t2.c from t2,t where t2.c=t.a);
 +select t1.a,t1.b from t1,t2
 +  where t1.a>t2.c and
 +        t2.c in (select t2.c
 +                   from t2,(select * from t1 where t1.a<5) as t
 +                   where t2.c=t.a);
 +explain
 +select t1.a,t1.b from t1,t2
 +  where t1.a>t2.c and
 +        t2.c in (with t as (select * from t1 where t1.a<5)
 +                   select t2.c from t2,t where t2.c=t.a);
 +explain
 +select t1.a,t1.b from t1,t2
 +  where t1.a>t2.c and
 +        t2.c in (select t2.c
 +                   from t2,(select * from t1 where t1.a<5) as t
 +                   where t2.c=t.a);
 +
 +--echo # two different definitions of t: one in the with clause of the main query,
 +--echo # the other in the with clause of a subquery 
 +with t as (select c from t2 where c >= 4)
 +  select t1.a,t1.b from t1,t
 +    where t1.a=t.c and
 +          t.c in (with t as (select * from t1 where t1.a<5)
 +                    select t2.c from t2,t where t2.c=t.a);
 +select t1.a,t1.b from t1, (select c from t2 where c >= 4) as t
 +  where t1.a=t.c and
 +        t.c in (select t2.c from t2,  (select * from t1 where t1.a<5) as t
 +                 where t2.c=t.a);
 +explain
 +with t as (select c from t2 where c >= 4)
 +  select t1.a,t1.b from t1,t
 +    where t1.a=t.c and
 +          t.c in (with t as (select * from t1 where t1.a<5)
 +                    select t2.c from t2,t where t2.c=t.a);
 +explain
 +select t1.a,t1.b from t1, (select c from t2 where c >= 4) as t
 +  where t1.a=t.c and
 +        t.c in (select t2.c from t2,  (select * from t1 where t1.a<5) as t
 +                 where t2.c=t.a);
 +
 +--echo # another with table tt is defined in the with clause of a subquery
 +--echo # from the specification of t
 +with t as (select * from t1
 +              where a>2 and
 +                    b in (with tt as (select * from t2 where t2.c<5)
 +                           select t1.b from t1,tt where t1.a=tt.c))
 +  select t.a, count(*) from t1,t where t1.a=t.a  group by t.a;
 +select t.a, count(*)
 +  from t1,
 +       (select * from t1
 +          where a>2 and
 +                b in (select t1.b
 +                        from t1,
 +                             (select * from t2 where t2.c<5) as tt
 +                          where t1.a=tt.c)) as t
 +    where t1.a=t.a  group by t.a;
 +explain
 +with t as (select * from t1
 +              where a>2 and
 +                    b in (with tt as (select * from t2 where t2.c<5)
 +                           select t1.b from t1,tt where t1.a=tt.c))
 +  select t.a, count(*) from t1,t where t1.a=t.a  group by t.a;
 +explain
 +select t.a, count(*)
 +  from t1,
 +       (select * from t1
 +          where a>2 and
 +                b in (select t1.b
 +                        from t1,
 +                             (select * from t2 where t2.c<5) as tt
 +                          where t1.a=tt.c)) as t
 +    where t1.a=t.a  group by t.a;
 +
 +--echo # with clause in the specification of a derived table
 +select *
 +  from t1, 
 +       (with t as (select a from t1 where b >= 'c') 
 +          select * from t2,t where t2.c=t.a) as tt
 +  where t1.b > 'f' and tt.a=t1.a; 
 +select *
 +  from t1, 
 +       (select * from t2,
 +                     (select a from t1 where b >= 'c') as t
 +          where t2.c=t.a) as tt
 +  where t1.b > 'f' and tt.a=t1.a; 
 +explain
 +select *
 +  from t1, 
 +       (with t as (select a from t1 where b >= 'c') 
 +          select * from t2,t where t2.c=t.a) as tt
 +  where t1.b > 'f' and tt.a=t1.a; 
 +explain
 +select *
 +  from t1, 
 +       (select * from t2,
 +                     (select a from t1 where b >= 'c') as t
 +          where t2.c=t.a) as tt
 +  where t1.b > 'f' and tt.a=t1.a; 
 +
 +--echo # with claused in the specification of a view
 +create view v1 as 
 +with t as (select a from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.a;
 +show create view v1;
 +select * from v1;
 +explain
 +select * from v1;
 +
 +--echo # with claused in the specification of a materialized view
 +create view v2 as 
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 +  select * from t2,t where t2.c=t.a;
 +show create view v2;
 +select * from v2;
 +explain
 +select * from v2;
 +
 +--echo # with clause in the specification of a view that whose definition
 +--echo # table alias for a with table
 +create view v3 as
 +with t(c) as (select a from t1 where b >= 'c')
 +select * from t r1 where r1.c=4;
 +show create view v3;
 +select * from v3;
 +
 +--echo # with clause in the specification of a view that whose definition
 +--echo # two table aliases for for the same with table
 +create view v4(c,d) as
 +with t(c) as (select a from t1 where b >= 'c')
 +select * from t r1, t r2 where r1.c=r2.c and r2.c=4;
 +show create view v4;
 +select * from v4;
 +explain
 +select * from v4;
 +
 +drop view v1,v2,v3,v4;
 +
 +
 +--echo # currently any views containing with clause are not updatable
 +create view v1(a) as 
 +with t as (select a from t1 where b >= 'c') 
 +  select t.a from t2,t where t2.c=t.a;
 +--error ER_NON_UPDATABLE_TABLE
 +update v1 set a=0 where a > 4;
 +drop view v1;
 +
 +
 +--echo # prepare of a query containing a definition of a with table t
 +prepare stmt1 from "
 +with t as (select a from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.a;
 +";
 +execute stmt1;
 +execute stmt1;
 +deallocate prepare stmt1;
 +
 +--echo # prepare of a query containing a definition of a materialized t
 +prepare stmt1 from "
 +with t as (select a, count(*) from t1 where b >= 'c' group by a) 
 + select * from t2,t where t2.c=t.a;
 +";
 +execute stmt1;
 +execute stmt1;
 +deallocate prepare stmt1;
 +
 +--echo # prepare of a query containing two references to with table t
 +prepare stmt1 from "
 +with t as (select * from t1 where b >= 'c')
 +  select * from t as r1, t as r2 where r1.a=r2.a;
 +";
 +execute stmt1;
 +execute stmt1;
 +deallocate prepare stmt1;
 +
 +--ERROR ER_WITH_COL_WRONG_LIST
 +with t(f) as (select * from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.f1;
 +
 +--ERROR ER_DUP_FIELDNAME
 +with t(f1,f1) as (select * from t1 where b >= 'c') 
 +  select * from t2,t where t2.c=t.f1;
 +
 +--ERROR ER_DUP_QUERY_NAME
 +with t as (select * from t2 where c>3),
 +     t as (select a from t1 where a>2)
 + select * from t,t1 where t1.a=t.c;
 +
 +--ERROR ER_NO_SUCH_TABLE
 +with t as (select a from s where a<5),
 +     s as (select a from t1 where b>='d')
 +  select * from t,s where t.a=s.a;
 +
 +with recursive
 +     t as (select a from s where a<5),
 +     s as (select a from t1 where b>='d')
 +  select * from t,s where t.a=s.a;
 +
 +--ERROR ER_RECURSIVE_WITHOUT_ANCHORS
 +with recursive t as (select * from s where a>2),
 +               s as (select a from t1,r where t1.a>r.c), 
 +               r as (select c from t,t2 where t.a=t2.c) 
 +  select * from r where r.c<7;
 +
 +--ERROR ER_RECURSIVE_WITHOUT_ANCHORS
 +with recursive
 +     t as (select * from s where a>2),
 +     s as (select a from t1,r where t1.a>r.c), 
 +     r as (select c from t,t2 where t.a=t2.c) 
 +  select * from r where r.c<7;
 +
 +--ERROR ER_RECURSIVE_WITHOUT_ANCHORS
 +with recursive
 +     t as (select * from t1
 +             where a in (select c from s where b<='ccc') and  b>'b'),
 +     s as (select * from t1,t2
 +             where t1.a=t2.c and t1.c in (select a from t where a<5))
 + select * from s where s.b>'aaa';
 +
 +--ERROR ER_RECURSIVE_WITHOUT_ANCHORS
 +with recursive 
 +  t as (select * from t1 where b>'aaa' and b <='d') 
 +  select t.b from t,t2
 +    where t.a=t2.c and
 +          t2.c in (with recursive
 +                   s as (select t1.a from s,t1 where t1.a=s.a and t1.b<'c')
 +                   select * from s);
 +--echo #erroneous definition of unreferenced with table t
 +--ERROR ER_BAD_FIELD_ERROR
 +with t as (select count(*) from t1 where d>='f' group by a)
 +  select t1.b from t2,t1 where t1.a = t2.c;
 +
 +with t as (select count(*) from t1 where b>='f' group by a)
 +  select t1.b from t2,t1 where t1.a = t2.c;
 +
 +--echo #erroneous definition of s referring to unreferenced t
 +--ERROR ER_BAD_FIELD_ERROR
 +with t(d) as (select count(*) from t1 where b<='ccc' group by b),
 +     s as (select * from t1 where a in (select t2.d from t2,t where t2.c=t.d))
 +  select t1.b from t1,t2 where t1.a=t2.c;
 +--ERROR ER_BAD_FIELD_ERROR
 +with t(d) as (select count(*) from t1 where b<='ccc' group by b),
 +     s as (select * from t1 where a in (select t2.c from t2,t where t2.c=t.c))
 +  select t1.b from t1,t2 where t1.a=t2.c;
 +
 +with t(d) as (select count(*) from t1 where b<='ccc' group by b),
 +     s as (select * from t1 where a in (select t2.c from t2,t where t2.c=t.d))
 +  select t1.b from t1,t2 where t1.a=t2.c;
 +
 +--echo #erroneous definition of unreferenced with table t
 +--ERROR ER_WITH_COL_WRONG_LIST
 +with t(f) as (select * from t1 where b >= 'c') 
 +  select t1.b from t2,t1 where t1.a = t2.c;
 +
 +--echo #erroneous definition of unreferenced with table t
 +--ERROR ER_DUP_FIELDNAME
 +with t(f1,f1) as (select * from t1 where b >= 'c') 
 +  select t1.b from t2,t1 where t1.a = t2.c;
 +
 +--echo # explain for query with unreferenced with table
 +
 +explain 
 +with t as (select a from t1 where b >= 'c') 
 +  select t1.b from t2,t1 where t1.a = t2.c;
 +
 +explain 
 +with t as (select a, count(*) from t1 where b >= 'c' group by a)
 +  select t1.b from t2,t1 where t1.a = t2.c;
 +
 +--echo # too many with elements in with clause
 +let $m= 65;
 +let $i= $m;
 +dec $i;
 +let $q= with s$m as (select * from t1);
 +while ($i)
 +{
 +  let $q= $q, s$i as (select * from t1) ;
 +  dec $i;
 + }
 +let $q= $q select * from s$m;
 +--ERROR ER_TOO_MANY_DEFINITIONS_IN_WITH_CLAUSE
 +eval $q;
 +
 +drop table t1,t2;
 +
 +--echo #
 +--echo # Bug mdev-9937: View used in the specification of with table 
 +--echo #                refers to the base table with the same name 
 +--echo #
 +
 +create table t1 (a int);
 +insert into t1 values (20), (30), (10);
 +create view v1 as select * from t1 where a > 10;
 +
 +with t1 as (select * from v1) select * from t1;
 +
 +drop view v1;
 +drop table t1;
 +
 +--echo #
 +--echo # Bug mdev-10058: Invalid derived table with WITH clause  
 +--echo #                 
 +
 +CREATE TABLE t1 (a INT);
 +CREATE TABLE t2 (a INT);
 +CREATE TABLE t3 (a INT);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +INSERT INTO t2 VALUES (1),(2),(3);
 +INSERT INTO t3 VALUES (1),(2),(3);
 +
 +--ERROR ER_PARSE_ERROR
 +SELECT * FROM (WITH a AS (SELECT * FROM t1) (t2 NATURAL JOIN t3));
 +
 +SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT * FROM t2 NATURAL JOIN t3) AS d1;
 +
 +DROP TABLE t1,t2,t3;
 +
 +--echo #
 +--echo # Bug mdev-10344: the WITH clause of the query refers to a view that uses 
 +--echo #     a base table with the same name as a  CTE table from the clause 
 +--echo #
 +
 +
 +create table ten(a int primary key);
 +insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
 + 
 +create table one_k(a int primary key);
 +insert into one_k select A.a + B.a* 10 + C.a * 100 from ten A, ten B, ten C;
 + 
 +create view v1 as select * from ten;
 +
 +select * from v1;
 +
 +drop view v1;
 +drop table ten, one_k;
 +
 +--echo #
 +--echo # MDEV-10057 : Crash with EXPLAIN + WITH + constant query
 +--echo #
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT 1) AS t1;
 +EXPLAIN SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT 1) AS t1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-10058: Suspicious EXPLAIN output for a derived table + WITH + joined table	
 +--echo #
 +CREATE TABLE t1 (a INT);
 +CREATE TABLE t2 (a INT);
 +CREATE TABLE t3 (a INT);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +INSERT INTO t2 VALUES (1),(2),(3);
 +INSERT INTO t3 VALUES (1),(2),(3);
 +--error ER_PARSE_ERROR
 +EXPLAIN SELECT * FROM (WITH a AS (SELECT * FROM t1) (t2 NATURAL JOIN t3));
 +explain SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT * FROM t2 NATURAL JOIN t3) AS d1;
 +DROP TABLE t1,t2,t3;
 +
 +--echo #
 +--echo # MDEV-10729: Server crashes in st_select_lex::set_explain_type
 +--echo #
 +CREATE TABLE t1 (i1 INT, KEY(i1)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (4),(8);
 +                        
 +CREATE TABLE t2 (a2 INT, b2 INT, KEY(b2)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (8,7);
 +            
 +CREATE TABLE t3 (i3 INT) ENGINE=MyISAM;
 +INSERT INTO t3 VALUES (2),(6);
 + 
 +SELECT * FROM t1, t2 WHERE a2 = i1 and b2 >= i1 AND i1 IN ( SELECT i3 FROM t3 )
 +UNION
 +SELECT * FROM t1, t2 WHERE a2 = i1 and b2 >= i1 AND i1 IN ( SELECT i3 FROM t3 )
 +;
 +DROP TABLE t1,t2,t3;
 +
 +--echo #
 +--echo # MDEV-10923: mergeable CTE used twice in the query
 +--echo #
 +
 +create table employees (
 +  name varchar(32),
 +  dept varchar(32),
 +  country varchar(8)
 +);
 + 
 +insert into employees 
 +values 
 +('Sergei Golubchik', 'Development', 'DE'),
 +('Claudio Nanni', 'Support', 'ES'),
 +('Sergei Petrunia', 'Development', 'RU');
 +
 +with eng as 
 +(
 +   select * from employees
 +   where dept in ('Development','Support')
 +),
 +eu_eng  as 
 +(
 +  select * from eng where country IN ('DE','ES','RU')
 +)
 +select * from eu_eng T1 
 +where 
 +  not exists (select 1 from eu_eng T2 
 +              where T2.country=T1.country
 +              and T2.name <> T1.name);
 +
 +drop table employees;
 +
 +--echo #
 +--echo # MDEV-11818: EXPLAIN EXTENDED for a query with optimized away CTE table
 +--echo #
 +
 +CREATE TABLE t1 (i INT, c VARCHAR(3));
 +INSERT INTO t1 VALUES (1,'foo');
 +
 +EXPLAIN EXTENDED
 +WITH cte AS ( SELECT * FROM t1 ) SELECT i FROM cte;
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-12185: view defintion contains WITH clause with 
 +--echo #             several specifications of CTE
 +--echo #
 +
 +with
 +  alias1 as (select 1 as one),
 +  alias2 as (select 2 as two)
 +select one, two from alias1, alias2;
 +
 +create view v1 as 
 +with
 +  alias1 as (select 1 as one),
 +  alias2 as (select 2 as two)
 +select one, two from alias1, alias2;
 +
 +select * from v1;
 +show create view v1;
 +
 +drop view v1;
 +
 +--echo #
 +--echo # MDEV-12440: the same CTE table is used twice
 +--echo #
 +
 +create table t1 (a int, b  varchar(32));
 +insert into t1 values
 +  (4,'aaaa' ), (7,'bb'), (1,'ccc'), (4,'dd');  
 +
 +--echo # cte2 is used in the main query and in the spec for ct3
 +with
 +cte1 as (select * from t1 where  b >= 'c'),
 +cte2 as (select * from cte1 where a < 7),
 +cte3 as (select * from cte2 where a > 1)
 +select * from cte2, cte3 where cte2.a = cte3.a;
 +
 +--echo # cte2 is used twice in the spec for ct3
 +with
 +cte1 as (select * from t1 where  b >= 'b'),
 +cte2 as (select * from cte1 where b > 'c'),
 +cte3 as (select * from cte2 where a > 1 union select * from cte2 where a > 1)
 +select * from cte3;
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-12558: CTE with the same name as temporary table
 +--echo #
 +
 +CREATE TABLE t ENGINE=MyISAM AS SELECT 1 AS i;
 +CREATE TEMPORARY TABLE cte ENGINE=MyISAM AS SELECT 2 AS f;
 +
 +WITH cte AS ( SELECT i FROM t ) SELECT * FROM cte;
 +WITH cte AS ( SELECT i FROM t GROUP BY i) SELECT * FROM cte;
 +
 +SELECT * FROM cte;
 +
 +DROP TABLE cte;
 +DROP TABLE t;
 +
 +--echo #
 +--echo # MDEV-13107: SHOW TABLE STATUS, SHOW CREATE VIEW 
 +--echo #             for CTEs that use derived tables
 +--echo #
 +
 +create table t1(a int) engine=myisam;
 +insert into t1 values (3), (1), (2);
 +create table t2 (b int) engine=myisam;
 +insert into t2 values (2), (10);
 +
 +create view v1 as
 +with t as (select s.a from (select t1.a from t1) s),
 +     r as(select t.a from t2, t where t2.b=t.a)
 + select a from r;
 +
 +create view v2 as
 +with t as (select s.a from (select t1.a from t1) s),
 +     r as(select t.a from t2, t where t2.b=t.a)
 + select a from t1;
 +
 +--disable_result_log
 +show table status;
 +--enable_result_log
 +
 +show create view v1;
 +show create view v2;
 +
 +select * from v1;
 +select * from v2;
 +
 +prepare stmt1 from "select * from v1";
 +execute stmt1;
 +execute stmt1;
 +prepare stmt2 from "select * from v2";
 +execute stmt2;
 +execute stmt2;
 +
 +deallocate prepare stmt1;
 +deallocate prepare stmt2;
 +
 +drop view v1,v2;
 +drop table t1,t2;
 +
 +--echo #
 +--echo # MDEV-13796: UNION of two materialized CTEs
 +--echo #
 +
 +CREATE TABLE t1 (id int, k int);
 +CREATE TABLE t2 (id int);
 +INSERT INTO t1 VALUES (3,5), (1,7), (4,3);
 +INSERT INTO t2 VALUES (4), (3), (2);
 +
 +let $q=
 +WITH d1 AS (SELECT SUM(k) FROM t1, t2 as t2 WHERE t1.id = t2.id),
 +     d2 AS (SELECT SUM(k) FROM t1, t2 as t2 WHERE t1.id = t2.id)
 +SELECT * FROM d1 UNION  SELECT * FROM d2;
 +
 +eval $q;
 +eval explain $q;
 +
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-13780: tower of embedding CTEs with multiple usage of them
 +--echo #
 +
 +create table t1 (a int);
 +insert into t1 values (3), (2), (4), (7), (1), (2), (5);
 +
 +let $q=
 +with cte_e as
 +(
 +  with cte_o as
 +  (
 +    with cte_i as (select * from t1 where a < 7)
 +    select * from cte_i where a > 1
 +  )
 +  select * from cte_o as cto_o1 where a < 3
 +  union
 +  select * from cte_o as cto_o2 where a > 4
 +)
 +select * from cte_e as cte_e1 where a > 1
 +union
 +select * from cte_e as cte_e2;
 +
 +eval $q;
 +eval explain extended $q;
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-13753: embedded CTE in a VIEW created in prepared statement
 +--echo #
 +
 +SET @sql_query = "
 +  CREATE OR REPLACE VIEW cte_test AS
 +   WITH  cte1  AS ( SELECT 1 as a from dual )
 +    ,    cte2  AS ( SELECT * FROM cte1 )
 +    SELECT * FROM cte2;
 +";
 +PREPARE stmt FROM @sql_query;
 +EXECUTE stmt;
 +DEALLOCATE PREPARE stmt;
 +
 +SHOW CREATE VIEW cte_test;
 +SELECT * FROM cte_test;
 +
 +DROP VIEW cte_test;
 +
 +--echo #
 +--echo # mdev-14755 : PS for query using CTE in select with subquery
 +--echo #
 +
 +create table t1 (a int);
 +insert into t1 values
 +  (7), (2), (8), (1), (3), (2), (7), (5), (4), (7), (9), (8);
 +
 +let $q1=
 +with cte as
 +(select a from t1 where a between 4 and 7 group by a)
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ))
 +union
 +(select a from t1 where a < 2);
 +
 +eval $q1;
 +eval prepare stmt from "$q1";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +let $q2=
 +with cte as
 +(select a from t1 where a between 4 and 7 group by a)
 +(select a from t1 where a < 2)
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ));
 +
 +eval $q2;
 +eval prepare stmt from "$q2";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +let $q3=
 +with cte as
 +(select a from t1 where a between 4 and 7)
 +(select a from t1 where a < 2)
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ));
 +
 +eval $q3;
 +eval prepare stmt from "$q3";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +let $q4=
 +with cte as
 +(select a from t1 where a between 4 and 7)
 +(select a from cte
 +   where exists( select a from t1 where t1.a < 2 and cte.a=t1.a ))
 +union
 +(select a from cte where exists( select a from t1 where cte.a=t1.a ));
 +
 +eval $q4;
 +eval prepare stmt from "$q4";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-14852: CTE using temporary table in query
 +--echo #             with two references to the CTE
 +--echo #
 +
 +create temporary table t1 (i int);
 +insert into t1 values (5),(4),(1),(2),(3);
 +
 +with
 +c1 as (select i from t1),
 +c2 as (select i from c1 where c1.i=2)
 +select i from c1 where i > 3 union  select i from c2;
 +
 +drop table t1;
 +
 +create table t1 (term char(10));
 +create temporary table t2 (term char(10));
 +
 +insert into t1 values ('TERM01'),('TERM02'),('TERM03');
 +insert into t2 values ('TERM02'),('TERM03'),('TERM04');
 +
 +with c1 as (select * from t1), c2 as (select * from t2)
 +(select * from c1 left outer join c2 on c1.term = c2.term)
 +union all
 +(select * from c1 right outer join c2 on c1.term = c2.term
 +  where c1.term is null);
 +
 +drop table t1,t2;
 +
 +--echo #
 +--echo # MDEV-14969: view using subquery with attached CTE
 +--echo #
 +
 +create table region (
 +  r_regionkey int,
 +  r_name char(25),
 +  primary key (r_regionkey)
 +);
 +insert into region values
 +(0,'AFRICA'), (1,'AMERICA'), (2,'ASIA'), (3,'EUROPE'), (4,'MIDDLE EAST');
 +
 +create table nation (
 +  n_nationkey int,
 +  n_name char(25),
 +  n_regionkey int,
 +  primary key (n_nationkey),
 +  key i_n_regionkey (n_regionkey)
 +);
 +insert into nation values
 +(0,'ALGERIA',0), (1,'ARGENTINA',1), (2,'BRAZIL',1), (3,'CANADA',1),
 +(4,'EGYPT',4), (5,'ETHIOPIA',0), (6,'FRANCE',3), (7,'GERMANY',3),
 +(8,'INDIA',2), (9,'INDONESIA',2), (10,'IRAN',4), (11,'IRAQ',4),
 +(12,'JAPAN',2), (13,'JORDAN',4), (14,'KENYA',0), (15,'MOROCCO',0),
 +(16,'MOZAMBIQUE',0), (17,'PERU',1), (18,'CHINA',2), (19,'ROMANIA',3),
 +(20,'SAUDI ARABIA',4), (21,'VIETNAM',2), (22,'RUSSIA',3),
 +(23,'UNITED KINGDOM',3), (24,'UNITED STATES',1);
 +
 +select * from nation n ,region r
 +  where n.n_regionkey = r.r_regionkey and
 +        r.r_regionkey in
 +        (with t as (select * from region where r_regionkey <= 3 )
 +           select r_regionkey from t where r_name <> "ASIA");
 +
 +create view v as
 +select * from nation n ,region r
 +  where n.n_regionkey = r.r_regionkey and
 +        r.r_regionkey in
 +        (with t as (select * from region where r_regionkey <= 3)
 +           select r_regionkey from t where r_name <> "ASIA");
 +
 +show create view v;
 +select * from v;
 +
 +drop view v;
 +drop table region, nation;
 +
 +--echo #
 +--echo # MDEV-15120: cte name used with database name
 +--echo #
 +
 +--error ER_NO_SUCH_TABLE
 +WITH cte AS (SELECT 1 AS a) SELECT test.cte.a FROM test.cte;
 +
 +CREATE DATABASE db1;
 +USE db1;
 +
 +--error ER_NO_SUCH_TABLE
 +WITH cte AS (SELECT 1 AS a) SELECT db1.cte.a FROM db1.cte;
 +
 +DROP DATABASE db1;
 +USE test;
 +
 +--echo #
 +--echo # MDEV-15119: CTE c2 specified after CTE c1 and is used in
 +--echo #             CTE c3 that is embedded into the spec of c1
 +--echo #
 +
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +
 +--error ER_NO_SUCH_TABLE
 +WITH c1 AS (WITH c3 AS (SELECT * FROM c2) SELECT * FROM c3),
 +     c2 AS (SELECT * FROM t1)
 +SELECT * FROM c1;
 +
 +WITH RECURSIVE c1 AS (WITH c3 AS (SELECT * FROM c2) SELECT * FROM c3),
 +     c2 AS (SELECT * FROM t1)
 +SELECT * FROM c1;
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-14297: Lost name of a explicitly named CTE column used in
 +--echo #             the non-recursive CTE via prepared statement
 +--echo #
 +
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(2),(3);
 +
 +PREPARE stmt FROM "WITH cte(a) AS (SELECT 1) SELECT * FROM cte";
 +EXECUTE stmt;
 +DEALLOCATE PREPARE stmt;
 +
 +PREPARE stmt FROM "CREATE VIEW v1 AS WITH cte(a) AS (SELECT 1) SELECT * FROM cte";
 +EXECUTE stmt;
 +SELECT * FROM v1;
 +DEALLOCATE PREPARE stmt;
 +
 +PREPARE stmt FROM "CREATE VIEW v2 AS WITH cte(a) AS (SELECT * FROM t1) SELECT * FROM cte";
 +EXECUTE stmt;
 +SELECT * FROM v2;
 +DEALLOCATE PREPARE stmt;
 +
 +DROP TABLE t1;
 +DROP VIEW v1,v2;
 +
 +--echo #
 +--echo # MDEV-15478: Lost name of a explicitly named CTE column used in
 +--echo #             the non-recursive CTE defined with UNION
 +--echo #
 +
 +CREATE TABLE t1 (x int, y int);
 +INSERT INTO t1 VALUES (1,2),(2,7),(3,3);
 +
 +WITH cte(a) AS (SELECT 1 UNION SELECT 2) SELECT * FROM cte;
 +
 +WITH cte(a) AS (SELECT 1 UNION SELECT 2) SELECT a FROM cte;
 +
 +WITH cte(a) AS (SELECT 1 UNION ALL SELECT 1) SELECT a FROM cte;
 +
 +WITH cte(a) AS (SELECT x from t1 UNION SELECT 4) SELECT a FROM cte;
 +
 +WITH cte(a) AS (SELECT 4 UNION SELECT x FROM t1 UNION SELECT 5)
 +SELECT a FROM cte;
 +
 +WITH cte(a,b) AS (SELECT 4,5 UNION SELECT 4,3) SELECT a,b FROM cte;
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-16353: unreferenced CTE specified by query with UNION
 +--echo #
 +
 +with cte as
 +  (select 1 union select 2 union select 3)
 +select 1 as f;
 +
 +create table t1 (a int);
 +insert into t1 values (2), (1), (7), (1), (4);
 +
 +with cte as
 +  (select * from t1 where a < 2 union select * from t1 where a > 5)
 +select 2 as f;
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-16473: query with CTE when no database is set
 +--echo #
 +
 +create database db_mdev_16473;
 +use db_mdev_16473;
 +drop database db_mdev_16473;
 +
 +--echo # Now no default database is set
 +select database();
 +
 +with cte as (select 1 as a) select * from cte;
 +
 +create database db_mdev_16473;
 +create table db_mdev_16473.t1 (a int);
 +insert into db_mdev_16473.t1 values (2), (7), (3), (1);
 +with cte as (select * from db_mdev_16473.t1) select * from cte;
 +
 +--error ER_NO_DB_ERROR
 +with cte as (select * from db_mdev_16473.t1)
 +select * from cte, t1 as t where cte.a=t.a;
 +with cte as (select * from db_mdev_16473.t1)
 +select * from cte, db_mdev_16473.t1 as t where cte.a=t.a;
 +
 +drop database db_mdev_16473;
 +
 +use test;
 +
 +--echo #
 +--echo # MDEV-17154: using parameter markers for PS within CTEs more than once
 +--echo #             using local variables in SP within CTEs more than once
 +--echo #
 +
 +prepare stmt from "
 +with cte(c) as (select ? ) select r.c, s.c+10  from cte as r, cte as s;
 +";
 +set @a=2;
 +execute stmt using @a;
 +set @a=5;
 +execute stmt using @a;
 +deallocate prepare stmt;
 +
 +prepare stmt from "
 +with cte(c) as (select ? ) select c from cte union select c+10 from cte;
 +";
 +set @a=2;
 +execute stmt using @a;
 +set @a=5;
 +execute stmt using @a;
 +deallocate prepare stmt;
 +
 +prepare stmt from "
 +with cte_e(a,b) as
 +(
 +  with cte_o(c) as (select ?)
 +  select r.c+10, s.c+20 from cte_o as r, cte_o as s
 +)
 +select * from cte_e as cte_e1 where a > 12
 +union all
 +select * from cte_e as cte_e2;
 +";
 +set @a=2;
 +execute stmt using @a;
 +set @a=5;
 +execute stmt using @a;
 +deallocate prepare stmt;
 +
 +create table t1 (a int, b int);
 +insert into t1 values
 +  (3,33), (1,17), (7,72), (4,45), (2,27), (3,35), (4,47), (3,38), (2,22);
 +
 +prepare stmt from "
 +with cte as (select * from t1 where a < ? and b > ?)
 +  select r.a, r.b+10, s.a, s.b+20 from cte as r, cte as s where r.a=s.a+1;
 +";
 +set @a=4, @b=20;
 +execute stmt using @a, at b;
 +set @a=5, @b=20;
 +execute stmt using @a, at b;
 +deallocate prepare stmt;
 +
 +delimiter |;
 +
 +create procedure p1()
 +begin
 +  declare i int;
 +  set i = 0;
 +  while i < 4 do
 +    insert into t1
 +      with cte(a) as (select i) select r.a-1, s.a+1 from cte as r, cte as s;
 +    set i = i+1;
 +  end while;
 +end|
 +
 +create procedure p2(in i int)
 +begin
 + insert into t1
 +   with cte(a) as (select i) select r.a-1, s.a+1 from cte as r, cte as s;
 +end|
 +
 +delimiter ;|
 +
 +delete from t1;
 +call p1();
 +select * from t1;
 +call p1();
 +select * from t1;
 +
 +delete from t1;
 +call p2(3);
 +select * from t1;
 +call p2(7);
 +select * from t1;
 +
 +drop procedure p1;
 +drop procedure p2;
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-17107: PS for CREATE OR REPLACE VIEW defined by SELECT with CTEs
 +--echo #
 +
 +create table t1(a int);
 +insert into t1 values (3), (1), (2);
 +create table t2 (b int);
 +insert into t2 values (2), (10);
 +
 +prepare stmt from
 +"create or replace view v1 as
 + with t as (select s.a from (select t1.a from t1) s),
 +      r as(select t.a from t2, t where t2.b=t.a)
 + select a from r;";
 +
 +execute stmt;
 +select * from v1;
 +
 +drop view v1;
 +drop table t1,t2;
 +
 +--echo #
 +--echo # MDEV-19112: CTE usage when information_schema is set as default db
 +--echo #
 +
 +with t as (select 1 as t ) select * from t;
 +
 +use information_schema;
 +with t as (select 1 as t) select * from t;
 +with columns as (select 1 as t) select * from columns;
 +
 +use test;
 +
 +--echo #
 +--echo # MDEV-18460: Server crashed in strmake / tdc_create_key /
 +--echo # THD::create_tmp_table_def_key
 +--echo #
 +
 +--connect con1,localhost,root,,
 +--change_user root,,
 +
 +CREATE TEMPORARY TABLE test.t (a INT);
 +WITH cte AS (SELECT 1) SELECT * FROM cte;
 +WITH t AS (SELECT 1) SELECT * FROM t;
 +--error ER_NO_DB_ERROR
 +WITH cte AS (SELECT 1) SELECT * FROM t;
 +DROP TABLE test.t;
 +
 +--connection default
 +--disconnect con1
 +
 +--echo #
 +--echo # MDEV-22781: create view with CTE without default database
 +--echo #
 +
 +drop database test;
 +create database db1;
 +create table db1.t1 (a int);
 +insert into db1.t1 values (3),(7),(1);
 +
 +create view db1.v1 as with t as (select * from db1.t1) select * from t;
 +show create view db1.v1;
 +select * from db1.v1;
 +drop view db1.v1;
 +
 +prepare stmt from "
 +create view db1.v1 as with t as (select * from db1.t1) select * from t;
 +";
 +execute stmt;
 +deallocate prepare stmt;
 +show create view db1.v1;
 +select * from db1.v1;
 +drop view db1.v1;
 +
 +drop table db1.t1;
 +drop database db1;
 +
 +create database test;
 +use test;
 +
 +--echo #
 +--echo # MDEV-24597: CTE with union used multiple times in query
 +--echo #
 +
 +with cte(a) as
 +(select 1 as d union select 2 as d)
 +select a from cte as r1
 +union
 +select a from cte as r2;
 +
 +create table t1 (a int, b int) engine=myisam;
 +insert into t1 values
 +(3,30), (7,70), (1,10), (7,71), (2,20), (7,72), (3,33), (4,44),
 +(5,50), (4,40), (3,33), (4,42), (4,43), (5,51);
 +
 +with cte(c) as
 +(select a from t1 where b < 30 union select a from t1 where b > 40)
 +select * from cte as r1, cte as r2 where r1.c = r2.c;
 +
 +with cte(a,c) as
 +(
 +  select a, count(*) from t1 group by a having count(*) = 1
 +  union
 +  select a, count(*) from t1 group by a having count(*) = 3
 +)
 +select a, c from cte as r1 where a < 3
 +union
 +select a, c from cte as r2 where a > 4;
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-23886: Stored Function returning the result of a query
 +--echo #             that uses CTE over a table twice
 +--echo #
 +
 +create table t1 (c1 int);
 +insert into t1 values (1),(2),(6);
 +
 +create function f1() returns int return
 +( with cte1 as (select c1 from t1)
 +  select sum(c1) from
 +  (select * from cte1 union all select * from cte1) dt
 +);
 +select f1();
 +
 +create function f2() returns int return
 +( with cte1 as (select c1 from t1)
 +  select sum(s.c1) from cte1 as s, cte1 as t where s.c1=t.c1
 +);
 +select f2();
 +
 +create function f3() returns int return
 +( with cte1 as (select c1 from t1)
 +  select
 +  case
 +    when exists(select 1 from cte1 where c1 between 1 and 2) then 1
 +    when exists(select 1 from cte1 where c1 between 5 and 6) then 2
 +    else 0
 +  end
 +);
 +select f3();
 +
 +create view v1 as (select c1 from t1);
 +
 +create function f4() returns int return
 +( select sum(c1) from
 +  (select * from v1 union all select * from v1) dt
 +);
 +select f4();
 +
 +create function f5() returns int return
 +( select sum(s.c1) from v1 as s, v1 as t where s.c1=t.c1
 +);
 +select f5();
 +
 +create view v2(s) as
 +with cte1 as (select c1 from t1)
 +select sum(c1) from (select * from cte1 union all select * from cte1) dt;
 +
 +create function f6() returns int return
 +(select s from v2);
 +select f6();
 +
 +create function f7() returns int return
 +( select r.s from v2 as r, v2 as t where r.s=t.s
 +);
 +select f7();
 +
 +select f5() + f6();
 +
 +prepare stmt from "select f5() + f6();";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +drop function f1;
 +drop function f2;
 +drop function f3;
 +drop function f4;
 +drop function f5;
 +drop function f6;
 +drop function f7;
 +
 +drop view v1;
 +drop view v2;
 +
 +create table t2 (a int, b int);
 +
 +insert into t2
 +with cte1 as (select c1 from t1)
 +select * from cte1 as s, cte1 as t where s.c1=t.c1 and s.c1 > 5;
 +
 +select * from t2;
 +
 +delimiter |;
 +
 +create procedure p1()
 +begin
 +insert into t2
 +with cte1 as (select c1 from t1)
 +select * from cte1 as s, cte1 as t where s.c1=t.c1 and s.c1 <= 2 and t.c1 >= 2;
 +end |
 +
 +delimiter ;|
 +
 +call p1();
 +select * from t2;
 +
 +drop procedure p1;
 +
 +--echo # checking CTE resolution for queries with hanging CTEs
 +
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where a >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.b)
 +select * from cte3;
 +
 +select * from t2;
 +
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where a >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.b)
 +select * from t2;
 +
 +--error ER_BAD_FIELD_ERROR
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where c1 >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.b)
 +select * from t2;
 +
 +--error ER_BAD_FIELD_ERROR
 +with
 +cte1(a) as (select * from t1 where c1 <= 2),
 +cte2(b) as (select * from cte1 where a >= 2),
 +cte3 as (select * from cte1,cte2 where cte1.a < cte2.c1)
 +select * from t2;
 +
 +with
 +cte1 as (select * from t1 where c1 <= 2),
 +cte2(a,b) as (select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +select * from cte2;
 +
 +with
 +cte1 as (select * from t1 where c1 <= 2),
 +cte2(a,b) as (select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +select * from t2;
 +
 +--error ER_NON_UNIQ_ERROR
 +with
 +cte1 as (select * from t1 where c1 <= 2),
 +cte2(a,b) as (select * from cte1 as s1, cte1 as s2 where s1.c1=c1)
 +select * from t2;
 +
 +with cte3 as
 +( with cte2(a,b) as
 +  ( with cte1 as (select * from t1 where c1 <= 2)
 +    select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +  select r1.a,r2.b from cte2 as r1, cte2 as r2)
 +select * from cte3;
 +
 +with cte3 as
 +( with cte2(a,b) as
 +  ( with cte1 as (select * from t1 where c1 <= 2)
 +    select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +  select r1.a,r2.b from cte2 as r1, cte2 as r2)
 +select * from t2;
 +
 +--error ER_BAD_FIELD_ERROR
 +with cte3 as
 +( with cte2(a,b) as
 +  ( with cte1 as (select * from t1 where c1 <= 2)
 +    select * from cte1 as s1, cte1 as s2 where s1.c1=s2.c1)
 +  select r1.c1,r2.c1 from cte2 as r1, cte2 as r2)
 +select * from t2;
 +
 +delimiter |;
 +
 +create procedure p1()
 +begin
 +insert into t2
 +with cte1 as (select c1 from t1)
 +select * from t1 as s, t1 as t where s.c1=t.c1 and s.c1 <= 2 and t.c1 >= 2;
 +end |
 +
 +delimiter ;|
 +
 +call p1();
 +select * from t2;
 +
 +drop procedure p1;
 +
 +delimiter |;
 +
 +create procedure p1()
 +begin
 +insert into t2
 +with cte1 as (select a from t1)
 +select * from t1 as s, t1 as t where s.c1=t.c1 and s.c1 <= 2 and t.c1 >= 2;
 +end |
 +
 +delimiter ;|
 +
 +--error ER_BAD_FIELD_ERROR
 +call p1();
 +
 +drop procedure p1;
 +
 +drop table t1,t2;
 +
++
++--echo #
++--echo # MDEV-20411: SP containing only one SELECT with WITH clause
++--echo #
++
++create procedure sp1 ()
++with cte as (select 1 as a) select * from cte;
++call sp1();
++call sp1();
++
++create table t1 (a int);
++insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5);
++
++create procedure sp2 ()
++with cte as (select * from t1) select * from cte;
++call sp2();
++call sp2();
++
++create procedure sp3 ()
++with cte as (select * from t1 group by a) select * from cte;
++call sp3();
++call sp3();
++
++drop procedure sp1;
++drop procedure sp2;
++drop procedure sp3;
++
++drop table t1;
++
 +--echo # End of 10.2 tests
 +
 +--echo #
 +--echo # MDEV-21673: several references to CTE that uses
 +--echo #             local variables / parameters of SP
 +--echo #
 +
 +CREATE TABLE t1 (col1 int);
 +CREATE TABLE t2 (col1 int, col2 date, col3 varchar(16), col4 int);
 +CREATE TABLE t3 (col1 int, col2 date);
 +CREATE TABLE t4 (col1 int, col2 date);
 +INSERT INTO t1 VALUES (3), (7), (9), (1);
 +INSERT INTO t2 VALUES
 +  (3,'2019-09-01','AAA',2), (7,'2019-10-01','AAA',4), (3,'2019-10-01','AAA',8),
 +  (1,'2019-10-01','BBB',9), (1,'2019-10-01','AAA',4), (1,'2019-10-01','AAA',6);
 +INSERT INTO t3 VALUES
 +  (4,'2018-10-01'), (6,'2018-10-01'), (4,'2017-10-01'), (7,'2017-10-01');
 +INSERT INTO t4 VALUES
 +  (5,'2018-10-01'), (8,'2017-10-01'), (4,'2017-10-01');
 +
 +DELIMITER |;
 +
 +CREATE OR REPLACE PROCEDURE SP1()
 +BEGIN
 +DECLARE p_date date;
 +DECLARE p_var2 varchar(16);
 +SET p_date='2019-10-01';
 +SET p_var2='AAA';
 +WITH cte_first(col) AS
 +(
 +  SELECT DISTINCT col4
 +  FROM t1, t2
 +  WHERE t2.col1 = t1.col1 AND t2.col2 = p_date AND t2.col3 = p_var2
 +),
 +cte2 AS
 +(
 +  SELECT DISTINCT col2
 +  FROM t3
 +  WHERE col1 IN ( SELECT col FROM cte_first )
 +),
 +cte3 AS (
 +  SELECT distinct t4.col1
 +  FROM cte2, t4
 +  WHERE t4.col2 = cte2.col2 AND t4.col1 IN ( SELECT col FROM cte_first )
 +)
 +SELECT * FROM cte3;
 +END|
 +
 +CREATE PROCEDURE SP2(IN d date)
 +BEGIN
 +DECLARE p_var2 varchar(16);
 +SET p_var2='AAA';
 +WITH cte_first(col) AS
 +(
 +  SELECT DISTINCT col4
 +  FROM t1, t2
 +  WHERE t2.col1 = t1.col1 AND t2.col2 = d AND t2.col3 = p_var2
 +),
 +cte2 AS
 +(
 +  SELECT DISTINCT col2
 +  FROM t3
 +  WHERE col1 IN ( SELECT col FROM cte_first )
 +),
 +cte3 AS (
 +  SELECT distinct t4.col1
 +  FROM cte2, t4
 +  WHERE t4.col2 = cte2.col2 AND t4.col1 IN ( SELECT col FROM cte_first )
 +)
 +SELECT * FROM cte3;
 +END|
 +
 +DELIMITER ;|
 +
 +
 +CREATE TABLE t AS
 +SELECT col4 AS col
 +FROM t1, t2
 +WHERE t2.col1 = t1.col1 AND t2.col2 ='2019-10-01' AND t2.col3 = 'AAA';
 +SELECT * FROM t;
 +
 +CREATE TABLE tt AS
 +SELECT col2
 +FROM t3
 +WHERE col1 IN ( SELECT col FROM t );
 +SELECT * FROM tt;
 +
 +SELECT t4.col1
 +FROM tt, t4
 +WHERE t4.col2 = tt.col2 AND t4.col1 IN ( SELECT col FROM t );
 +
 +DROP TABLE t,tt;
 +
 +CALL SP1();
 +CALL SP1();
 +
 +CALL SP2('2019-10-01');
 +CALL SP2('2019-10-01');
 +
 +DROP PROCEDURE SP1;
 +DROP PROCEDURE SP2;
 +DROP TABLE t1,t2,t3,t4;
 +
 +--echo # End of 10.3 tests
diff --cc mysql-test/main/derived_cond_pushdown.result
index 6e84a83fd24,00000000000..b886db20eed
mode 100644,000000..100644
--- a/mysql-test/main/derived_cond_pushdown.result
+++ b/mysql-test/main/derived_cond_pushdown.result
@@@ -1,17387 -1,0 +1,17533 @@@
 +set @@join_buffer_size=256*1024;
 +create table t1 (a int, b int, c int);
 +create table t2 (a int, b int, c int, d decimal);
 +insert into t1 values
 +(1,21,345), (1,33,7), (8,33,114), (1,21,500), (1,19,107), (5,14,787),
 +(8,33,123), (9,10,211), (5,16,207), (1,33,988), (5,27,132), (1,21,104),
 +(6,20,309), (6,20,315), (1,21,101), (8,33,404), (9,10,800), (1,21,123),
 +(7,11,708), (6,20,214);
 +insert into t2 values
 +(2,3,207,207.0000), (1,21,909,12.0000), (7,13,312,406.0000),
 +(8,64,248,107.0000), (6,20,315,279.3333), (1,19,203,107.0000),
 +(8,80,800,314.0000), (3,12,231,190.0000), (6,23,303,909.0000);
 +Warnings:
 +Note	1265	Data truncated for column 'd' at row 5
 +create table t1_double(a int, b double, c double);
 +insert into t1_double values
 +(1,23.4,14.3333), (1,12.5,18.9), (3,12.5,18.9),
 +(4,33.4,14.3333), (4,14.3333,13.65), (5,17.89,7.22),
 +(6,33.4,14.3), (10,33.4,13.65), (11,33.4,13.65);
 +create table t2_double(a int, b double, c double);
 +insert into t2_double values
 +(1,22.4,14.3333), (1,12.5,18.9), (2,22.4,18.9),
 +(4,33.4,14.3333), (5,22.4,13.65), (7,17.89,18.9),
 +(6,33.4,14.3333), (10,31.4,13.65), (12,33.4,13.65);
 +create table t1_char(a char, b char(8), c int);
 +insert into t1_char values
 +('a','Ivan',1), ('b','Vika',2), ('b','Inga',6), ('c','Vika',7),
 +('b','Ivan',7), ('a','Alex',6), ('b','Inga',5), ('d','Ron',9),
 +('d','Harry',2), ('d','Hermione',3), ('c','Ivan',3), ('c','Harry',4);
 +create table t2_char(a char, b char(8), c int);
 +insert into t2_char values
 +('b','Ivan',1), ('c','Vinny',3), ('c','Inga',9), ('a','Vika',1),
 +('c','Ivan',2), ('b','Ali',6), ('c','Inga',2), ('a','Ron',9),
 +('d','Harry',1), ('b','Hermes',3), ('b','Ivan',11), ('b','Harry',4);
 +create table t1_decimal (a decimal(3,1), b decimal(3,1), c int);
 +insert into t1_decimal values
 +(1,1,23),(2,2,11),(3,3,16),
 +(1,1,12),(1,1,14),(2,3,15),
 +(2,1,13),(2,3,11),(3,3,16);
 +create table t2_decimal (a decimal(3,1), b decimal(3,1), c int);
 +insert into t2_decimal values
 +(2,1,13),(2,2,11),(3,3,16),
 +(1,3,22),(1,3,14),(2,2,15),
 +(2,1,43),(2,3,11),(2,3,16);
 +create view v1 as select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707;
 +create view v2 as select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707;
 +create view v3 as select a, b, min(c) as min_c from t1
 +where t1.a<10 group by a,b having min_c > 109;
 +create view v4 as
 +select a, b, min(max_c) as min_c from v1
 +where (v1.a<15) group by a,b;
 +create view v_union as
 +select a, b, min(c) as c from t1
 +where t1.a<10 group by a,b having c > 109
 +union
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300;
 +create view v2_union as
 +select a, b, min(c) as c from t1
 +where t1.a<10 group by a,b having c > 109
 +union
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +union
 +select a, b, avg(c) as c from t1
 +where t1.c>300 group by a,b having c < 707;
 +create view v3_union as
 +select a, b, (a+1) as c from t1
 +where t1.a<10
 +union
 +select a, b, c from t1
 +where t1.b>10 and t1.c>100;
 +create view v4_union as
 +select a, b, max(c)-100 as c from t1
 +where t1.a<10 group by a,b having c > 109
 +union
 +select a, b, (c+100) as c from t1
 +where t1.b>10;
 +create view v_double as
 +select a, avg(a/4) as avg_a, b, c from t1_double
 +where (b>12.2) group by b,c having (avg_a<22.333);
 +create view v_char as
 +select a, b, max(c) as max_c from t1_char
 +group by a,b having max_c < 9;
 +create view v_decimal as
 +select a, b, avg(c) as avg_c from t1_decimal
 +group by a,b having (avg_c>12);
 +# conjunctive subformula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.max_c>214) and (t2.a>v1.a);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	8	64	248	107
 +6	20	315	279.3333	8	80	800	314
 +select * from v1,t2 where (v1.max_c>214) and (t2.a>v1.a);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	8	64	248	107
 +6	20	315	279.3333	8	80	800	314
 +explain select * from v1,t2 where (v1.max_c>214) and (t2.a>v1.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (v1.max_c>214) and (t2.a>v1.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.max_c > 214"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t2.a > v1.a",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 214",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +8	33	404	213.6667	8	64	248	107
 +6	20	315	279.3333	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +6	20	315	279.3333	6	23	303	909
 +select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +8	33	404	213.6667	8	64	248	107
 +6	20	315	279.3333	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +6	20	315	279.3333	6	23	303	909
 +explain select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.max_c > 300",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 300",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +5	27	132	132.0000	2	3	207	207
 +5	27	132	132.0000	1	21	909	12
 +5	27	132	132.0000	1	19	203	107
 +5	27	132	132.0000	3	12	231	190
 +select * from v1,t2 where
 +((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +5	27	132	132.0000	2	3	207	207
 +5	27	132	132.0000	1	21	909	12
 +5	27	132	132.0000	1	19	203	107
 +5	27	132	132.0000	3	12	231	190
 +explain select * from v1,t2 where
 +((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.max_c>300) and (v1.avg_c>t2.d) and (v1.b=t2.b)) or
 +((v1.max_c<135) and (v1.max_c<t2.c) and (v1.a=t2.a));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +6	20	315	279.3333	6	20	315	279
 +select * from v1,t2 where
 +((v1.max_c>300) and (v1.avg_c>t2.d) and (v1.b=t2.b)) or
 +((v1.max_c<135) and (v1.max_c<t2.c) and (v1.a=t2.a));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +6	20	315	279.3333	6	20	315	279
 +explain select * from v1,t2 where
 +((v1.max_c>300) and (v1.avg_c>t2.d) and (v1.b=t2.b)) or
 +((v1.max_c<135) and (v1.max_c<t2.c) and (v1.a=t2.a));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +((v1.max_c>300) and (v1.avg_c>t2.d) and (v1.b=t2.b)) or
 +((v1.max_c<135) and (v1.max_c<t2.c) and (v1.a=t2.a));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.max_c > 300 or v1.max_c < 135"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.b = t2.b and v1.max_c > 300 and v1.avg_c > t2.d or v1.a = t2.a and v1.max_c < 135 and v1.max_c < t2.c",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (max_c > 300 or max_c < 135)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a>6) and (t2.b>v1.b);
 +a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	80	800	314
 +select * from v1,t2 where (v1.a>6) and (t2.b>v1.b);
 +a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	80	800	314
 +explain select * from v1,t2 where (v1.a>6) and (t2.b>v1.b);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (v1.a>6) and (t2.b>v1.b);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a > 6"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t2.b > v1.b",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 6"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2,t2 where (v2.b>25) and (t2.a<v2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +select * from v2,t2 where (v2.b>25) and (t2.a<v2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v2,t2 where (v2.b>25) and (t2.a<v2.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v2,t2 where (v2.b>25) and (t2.a<v2.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v2.b > 25"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t2.a < v2.a",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and t1.b > 25"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.a>7) and (t2.c<v1.max_c)) or ((v1.a<2) and (t2.b<v1.b));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	2	3	207	207
 +1	19	107	107.0000	7	13	312	406
 +1	19	107	107.0000	3	12	231	190
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +1	21	500	234.6000	3	12	231	190
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +select * from v1,t2 where
 +((v1.a>7) and (t2.c<v1.max_c)) or ((v1.a<2) and (t2.b<v1.b));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	2	3	207	207
 +1	19	107	107.0000	7	13	312	406
 +1	19	107	107.0000	3	12	231	190
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +1	21	500	234.6000	3	12	231	190
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v1,t2 where
 +((v1.a>7) and (t2.c<v1.max_c)) or ((v1.a<2) and (t2.b<v1.b));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +((v1.a>7) and (t2.c<v1.max_c)) or ((v1.a<2) and (t2.b<v1.b));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a > 7 or v1.a < 2"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a > 7 and t2.c < v1.max_c or v1.a < 2 and t2.b < v1.b",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 7 or t1.a < 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2,t2 where
 +((v2.a>7) and (t2.c<v2.max_c)) or ((v2.a>5) and (t2.b<v2.b));
 +a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	2	3	207	207
 +6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	1	19	203	107
 +6	20	315	279.3333	3	12	231	190
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +select * from v2,t2 where
 +((v2.a>7) and (t2.c<v2.max_c)) or ((v2.a>5) and (t2.b<v2.b));
 +a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	2	3	207	207
 +6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	1	19	203	107
 +6	20	315	279.3333	3	12	231	190
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v2,t2 where
 +((v2.a>7) and (t2.c<v2.max_c)) or ((v2.a>5) and (t2.b<v2.b));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v2,t2 where
 +((v2.a>7) and (t2.c<v2.max_c)) or ((v2.a>5) and (t2.b<v2.b));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v2.a > 7 or v2.a > 5"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v2.a > 7 and t2.c < v2.max_c or v2.a > 5 and t2.b < v2.b",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and (t1.a > 7 or t1.a > 5)"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.a>4) and (v1.b>t2.b) and (v1.max_c=t2.d)) or
 +((v1.a<2) and (v1.max_c<t2.c) and (v1.max_c=t2.d));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	8	64	248	107
 +1	19	107	107.0000	1	19	203	107
 +5	16	207	207.0000	2	3	207	207
 +select * from v1,t2 where
 +((v1.a>4) and (v1.b>t2.b) and (v1.max_c=t2.d)) or
 +((v1.a<2) and (v1.max_c<t2.c) and (v1.max_c=t2.d));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	8	64	248	107
 +1	19	107	107.0000	1	19	203	107
 +5	16	207	207.0000	2	3	207	207
 +explain select * from v1,t2 where
 +((v1.a>4) and (v1.b>t2.b) and (v1.max_c=t2.d)) or
 +((v1.a<2) and (v1.max_c<t2.c) and (v1.max_c=t2.d));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +((v1.a>4) and (v1.b>t2.b) and (v1.max_c=t2.d)) or
 +((v1.a<2) and (v1.max_c<t2.c) and (v1.max_c=t2.d));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a > 4 or v1.a < 2"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a > 4 and v1.b > t2.b and v1.max_c = t2.d or v1.a < 2 and v1.max_c < t2.c and v1.max_c = t2.d",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 4 or t1.a < 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformulas : pushing into HAVING and WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a<2) and (v1.max_c>400) and (t2.b>v1.b);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	6	23	303	909
 +select * from v1,t2 where (v1.a<2) and (v1.max_c>400) and (t2.b>v1.b);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	6	23	303	909
 +explain select * from v1,t2 where (v1.a<2) and (v1.max_c>400) and (t2.b>v1.b);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (v1.a<2) and (v1.max_c>400) and (t2.b>v1.b);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a < 2 and v1.max_c > 400"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t2.b > v1.b",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 400",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a < 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_double as v,t2_double as t where
 +(v.a=t.a) and (v.avg_a>0.45) and (v.b>10);
 +a	avg_a	b	c	a	b	c
 +1	0.50000000	12.5	18.9	1	22.4	14.3333
 +1	0.50000000	12.5	18.9	1	12.5	18.9
 +4	1.00000000	33.4	14.3333	4	33.4	14.3333
 +4	1.00000000	14.3333	13.65	4	33.4	14.3333
 +5	1.25000000	17.89	7.22	5	22.4	13.65
 +6	1.50000000	33.4	14.3	6	33.4	14.3333
 +10	2.62500000	33.4	13.65	10	31.4	13.65
 +select * from v_double as v,t2_double as t where
 +(v.a=t.a) and (v.avg_a>0.45) and (v.b>10);
 +a	avg_a	b	c	a	b	c
 +1	0.50000000	12.5	18.9	1	22.4	14.3333
 +1	0.50000000	12.5	18.9	1	12.5	18.9
 +4	1.00000000	33.4	14.3333	4	33.4	14.3333
 +4	1.00000000	14.3333	13.65	4	33.4	14.3333
 +5	1.25000000	17.89	7.22	5	22.4	13.65
 +6	1.50000000	33.4	14.3	6	33.4	14.3333
 +10	2.62500000	33.4	13.65	10	31.4	13.65
 +explain select * from v_double as v,t2_double as t where
 +(v.a=t.a) and (v.avg_a>0.45) and (v.b>10);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t.a	2	Using where
 +2	DERIVED	t1_double	ALL	NULL	NULL	NULL	NULL	9	Using where; Using temporary; Using filesort
 +explain format=json select * from v_double as v,t2_double as t where
 +(v.a=t.a) and (v.avg_a>0.45) and (v.b>10);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v.avg_a > 0.45 and v.b > 10",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "avg_a < 22.333 and avg_a > 0.45",
 +          "filesort": {
 +            "sort_key": "t1_double.b, t1_double.c",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_double",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t1_double.b > 12.2 and t1_double.b > 10"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_decimal as v,t2_decimal as t where
 +(v.a=t.a) and (v.avg_c>15) and (v.b>1);
 +a	b	avg_c	a	b	c
 +3.0	3.0	16.0000	3.0	3.0	16
 +select * from v_decimal as v,t2_decimal as t where
 +(v.a=t.a) and (v.avg_c>15) and (v.b>1);
 +a	b	avg_c	a	b	c
 +3.0	3.0	16.0000	3.0	3.0	16
 +explain select * from v_decimal as v,t2_decimal as t where
 +(v.a=t.a) and (v.avg_c>15) and (v.b>1);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	3	test.t.a	2	Using where
 +2	DERIVED	t1_decimal	ALL	NULL	NULL	NULL	NULL	9	Using where; Using temporary; Using filesort
 +explain format=json select * from v_decimal as v,t2_decimal as t where
 +(v.a=t.a) and (v.avg_c>15) and (v.b>1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "3",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v.avg_c > 15 and v.b > 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "avg_c > 12 and avg_c > 15",
 +          "filesort": {
 +            "sort_key": "t1_decimal.a, t1_decimal.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_decimal",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t1_decimal.b > 1"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formula : pushing into HAVING and WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.a>7) and (v1.max_c>300) and (t2.c<v1.max_c)) or
 +((v1.a<4) and (v1.max_c<500) and (t2.b<v1.b));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	2	3	207	207
 +1	19	107	107.0000	7	13	312	406
 +1	19	107	107.0000	3	12	231	190
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +select * from v1,t2 where
 +((v1.a>7) and (v1.max_c>300) and (t2.c<v1.max_c)) or
 +((v1.a<4) and (v1.max_c<500) and (t2.b<v1.b));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	2	3	207	207
 +1	19	107	107.0000	7	13	312	406
 +1	19	107	107.0000	3	12	231	190
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v1,t2 where
 +((v1.a>7) and (v1.max_c>300) and (t2.c<v1.max_c)) or
 +((v1.a<4) and (v1.max_c<500) and (t2.b<v1.b));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +((v1.a>7) and (v1.max_c>300) and (t2.c<v1.max_c)) or
 +((v1.a<4) and (v1.max_c<500) and (t2.b<v1.b));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a > 7 and v1.max_c > 300 or v1.a < 4 and v1.max_c < 500"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a > 7 and v1.max_c > 300 and t2.c < v1.max_c or v1.a < 4 and v1.max_c < 500 and t2.b < v1.b",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (t1.a > 7 and max_c > 300 or t1.a < 4 and max_c < 500)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 7 or t1.a < 4"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where ((v1.a<2) and (v1.max_c>120)) or (v1.a>7);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +select * from v1,t2 where ((v1.a<2) and (v1.max_c>120)) or (v1.a>7);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v1,t2 where ((v1.a<2) and (v1.max_c>120)) or (v1.a>7);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where ((v1.a<2) and (v1.max_c>120)) or (v1.a>7);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (t1.a < 2 and max_c > 120 or t1.a > 7)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a < 2 or t1.a > 7"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formulas : pushing into WHERE and HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.a<2) and (v1.max_c>120) and (v1.b=t2.b)) or (v1.a>7);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +select * from v1,t2 where
 +((v1.a<2) and (v1.max_c>120) and (v1.b=t2.b)) or (v1.a>7);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v1,t2 where
 +((v1.a<2) and (v1.max_c>120) and (v1.b=t2.b)) or (v1.a>7);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +((v1.a<2) and (v1.max_c>120) and (v1.b=t2.b)) or (v1.a>7);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a < 2 and v1.max_c > 120 or v1.a > 7"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.b = t2.b and v1.a < 2 and v1.max_c > 120 or v1.a > 7",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (t1.a < 2 and max_c > 120 or t1.a > 7)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a < 2 or t1.a > 7"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.a<2) and (v1.max_c<200) and (t2.c>v1.max_c) and (v1.max_c=t2.d)) or
 +((v1.a>4) and (v1.max_c<500) and (t2.b<v1.b) and (v1.max_c=t2.c));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	8	64	248	107
 +1	19	107	107.0000	1	19	203	107
 +5	16	207	207.0000	2	3	207	207
 +select * from v1,t2 where
 +((v1.a<2) and (v1.max_c<200) and (t2.c>v1.max_c) and (v1.max_c=t2.d)) or
 +((v1.a>4) and (v1.max_c<500) and (t2.b<v1.b) and (v1.max_c=t2.c));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	8	64	248	107
 +1	19	107	107.0000	1	19	203	107
 +5	16	207	207.0000	2	3	207	207
 +explain select * from v1,t2 where
 +((v1.a<2) and (v1.max_c<200) and (t2.c>v1.max_c) and (v1.max_c=t2.d)) or
 +((v1.a>4) and (v1.max_c<500) and (t2.b<v1.b) and (v1.max_c=t2.c));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +((v1.a<2) and (v1.max_c<200) and (t2.c>v1.max_c) and (v1.max_c=t2.d)) or
 +((v1.a>4) and (v1.max_c<500) and (t2.b<v1.b) and (v1.max_c=t2.c));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a < 2 and v1.max_c < 200 or v1.a > 4"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a < 2 and v1.max_c < 200 and t2.c > v1.max_c and v1.max_c = t2.d or v1.max_c = t2.c and v1.a > 4 and t2.c < 500 and t2.b < v1.b",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (t1.a < 2 and max_c < 200 or t1.a > 4 and max_c < 500)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a < 2 or t1.a > 4"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# prepare of a query containing extracted or formula
 +prepare stmt from "select * from v1,t2 where
 +  ((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));";
 +execute stmt;
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +5	27	132	132.0000	2	3	207	207
 +5	27	132	132.0000	1	21	909	12
 +5	27	132	132.0000	1	19	203	107
 +5	27	132	132.0000	3	12	231	190
 +execute stmt;
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +5	27	132	132.0000	2	3	207	207
 +5	27	132	132.0000	1	21	909	12
 +5	27	132	132.0000	1	19	203	107
 +5	27	132	132.0000	3	12	231	190
 +deallocate prepare stmt;
 +prepare stmt from
 +"explain format=json select * from v1,t2 where
 +    ((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));";
 +execute stmt;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +execute stmt;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.max_c > 400 or v1.max_c < 135"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.max_c > 400 and t2.a > v1.a or v1.max_c < 135 and t2.a < v1.a",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (max_c > 400 or max_c < 135)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +deallocate prepare stmt;
 +# conjunctive subformula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (t2.a=v1.a) and (v1.b=t2.b) and (v1.a=1);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +select * from v1,t2 where (t2.a=v1.a) and (v1.b=t2.b) and (v1.a=1);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +explain select * from v1,t2 where (t2.a=v1.a) and (v1.b=t2.b) and (v1.a=1);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.b	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (t2.a=v1.a) and (v1.b=t2.b) and (v1.a=1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 1 and t2.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t2.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.a = 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a = 1"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=5) and (v1.max_c=t2.d);
 +a	b	max_c	avg_c	a	b	c	d
 +5	16	207	207.0000	2	3	207	207
 +select * from v1,t2 where (v1.a=5) and (v1.max_c=t2.d);
 +a	b	max_c	avg_c	a	b	c	d
 +5	16	207	207.0000	2	3	207	207
 +explain select * from v1,t2 where (v1.a=5) and (v1.max_c=t2.d);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.d	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (v1.a=5) and (v1.max_c=t2.d);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.d is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["max_c"],
 +      "ref": ["test.t2.d"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.a = 5 and v1.max_c = t2.d",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a = 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformula : pushing into WHERE using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (t2.a<5) and (v1.a=t2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +1	19	107	107.0000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +1	19	107	107.0000	1	19	203	107
 +select * from v1,t2 where (t2.a<5) and (v1.a=t2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +1	19	107	107.0000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +1	19	107	107.0000	1	19	203	107
 +explain select * from v1,t2 where (t2.a<5) and (v1.a=t2.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (t2.a<5) and (v1.a=t2.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 5 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a < 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +explain select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	10	test.t2.a,test.t2.a	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "10",
 +      "used_key_parts": ["a", "b"],
 +      "ref": ["test.t2.a", "test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.b = t1.a"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformula : pushing into HAVING using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (t2.c>150) and (v1.max_c=t2.c);
 +a	b	max_c	avg_c	a	b	c	d
 +5	16	207	207.0000	2	3	207	207
 +6	20	315	279.3333	6	20	315	279
 +select * from v1,t2 where (t2.c>150) and (v1.max_c=t2.c);
 +a	b	max_c	avg_c	a	b	c	d
 +5	16	207	207.0000	2	3	207	207
 +6	20	315	279.3333	6	20	315	279
 +explain select * from v1,t2 where (t2.c>150) and (v1.max_c=t2.c);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.c	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (t2.c>150) and (v1.max_c=t2.c);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.c > 150 and t2.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["max_c"],
 +      "ref": ["test.t2.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 150",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted and formula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a) and (v1.a=3);
 +a	b	max_c	avg_c	a	b	c	d
 +select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a) and (v1.a=3);
 +a	b	max_c	avg_c	a	b	c	d
 +explain select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a) and (v1.a=3);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +explain format=json select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a) and (v1.a=3);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 3"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 3 and v1.b = 3"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 20,
 +            "filtered": 100,
 +            "attached_condition": "t1.a = 3 and t1.b = 3"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=1) and (v1.b=21) and (t2.a=2);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +select * from v1,t2 where (v1.a=1) and (v1.b=21) and (t2.a=2);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	2	3	207	207
 +explain select * from v1,t2 where (v1.a=1) and (v1.b=21) and (t2.a=2);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +explain format=json select * from v1,t2 where (v1.a=1) and (v1.b=21) and (t2.a=2);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 2"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 1 and v1.b = 21"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 20,
 +            "filtered": 100,
 +            "attached_condition": "t1.a = 1 and t1.b = 21"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_char as v,t2_char as t where
 +(v.a='c') and (v.b<'Hermes') and ((v.b=t.b) or (v.max_c>20));
 +a	b	max_c	a	b	c
 +c	Harry	4	d	Harry	1
 +c	Harry	4	b	Harry	4
 +select * from v_char as v,t2_char as t where
 +(v.a='c') and (v.b<'Hermes') and ((v.b=t.b) or (v.max_c>20));
 +a	b	max_c	a	b	c
 +c	Harry	4	d	Harry	1
 +c	Harry	4	b	Harry	4
 +explain select * from v_char as v,t2_char as t where
 +(v.a='c') and (v.b<'Hermes') and ((v.b=t.b) or (v.max_c>20));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	12	Using where
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	12	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1_char	ALL	NULL	NULL	NULL	NULL	12	Using where; Using temporary; Using filesort
 +explain format=json select * from v_char as v,t2_char as t where
 +(v.a='c') and (v.b<'Hermes') and ((v.b=t.b) or (v.max_c>20));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 12,
 +      "filtered": 100,
 +      "attached_condition": "v.a = 'c' and v.b < 'Hermes'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 9",
 +          "filesort": {
 +            "sort_key": "t1_char.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_char",
 +                "access_type": "ALL",
 +                "rows": 12,
 +                "filtered": 100,
 +                "attached_condition": "t1_char.a = 'c' and t1_char.b < 'Hermes'"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t",
 +        "access_type": "ALL",
 +        "rows": 12,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t.b = v.b or v.max_c > 20"
 +    }
 +  }
 +}
 +# extracted and formula : pushing into WHERE using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_decimal as v,t2_decimal as t where
 +(v.a=v.b) and (v.b=t.b) and ((t.b>1) or (v.a=1));
 +a	b	avg_c	a	b	c
 +1.0	1.0	16.3333	2.0	1.0	13
 +3.0	3.0	16.0000	3.0	3.0	16
 +3.0	3.0	16.0000	1.0	3.0	22
 +3.0	3.0	16.0000	1.0	3.0	14
 +1.0	1.0	16.3333	2.0	1.0	43
 +3.0	3.0	16.0000	2.0	3.0	11
 +3.0	3.0	16.0000	2.0	3.0	16
 +select * from v_decimal as v,t2_decimal as t where
 +(v.a=v.b) and (v.b=t.b) and ((t.b>1) or (v.a=1));
 +a	b	avg_c	a	b	c
 +1.0	1.0	16.3333	2.0	1.0	13
 +3.0	3.0	16.0000	3.0	3.0	16
 +3.0	3.0	16.0000	1.0	3.0	22
 +3.0	3.0	16.0000	1.0	3.0	14
 +1.0	1.0	16.3333	2.0	1.0	43
 +3.0	3.0	16.0000	2.0	3.0	11
 +3.0	3.0	16.0000	2.0	3.0	16
 +explain select * from v_decimal as v,t2_decimal as t where
 +(v.a=v.b) and (v.b=t.b) and ((t.b>1) or (v.a=1));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	6	test.t.b,test.t.b	2	
 +2	DERIVED	t1_decimal	ALL	NULL	NULL	NULL	NULL	9	Using where; Using temporary; Using filesort
 +explain format=json select * from v_decimal as v,t2_decimal as t where
 +(v.a=v.b) and (v.b=t.b) and ((t.b>1) or (v.a=1));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "(t.b > 1 or t.b = 1) and t.b is not null and t.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "6",
 +      "used_key_parts": ["a", "b"],
 +      "ref": ["test.t.b", "test.t.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "avg_c > 12",
 +          "filesort": {
 +            "sort_key": "t1_decimal.a, t1_decimal.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_decimal",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t1_decimal.b = t1_decimal.a and (t1_decimal.a > 1 or t1_decimal.a = 1)"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formula : pushing into HAVING using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2
 +where ((t2.a<4) and (v1.a=t2.a)) or ((t2.c>150) and (v1.max_c=t2.c));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +5	16	207	207.0000	2	3	207	207
 +6	20	315	279.3333	6	20	315	279
 +select * from v1,t2
 +where ((t2.a<4) and (v1.a=t2.a)) or ((t2.c>150) and (v1.max_c=t2.c));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +5	16	207	207.0000	2	3	207	207
 +6	20	315	279.3333	6	20	315	279
 +explain select * from v1,t2
 +where ((t2.a<4) and (v1.a=t2.a)) or ((t2.c>150) and (v1.max_c=t2.c));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2
 +where ((t2.a<4) and (v1.a=t2.a)) or ((t2.c>150) and (v1.max_c=t2.c));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 4 or t2.c > 150"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a = t2.a and t2.a < 4 or v1.max_c = t2.c and t2.c > 150",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (t1.a < 4 or max_c > 150)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformulas : pushing into WHERE and HAVING using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2
 +where ((t2.a>5) and (v1.a=t2.a)) and ((t2.c>250) and (v1.max_c=t2.c));
 +a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279
 +select * from v1,t2
 +where ((t2.a>5) and (v1.a=t2.a)) and ((t2.c>250) and (v1.max_c=t2.c));
 +a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279
 +explain select * from v1,t2
 +where ((t2.a>5) and (v1.a=t2.a)) and ((t2.c>250) and (v1.max_c=t2.c));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	10	test.t2.a,test.t2.c	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2
 +where ((t2.a>5) and (v1.a=t2.a)) and ((t2.c>250) and (v1.max_c=t2.c));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 5 and t2.c > 250 and t2.a is not null and t2.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "10",
 +      "used_key_parts": ["a", "max_c"],
 +      "ref": ["test.t2.a", "test.t2.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 250",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=8) and (v1.a=t2.a) and (v1.max_c=404);
 +a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	80	800	314
 +select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=8) and (v1.a=t2.a) and (v1.max_c=404);
 +a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	80	800	314
 +explain select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=8) and (v1.a=t2.a) and (v1.max_c=404);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where (v1.a=8) and (v1.a=t2.a) and (v1.max_c=404);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 8"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 8 and v1.max_c = 404"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c = 404",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a = 8"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +(v1.a>3) and (v1.max_c>200) and (t2.b<v1.b) and (t2.d=v1.max_c);
 +a	b	max_c	avg_c	a	b	c	d
 +5	16	207	207.0000	2	3	207	207
 +select * from v1,t2 where
 +(v1.a>3) and (v1.max_c>200) and (t2.b<v1.b) and (t2.d=v1.max_c);
 +a	b	max_c	avg_c	a	b	c	d
 +5	16	207	207.0000	2	3	207	207
 +explain select * from v1,t2 where
 +(v1.a>3) and (v1.max_c>200) and (t2.b<v1.b) and (t2.d=v1.max_c);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.d	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +(v1.a>3) and (v1.max_c>200) and (t2.b<v1.b) and (t2.d=v1.max_c);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.d is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["max_c"],
 +      "ref": ["test.t2.d"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.a > 3 and v1.max_c > 200 and t2.b < v1.b and t2.d = v1.max_c",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 200",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 3"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformula : pushing into WHERE
 +# extracted or formula : pushing into HAVING using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_double as v,t2_double as t where
 +(v.b=v.c) and (v.c=t.c) and ((t.c>10) or (v.a=1));
 +a	avg_a	b	c	a	b	c
 +select * from v_double as v,t2_double as t where
 +(v.b=v.c) and (v.c=t.c) and ((t.c>10) or (v.a=1));
 +a	avg_a	b	c	a	b	c
 +explain select * from v_double as v,t2_double as t where
 +(v.b=v.c) and (v.c=t.c) and ((t.c>10) or (v.a=1));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	18	test.t.c,test.t.c	2	Using where
 +2	DERIVED	t1_double	ALL	NULL	NULL	NULL	NULL	9	Using where; Using temporary; Using filesort
 +explain format=json select * from v_double as v,t2_double as t where
 +(v.b=v.c) and (v.c=t.c) and ((t.c>10) or (v.a=1));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t.c is not null and t.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "18",
 +      "used_key_parts": ["b", "c"],
 +      "ref": ["test.t.c", "test.t.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t.c > 10 or v.a = 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "avg_a < 22.333 and (t1_double.b > 10 or t1_double.a = 1)",
 +          "filesort": {
 +            "sort_key": "t1_double.b, t1_double.c",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_double",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t1_double.c = t1_double.b and t1_double.b > 12.2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# conjunctive subformula : pushing into WHERE
 +# extracted or formula : pushing into HAVING using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_double as v,t2_double as t where
 +(((v.a>0.2) or (v.b<17)) or (t.c>17)) and (t.c=v.c) and (v.c>18);
 +a	avg_a	b	c	a	b	c
 +1	0.50000000	12.5	18.9	1	12.5	18.9
 +1	0.50000000	12.5	18.9	2	22.4	18.9
 +1	0.50000000	12.5	18.9	7	17.89	18.9
 +select * from v_double as v,t2_double as t where
 +(((v.a>0.2) or (v.b<17)) or (t.c>17)) and (t.c=v.c) and (v.c>18);
 +a	avg_a	b	c	a	b	c
 +1	0.50000000	12.5	18.9	1	12.5	18.9
 +1	0.50000000	12.5	18.9	2	22.4	18.9
 +1	0.50000000	12.5	18.9	7	17.89	18.9
 +explain select * from v_double as v,t2_double as t where
 +(((v.a>0.2) or (v.b<17)) or (t.c>17)) and (t.c=v.c) and (v.c>18);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	9	test.t.c	2	Using where
 +2	DERIVED	t1_double	ALL	NULL	NULL	NULL	NULL	9	Using where; Using temporary; Using filesort
 +explain format=json select * from v_double as v,t2_double as t where
 +(((v.a>0.2) or (v.b<17)) or (t.c>17)) and (t.c=v.c) and (v.c>18);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t.c > 18 and t.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "9",
 +      "used_key_parts": ["c"],
 +      "ref": ["test.t.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v.a > 0.2 or v.b < 17 or t.c > 17",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "avg_a < 22.333 and (t1_double.a > 0.2 or t1_double.b < 17 or t1_double.c > 17)",
 +          "filesort": {
 +            "sort_key": "t1_double.b, t1_double.c",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_double",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t1_double.b > 12.2 and t1_double.c > 18"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formula : pushing into WHERE
 +# conjunctive subformula : pushing into HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_decimal as v,t2_decimal as t where
 +(((v.a>4) or (v.a=2)) or (v.b>3)) and (v.avg_c=13);
 +a	b	avg_c	a	b	c
 +2.0	1.0	13.0000	2.0	1.0	13
 +2.0	3.0	13.0000	2.0	1.0	13
 +2.0	1.0	13.0000	2.0	2.0	11
 +2.0	3.0	13.0000	2.0	2.0	11
 +2.0	1.0	13.0000	3.0	3.0	16
 +2.0	3.0	13.0000	3.0	3.0	16
 +2.0	1.0	13.0000	1.0	3.0	22
 +2.0	3.0	13.0000	1.0	3.0	22
 +2.0	1.0	13.0000	1.0	3.0	14
 +2.0	3.0	13.0000	1.0	3.0	14
 +2.0	1.0	13.0000	2.0	2.0	15
 +2.0	3.0	13.0000	2.0	2.0	15
 +2.0	1.0	13.0000	2.0	1.0	43
 +2.0	3.0	13.0000	2.0	1.0	43
 +2.0	1.0	13.0000	2.0	3.0	11
 +2.0	3.0	13.0000	2.0	3.0	11
 +2.0	1.0	13.0000	2.0	3.0	16
 +2.0	3.0	13.0000	2.0	3.0	16
 +select * from v_decimal as v,t2_decimal as t where
 +(((v.a>4) or (v.a=2)) or (v.b>3)) and (v.avg_c=13);
 +a	b	avg_c	a	b	c
 +2.0	1.0	13.0000	2.0	1.0	13
 +2.0	3.0	13.0000	2.0	1.0	13
 +2.0	1.0	13.0000	2.0	2.0	11
 +2.0	3.0	13.0000	2.0	2.0	11
 +2.0	1.0	13.0000	3.0	3.0	16
 +2.0	3.0	13.0000	3.0	3.0	16
 +2.0	1.0	13.0000	1.0	3.0	22
 +2.0	3.0	13.0000	1.0	3.0	22
 +2.0	1.0	13.0000	1.0	3.0	14
 +2.0	3.0	13.0000	1.0	3.0	14
 +2.0	1.0	13.0000	2.0	2.0	15
 +2.0	3.0	13.0000	2.0	2.0	15
 +2.0	1.0	13.0000	2.0	1.0	43
 +2.0	3.0	13.0000	2.0	1.0	43
 +2.0	1.0	13.0000	2.0	3.0	11
 +2.0	3.0	13.0000	2.0	3.0	11
 +2.0	1.0	13.0000	2.0	3.0	16
 +2.0	3.0	13.0000	2.0	3.0	16
 +explain select * from v_decimal as v,t2_decimal as t where
 +(((v.a>4) or (v.a=2)) or (v.b>3)) and (v.avg_c=13);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	9	Using join buffer (flat, BNL join)
 +2	DERIVED	t1_decimal	ALL	NULL	NULL	NULL	NULL	9	Using where; Using temporary; Using filesort
 +explain format=json select * from v_decimal as v,t2_decimal as t where
 +(((v.a>4) or (v.a=2)) or (v.b>3)) and (v.avg_c=13);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "(v.a > 4 or v.a = 2 or v.b > 3) and v.avg_c = 13",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "avg_c > 12 and avg_c = 13",
 +          "filesort": {
 +            "sort_key": "t1_decimal.a, t1_decimal.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_decimal",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t1_decimal.a > 4 or t1_decimal.a = 2 or t1_decimal.b > 3"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t",
 +        "access_type": "ALL",
 +        "rows": 9,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL"
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.a=v1.b);
 +a	b	max_c	avg_c	a	b	c	d
 +select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.a=v1.b);
 +a	b	max_c	avg_c	a	b	c	d
 +explain select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.a=v1.b);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	10	test.t2.a,test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.a=v1.b);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "10",
 +      "used_key_parts": ["a", "b"],
 +      "ref": ["test.t2.a", "test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.max_c > 300",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 300",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.b = t1.a and t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# nothing to push
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (t2.a<2) and (t2.c>900);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	21	500	234.6000	1	21	909	12
 +5	16	207	207.0000	1	21	909	12
 +5	27	132	132.0000	1	21	909	12
 +6	20	315	279.3333	1	21	909	12
 +8	33	404	213.6667	1	21	909	12
 +select * from v1,t2 where (t2.a<2) and (t2.c>900);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	21	500	234.6000	1	21	909	12
 +5	16	207	207.0000	1	21	909	12
 +5	27	132	132.0000	1	21	909	12
 +6	20	315	279.3333	1	21	909	12
 +8	33	404	213.6667	1	21	909	12
 +explain select * from v1,t2 where (t2.a<2) and (t2.c>900);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (t2.a<2) and (t2.c>900);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 2 and t2.c > 900"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.b=t2.b);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +6	20	315	279.3333	6	20	315	279
 +1	19	107	107.0000	1	19	203	107
 +select * from v1,t2 where (v1.a=t2.a) and (v1.b=t2.b);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +6	20	315	279.3333	6	20	315	279
 +1	19	107	107.0000	1	19	203	107
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.b=t2.b);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	10	test.t2.a,test.t2.b	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.b=t2.b);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null and t2.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "10",
 +      "used_key_parts": ["a", "b"],
 +      "ref": ["test.t2.a", "test.t2.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +(t2.a=v1.a) or (v1.b=t2.b) and ((v1.a=1) or (v1.a=6));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	80	800	314
 +select * from v1,t2 where
 +(t2.a=v1.a) or (v1.b=t2.b) and ((v1.a=1) or (v1.a=6));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	80	800	314
 +explain select * from v1,t2 where
 +(t2.a=v1.a) or (v1.b=t2.b) and ((v1.a=1) or (v1.a=6));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +(t2.a=v1.a) or (v1.b=t2.b) and ((v1.a=1) or (v1.a=6));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a = t2.a or v1.b = t2.b and (v1.a = 1 or v1.a = 6)",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=1) or (v1.b=21) or (t2.a=2);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	2	3	207	207
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	7	13	312	406
 +1	19	107	107.0000	8	64	248	107
 +1	19	107	107.0000	6	20	315	279
 +1	19	107	107.0000	1	19	203	107
 +1	19	107	107.0000	8	80	800	314
 +1	19	107	107.0000	3	12	231	190
 +1	19	107	107.0000	6	23	303	909
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +5	16	207	207.0000	2	3	207	207
 +5	27	132	132.0000	2	3	207	207
 +6	20	315	279.3333	2	3	207	207
 +8	33	404	213.6667	2	3	207	207
 +select * from v1,t2 where (v1.a=1) or (v1.b=21) or (t2.a=2);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	2	3	207	207
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	7	13	312	406
 +1	19	107	107.0000	8	64	248	107
 +1	19	107	107.0000	6	20	315	279
 +1	19	107	107.0000	1	19	203	107
 +1	19	107	107.0000	8	80	800	314
 +1	19	107	107.0000	3	12	231	190
 +1	19	107	107.0000	6	23	303	909
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	1	19	203	107
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +5	16	207	207.0000	2	3	207	207
 +5	27	132	132.0000	2	3	207	207
 +6	20	315	279.3333	2	3	207	207
 +8	33	404	213.6667	2	3	207	207
 +explain select * from v1,t2 where (v1.a=1) or (v1.b=21) or (t2.a=2);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where (v1.a=1) or (v1.b=21) or (t2.a=2);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a = 1 or v1.b = 21 or t2.a = 2",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +(t2.a<2) and (t2.c>900) and ((v1.a<t2.a) or (t2.a<11));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	21	500	234.6000	1	21	909	12
 +5	16	207	207.0000	1	21	909	12
 +5	27	132	132.0000	1	21	909	12
 +6	20	315	279.3333	1	21	909	12
 +8	33	404	213.6667	1	21	909	12
 +select * from v1,t2 where
 +(t2.a<2) and (t2.c>900) and ((v1.a<t2.a) or (t2.a<11));
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	21	500	234.6000	1	21	909	12
 +5	16	207	207.0000	1	21	909	12
 +5	27	132	132.0000	1	21	909	12
 +6	20	315	279.3333	1	21	909	12
 +8	33	404	213.6667	1	21	909	12
 +explain select * from v1,t2 where
 +(t2.a<2) and (t2.c>900) and ((v1.a<t2.a) or (t2.a<11));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,t2 where
 +(t2.a<2) and (t2.c>900) and ((v1.a<t2.a) or (t2.a<11));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 2 and t2.c > 900"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a < t2.a or t2.a < 11",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using several derived tables : nothing to push
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where
 +(v1.a=v2.a) and (v1.a=t2.a) and (v2.b<50);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	8	33	404	213.6667	8	64	248	107
 +6	20	315	279.3333	6	20	315	279.3333	6	20	315	279
 +8	33	404	213.6667	8	33	404	213.6667	8	80	800	314
 +6	20	315	279.3333	6	20	315	279.3333	6	23	303	909
 +select * from v1,v2,t2 where
 +(v1.a=v2.a) and (v1.a=t2.a) and (v2.b<50);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +8	33	404	213.6667	8	33	404	213.6667	8	64	248	107
 +6	20	315	279.3333	6	20	315	279.3333	6	20	315	279
 +8	33	404	213.6667	8	33	404	213.6667	8	80	800	314
 +6	20	315	279.3333	6	20	315	279.3333	6	23	303	909
 +explain select * from v1,v2,t2 where
 +(v1.a=v2.a) and (v1.a=t2.a) and (v2.b<50);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key1	key1	5	test.t2.a	2	
 +1	PRIMARY	<derived3>	ref	key0	key0	5	test.t2.a	2	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,v2,t2 where
 +(v1.a=v2.a) and (v1.a=t2.a) and (v2.b<50);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key1"],
 +      "key": "key1",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v2.b < 50",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and t1.b < 50"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and (t2.b<50) and (v1.b=v2.b);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279.3333	2	3	207	207
 +6	20	315	279.3333	6	20	315	279.3333	1	21	909	12
 +6	20	315	279.3333	6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	20	315	279.3333	1	19	203	107
 +6	20	315	279.3333	6	20	315	279.3333	3	12	231	190
 +6	20	315	279.3333	6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	8	33	404	213.6667	6	23	303	909
 +select * from v1,v2,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and (t2.b<50) and (v1.b=v2.b);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279.3333	2	3	207	207
 +6	20	315	279.3333	6	20	315	279.3333	1	21	909	12
 +6	20	315	279.3333	6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	20	315	279.3333	1	19	203	107
 +6	20	315	279.3333	6	20	315	279.3333	3	12	231	190
 +6	20	315	279.3333	6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	8	33	404	213.6667	6	23	303	909
 +explain select * from v1,v2,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and (t2.b<50) and (v1.b=v2.b);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived3>	ref	key0	key0	5	v1.b	2	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,v2,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and (t2.b<50) and (v1.b=v2.b);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.b < 50"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.b is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["v1.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v2.a = v1.a or v1.a = t2.a",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where
 +((v1.a=v2.a) and (v1.a=t2.a)) or ((v2.b>13) and (t2.c<115));
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	33	404	213.6667	8	80	800	314
 +select * from v1,v2,t2 where
 +((v1.a=v2.a) and (v1.a=t2.a)) or ((v2.b>13) and (t2.c<115));
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	8	33	404	213.6667	8	80	800	314
 +explain select * from v1,v2,t2 where
 +((v1.a=v2.a) and (v1.a=t2.a)) or ((v2.b>13) and (t2.c<115));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (incremental, BNL join)
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,v2,t2 where
 +((v1.a=v2.a) and (v1.a=t2.a)) or ((v2.b>13) and (t2.c<115));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a = t2.a or t2.c < 115",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived3>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "incremental",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a = t2.a and v2.a = t2.a or v2.b > 13 and t2.c < 115",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using several derived tables : pushing in all tables
 +# conjunctive subformula : pushing into HAVING
 +# extracted or formula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where ((v1.a=v2.a) or (v1.a=t2.a)) and
 +((v2.b<50) or (v2.b=19)) and (v1.max_c<300);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	6	20	315	279.3333	1	21	909	12
 +1	19	107	107.0000	6	20	315	279.3333	1	19	203	107
 +1	19	107	107.0000	8	33	404	213.6667	1	21	909	12
 +1	19	107	107.0000	8	33	404	213.6667	1	19	203	107
 +select * from v1,v2,t2 where ((v1.a=v2.a) or (v1.a=t2.a)) and
 +((v2.b<50) or (v2.b=19)) and (v1.max_c<300);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	6	20	315	279.3333	1	21	909	12
 +1	19	107	107.0000	6	20	315	279.3333	1	19	203	107
 +1	19	107	107.0000	8	33	404	213.6667	1	21	909	12
 +1	19	107	107.0000	8	33	404	213.6667	1	19	203	107
 +explain select * from v1,v2,t2 where ((v1.a=v2.a) or (v1.a=t2.a)) and
 +((v2.b<50) or (v2.b=19)) and (v1.max_c<300);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (incremental, BNL join)
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,v2,t2 where ((v1.a=v2.a) or (v1.a=t2.a)) and
 +((v2.b<50) or (v2.b=19)) and (v1.max_c<300);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.max_c < 300"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c < 300",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived3>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v2.b < 50 or v2.b = 19"
 +      },
 +      "buffer_type": "incremental",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "(v2.a = v1.a or v1.a = t2.a) and (v2.b < 50 or v2.b = 19)",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and (t1.b < 50 or t1.b = 19)"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using several derived tables : pushing only in one table
 +# conjunctive subformula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where
 +(v1.a=t2.a) and (v1.a=v1.b) and (v1.a=v2.a) and (v2.max_c<300);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +select * from v1,v2,t2 where
 +(v1.a=t2.a) and (v1.a=v1.b) and (v1.a=v2.a) and (v2.max_c<300);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +explain select * from v1,v2,t2 where
 +(v1.a=t2.a) and (v1.a=v1.b) and (v1.a=v2.a) and (v2.max_c<300);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key1	key1	10	test.t2.a,test.t2.a	2	
 +1	PRIMARY	<derived3>	ref	key0	key0	5	test.t2.a	2	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,v2,t2 where
 +(v1.a=t2.a) and (v1.a=v1.b) and (v1.a=v2.a) and (v2.max_c<300);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null and t2.a is not null and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key1"],
 +      "key": "key1",
 +      "key_length": "10",
 +      "used_key_parts": ["a", "b"],
 +      "ref": ["test.t2.a", "test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.b = t1.a"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v2.max_c < 300",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "max_c < 707 and max_c < 300",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using several derived tables : pushing only in one table
 +# extracted and formula : pushing into WHERE
 +# conjunctive subformula : pushing into WHERE using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where (v1.a=1) and (v1.b>10) and (v1.b=v2.b);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +select * from v1,v2,t2 where (v1.a=1) and (v1.b>10) and (v1.b=v2.b);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	c	d
 +explain select * from v1,v2,t2 where (v1.a=1) and (v1.b>10) and (v1.b=v2.b);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived3>	ref	key0	key0	5	v1.b	2	
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v1,v2,t2 where (v1.a=1) and (v1.b>10) and (v1.b=v2.b);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 1 and v1.b > 10"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.b is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a = 1 and t1.b > 10"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["v1.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and t1.b > 10"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formula : pushing into WHERE
 +# conjunctive subformula : pushing into WHERE using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (t.a='b') and ((v.b='Vika') or (v.b='Ali'));
 +a	b	max_c	a	b	c
 +b	Vika	2	b	Ivan	1
 +b	Vika	2	b	Ali	6
 +b	Vika	2	b	Hermes	3
 +b	Vika	2	b	Ivan	11
 +b	Vika	2	b	Harry	4
 +select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (t.a='b') and ((v.b='Vika') or (v.b='Ali'));
 +a	b	max_c	a	b	c
 +b	Vika	2	b	Ivan	1
 +b	Vika	2	b	Ali	6
 +b	Vika	2	b	Hermes	3
 +b	Vika	2	b	Ivan	11
 +b	Vika	2	b	Harry	4
 +explain select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (t.a='b') and ((v.b='Vika') or (v.b='Ali'));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	12	Using where
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	12	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1_char	ALL	NULL	NULL	NULL	NULL	12	Using where; Using temporary; Using filesort
 +explain format=json select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (t.a='b') and ((v.b='Vika') or (v.b='Ali'));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 12,
 +      "filtered": 100,
 +      "attached_condition": "v.a = 'b' and (v.b = 'Vika' or v.b = 'Ali')",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 9",
 +          "filesort": {
 +            "sort_key": "t1_char.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_char",
 +                "access_type": "ALL",
 +                "rows": 12,
 +                "filtered": 100,
 +                "attached_condition": "t1_char.a = 'b' and (t1_char.b = 'Vika' or t1_char.b = 'Ali')"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t",
 +        "access_type": "ALL",
 +        "rows": 12,
 +        "filtered": 100,
 +        "attached_condition": "t.a = 'b'"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL"
 +    }
 +  }
 +}
 +# using several derived tables : pushing in all tables
 +# extracted or formula : pushing into WHERE
 +# conjunctive subformulas : pushing into HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,v3,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and ((v3.b<50) or (v3.b=33))
 +and (v1.max_c<500) and (v3.a=t2.a) and (v2.max_c>300);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	min_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279.3333	7	11	708	7	13	312	406
 +6	20	315	279.3333	6	20	315	279.3333	8	33	114	8	64	248	107
 +6	20	315	279.3333	6	20	315	279.3333	6	20	214	6	20	315	279
 +6	20	315	279.3333	6	20	315	279.3333	8	33	114	8	80	800	314
 +6	20	315	279.3333	6	20	315	279.3333	6	20	214	6	23	303	909
 +6	20	315	279.3333	8	33	404	213.6667	6	20	214	6	20	315	279
 +6	20	315	279.3333	8	33	404	213.6667	6	20	214	6	23	303	909
 +8	33	404	213.6667	6	20	315	279.3333	8	33	114	8	64	248	107
 +8	33	404	213.6667	6	20	315	279.3333	8	33	114	8	80	800	314
 +8	33	404	213.6667	8	33	404	213.6667	7	11	708	7	13	312	406
 +8	33	404	213.6667	8	33	404	213.6667	8	33	114	8	64	248	107
 +8	33	404	213.6667	8	33	404	213.6667	6	20	214	6	20	315	279
 +8	33	404	213.6667	8	33	404	213.6667	8	33	114	8	80	800	314
 +8	33	404	213.6667	8	33	404	213.6667	6	20	214	6	23	303	909
 +select * from v1,v2,v3,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and ((v3.b<50) or (v3.b=33))
 +and (v1.max_c<500) and (v3.a=t2.a) and (v2.max_c>300);
 +a	b	max_c	avg_c	a	b	max_c	avg_c	a	b	min_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279.3333	7	11	708	7	13	312	406
 +6	20	315	279.3333	6	20	315	279.3333	8	33	114	8	64	248	107
 +6	20	315	279.3333	6	20	315	279.3333	6	20	214	6	20	315	279
 +6	20	315	279.3333	6	20	315	279.3333	8	33	114	8	80	800	314
 +6	20	315	279.3333	6	20	315	279.3333	6	20	214	6	23	303	909
 +6	20	315	279.3333	8	33	404	213.6667	6	20	214	6	20	315	279
 +6	20	315	279.3333	8	33	404	213.6667	6	20	214	6	23	303	909
 +8	33	404	213.6667	6	20	315	279.3333	8	33	114	8	64	248	107
 +8	33	404	213.6667	6	20	315	279.3333	8	33	114	8	80	800	314
 +8	33	404	213.6667	8	33	404	213.6667	7	11	708	7	13	312	406
 +8	33	404	213.6667	8	33	404	213.6667	8	33	114	8	64	248	107
 +8	33	404	213.6667	8	33	404	213.6667	6	20	214	6	20	315	279
 +8	33	404	213.6667	8	33	404	213.6667	8	33	114	8	80	800	314
 +8	33	404	213.6667	8	33	404	213.6667	6	20	214	6	23	303	909
 +explain select * from v1,v2,v3,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and ((v3.b<50) or (v3.b=33))
 +and (v1.max_c<500) and (v3.a=t2.a) and (v2.max_c>300);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived4>	ref	key0	key0	5	test.t2.a	2	Using where
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (incremental, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +explain format=json select * from v1,v2,v3,t2 where
 +((v1.a=v2.a) or (v1.a=t2.a)) and ((v3.b<50) or (v3.b=33))
 +and (v1.max_c<500) and (v3.a=t2.a) and (v2.max_c>300);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v3.b < 50 or v3.b = 33",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "min_c > 109",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a < 10 and (t1.b < 50 or t1.b = 33)"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived3>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v2.max_c > 300"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "max_c < 707 and max_c > 300",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.max_c < 500"
 +      },
 +      "buffer_type": "incremental",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a = v2.a or v1.a = t2.a",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c < 500",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using several derived tables : pushing in all tables
 +# conjunctive subformulas : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +t2 where (v1.a=v2.a) and (v1.b=t2.b) and (v1.max_c>130) and (v2.min_c<130);
 +a	b	max_c	avg_c	a	b	min_c	a	b	c	d
 +select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +t2 where (v1.a=v2.a) and (v1.b=t2.b) and (v1.max_c>130) and (v2.min_c<130);
 +a	b	max_c	avg_c	a	b	min_c	a	b	c	d
 +explain select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +t2 where (v1.a=v2.a) and (v1.b=t2.b) and (v1.max_c>130) and (v2.min_c<130);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key1	key1	5	test.t2.b	2	Using where
 +1	PRIMARY	<derived3>	ref	key0	key0	5	v1.a	2	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +t2 where (v1.a=v2.a) and (v1.b=t2.b) and (v1.max_c>130) and (v2.min_c<130);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key1"],
 +      "key": "key1",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t2.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.max_c > 130 and v1.a is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 130",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["v1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v2.min_c < 130",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "min_c < 707 and min_c < 130",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using several derived tables : pushing in all tables
 +# extracted or formulas : pushing into HAVING
 +# conjunctive subformula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +(select a, b, avg(c) as avg_c from t1
 +where t1.a<8 group by a,b) v3,
 +t2 where (v1.a=v2.a) and (v1.b=v3.b) and ((v3.avg_c>170) or (v3.a<5))
 +and ((v1.avg_c<400) or (v1.a>1)) and (v2.min_c<200);
 +a	b	max_c	avg_c	a	b	min_c	a	b	avg_c	a	b	c	d
 +8	33	404	213.6667	8	33	114	1	33	497.5000	2	3	207	207
 +8	33	404	213.6667	8	33	114	1	33	497.5000	1	21	909	12
 +8	33	404	213.6667	8	33	114	1	33	497.5000	7	13	312	406
 +8	33	404	213.6667	8	33	114	1	33	497.5000	8	64	248	107
 +8	33	404	213.6667	8	33	114	1	33	497.5000	6	20	315	279
 +8	33	404	213.6667	8	33	114	1	33	497.5000	1	19	203	107
 +8	33	404	213.6667	8	33	114	1	33	497.5000	8	80	800	314
 +8	33	404	213.6667	8	33	114	1	33	497.5000	3	12	231	190
 +8	33	404	213.6667	8	33	114	1	33	497.5000	6	23	303	909
 +select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +(select a, b, avg(c) as avg_c from t1
 +where t1.a<8 group by a,b) v3,
 +t2 where (v1.a=v2.a) and (v1.b=v3.b) and ((v3.avg_c>170) or (v3.a<5))
 +and ((v1.avg_c<400) or (v1.a>1)) and (v2.min_c<200);
 +a	b	max_c	avg_c	a	b	min_c	a	b	avg_c	a	b	c	d
 +8	33	404	213.6667	8	33	114	1	33	497.5000	2	3	207	207
 +8	33	404	213.6667	8	33	114	1	33	497.5000	1	21	909	12
 +8	33	404	213.6667	8	33	114	1	33	497.5000	7	13	312	406
 +8	33	404	213.6667	8	33	114	1	33	497.5000	8	64	248	107
 +8	33	404	213.6667	8	33	114	1	33	497.5000	6	20	315	279
 +8	33	404	213.6667	8	33	114	1	33	497.5000	1	19	203	107
 +8	33	404	213.6667	8	33	114	1	33	497.5000	8	80	800	314
 +8	33	404	213.6667	8	33	114	1	33	497.5000	3	12	231	190
 +8	33	404	213.6667	8	33	114	1	33	497.5000	6	23	303	909
 +explain select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +(select a, b, avg(c) as avg_c from t1
 +where t1.a<8 group by a,b) v3,
 +t2 where (v1.a=v2.a) and (v1.b=v3.b) and ((v3.avg_c>170) or (v3.a<5))
 +and ((v1.avg_c<400) or (v1.a>1)) and (v2.min_c<200);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived3>	ref	key0	key0	5	v1.a	2	Using where
 +1	PRIMARY	<derived4>	ref	key0	key0	5	v1.b	2	Using where
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +(select a, b, min(c) as min_c from t1
 +where t1.a>5 group by a,b having min_c < 707) v2,
 +(select a, b, avg(c) as avg_c from t1
 +where t1.a<8 group by a,b) v3,
 +t2 where (v1.a=v2.a) and (v1.b=v3.b) and ((v3.avg_c>170) or (v3.a<5))
 +and ((v1.avg_c<400) or (v1.a>1)) and (v2.min_c<200);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.avg_c < 400 or v1.a > 1"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "(v1.avg_c < 400 or v1.a > 1) and v1.a is not null and v1.b is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (avg_c < 400 or t1.a > 1)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["v1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v2.min_c < 200",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "min_c < 707 and min_c < 200",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["v1.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v3.avg_c > 170 or v3.a < 5",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "avg_c > 170 or t1.a < 5",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a < 8"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted or formula : pushing into HAVING
 +# conjunctive subformula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where ((v1.a=1) or (v1.max_c<300)) and (v1.b>25);
 +a	b	max_c	avg_c	a	b	c	d
 +5	27	132	132.0000	2	3	207	207
 +5	27	132	132.0000	1	21	909	12
 +5	27	132	132.0000	7	13	312	406
 +5	27	132	132.0000	8	64	248	107
 +5	27	132	132.0000	6	20	315	279
 +5	27	132	132.0000	1	19	203	107
 +5	27	132	132.0000	8	80	800	314
 +5	27	132	132.0000	3	12	231	190
 +5	27	132	132.0000	6	23	303	909
 +select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where ((v1.a=1) or (v1.max_c<300)) and (v1.b>25);
 +a	b	max_c	avg_c	a	b	c	d
 +5	27	132	132.0000	2	3	207	207
 +5	27	132	132.0000	1	21	909	12
 +5	27	132	132.0000	7	13	312	406
 +5	27	132	132.0000	8	64	248	107
 +5	27	132	132.0000	6	20	315	279
 +5	27	132	132.0000	1	19	203	107
 +5	27	132	132.0000	8	80	800	314
 +5	27	132	132.0000	3	12	231	190
 +5	27	132	132.0000	6	23	303	909
 +explain select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where ((v1.a=1) or (v1.max_c<300)) and (v1.b>25);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +group by a,b having max_c < 707) v1,
 +t2 where ((v1.a=1) or (v1.max_c<300)) and (v1.b>25);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "(v1.a = 1 or v1.max_c < 300) and v1.b > 25"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.a = 1 or v1.max_c < 300",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and (t1.a = 1 or max_c < 300)",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.b > 25"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# extracted and formula : pushing into WHERE
 +# conjunctive subformula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.b<30);
 +a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	23	303	909
 +select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.b<30);
 +a	b	max_c	avg_c	a	b	c	d
 +6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	23	303	909
 +explain select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.b<30);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from
 +(select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +where t1.a>5 group by a,b having max_c < 707) v1,
 +t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.b<30);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.max_c > 300 and v1.b < 30",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 707 and max_c > 300",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and t1.b < 30"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using query with union
 +# conjunctive subformula : pushing into WHERE
 +# conjunctive subformulas : pushing into HAVING and WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (t2.c>800)
 +union
 +select * from v1,t2 where (v1.max_c>100) and (v1.a>7) and (t2.d>800);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +8	33	404	213.6667	6	23	303	909
 +select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (t2.c>800)
 +union
 +select * from v1,t2 where (v1.max_c>100) and (v1.a>7) and (t2.d>800);
 +a	b	max_c	avg_c	a	b	c	d
 +1	21	500	234.6000	1	21	909	12
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (t2.c>800)
 +union
 +select * from v1,t2 where (v1.max_c>100) and (v1.a>7) and (t2.d>800);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived3>	ref	key0	key0	5	test.t2.b	2	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	UNION	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +2	UNION	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union1,2>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (t2.c>800)
 +union
 +select * from v1,t2 where (v1.max_c>100) and (v1.a>7) and (t2.d>800);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "union_result": {
 +      "table_name": "<union1,2>",
 +      "access_type": "ALL",
 +      "query_specifications": [
 +        {
 +          "query_block": {
 +            "select_id": 1,
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100,
 +              "attached_condition": "t2.c > 800 and t2.b is not null"
 +            },
 +            "table": {
 +              "table_name": "<derived3>",
 +              "access_type": "ref",
 +              "possible_keys": ["key0"],
 +              "key": "key0",
 +              "key_length": "5",
 +              "used_key_parts": ["b"],
 +              "ref": ["test.t2.b"],
 +              "rows": 2,
 +              "filtered": 100,
 +              "attached_condition": "v1.a < 5",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "having_condition": "max_c < 707",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        },
 +        {
 +          "query_block": {
 +            "select_id": 2,
 +            "operation": "UNION",
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100,
 +              "attached_condition": "t2.d > 800"
 +            },
 +            "block-nl-join": {
 +              "table": {
 +                "table_name": "<derived4>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.max_c > 100 and v1.a > 7"
 +              },
 +              "buffer_type": "flat",
 +              "buffer_size": "256Kb",
 +              "join_type": "BNL",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "having_condition": "max_c < 707 and max_c > 100",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a > 7"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      ]
 +    }
 +  }
 +}
 +# using query with union
 +# extracted and formula : pushing into WHERE
 +# extracted or formula : pushing into HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (v1.b=19)
 +union
 +select * from v1,t2 where ((v1.max_c>400) or (v1.avg_c>270)) and (v1.a<t2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	8	64	248	107
 +6	20	315	279.3333	8	80	800	314
 +select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (v1.b=19)
 +union
 +select * from v1,t2 where ((v1.max_c>400) or (v1.avg_c>270)) and (v1.a<t2.a);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	2	3	207	207
 +1	21	500	234.6000	7	13	312	406
 +1	21	500	234.6000	8	64	248	107
 +1	21	500	234.6000	6	20	315	279
 +1	21	500	234.6000	8	80	800	314
 +1	21	500	234.6000	3	12	231	190
 +1	21	500	234.6000	6	23	303	909
 +6	20	315	279.3333	7	13	312	406
 +6	20	315	279.3333	8	64	248	107
 +6	20	315	279.3333	8	80	800	314
 +explain select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (v1.b=19)
 +union
 +select * from v1,t2 where ((v1.max_c>400) or (v1.avg_c>270)) and (v1.a<t2.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	UNION	t2	ALL	NULL	NULL	NULL	NULL	9	
 +2	UNION	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +NULL	UNION RESULT	<union1,2>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (v1.b=19)
 +union
 +select * from v1,t2 where ((v1.max_c>400) or (v1.avg_c>270)) and (v1.a<t2.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "union_result": {
 +      "table_name": "<union1,2>",
 +      "access_type": "ALL",
 +      "query_specifications": [
 +        {
 +          "query_block": {
 +            "select_id": 1,
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100,
 +              "attached_condition": "t2.b = 19"
 +            },
 +            "block-nl-join": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.b = 19 and v1.a < 5"
 +              },
 +              "buffer_type": "flat",
 +              "buffer_size": "256Kb",
 +              "join_type": "BNL",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "having_condition": "max_c < 707",
 +                  "filesort": {
 +                    "sort_key": "t1.a",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b = 19 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        },
 +        {
 +          "query_block": {
 +            "select_id": 2,
 +            "operation": "UNION",
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100
 +            },
 +            "block-nl-join": {
 +              "table": {
 +                "table_name": "<derived4>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.max_c > 400 or v1.avg_c > 270"
 +              },
 +              "buffer_type": "flat",
 +              "buffer_size": "256Kb",
 +              "join_type": "BNL",
 +              "attached_condition": "(v1.max_c > 400 or v1.avg_c > 270) and v1.a < t2.a",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "having_condition": "max_c < 707 and (max_c > 400 or avg_c > 270)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      ]
 +    }
 +  }
 +}
 +# using query with union
 +# extracted or formula : pushing into HAVING
 +# extracted or formula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((t2.a=v1.a) or (v1.b=t2.b)) and ((v1.a=1) or (v1.a=6))
 +union
 +select * from v1,t2 where ((v1.a>3) and (v1.b>27)) or (v1.max_c>550);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +select * from v1,t2 where
 +((t2.a=v1.a) or (v1.b=t2.b)) and ((v1.a=1) or (v1.a=6))
 +union
 +select * from v1,t2 where ((v1.a>3) and (v1.b>27)) or (v1.max_c>550);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +1	21	500	234.6000	1	21	909	12
 +1	21	500	234.6000	1	19	203	107
 +6	20	315	279.3333	6	20	315	279
 +6	20	315	279.3333	6	23	303	909
 +8	33	404	213.6667	2	3	207	207
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	7	13	312	406
 +8	33	404	213.6667	8	64	248	107
 +8	33	404	213.6667	6	20	315	279
 +8	33	404	213.6667	1	19	203	107
 +8	33	404	213.6667	8	80	800	314
 +8	33	404	213.6667	3	12	231	190
 +8	33	404	213.6667	6	23	303	909
 +explain select * from v1,t2 where
 +((t2.a=v1.a) or (v1.b=t2.b)) and ((v1.a=1) or (v1.a=6))
 +union
 +select * from v1,t2 where ((v1.a>3) and (v1.b>27)) or (v1.max_c>550);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	UNION	t2	ALL	NULL	NULL	NULL	NULL	9	
 +2	UNION	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +NULL	UNION RESULT	<union1,2>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where
 +((t2.a=v1.a) or (v1.b=t2.b)) and ((v1.a=1) or (v1.a=6))
 +union
 +select * from v1,t2 where ((v1.a>3) and (v1.b>27)) or (v1.max_c>550);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "union_result": {
 +      "table_name": "<union1,2>",
 +      "access_type": "ALL",
 +      "query_specifications": [
 +        {
 +          "query_block": {
 +            "select_id": 1,
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100
 +            },
 +            "block-nl-join": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a = 1 or v1.a = 6"
 +              },
 +              "buffer_type": "flat",
 +              "buffer_size": "256Kb",
 +              "join_type": "BNL",
 +              "attached_condition": "(v1.a = t2.a or v1.b = t2.b) and (v1.a = 1 or v1.a = 6)",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "having_condition": "max_c < 707",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 1 or t1.a = 6"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        },
 +        {
 +          "query_block": {
 +            "select_id": 2,
 +            "operation": "UNION",
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100
 +            },
 +            "block-nl-join": {
 +              "table": {
 +                "table_name": "<derived4>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a > 3 and v1.b > 27 or v1.max_c > 550"
 +              },
 +              "buffer_type": "flat",
 +              "buffer_size": "256Kb",
 +              "join_type": "BNL",
 +              "attached_condition": "v1.a > 3 and v1.b > 27 or v1.max_c > 550",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "having_condition": "max_c < 707 and (t1.a > 3 and t1.b > 27 or max_c > 550)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      ]
 +    }
 +  }
 +}
 +# using query with union
 +# extracted or formula : pushing into HAVING
 +# conjunctive subformulas : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.a=1) and (v1.a=t2.a)) and ((v1.max_c<500) or (v1.avg_c>500))
 +union
 +select * from v2,t2 where
 +((v2.a<t2.b) or (v2.max_c>200)) and (v2.b>10) and (t2.a<2)
 +union
 +select * from v2,t2 where
 +(v2.max_c=t2.c) and (v2.b<10);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +6	20	315	279.3333	1	21	909	12
 +6	20	315	279.3333	1	19	203	107
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	1	19	203	107
 +select * from v1,t2 where
 +((v1.a=1) and (v1.a=t2.a)) and ((v1.max_c<500) or (v1.avg_c>500))
 +union
 +select * from v2,t2 where
 +((v2.a<t2.b) or (v2.max_c>200)) and (v2.b>10) and (t2.a<2)
 +union
 +select * from v2,t2 where
 +(v2.max_c=t2.c) and (v2.b<10);
 +a	b	max_c	avg_c	a	b	c	d
 +1	19	107	107.0000	1	21	909	12
 +1	19	107	107.0000	1	19	203	107
 +6	20	315	279.3333	1	21	909	12
 +6	20	315	279.3333	1	19	203	107
 +8	33	404	213.6667	1	21	909	12
 +8	33	404	213.6667	1	19	203	107
 +explain select * from v1,t2 where
 +((v1.a=1) and (v1.a=t2.a)) and ((v1.max_c<500) or (v1.avg_c>500))
 +union
 +select * from v2,t2 where
 +((v2.a<t2.b) or (v2.max_c>200)) and (v2.b>10) and (t2.a<2)
 +union
 +select * from v2,t2 where
 +(v2.max_c=t2.c) and (v2.b<10);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	UNION	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +2	UNION	<derived5>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +5	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +3	UNION	<derived6>	ref	key0	key0	5	test.t2.c	2	Using where
 +6	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union1,2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where
 +((v1.a=1) and (v1.a=t2.a)) and ((v1.max_c<500) or (v1.avg_c>500))
 +union
 +select * from v2,t2 where
 +((v2.a<t2.b) or (v2.max_c>200)) and (v2.b>10) and (t2.a<2)
 +union
 +select * from v2,t2 where
 +(v2.max_c=t2.c) and (v2.b<10);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "union_result": {
 +      "table_name": "<union1,2,3>",
 +      "access_type": "ALL",
 +      "query_specifications": [
 +        {
 +          "query_block": {
 +            "select_id": 1,
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100,
 +              "attached_condition": "t2.a = 1"
 +            },
 +            "block-nl-join": {
 +              "table": {
 +                "table_name": "<derived4>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a = 1 and (v1.max_c < 500 or v1.avg_c > 500)"
 +              },
 +              "buffer_type": "flat",
 +              "buffer_size": "256Kb",
 +              "join_type": "BNL",
 +              "attached_condition": "v1.max_c < 500 or v1.avg_c > 500",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "having_condition": "max_c < 707 and (max_c < 500 or avg_c > 500)",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 1"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        },
 +        {
 +          "query_block": {
 +            "select_id": 2,
 +            "operation": "UNION",
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100,
 +              "attached_condition": "t2.a < 2"
 +            },
 +            "block-nl-join": {
 +              "table": {
 +                "table_name": "<derived5>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v2.b > 10"
 +              },
 +              "buffer_type": "flat",
 +              "buffer_size": "256Kb",
 +              "join_type": "BNL",
 +              "attached_condition": "v2.a < t2.b or v2.max_c > 200",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 5,
 +                  "having_condition": "max_c < 707",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a > 5 and t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        },
 +        {
 +          "query_block": {
 +            "select_id": 3,
 +            "operation": "UNION",
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100,
 +              "attached_condition": "t2.c is not null"
 +            },
 +            "table": {
 +              "table_name": "<derived6>",
 +              "access_type": "ref",
 +              "possible_keys": ["key0"],
 +              "key": "key0",
 +              "key_length": "5",
 +              "used_key_parts": ["max_c"],
 +              "ref": ["test.t2.c"],
 +              "rows": 2,
 +              "filtered": 100,
 +              "attached_condition": "v2.b < 10",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 6,
 +                  "having_condition": "max_c < 707",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a > 5 and t1.b < 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      ]
 +    }
 +  }
 +}
 +# using derived table with union
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_union,t2 where (v_union.a<3) and (v_union.c>100);
 +a	b	c	a	b	c	d
 +1	19	107	2	3	207	207
 +1	19	107	1	21	909	12
 +1	19	107	7	13	312	406
 +1	19	107	8	64	248	107
 +1	19	107	6	20	315	279
 +1	19	107	1	19	203	107
 +1	19	107	8	80	800	314
 +1	19	107	3	12	231	190
 +1	19	107	6	23	303	909
 +select * from v_union,t2 where (v_union.a<3) and (v_union.c>100);
 +a	b	c	a	b	c	d
 +1	19	107	2	3	207	207
 +1	19	107	1	21	909	12
 +1	19	107	7	13	312	406
 +1	19	107	8	64	248	107
 +1	19	107	6	20	315	279
 +1	19	107	1	19	203	107
 +1	19	107	8	80	800	314
 +1	19	107	3	12	231	190
 +1	19	107	6	23	303	909
 +explain select * from v_union,t2 where (v_union.a<3) and (v_union.c>100);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	40	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v_union,t2 where (v_union.a<3) and (v_union.c>100);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 40,
 +        "filtered": 100,
 +        "attached_condition": "v_union.a < 3 and v_union.c > 100"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 109 and c > 100",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 10 and t1.a < 3"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300 and c > 100",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a < 3"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union
 +# conjunctive subformula : pushing into WHERE
 +# extracted or formula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_union,t2 where
 +((v_union.a<2) or (v_union.c>800)) and (v_union.b>12);
 +a	b	c	a	b	c	d
 +1	19	107	2	3	207	207
 +1	19	107	1	21	909	12
 +1	19	107	7	13	312	406
 +1	19	107	8	64	248	107
 +1	19	107	6	20	315	279
 +1	19	107	1	19	203	107
 +1	19	107	8	80	800	314
 +1	19	107	3	12	231	190
 +1	19	107	6	23	303	909
 +select * from v_union,t2 where
 +((v_union.a<2) or (v_union.c>800)) and (v_union.b>12);
 +a	b	c	a	b	c	d
 +1	19	107	2	3	207	207
 +1	19	107	1	21	909	12
 +1	19	107	7	13	312	406
 +1	19	107	8	64	248	107
 +1	19	107	6	20	315	279
 +1	19	107	1	19	203	107
 +1	19	107	8	80	800	314
 +1	19	107	3	12	231	190
 +1	19	107	6	23	303	909
 +explain select * from v_union,t2 where
 +((v_union.a<2) or (v_union.c>800)) and (v_union.b>12);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	40	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v_union,t2 where
 +((v_union.a<2) or (v_union.c>800)) and (v_union.b>12);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 40,
 +        "filtered": 100,
 +        "attached_condition": "(v_union.a < 2 or v_union.c > 800) and v_union.b > 12"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v_union.a < 2 or v_union.c > 800",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 109 and (t1.a < 2 or c > 800)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 10 and t1.b > 12"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300 and (t1.a < 2 or c > 800)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.b > 12"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union
 +# conjunctive subformula : pushing into HAVING
 +# conjunctive subformula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_union,t2 where
 +(v_union.a=1) and (v_union.a=t2.a) and (v_union.c<200);
 +a	b	c	a	b	c	d
 +1	19	107	1	21	909	12
 +1	19	107	1	19	203	107
 +select * from v_union,t2 where
 +(v_union.a=1) and (v_union.a=t2.a) and (v_union.c<200);
 +a	b	c	a	b	c	d
 +1	19	107	1	21	909	12
 +1	19	107	1	19	203	107
 +explain select * from v_union,t2 where
 +(v_union.a=1) and (v_union.a=t2.a) and (v_union.c<200);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	40	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v_union,t2 where
 +(v_union.a=1) and (v_union.a=t2.a) and (v_union.c<200);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 1"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 40,
 +        "filtered": 100,
 +        "attached_condition": "v_union.a = 1 and v_union.c < 200"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 109 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 1"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 1 and t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (v.b='Vika') and (v.max_c>2);
 +a	b	max_c	a	b	c
 +c	Vika	7	c	Vinny	3
 +c	Vika	7	c	Inga	9
 +c	Vika	7	c	Ivan	2
 +c	Vika	7	c	Inga	2
 +select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (v.b='Vika') and (v.max_c>2);
 +a	b	max_c	a	b	c
 +c	Vika	7	c	Vinny	3
 +c	Vika	7	c	Inga	9
 +c	Vika	7	c	Ivan	2
 +c	Vika	7	c	Inga	2
 +explain select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (v.b='Vika') and (v.max_c>2);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t	ALL	NULL	NULL	NULL	NULL	12	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	2	test.t.a	2	Using where
 +2	DERIVED	t1_char	ALL	NULL	NULL	NULL	NULL	12	Using where; Using temporary; Using filesort
 +explain format=json select * from v_char as v,t2_char as t where
 +(v.a=t.a) and (v.b='Vika') and (v.max_c>2);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t",
 +      "access_type": "ALL",
 +      "rows": 12,
 +      "filtered": 100,
 +      "attached_condition": "t.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "2",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v.b = 'Vika' and v.max_c > 2",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c < 9 and max_c > 2",
 +          "filesort": {
 +            "sort_key": "t1_char.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1_char",
 +                "access_type": "ALL",
 +                "rows": 12,
 +                "filtered": 100,
 +                "attached_condition": "t1_char.b = 'Vika'"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union
 +# using several derived tables : pushing in all tables
 +# conjunctive subformula : pushing into WHERE using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_union,v1,t2 where
 +(v_union.a=v1.a) and (v1.a=t2.a) and (t2.a=1)
 +and ((v_union.c>800) or (v1.max_c>200));
 +a	b	c	a	b	max_c	avg_c	a	b	c	d
 +1	19	107	1	21	500	234.6000	1	21	909	12
 +1	19	107	1	21	500	234.6000	1	19	203	107
 +select * from v_union,v1,t2 where
 +(v_union.a=v1.a) and (v1.a=t2.a) and (t2.a=1)
 +and ((v_union.c>800) or (v1.max_c>200));
 +a	b	c	a	b	max_c	avg_c	a	b	c	d
 +1	19	107	1	21	500	234.6000	1	21	909	12
 +1	19	107	1	21	500	234.6000	1	19	203	107
 +explain select * from v_union,v1,t2 where
 +(v_union.a=v1.a) and (v1.a=t2.a) and (t2.a=1)
 +and ((v_union.c>800) or (v1.max_c>200));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	40	Using where; Using join buffer (incremental, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v_union,v1,t2 where
 +(v_union.a=v1.a) and (v1.a=t2.a) and (t2.a=1)
 +and ((v_union.c>800) or (v1.max_c>200));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 1"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived4>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 1"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a = 1"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 40,
 +        "filtered": 100,
 +        "attached_condition": "v_union.a = 1"
 +      },
 +      "buffer_type": "incremental",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v_union.c > 800 or v1.max_c > 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 109",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 1"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 1 and t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union
 +# extracted or formula : pushing into WHERE
 +# conjunctive subformula : pushing into HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2_union as v,t2 where
 +((v.a=6) or (v.a=8)) and (v.c>200) and (v.a=t2.a);
 +a	b	c	a	b	c	d
 +8	33	404.0000	8	64	248	107
 +6	20	312.0000	6	20	315	279
 +6	20	214.0000	6	20	315	279
 +8	33	404.0000	8	80	800	314
 +6	20	312.0000	6	23	303	909
 +6	20	214.0000	6	23	303	909
 +select * from v2_union as v,t2 where
 +((v.a=6) or (v.a=8)) and (v.c>200) and (v.a=t2.a);
 +a	b	c	a	b	c	d
 +8	33	404.0000	8	64	248	107
 +6	20	312.0000	6	20	315	279
 +6	20	214.0000	6	20	315	279
 +8	33	404.0000	8	80	800	314
 +6	20	312.0000	6	23	303	909
 +6	20	214.0000	6	23	303	909
 +explain select * from v2_union as v,t2 where
 +((v.a=6) or (v.a=8)) and (v.c>200) and (v.a=t2.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	6	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +4	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union2,3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v2_union as v,t2 where
 +((v.a=6) or (v.a=8)) and (v.c>200) and (v.a=t2.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "(t2.a = 6 or t2.a = 8) and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 6,
 +      "filtered": 100,
 +      "attached_condition": "v.c > 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3,4>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 109 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 10 and (t1.a = 6 or t1.a = 8)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and (t1.a = 6 or t1.a = 8)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 707 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.c > 300 and (t1.a = 6 or t1.a = 8)"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union of selects without aggregation
 +# extracted conjunctive predicate: pushing in WHERE of both selects
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v3_union as v,t2 where (v.a=t2.a) and (v.c>6);
 +a	b	c	a	b	c	d
 +1	21	123	1	21	909	12
 +1	21	101	1	21	909	12
 +1	21	104	1	21	909	12
 +1	33	988	1	21	909	12
 +1	19	107	1	21	909	12
 +1	21	500	1	21	909	12
 +1	21	345	1	21	909	12
 +7	11	708	7	13	312	406
 +7	11	8	7	13	312	406
 +8	33	404	8	64	248	107
 +8	33	123	8	64	248	107
 +8	33	114	8	64	248	107
 +8	33	9	8	64	248	107
 +6	20	214	6	20	315	279
 +6	20	315	6	20	315	279
 +6	20	309	6	20	315	279
 +6	20	7	6	20	315	279
 +1	21	123	1	19	203	107
 +1	21	101	1	19	203	107
 +1	21	104	1	19	203	107
 +1	33	988	1	19	203	107
 +1	19	107	1	19	203	107
 +1	21	500	1	19	203	107
 +1	21	345	1	19	203	107
 +8	33	404	8	80	800	314
 +8	33	123	8	80	800	314
 +8	33	114	8	80	800	314
 +8	33	9	8	80	800	314
 +6	20	214	6	23	303	909
 +6	20	315	6	23	303	909
 +6	20	309	6	23	303	909
 +6	20	7	6	23	303	909
 +select * from v3_union as v,t2 where (v.a=t2.a) and (v.c>6);
 +a	b	c	a	b	c	d
 +1	21	123	1	21	909	12
 +1	21	101	1	21	909	12
 +1	21	104	1	21	909	12
 +1	33	988	1	21	909	12
 +1	19	107	1	21	909	12
 +1	21	500	1	21	909	12
 +1	21	345	1	21	909	12
 +7	11	708	7	13	312	406
 +7	11	8	7	13	312	406
 +8	33	404	8	64	248	107
 +8	33	123	8	64	248	107
 +8	33	114	8	64	248	107
 +8	33	9	8	64	248	107
 +6	20	214	6	20	315	279
 +6	20	315	6	20	315	279
 +6	20	309	6	20	315	279
 +6	20	7	6	20	315	279
 +1	21	123	1	19	203	107
 +1	21	101	1	19	203	107
 +1	21	104	1	19	203	107
 +1	33	988	1	19	203	107
 +1	19	107	1	19	203	107
 +1	21	500	1	19	203	107
 +1	21	345	1	19	203	107
 +8	33	404	8	80	800	314
 +8	33	123	8	80	800	314
 +8	33	114	8	80	800	314
 +8	33	9	8	80	800	314
 +6	20	214	6	23	303	909
 +6	20	315	6	23	303	909
 +6	20	309	6	23	303	909
 +6	20	7	6	23	303	909
 +explain select * from v3_union as v,t2 where (v.a=t2.a) and (v.c>6);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	4	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v3_union as v,t2 where (v.a=t2.a) and (v.c>6);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "attached_condition": "v.c > 6",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.a < 10 and t1.a + 1 > 6"
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.b > 10 and t1.c > 100 and t1.c > 6"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union of selects without aggregation
 +# extracted conjunctive OR subformula: pushing in WHERE using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v3_union as v,t2 where (v.a=t2.a) and ((t2.a>1) or (v.b<20));
 +a	b	c	a	b	c	d
 +1	19	107	1	21	909	12
 +1	19	2	1	21	909	12
 +7	11	708	7	13	312	406
 +7	11	8	7	13	312	406
 +8	33	404	8	64	248	107
 +8	33	123	8	64	248	107
 +8	33	114	8	64	248	107
 +8	33	9	8	64	248	107
 +6	20	214	6	20	315	279
 +6	20	315	6	20	315	279
 +6	20	309	6	20	315	279
 +6	20	7	6	20	315	279
 +1	19	107	1	19	203	107
 +1	19	2	1	19	203	107
 +8	33	404	8	80	800	314
 +8	33	123	8	80	800	314
 +8	33	114	8	80	800	314
 +8	33	9	8	80	800	314
 +6	20	214	6	23	303	909
 +6	20	315	6	23	303	909
 +6	20	309	6	23	303	909
 +6	20	7	6	23	303	909
 +select * from v3_union as v,t2 where (v.a=t2.a) and ((t2.a>1) or (v.b<20));
 +a	b	c	a	b	c	d
 +1	19	107	1	21	909	12
 +1	19	2	1	21	909	12
 +7	11	708	7	13	312	406
 +7	11	8	7	13	312	406
 +8	33	404	8	64	248	107
 +8	33	123	8	64	248	107
 +8	33	114	8	64	248	107
 +8	33	9	8	64	248	107
 +6	20	214	6	20	315	279
 +6	20	315	6	20	315	279
 +6	20	309	6	20	315	279
 +6	20	7	6	20	315	279
 +1	19	107	1	19	203	107
 +1	19	2	1	19	203	107
 +8	33	404	8	80	800	314
 +8	33	123	8	80	800	314
 +8	33	114	8	80	800	314
 +8	33	9	8	80	800	314
 +6	20	214	6	23	303	909
 +6	20	315	6	23	303	909
 +6	20	309	6	23	303	909
 +6	20	7	6	23	303	909
 +explain select * from v3_union as v,t2 where (v.a=t2.a) and ((t2.a>1) or (v.b<20));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	4	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v3_union as v,t2 where (v.a=t2.a) and ((t2.a>1) or (v.b<20));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 1 or v.b < 20",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.a < 10 and (t1.a > 1 or t1.b < 20)"
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.b > 10 and t1.c > 100 and (t1.a > 1 or t1.b < 20)"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union of selects without aggregation
 +# extracted the whole condition: in WHERE of both selects
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v3_union as v,t2 where
 +(v.a=t2.a) and ((v.b=19) or (v.b=21)) and ((v.c<3) or (v.c>600));
 +a	b	c	a	b	c	d
 +1	19	2	1	21	909	12
 +1	21	2	1	21	909	12
 +1	19	2	1	19	203	107
 +1	21	2	1	19	203	107
 +select * from v3_union as v,t2 where
 +(v.a=t2.a) and ((v.b=19) or (v.b=21)) and ((v.c<3) or (v.c>600));
 +a	b	c	a	b	c	d
 +1	19	2	1	21	909	12
 +1	21	2	1	21	909	12
 +1	19	2	1	19	203	107
 +1	21	2	1	19	203	107
 +explain select * from v3_union as v,t2 where
 +(v.a=t2.a) and ((v.b=19) or (v.b=21)) and ((v.c<3) or (v.c>600));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	4	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v3_union as v,t2 where
 +(v.a=t2.a) and ((v.b=19) or (v.b=21)) and ((v.c<3) or (v.c>600));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "attached_condition": "(v.b = 19 or v.b = 21) and (v.c < 3 or v.c > 600)",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.a < 10 and (t1.b = 19 or t1.b = 21) and (t1.a + 1 < 3 or t1.a + 1 > 600)"
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.b > 10 and t1.c > 100 and (t1.b = 19 or t1.b = 21) and (t1.c < 3 or t1.c > 600)"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union of
 +# a select without aggregation and a select with aggregation
 +# extracted conjunctive predicate: pushing in WHERE of both selects
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4_union as v,t2 where (v.a=t2.a) and (v.b<20);
 +a	b	c	a	b	c	d
 +1	19	207	1	21	909	12
 +7	11	808	7	13	312	406
 +7	11	608	7	13	312	406
 +1	19	207	1	19	203	107
 +select * from v4_union as v,t2 where (v.a=t2.a) and (v.b<20);
 +a	b	c	a	b	c	d
 +1	19	207	1	21	909	12
 +7	11	808	7	13	312	406
 +7	11	608	7	13	312	406
 +1	19	207	1	19	203	107
 +explain select * from v4_union as v,t2 where (v.a=t2.a) and (v.b<20);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	4	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v4_union as v,t2 where (v.a=t2.a) and (v.b<20);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "attached_condition": "v.b < 20",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 109",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 10 and t1.b < 20"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.b > 10 and t1.b < 20"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using derived table with union of
 +# a select without aggregation and a select with aggregation
 +# extracted subformula: pushing in WHERE of one select
 +# extracted subformula: pushing in HAVING of the other select
 +# extracted sub-subformula: pushing in WHERE of the other select
 +# using an equality in all pushdowns
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4_union as v,t2 where
 +(v.a=t2.a) and ((t2.a<3) or (v.b<40)) and (v.c>500);
 +a	b	c	a	b	c	d
 +1	33	1088	1	21	909	12
 +1	21	600	1	21	909	12
 +1	33	888	1	21	909	12
 +7	11	808	7	13	312	406
 +7	11	608	7	13	312	406
 +8	33	504	8	64	248	107
 +1	33	1088	1	19	203	107
 +1	21	600	1	19	203	107
 +1	33	888	1	19	203	107
 +8	33	504	8	80	800	314
 +select * from v4_union as v,t2 where
 +(v.a=t2.a) and ((t2.a<3) or (v.b<40)) and (v.c>500);
 +a	b	c	a	b	c	d
 +1	33	1088	1	21	909	12
 +1	21	600	1	21	909	12
 +1	33	888	1	21	909	12
 +7	11	808	7	13	312	406
 +7	11	608	7	13	312	406
 +8	33	504	8	64	248	107
 +1	33	1088	1	19	203	107
 +1	21	600	1	19	203	107
 +1	33	888	1	19	203	107
 +8	33	504	8	80	800	314
 +explain select * from v4_union as v,t2 where
 +(v.a=t2.a) and ((t2.a<3) or (v.b<40)) and (v.c>500);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	4	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	20	Using where
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v4_union as v,t2 where
 +(v.a=t2.a) and ((t2.a<3) or (v.b<40)) and (v.c>500);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "attached_condition": "(t2.a < 3 or v.b < 40) and v.c > 500",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 109 and c > 500",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 10 and (t1.a < 3 or t1.b < 40)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "rows": 20,
 +                    "filtered": 100,
 +                    "attached_condition": "t1.b > 10 and (t1.a < 3 or t1.b < 40) and t1.c + 100 > 500"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded derived table : pushing the same conditions
 +# using several derived tables : pushing in all tables
 +# conjunctive subformula : pushing into WHERE
 +# extracted and formula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v1 where
 +(v4.a<13) and (v1.a>5) and (v1.b>12);
 +a	b	min_c	a	b	max_c	avg_c
 +1	19	107	6	20	315	279.3333
 +1	21	500	6	20	315	279.3333
 +5	16	207	6	20	315	279.3333
 +5	27	132	6	20	315	279.3333
 +6	20	315	6	20	315	279.3333
 +8	33	404	6	20	315	279.3333
 +1	19	107	8	33	404	213.6667
 +1	21	500	8	33	404	213.6667
 +5	16	207	8	33	404	213.6667
 +5	27	132	8	33	404	213.6667
 +6	20	315	8	33	404	213.6667
 +8	33	404	8	33	404	213.6667
 +select * from v4,v1 where
 +(v4.a<13) and (v1.a>5) and (v1.b>12);
 +a	b	min_c	a	b	max_c	avg_c
 +1	19	107	6	20	315	279.3333
 +1	21	500	6	20	315	279.3333
 +5	16	207	6	20	315	279.3333
 +5	27	132	6	20	315	279.3333
 +6	20	315	6	20	315	279.3333
 +8	33	404	6	20	315	279.3333
 +1	19	107	8	33	404	213.6667
 +1	21	500	8	33	404	213.6667
 +5	16	207	8	33	404	213.6667
 +5	27	132	8	33	404	213.6667
 +6	20	315	8	33	404	213.6667
 +8	33	404	8	33	404	213.6667
 +explain select * from v4,v1 where
 +(v4.a<13) and (v1.a>5) and (v1.b>12);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where
 +1	PRIMARY	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v1 where
 +(v4.a<13) and (v1.a>5) and (v1.b>12);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 20,
 +      "filtered": 100,
 +      "attached_condition": "v4.a < 13",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 15 and v1.a < 13",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.a < 15 and t1.a < 13"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived4>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v1.a > 5 and v1.b > 12"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and t1.b > 12"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : nothing to push
 +# using several derived tables : pushing only in one table
 +# conjunctive subformula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a=v1.a) and (v1.b>30);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +8	33	404	8	33	404	213.6667	8	64	248	107
 +8	33	404	8	33	404	213.6667	8	80	800	314
 +select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a=v1.a) and (v1.b>30);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +8	33	404	8	33	404	213.6667	8	64	248	107
 +8	33	404	8	33	404	213.6667	8	80	800	314
 +explain select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a=v1.a) and (v1.b>30);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key1	key1	5	test.t2.a	2	
 +1	PRIMARY	<derived4>	ref	key0	key0	5	test.t2.a	2	Using where
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a=v1.a) and (v1.b>30);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key1"],
 +      "key": "key1",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 15",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.a < 15"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.b > 30",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.b > 30"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing different conditions
 +# using several derived tables : pushing in all tables
 +# conjunctive subformula : pushing into WHERE using equalities
 +# extracted and formula : pushing into WHERE using equalities
 +# conjunctive subformula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a>1) and (v4.a=v1.a) and (v4.min_c>100) and (v1.b<30);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	6	20	315	279.3333	6	20	315	279
 +6	20	315	6	20	315	279.3333	6	23	303	909
 +select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a>1) and (v4.a=v1.a) and (v4.min_c>100) and (v1.b<30);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	6	20	315	279.3333	6	20	315	279
 +6	20	315	6	20	315	279.3333	6	23	303	909
 +explain select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a>1) and (v4.a=v1.a) and (v4.min_c>100) and (v1.b<30);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key1	key1	5	test.t2.a	2	Using where
 +1	PRIMARY	<derived4>	ref	key0	key0	5	test.t2.a	2	Using where
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v1,t2 where
 +(v4.a=t2.a) and (v4.a>1) and (v4.a=v1.a) and (v4.min_c>100) and (v1.b<30);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 1 and t2.a is not null and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key1"],
 +      "key": "key1",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v4.min_c > 100",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "min_c > 100",
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 15 and v1.a > 1",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.a < 15 and t1.a > 1"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.b < 30",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 1 and t1.b < 30"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing different conditions
 +# using several derived tables : pushing in all tables
 +# extracted or formula : pushing into WHERE
 +# conjunctive subformula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v1,t2 where
 +(((v4.b>10) and (v4.a>1)) or (v4.b<20)) and (v1.max_c>200) and (v1.a=v4.a);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +1	19	107	1	21	500	234.6000	2	3	207	207
 +1	19	107	1	21	500	234.6000	1	21	909	12
 +1	19	107	1	21	500	234.6000	7	13	312	406
 +1	19	107	1	21	500	234.6000	8	64	248	107
 +1	19	107	1	21	500	234.6000	6	20	315	279
 +1	19	107	1	21	500	234.6000	1	19	203	107
 +1	19	107	1	21	500	234.6000	8	80	800	314
 +1	19	107	1	21	500	234.6000	3	12	231	190
 +1	19	107	1	21	500	234.6000	6	23	303	909
 +5	16	207	5	16	207	207.0000	2	3	207	207
 +5	16	207	5	16	207	207.0000	1	21	909	12
 +5	16	207	5	16	207	207.0000	7	13	312	406
 +5	16	207	5	16	207	207.0000	8	64	248	107
 +5	16	207	5	16	207	207.0000	6	20	315	279
 +5	16	207	5	16	207	207.0000	1	19	203	107
 +5	16	207	5	16	207	207.0000	8	80	800	314
 +5	16	207	5	16	207	207.0000	3	12	231	190
 +5	16	207	5	16	207	207.0000	6	23	303	909
 +5	27	132	5	16	207	207.0000	2	3	207	207
 +5	27	132	5	16	207	207.0000	1	21	909	12
 +5	27	132	5	16	207	207.0000	7	13	312	406
 +5	27	132	5	16	207	207.0000	8	64	248	107
 +5	27	132	5	16	207	207.0000	6	20	315	279
 +5	27	132	5	16	207	207.0000	1	19	203	107
 +5	27	132	5	16	207	207.0000	8	80	800	314
 +5	27	132	5	16	207	207.0000	3	12	231	190
 +5	27	132	5	16	207	207.0000	6	23	303	909
 +6	20	315	6	20	315	279.3333	2	3	207	207
 +6	20	315	6	20	315	279.3333	1	21	909	12
 +6	20	315	6	20	315	279.3333	7	13	312	406
 +6	20	315	6	20	315	279.3333	8	64	248	107
 +6	20	315	6	20	315	279.3333	6	20	315	279
 +6	20	315	6	20	315	279.3333	1	19	203	107
 +6	20	315	6	20	315	279.3333	8	80	800	314
 +6	20	315	6	20	315	279.3333	3	12	231	190
 +6	20	315	6	20	315	279.3333	6	23	303	909
 +8	33	404	8	33	404	213.6667	2	3	207	207
 +8	33	404	8	33	404	213.6667	1	21	909	12
 +8	33	404	8	33	404	213.6667	7	13	312	406
 +8	33	404	8	33	404	213.6667	8	64	248	107
 +8	33	404	8	33	404	213.6667	6	20	315	279
 +8	33	404	8	33	404	213.6667	1	19	203	107
 +8	33	404	8	33	404	213.6667	8	80	800	314
 +8	33	404	8	33	404	213.6667	3	12	231	190
 +8	33	404	8	33	404	213.6667	6	23	303	909
 +select * from v4,v1,t2 where
 +(((v4.b>10) and (v4.a>1)) or (v4.b<20)) and (v1.max_c>200) and (v1.a=v4.a);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +1	19	107	1	21	500	234.6000	2	3	207	207
 +1	19	107	1	21	500	234.6000	1	21	909	12
 +1	19	107	1	21	500	234.6000	7	13	312	406
 +1	19	107	1	21	500	234.6000	8	64	248	107
 +1	19	107	1	21	500	234.6000	6	20	315	279
 +1	19	107	1	21	500	234.6000	1	19	203	107
 +1	19	107	1	21	500	234.6000	8	80	800	314
 +1	19	107	1	21	500	234.6000	3	12	231	190
 +1	19	107	1	21	500	234.6000	6	23	303	909
 +5	16	207	5	16	207	207.0000	2	3	207	207
 +5	16	207	5	16	207	207.0000	1	21	909	12
 +5	16	207	5	16	207	207.0000	7	13	312	406
 +5	16	207	5	16	207	207.0000	8	64	248	107
 +5	16	207	5	16	207	207.0000	6	20	315	279
 +5	16	207	5	16	207	207.0000	1	19	203	107
 +5	16	207	5	16	207	207.0000	8	80	800	314
 +5	16	207	5	16	207	207.0000	3	12	231	190
 +5	16	207	5	16	207	207.0000	6	23	303	909
 +5	27	132	5	16	207	207.0000	2	3	207	207
 +5	27	132	5	16	207	207.0000	1	21	909	12
 +5	27	132	5	16	207	207.0000	7	13	312	406
 +5	27	132	5	16	207	207.0000	8	64	248	107
 +5	27	132	5	16	207	207.0000	6	20	315	279
 +5	27	132	5	16	207	207.0000	1	19	203	107
 +5	27	132	5	16	207	207.0000	8	80	800	314
 +5	27	132	5	16	207	207.0000	3	12	231	190
 +5	27	132	5	16	207	207.0000	6	23	303	909
 +6	20	315	6	20	315	279.3333	2	3	207	207
 +6	20	315	6	20	315	279.3333	1	21	909	12
 +6	20	315	6	20	315	279.3333	7	13	312	406
 +6	20	315	6	20	315	279.3333	8	64	248	107
 +6	20	315	6	20	315	279.3333	6	20	315	279
 +6	20	315	6	20	315	279.3333	1	19	203	107
 +6	20	315	6	20	315	279.3333	8	80	800	314
 +6	20	315	6	20	315	279.3333	3	12	231	190
 +6	20	315	6	20	315	279.3333	6	23	303	909
 +8	33	404	8	33	404	213.6667	2	3	207	207
 +8	33	404	8	33	404	213.6667	1	21	909	12
 +8	33	404	8	33	404	213.6667	7	13	312	406
 +8	33	404	8	33	404	213.6667	8	64	248	107
 +8	33	404	8	33	404	213.6667	6	20	315	279
 +8	33	404	8	33	404	213.6667	1	19	203	107
 +8	33	404	8	33	404	213.6667	8	80	800	314
 +8	33	404	8	33	404	213.6667	3	12	231	190
 +8	33	404	8	33	404	213.6667	6	23	303	909
 +explain select * from v4,v1,t2 where
 +(((v4.b>10) and (v4.a>1)) or (v4.b<20)) and (v1.max_c>200) and (v1.a=v4.a);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using join buffer (flat, BNL join)
 +1	PRIMARY	<derived4>	ref	key0	key0	5	v4.a	2	Using where
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v1,t2 where
 +(((v4.b>10) and (v4.a>1)) or (v4.b<20)) and (v1.max_c>200) and (v1.a=v4.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100,
 +        "attached_condition": "v4.b > 10 and v4.a > 1 or v4.b < 20"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "(v4.b > 10 and v4.a > 1 or v4.b < 20) and v4.a is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 15 and (v1.b > 10 and v1.a > 1 or v1.b < 20)",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.a < 15 and (t1.b > 10 and t1.a > 1 or t1.b < 20)"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["v4.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.max_c > 200",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707 and max_c > 200",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing different conditions
 +# using several derived tables : pushing only in one table
 +# extracted or formula : pushing into WHERE
 +# extracted or formula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v2 where
 +((v4.a>12) and (v4.min_c<300) and (v4.b>13)) or (v4.a<1);
 +a	b	min_c	a	b	max_c	avg_c
 +select * from v4,v2 where
 +((v4.a>12) and (v4.min_c<300) and (v4.b>13)) or (v4.a<1);
 +a	b	min_c	a	b	max_c	avg_c
 +explain select * from v4,v2 where
 +((v4.a>12) and (v4.min_c<300) and (v4.b>13)) or (v4.a<1);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where
 +1	PRIMARY	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using join buffer (flat, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v2 where
 +((v4.a>12) and (v4.min_c<300) and (v4.b>13)) or (v4.a<1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 20,
 +      "filtered": 100,
 +      "attached_condition": "v4.a > 12 and v4.min_c < 300 and v4.b > 13 or v4.a < 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "v1.a > 12 and min_c < 300 and v1.b > 13 or v1.a < 1",
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 15 and (v1.a > 12 and v1.b > 13 or v1.a < 1)",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.a < 15 and (t1.a > 12 and t1.b > 13 or t1.a < 1)"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived4>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing different conditions
 +# using several derived tables : pushing only in one table
 +# conjunctive subformula : pushing into WHERE
 +# conjunctive subformula : pushing into HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v4.min_c<100);
 +a	b	min_c	a	b	max_c	avg_c
 +select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v4.min_c<100);
 +a	b	min_c	a	b	max_c	avg_c
 +explain select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v4.min_c<100);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where
 +1	PRIMARY	<derived4>	ref	key0	key0	5	v4.a	2	
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v4.min_c<100);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 20,
 +      "filtered": 100,
 +      "attached_condition": "v4.b = v4.a and v4.min_c < 100 and v4.a is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "min_c < 100",
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.b = v1.a and v1.a < 15",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.b = t1.a and t1.a < 15"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["v4.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing the same conditions
 +# using several derived tables : pushing in all tables
 +# extracted and formula : pushing into WHERE using equalities
 +# conjunctive subformula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v2.b<30);
 +a	b	min_c	a	b	max_c	avg_c
 +select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v2.b<30);
 +a	b	min_c	a	b	max_c	avg_c
 +explain select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v2.b<30);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where
 +1	PRIMARY	<derived4>	ref	key0	key0	5	v4.a	2	
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and (v2.b<30);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 20,
 +      "filtered": 100,
 +      "attached_condition": "v4.b = v4.a and v4.a < 30 and v4.a is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.b = v1.a and v1.a < 15 and v1.a < 30",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.b = t1.a and t1.a < 15 and t1.a < 30"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["v4.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and t1.b < 30"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing the same conditions
 +# using several derived tables : pushing in all tables
 +# extracted or formula : pushing into WHERE using equalities
 +# extracted and formula : pushing into WHERE using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and ((v2.b<30) or (v4.a>2));
 +a	b	min_c	a	b	max_c	avg_c
 +select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and ((v2.b<30) or (v4.a>2));
 +a	b	min_c	a	b	max_c	avg_c
 +explain select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and ((v2.b<30) or (v4.a>2));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where
 +1	PRIMARY	<derived4>	ref	key0	key0	5	v4.a	2	
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v2 where
 +(v4.a=v2.b) and (v4.a=v4.b) and ((v2.b<30) or (v4.a>2));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 20,
 +      "filtered": 100,
 +      "attached_condition": "v4.b = v4.a and (v4.a < 30 or v4.a > 2) and v4.a is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.b = v1.a and v1.a < 15 and (v1.a < 30 or v1.a > 2)",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.b = t1.a and t1.a < 15 and (t1.a < 30 or t1.a > 2)"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["v4.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5 and (t1.b < 30 or t1.b > 2)"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing the same conditions
 +# using several derived tables : pushing in all tables
 +# extracted or formula : pushing into WHERE
 +# conjunctive subformula : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v2 where
 +(((v4.a<12) and (v4.b>13)) or (v4.a>10)) and
 +(v4.min_c=v2.max_c) and (v4.min_c>100);
 +a	b	min_c	a	b	max_c	avg_c
 +6	20	315	6	20	315	279.3333
 +8	33	404	8	33	404	213.6667
 +select * from v4,v2 where
 +(((v4.a<12) and (v4.b>13)) or (v4.a>10)) and
 +(v4.min_c=v2.max_c) and (v4.min_c>100);
 +a	b	min_c	a	b	max_c	avg_c
 +6	20	315	6	20	315	279.3333
 +8	33	404	8	33	404	213.6667
 +explain select * from v4,v2 where
 +(((v4.a<12) and (v4.b>13)) or (v4.a>10)) and
 +(v4.min_c=v2.max_c) and (v4.min_c>100);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where
 +1	PRIMARY	<derived4>	ref	key0	key0	5	v4.min_c	2	
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v2 where
 +(((v4.a<12) and (v4.b>13)) or (v4.a>10)) and
 +(v4.min_c=v2.max_c) and (v4.min_c>100);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 20,
 +      "filtered": 100,
 +      "attached_condition": "(v4.a < 12 and v4.b > 13 or v4.a > 10) and v4.min_c > 100 and v4.min_c is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "min_c > 100",
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 15 and (v1.a < 12 and v1.b > 13 or v1.a > 10)",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.a < 15 and (t1.a < 12 and t1.b > 13 or t1.a > 10)"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived4>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["max_c"],
 +      "ref": ["v4.min_c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707 and max_c > 100",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using embedded view : pushing the same conditions
 +# using several derived tables : pushing only in one table
 +# extracted or formula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v4,v2,t2 where
 +(((v4.a<12) and (t2.b>13)) or (v4.a>10)) and
 +(v4.min_c=t2.c) and (t2.c>100);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	6	20	315	279.3333	6	20	315	279
 +6	20	315	8	33	404	213.6667	6	20	315	279
 +select * from v4,v2,t2 where
 +(((v4.a<12) and (t2.b>13)) or (v4.a>10)) and
 +(v4.min_c=t2.c) and (t2.c>100);
 +a	b	min_c	a	b	max_c	avg_c	a	b	c	d
 +6	20	315	6	20	315	279.3333	6	20	315	279
 +6	20	315	8	33	404	213.6667	6	20	315	279
 +explain select * from v4,v2,t2 where
 +(((v4.a<12) and (t2.b>13)) or (v4.a>10)) and
 +(v4.min_c=t2.c) and (t2.c>100);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.c	2	Using where
 +1	PRIMARY	<derived4>	ALL	NULL	NULL	NULL	NULL	20	Using join buffer (flat, BNL join)
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from v4,v2,t2 where
 +(((v4.a<12) and (t2.b>13)) or (v4.a>10)) and
 +(v4.min_c=t2.c) and (t2.c>100);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.c > 100 and t2.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["min_c"],
 +      "ref": ["test.t2.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v4.a < 12 and t2.b > 13 or v4.a > 10",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "min_c > 100",
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 15 and (v1.a < 12 or v1.a > 10)",
 +                "materialized": {
 +                  "query_block": {
 +                    "select_id": 3,
 +                    "having_condition": "max_c < 707",
 +                    "filesort": {
 +                      "sort_key": "t1.a, t1.b",
 +                      "temporary_table": {
 +                        "table": {
 +                          "table_name": "t1",
 +                          "access_type": "ALL",
 +                          "rows": 20,
 +                          "filtered": 100,
 +                          "attached_condition": "t1.a < 15 and (t1.a < 12 or t1.a > 10)"
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived4>",
 +        "access_type": "ALL",
 +        "rows": 20,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "having_condition": "max_c < 707",
 +          "filesort": {
 +            "sort_key": "t1.a, t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t1.a > 5"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1,v2,v3,v4;
 +drop view v_union,v2_union,v3_union,v4_union;
 +drop view v_double,v_char,v_decimal;
 +drop table t1,t2,t1_double,t2_double,t1_char,t2_char,t1_decimal,t2_decimal;
 +#
 +# MDEV-10782: condition extracted from a multiple equality
 +#             pushed into HAVING
 +#
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(2);
 +EXPLAIN EXTENDED
 +SELECT *
 +FROM ( SELECT * FROM ( SELECT MIN(i) as f FROM t1 ) sq1 ) AS sq2
 +WHERE f = 8;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	2	100.00	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	2	100.00	
 +Warnings:
 +Note	1003	/* select#1 */ select `sq1`.`f` AS `f` from (/* select#3 */ select min(`test`.`t1`.`i`) AS `f` from `test`.`t1` having `f` = 8) `sq1` where `sq1`.`f` = 8
 +SELECT *
 +FROM ( SELECT * FROM ( SELECT MIN(i) as f FROM t1 ) sq1 ) AS sq2
 +WHERE f = 8;
 +f
 +SELECT *
 +FROM ( SELECT * FROM ( SELECT MIN(i) as f FROM t1 ) sq1 ) AS sq2
 +WHERE f = 1;
 +f
 +1
 +DROP TABLE t1;
 +#
 +# MDEV-10783: pushdown into constant view
 +#
 +CREATE TABLE t1 (i int) ENGINE=MyISAM;
 +CREATE VIEW v AS SELECT 5;
 +SELECT * FROM t1 WHERE 1 IN ( SELECT * FROM v );
 +i
 +DROP VIEW v;
 +DROP TABLE t1;
 +#
 +# MDEV-10785: second execution of a query with condition
 +#             pushed into view
 +#
 +CREATE TABLE t1 (i int);
 +CREATE VIEW v1 AS SELECT i FROM t1 WHERE i < 5;
 +CREATE FUNCTION f (in1 int) RETURNS int RETURN in1;
 +CREATE VIEW v2 AS SELECT * FROM v1 GROUP BY i;
 +PREPARE stmt FROM "SELECT * FROM v2 WHERE f(0) <> 2";
 +EXECUTE stmt;
 +i
 +EXECUTE stmt;
 +i
 +DROP FUNCTION f;
 +DROP VIEW v2,v1;
 +DROP TABLE t1;
 +#
 +# MDEV-10884: condition pushdown into derived specified by
 +#             1. unit with  SELECT containing ORDER BY ... LIMIT
 +#             2. unit containing global ORDER BY ... LIMIT
 +#
 +create table t1(a int);
 +insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
 +select a from t1 order by a limit 5;
 +a
 +0
 +1
 +2
 +3
 +4
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for
 +select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
 +a
 +0
 +4
 +set statement optimizer_switch='condition_pushdown_for_derived=on' for
 +select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
 +a
 +0
 +4
 +select a from t1 where a < 4 union select a from t1 where a > 5
 +order by a limit 5;
 +a
 +0
 +1
 +2
 +3
 +6
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for
 +select * from
 +(select a from t1 where a < 4 union select a from t1 where a > 5
 +order by a limit 5) t where t.a not in (2,9);
 +a
 +0
 +1
 +3
 +6
 +set statement optimizer_switch='condition_pushdown_for_derived=on' for
 +select * from
 +(select a from t1 where a < 4 union select a from t1 where a > 5
 +order by a limit 5) t where t.a not in (2,9);
 +a
 +0
 +1
 +3
 +6
 +drop table t1;
 +#
 +# MDEV-11072: pushdown of the condition obtained
 +#             after constant row substitution
 +#
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +CREATE TABLE t2 (b INT) ENGINE=MyISAM;
 +CREATE OR REPLACE VIEW v2 AS SELECT * FROM t2;
 +CREATE TABLE t3 (c INT) ENGINE=MyISAM;
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
 +SELECT * FROM t1 WHERE a IN (
 +SELECT b FROM v2 WHERE b < a OR b IN (
 +SELECT c FROM v3 WHERE c = a
 +)
 +);
 +a
 +INSERT INTO t1 VALUES (2);
 +INSERT INTO t2 VALUES (3), (2);
 +INSERT INTO t3 VALUES (4), (1), (2), (7);
 +SELECT * FROM t1 WHERE a IN (
 +SELECT b FROM v2 WHERE b < a OR b IN (
 +SELECT c FROM v3 WHERE c = a
 +)
 +);
 +a
 +2
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM t1 WHERE a IN (
 +SELECT b FROM v2 WHERE b < a OR b IN (
 +SELECT c FROM v3 WHERE c = a
 +)
 +);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "const_condition": "0 or <in_optimizer>(2,<exists>(subquery#3))",
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t2.b = 2",
 +      "first_match": "t1"
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "<derived5>",
 +            "access_type": "index_subquery",
 +            "possible_keys": ["key0"],
 +            "key": "key0",
 +            "key_length": "5",
 +            "used_key_parts": ["c"],
 +            "ref": ["func"],
 +            "rows": 2,
 +            "filtered": 100,
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 5,
 +                "table": {
 +                  "table_name": "t3",
 +                  "access_type": "ALL",
 +                  "rows": 4,
 +                  "filtered": 100,
 +                  "attached_condition": "t3.c = 2"
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +CREATE TABLE t4 (d INT, e INT) ENGINE=MyISAM;
 +INSERT INTO t4 VALUES (1,10),(3,11),(2,10),(2,20),(3,21);
 +CREATE OR REPLACE VIEW v4 AS
 +SELECT d, sum(e) AS s FROM t4 GROUP BY d;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for SELECT * FROM t1 WHERE a IN (
 +SELECT b FROM v2 WHERE b < a OR b IN (
 +SELECT d FROM v4 WHERE s > a
 +)
 +);
 +a
 +2
 +SELECT * FROM t1 WHERE a IN (
 +SELECT b FROM v2 WHERE b < a OR b IN (
 +SELECT d FROM v4 WHERE s > a
 +)
 +);
 +a
 +2
 +explain SELECT * FROM t1 WHERE a IN (
 +SELECT b FROM v2 WHERE b < a OR b IN (
 +SELECT d FROM v4 WHERE s > a
 +)
 +);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	system	NULL	NULL	NULL	NULL	1	
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	2	Using where; FirstMatch(t1)
 +3	DEPENDENT SUBQUERY	<derived5>	index_subquery	key0	key0	5	func	2	Using where
 +5	DERIVED	t4	ALL	NULL	NULL	NULL	NULL	5	Using temporary; Using filesort
 +explain format=json SELECT * FROM t1 WHERE a IN (
 +SELECT b FROM v2 WHERE b < a OR b IN (
 +SELECT d FROM v4 WHERE s > a
 +)
 +);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "const_condition": "0 or <in_optimizer>(2,<exists>(subquery#3))",
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t2.b = 2",
 +      "first_match": "t1"
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "<derived5>",
 +            "access_type": "index_subquery",
 +            "possible_keys": ["key0"],
 +            "key": "key0",
 +            "key_length": "5",
 +            "used_key_parts": ["d"],
 +            "ref": ["func"],
 +            "rows": 2,
 +            "filtered": 100,
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 5,
 +                "having_condition": "s > 2",
 +                "filesort": {
 +                  "sort_key": "t4.d",
 +                  "temporary_table": {
 +                    "table": {
 +                      "table_name": "t4",
 +                      "access_type": "ALL",
 +                      "rows": 5,
 +                      "filtered": 100
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +DROP VIEW v2,v3,v4;
 +DROP TABLE t1,t2,t3,t4;
 +#
 +# MDEV-10800: pushdown of the condition obtained
 +#             after constant row substitution
 +#
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1);
 +CREATE TABLE t2 (b INT) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3),(4);
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +SELECT * FROM
 +( SELECT * FROM t1
 +WHERE EXISTS ( SELECT * FROM v2 WHERE b = a ) ) AS sq;
 +a
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM
 +( SELECT * FROM t1
 +WHERE EXISTS ( SELECT * FROM v2 WHERE b = a ) ) AS sq;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "const_condition": "<in_optimizer>(1,exists(subquery#3))",
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "<derived4>",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "v2.b = 1",
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 4,
 +                "table": {
 +                  "table_name": "t2",
 +                  "access_type": "ALL",
 +                  "rows": 2,
 +                  "filtered": 100,
 +                  "attached_condition": "t2.b = 1"
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-11102: condition pushdown into materialized inner table
 +#              of outer join is not applied as not being valid
 +#
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (0),(2);
 +CREATE TABLE t2 (b INT);
 +INSERT INTO t2 VALUES (1),(2);
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +SELECT * FROM t1 LEFT JOIN t2 ON a = b WHERE b IS NULL;
 +a	b
 +0	NULL
 +SELECT * FROM t1 LEFT JOIN v2 ON a = b WHERE b IS NULL;
 +a	b
 +0	NULL
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM t1 LEFT JOIN v2 ON a = b WHERE b IS NULL;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "trigcond(v2.b is null) and trigcond(trigcond(t1.a is not null))",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-11103: pushdown condition with ANY subquery
 +#
 +CREATE TABLE t1 (i INT);
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES (1),(2);
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 WHERE i <= ANY ( SELECT 3 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "<nop>(v1.i <= 3)",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "<nop>(t1.i <= 3)"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +Warnings:
 +Note	1249	Select 2 was reduced during optimization
 +SELECT * FROM v1 WHERE i <= ANY ( SELECT 3 );
 +i
 +1
 +2
 +DROP VIEW v1;
 +DROP TABLE t1;
 +#
 +# MDEV-11315: condition with outer reference to mergeable derived
 +#
 +CREATE TABLE t1 (pk1 INT PRIMARY KEY, a INT, b INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (10,7,1),(11,0,2);
 +CREATE TABLE t2 (pk2 INT PRIMARY KEY, c INT, d DATETIME) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES
 +(1,4,'2008-09-27 00:34:58'),
 +(2,5,'2007-05-28 00:00:00'),
 +(3,6,'2009-07-25 09:21:20');
 +CREATE VIEW v1 AS SELECT * FROM t1;
 +CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +SELECT * FROM v1 AS sq
 +WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +pk1	a	b
 +10	7	1
 +11	0	2
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 AS sq
 +WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "<in_optimizer>(t1.b,<exists>(subquery#2)) or t1.b = 100"
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "<derived4>",
 +            "access_type": "index_subquery",
 +            "possible_keys": ["key0"],
 +            "key": "key0",
 +            "key_length": "4",
 +            "used_key_parts": ["pk2"],
 +            "ref": ["func"],
 +            "rows": 2,
 +            "filtered": 100,
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 4,
 +                "table": {
 +                  "table_name": "t2",
 +                  "access_type": "ALL",
 +                  "rows": 3,
 +                  "filtered": 100
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +SELECT * FROM ( SELECT * FROM t1 ) AS sq
 +WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +pk1	a	b
 +10	7	1
 +11	0	2
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT * FROM t1 ) AS sq
 +WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "<in_optimizer>(t1.b,<exists>(subquery#3)) or t1.b = 100"
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "<derived4>",
 +            "access_type": "index_subquery",
 +            "possible_keys": ["key0"],
 +            "key": "key0",
 +            "key_length": "4",
 +            "used_key_parts": ["pk2"],
 +            "ref": ["func"],
 +            "rows": 2,
 +            "filtered": 100,
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 4,
 +                "table": {
 +                  "table_name": "t2",
 +                  "access_type": "ALL",
 +                  "rows": 3,
 +                  "filtered": 100
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +DROP VIEW v1,v2;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-11313: pushdown of the condition obtained
 +#             after constant row substitution
 +#
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(2);
 +CREATE TABLE t2 (b INT) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (50);
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +SELECT ( SELECT COUNT(*) FROM v1 WHERE a = t2.b ) AS f FROM t2 GROUP BY f;
 +f
 +0
 +EXPLAIN FORMAT=JSON
 +SELECT ( SELECT COUNT(*) FROM v1 WHERE a = t2.b ) AS f FROM t2 GROUP BY f;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "<derived3>",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "v1.a = 50",
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 3,
 +                "table": {
 +                  "table_name": "t1",
 +                  "access_type": "ALL",
 +                  "rows": 2,
 +                  "filtered": 100,
 +                  "attached_condition": "t1.a = 50"
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +CREATE TABLE t3 (a INT, b INT) ENGINE=MYISAM;
 +INSERT INTO t3 VALUES (1,10),(3,11),(2,10),(2,20),(3,21);
 +CREATE VIEW v2 AS SELECT a, sum(b) AS s FROM t3 GROUP BY a ;
 +SELECT ( SELECT COUNT(*) FROM v2 WHERE s < t2.b ) AS f FROM t2 GROUP BY f;
 +f
 +3
 +EXPLAIN FORMAT=JSON
 +SELECT ( SELECT COUNT(*) FROM v2 WHERE s < t2.b ) AS f FROM t2 GROUP BY f;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "<derived3>",
 +            "access_type": "ALL",
 +            "rows": 5,
 +            "filtered": 100,
 +            "attached_condition": "v2.s < 50",
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 3,
 +                "having_condition": "s < 50",
 +                "filesort": {
 +                  "sort_key": "t3.a",
 +                  "temporary_table": {
 +                    "table": {
 +                      "table_name": "t3",
 +                      "access_type": "ALL",
 +                      "rows": 5,
 +                      "filtered": 100
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +DROP VIEW v1,v2;
 +DROP TABLE t1,t2,t3;
 +#
 +# MDEV-10882: pushdown of the predicate with cached value
 +#
 +CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL) ENGINE=MyISAM;
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES (1,2),(3,4);
 +CREATE TABLE t2 (c INT NOT NULL) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (5),(6);
 +SELECT a, GROUP_CONCAT(b) FROM v1
 +WHERE b IN ( SELECT COUNT(c) FROM t2 ) GROUP BY a;
 +a	GROUP_CONCAT(b)
 +1	2
 +EXPLAIN FORMAT=JSON
 +SELECT a, GROUP_CONCAT(b) FROM v1
 +WHERE b IN ( SELECT COUNT(c) FROM t2 ) GROUP BY a;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery2>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "read_sorted_file": {
 +      "filesort": {
 +        "sort_key": "v1.a",
 +        "table": {
 +          "table_name": "<derived3>",
 +          "access_type": "ALL",
 +          "rows": 2,
 +          "filtered": 100,
 +          "attached_condition": "v1.b = 2",
 +          "materialized": {
 +            "query_block": {
 +              "select_id": 3,
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 2,
 +                "filtered": 100,
 +                "attached_condition": "t1.b = 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-10836: pushdown of the predicate with cached value
 +#
 +CREATE TABLE t (pk INT PRIMARY KEY, f INT) ENGINE=MyISAM;
 +CREATE ALGORITHM=TEMPTABLE VIEW v AS SELECT * FROM t;
 +INSERT INTO t VALUES (1,1),(3,2);
 +SELECT * FROM v AS v1, v AS v2
 +WHERE v2.pk > v1.f AND v1.f IN ( SELECT COUNT(pk) FROM t );
 +pk	f	pk	f
 +3	2	3	2
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v AS v1, v AS v2
 +WHERE v2.pk > v1.f AND v1.f IN ( SELECT COUNT(pk) FROM t );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery2>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.f = 2",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "t.f = 2"
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived4>",
 +        "access_type": "ALL",
 +        "rows": 2,
 +        "filtered": 100,
 +        "attached_condition": "v2.pk > 2"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 4,
 +          "table": {
 +            "table_name": "t",
 +            "access_type": "range",
 +            "possible_keys": ["PRIMARY"],
 +            "key": "PRIMARY",
 +            "key_length": "4",
 +            "used_key_parts": ["pk"],
 +            "rows": 2,
 +            "filtered": 100,
 +            "index_condition": "t.pk > 2"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v;
 +DROP TABLE t;
 +#
 +# MDEV-11488: pushdown of the predicate with cached value
 +#
 +CREATE TABLE t1 (i INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(3),(2);
 +CREATE TABLE t2 (j INT, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3),(4);
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +3
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "sq.i = 3",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.i = 3"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +UPDATE t2 SET j = 2 WHERE j = 3;
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +2
 +DROP TABLE t1,t2;
 +CREATE TABLE t1 (i FLOAT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1.5),(3.2),(2.71);
 +CREATE TABLE t2 (j FLOAT, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3.2),(2.71);
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +2.71
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "sq.i = 2.71",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.i = 2.7100000381469727"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +CREATE TABLE t1 (i DECIMAL(10,2)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1.5),(3.21),(2.47);
 +CREATE TABLE t2 (j DECIMAL(10,2), KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3.21),(4.55);
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +3.21
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "sq.i = 3.21",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.i = 3.21"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +CREATE TABLE t1 (i VARCHAR(32)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('cc'),('aa'),('ddd');
 +CREATE TABLE t2 (j VARCHAR(16), KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES ('bbb'),('aa');
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +aa
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "sq.i = 'aa'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.i = 'aa'"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +CREATE TABLE t1 (i DATETIME) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES
 +('2008-09-27 00:34:58'),('2007-05-28 00:00:00'), ('2009-07-25 09:21:20');
 +CREATE TABLE t2 (j DATETIME, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES
 +('2007-05-28 00:00:00'), ('2010-08-25 00:00:00');
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +2007-05-28 00:00:00
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "sq.i = '2007-05-28 00:00:00'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.i = TIMESTAMP'2007-05-28 00:00:00'"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +CREATE TABLE t1 (i DATE) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('2008-09-27'),('2007-05-28'), ('2009-07-25');
 +CREATE TABLE t2 (j DATE, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES ('2007-05-28'), ('2010-08-25');
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +2007-05-28
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "sq.i = '2007-05-28'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.i = DATE'2007-05-28'"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +CREATE TABLE t1 (i TIME) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('00:34:58'),('10:00:02'), ('09:21:20');
 +CREATE TABLE t2 (j TIME, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES ('10:00:02'), ('11:00:10');
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +i
 +10:00:02
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "message": "Select tables optimized away"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "sq.i = '10:00:02'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.i = TIME'10:00:02'"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +#
 +# MDEV-11593: pushdown of condition with NULLIF
 +#
 +CREATE TABLE t1 (i INT);
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES (2), (1);
 +SELECT * FROM v1 WHERE NULLIF(1, i);
 +i
 +2
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 WHERE NULLIF(1, i);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "nullif(1,v1.i)",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "nullif(1,t1.i)"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v1;
 +DROP TABLE t1;
 +#
 +# MDEV-11608: pushdown of the predicate with cached null value
 +#
 +CREATE TABLE t1 (c VARCHAR(3));
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES ('foo'),('bar');
 +CREATE TABLE t2 (c VARCHAR(3));
 +INSERT INTO t2 VALUES ('foo'),('xyz');
 +SELECT * FROM v1 WHERE v1.c IN ( SELECT MIN(c) FROM t2 WHERE 0 );
 +c
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 WHERE v1.c IN ( SELECT MIN(c) FROM t2 WHERE 0 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<subquery2>",
 +      "access_type": "system",
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "message": "Impossible WHERE"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c = NULL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "t1.c = NULL"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +CREATE TABLE t1 (d DECIMAL(10,2));
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES (5.37),(1.1);
 +CREATE TABLE t2 (d DECIMAL(10,2));
 +INSERT INTO t2 VALUES ('1.1'),('2.23');
 +SELECT * FROM v1 WHERE v1.d IN ( SELECT MIN(d) FROM t2 WHERE 0 );
 +d
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-11820: second execution of PS for query
 +#             with false subquery predicate in WHERE
 +#
 +CREATE TABLE t1 (c VARCHAR(3)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('foo'),('bar');
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +CREATE TABLE t2 (a INT);
 +INSERT INTO t2 VALUES (3), (4);
 +PREPARE stmt1 FROM
 +" SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
 +PREPARE stmt2 FROM
 +"EXPLAIN FORMAT=JSON
 + SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
 +EXECUTE stmt1;
 +c
 +foo
 +EXECUTE stmt2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c = 'foo'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "t1.c = 'foo'"
 +          }
 +        }
 +      }
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "1 = t2.a"
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +EXECUTE stmt1;
 +c
 +foo
 +EXECUTE stmt2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "<cache>(<in_optimizer>(1,<exists>(subquery#2))) or v1.c = 'foo'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    },
 +    "subqueries": [
 +      {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ALL",
 +            "rows": 128,
 +            "filtered": 100,
 +            "attached_condition": "1 = t2.a"
 +          }
 +        }
 +      }
 +    ]
 +  }
 +}
 +DEALLOCATE PREPARE stmt1;
 +DEALLOCATE PREPARE stmt2;
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-12373: pushdown into derived with side effects is prohibited
 +#
 +CREATE TABLE sales_documents (
 +id           int NOT NULL AUTO_INCREMENT,
 +sale_id      int NULL DEFAULT NULL,
 +type         tinyint unsigned NULL DEFAULT NULL,
 +data         text NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
 +date         date NULL DEFAULT NULL,
 +order_number int unsigned NULL DEFAULT NULL,
 +created_at   int NULL DEFAULT NULL,
 +updated_at   int NULL DEFAULT NULL,
 +generated    tinyint NOT NULL DEFAULT '0',
 +synced_at    int NOT NULL DEFAULT '0',
 +sum          decimal(13,2) NOT NULL DEFAULT '0',
 +PRIMARY KEY (id)
 +);
 +INSERT INTO sales_documents
 +(id, sale_id, type, order_number, data, created_at,
 +updated_at, date, generated, synced_at, sum)
 +VALUES
 +(555, 165, 3, 5, '{}', 1486538300, 1486722835, '2017-02-17', 0, 1486538313, 2320.00),
 +(556, 165, 2, 3, '{}', 1486538304, 1486563125, '2017-02-08', 1, 1486538302, 2320.00),
 +(557, 158, 2, 2, '{}', 1486538661, 1486538661, '2017-02-08', 0, 1486538660, 2320.00),
 +(558, 171, 1, 3, '{}', 1486539104, 1488203405, '2017-02-08', 1, 1486539102, 23230.00),
 +(559, 171, 2, 5, '{}', 1486549233, 1487146010, '2017-02-08', 1, 1486549225, 37690.00),
 +(560, 172, 1, 1, '{}', 1486658260, 1488203409, '2017-02-09', 1, 1486658256, 40312.00),
 +(561, 172, 2, 1, '{}', 1486711997, 1486711997, '2017-02-10', 1, 1486711996, 40312.00),
 +(562, 172, 3, 1, '{}', 1486712104, 1486721395, '2017-02-10', 1, 1486712101, 40312.00),
 +(563, 171, 3, 2, '{}', 1486712953, 1486720244, '2017-02-10', 1, 1486712910, 23230.00),
 +(564, 170, 1, 2, '{}', 1486715948, 1488203410, '2017-02-10', 1, 1486715930, 28873.00),
 +(565, 170, 3, 3, '{}', 1486716782, 1486717426, '2017-02-10', 1, 1486716779, 61948.00),
 +(566, 166, 3, 4, '{}', 1486720947, 1486720947, '2017-02-10', 1, 1486720945, 4640.00),
 +(567, 167, 3, 5, '{}', 1486722741, 1486722783, '2017-02-26', 0, 1486722738, 14755.00),
 +(568, 165, 1, 4, '{}', 1486722849, 1486722849, '2017-02-10', 0, 1486722846, 2320.00),
 +(569, 173, 2, 2, '{}', 1486723073, 1487071275, '2017-02-10', 1, 1486723071, 14282.00),
 +(570, 173, 1, 4, '{}', 1486723100, 1488203412, '2017-02-10', 1, 1486723099, 14282.00),
 +(571, 167, 2, 4, '{}', 1486730859, 1486730859, '2017-02-10', 1, 1486730856, 18655.00),
 +(572, 167, 1, 5, '{}', 1486730883, 1488203412, '2017-02-10', 1, 1486730877, 18655.00),
 +(573, 174, 2, 51, '{}', 1486731622, 1487060259, '2017-02-10', 1, 1486731620, 7140.00),
 +(574, 174, 3, 5, '{}', 1486993472, 1486993472, '2017-02-13', 1, 1488216147, 28020.00),
 +(575, 174, 1, 6, '{}', 1486993530, 1488203412, '2017-02-13', 1, 1486993505, 7140.00),
 +(576, 173, 3, 6, '{}', 1487071425, 1487071425, '2017-02-14', 0, 1487071422, 14282.00),
 +(577, 178, 2, 6, '{}', 1487327372, 1487327372, '2017-02-17', 1, 1487327370, 12321.00),
 +(578, 177, 2, 7, '{}', 1487327394, 1487327394, '2017-02-17', 0, 1487327391, 4270.00),
 +(579, 182, 3, 6, '{}', 1487750589, 1487751693, '2017-02-22', 1, 1487751688, 4270.00),
 +(580, 182, 2, 7, '{}', 1487750601, 1487750663, '2017-02-22', 1, 1487750598, 4270.00),
 +(581, 182, 1, 7, '{}', 1487750694, 1488203412, '2017-02-22', 1, 1487750692, 4270.00),
 +(582, 185, 3, 7, '{}', 1487774051, 1487774051, '2017-02-22', 0, 1487774043, 8913.00),
 +(583, 184, 3, 7, '{}', 1487774071, 1487774235, '2017-02-22', 0, 1487774093, 3285.00),
 +(584, 184, 2, 8, '{}', 1487774074, 1487774074, '2017-02-22', 0, 1487774073, 3285.00),
 +(585, 184, 1, 8, '{}', 1487774081, 1487774081, '2017-02-22', 0, 1487774075, 3285.00),
 +(586, 193, 2, 8, '{}', 1487955294, 1487955318, '2017-02-24', 0, 1487955311, 4270.00),
 +(587, 193, 1, 8, '{}', 1487955324, 1487955324, '2017-02-24', 0, 1487955320, 4270.00),
 +(588, 193, 3, 7, '{}', 1487955341, 1487955341, '2017-02-24', 0, 1487955325, 4270.00),
 +(589, 186, 1, 8, '{}', 1487957291, 1487957464, '2017-02-24', 0, 1487957459, 6960.00),
 +(590, 186, 2, 8, '{}', 1487957308, 1487957468, '2017-02-24', 0, 1487957465, 6960.00),
 +(591, 186, 3, 7, '{}', 1487957312, 1487957473, '2017-02-24', 0, 1487957469, 6960.00),
 +(592, 194, 1, 8, '{}', 1488193293, 1488203412, '2017-02-27', 1, 1488193280, 2320.00),
 +(593, 194, 2, 8, '{}', 1488193304, 1488193304, '2017-02-27', 1, 1488193303, 2320.00),
 +(594, 210, 1, 9, '{}', 1488198896, 1488198896, '2017-02-27', 0, 1488198885, 4270.00),
 +(595, 210, 2, 12, '{}', 1488198901, 1488198901, '2017-02-27', 1, 1488532585, 4270.00),
 +(596, 210, 3, 10, '{}', 1488198904, 1488198904, '2017-02-27', 1, 1488532565, 4270.00),
 +(597, 209, 2, 9, '{}', 1488200016, 1488450772, '2017-02-27', 1, 1488450449, 4270.00),
 +(598, 209, 1, 9, '{}', 1488200020, 1488200063, '2017-02-27', 1, 1488200017, 4271.00),
 +(599, 209, 3, 7, '{}', 1488200053, 1488200053, '2017-02-27', 0, 1488200021, 4271.00),
 +(600, 211, 2, 10, '{}', 1488216265, 1489402027, '2017-02-27', 1, 1488216264, 2320.00),
 +(601, 211, 3, 7, '{}', 1488216281, 1488216281, '2017-02-27', 1, 1488216276, 2320.00),
 +(602, 211, 1, 10, '{}', 1488216283, 1488216283, '2017-02-27', 1, 1488216282, 2320.00),
 +(603, 198, 2, 11, '{}', 1488280125, 1488280125, '2017-02-28', 0, 1488280095, 4270.00),
 +(604, 198, 1, 11, '{}', 1488280160, 1488280160, '2017-02-28', 0, 1488280126, 4270.00),
 +(605, 198, 3, 8, '{}', 1488280440, 1488280440, '2017-02-28', 0, 1488280435, 4270.00),
 +(606, 212, 1, 12, '{}', 1488286301, 1489402168, '2017-02-28', 1, 1488286295, 13825.00),
 +(607, 212, 3, 8, '{}', 1488289644, 1488289690, '2017-02-28', 1, 1488289642, 25295.00),
 +(608, 212, 2, 13, '{}', 1488290350, 1488290431, '2017-02-28', 1, 1488290347, 13133.75),
 +(609, 213, 1, 11, '{}', 1488529470, 1488529470, '2017-03-03', 1, 1488529461, 5660.00),
 +(610, 213, 2, 11, '{}', 1488529484, 1488529484, '2017-03-03', 1, 1488529479, 5660.00),
 +(611, 213, 3, 9, '{}', 1488529493, 1488529493, '2017-03-03', 1, 1488529489, 5660.00),
 +(612, 197, 2, 13, '{}', 1489400715, 1489400715, '2017-03-13', 0, 1489398959, 4270.00),
 +(613, 219, 3, 11, '{}', 1490084337, 1490181958, '2017-03-21', 1, 1490084334, 73526.00),
 +(614, 216, 3, 11, '{}', 1490085757, 1490086717, '2017-03-21', 0, 1490085755, 5377.00);
 +SELECT * FROM
 +(SELECT @row := @row + 1 as row, a.* from (
 +SELECT t.order_number
 +FROM sales_documents t
 +WHERE
 +t.type = 2 AND
 +t.date >= '2017-01-01' AND
 +t.date <= '2017-12-31' AND
 +t.order_number IS NOT NULL AND
 +t.generated = 1
 +GROUP BY t.order_number
 +) a, (SELECT @row := 0) r) t
 +WHERE row <> order_number;
 +row	order_number
 +14	51
 +DROP TABLE sales_documents;
 +#
 +# MDEV-12845: pushdown from merged derived using equalities
 +#
 +create table t1 (a int);
 +insert into t1 values
 +(4), (8), (5), (3), (10), (2), (7);
 +create table t2 (b int, c int);
 +insert into t2 values
 +(2,1), (5,2), (2,2), (4,1), (4,3),
 +(5,3), (2,4), (4,6), (2,1);
 +create view v1 as
 +select b, sum(c) as s from t2 group by b;
 +create view v2 as
 +select distinct b, c from t2;
 +create view v3 as
 +select b, max(c) as m from t2 group by b;
 +select b
 +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t
 +where b > 2;
 +b
 +4
 +5
 +explain format=json select b
 +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t
 +where b > 2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 7,
 +      "filtered": 100,
 +      "attached_condition": "t1.a > 2 and t1.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "filesort": {
 +            "sort_key": "t2.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t2.b > 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +select a
 +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t
 +where a > 2;
 +a
 +4
 +5
 +explain format=json select a
 +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t
 +where a > 2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 7,
 +      "filtered": 100,
 +      "attached_condition": "t1.a > 2 and t1.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "filesort": {
 +            "sort_key": "t2.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100,
 +                "attached_condition": "t2.b > 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +select a
 +from  ( select t1.a, v2.b, v2.c from t1, v2 where t1.a = v2.b ) as t
 +where a > 2;
 +a
 +4
 +4
 +4
 +5
 +5
 +explain format=json select a
 +from  ( select t1.a, v2.b, v2.c from t1, v2 where t1.a = v2.b ) as t
 +where a > 2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 7,
 +      "filtered": 100,
 +      "attached_condition": "t1.a > 2 and t1.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "temporary_table": {
 +            "table": {
 +              "table_name": "t2",
 +              "access_type": "ALL",
 +              "rows": 9,
 +              "filtered": 100,
 +              "attached_condition": "t2.b > 2"
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +select a
 +from  ( select t1.a, v3.b, v3.m from t1, v3 where t1.a = v3.m ) as t
 +where a > 2;
 +a
 +4
 +3
 +explain format=json select a
 +from  ( select t1.a, v3.b, v3.m from t1, v3 where t1.a = v3.m ) as t
 +where a > 2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 7,
 +      "filtered": 100,
 +      "attached_condition": "t1.a > 2 and t1.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["m"],
 +      "ref": ["test.t1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "m > 2",
 +          "filesort": {
 +            "sort_key": "t2.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "rows": 9,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1,v2,v3;
 +drop table t1,t2;
 +#
 +# MDEV-13166: pushdown from merged derived
 +#
 +CREATE TABLE t1 (i int) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(2);
 +CREATE VIEW v1 AS SELECT MAX(i) AS f FROM t1;
 +SELECT * FROM ( SELECT * FROM v1 ) AS sq WHERE f > 0;
 +f
 +2
 +explain format=json SELECT * FROM ( SELECT * FROM v1 ) AS sq WHERE f > 0;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.f > 0",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "f > 0",
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v1;
 +DROP TABLE t1;
 +#
 +# MDEV-13193: pushdown of equality extracted from multiple equality
 +#
 +CREATE TABLE t1 (i1 int, KEY(i1)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(2);
 +CREATE TABLE t2 (i2 int) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (2),(4);
 +CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +SELECT * FROM t1, ( SELECT * FROM v2 ) AS sq
 +WHERE i1 = 1 AND ( i1 = i2 OR i1 = 2 );
 +i1	i2
 +explain format=json SELECT * FROM t1, ( SELECT * FROM v2 ) AS sq
 +WHERE i1 = 1 AND ( i1 = i2 OR i1 = 2 );
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ref",
 +      "possible_keys": ["i1"],
 +      "key": "i1",
 +      "key_length": "5",
 +      "used_key_parts": ["i1"],
 +      "ref": ["const"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "using_index": true
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived3>",
 +        "access_type": "ALL",
 +        "rows": 2,
 +        "filtered": 100,
 +        "attached_condition": "v2.i2 = 1"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "t2.i2 = 1"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-14237: derived with regexp_substr() in select list
 +#
 +create table t1 (a char(8));
 +insert into t1 values ('b'), ('a'), ('xx');
 +select *
 +from ( select distinct regexp_substr(t1.a,'^[A-Za-z]+') as f from t1) as t
 +where t.f = 'a' or t.f = 'b';
 +f
 +b
 +a
 +explain format=json select *
 +from ( select distinct regexp_substr(t1.a,'^[A-Za-z]+') as f from t1) as t
 +where t.f = 'a' or t.f = 'b';
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "t.f = 'a' or t.f = 'b'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "temporary_table": {
 +            "table": {
 +              "table_name": "t1",
 +              "access_type": "ALL",
 +              "rows": 3,
 +              "filtered": 100
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop table t1;
 +#
 +# MDEV-13454: consequence of mdev-14368 fixed for 5.5
 +#
 +SET  sql_mode = 'ONLY_FULL_GROUP_BY';
 +create table t1 (id int, id2 int);
 +insert into t1 values (1,1),(2,3),(3,4),(7,2);
 +create table t2(id2 int);
 +insert  t2 values (1),(2),(3);
 +SELECT * FROM t1
 +LEFT OUTER JOIN
 +(SELECT id2, COUNT(*) as ct FROM t2 GROUP BY id2) vc USING (id2)
 +WHERE (vc.ct>0);
 +id2	id	ct
 +1	1	1
 +3	2	1
 +2	7	1
 +EXPLAIN FORMAT=JSON SELECT * FROM t1
 +LEFT OUTER JOIN
 +(SELECT id2, COUNT(*) as ct FROM t2 GROUP BY id2) vc USING (id2)
 +WHERE (vc.ct>0);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "vc.ct > 0",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "ct > 0",
 +          "filesort": {
 +            "sort_key": "t2.id2",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t1",
 +        "access_type": "ALL",
 +        "rows": 4,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t1.id2 = vc.id2"
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +SET  sql_mode = DEFAULT;
 +#
 +# MDEV-15579: incorrect removal of sub-formulas to be pushed
 +#             into WHERE of materialized derived with GROUP BY
 +#
 +CREATE TABLE t1 (a INT, b INT, c INT, d INT);
 +CREATE TABLE t2 (x INT, y INT, z INT);
 +INSERT INTO t1 VALUES (1,1,66,1), (1,1,56,2), (3,2,42,3);
 +INSERT INTO t2 VALUES (1,1,66), (1,12,32);
 +SELECT *
 +FROM t2,
 +(
 +SELECT a, b, max(c) AS max_c
 +FROM t1
 +GROUP BY a
 +HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND
 +(v1.a=t2.x) AND (v1.max_c>30);
 +x	y	z	a	b	max_c
 +1	1	66	1	1	66
 +1	12	32	1	1	66
 +EXPLAIN SELECT *
 +FROM t2,
 +(
 +SELECT a, b, max(c) AS max_c
 +FROM t1
 +GROUP BY a
 +HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND
 +(v1.a=t2.x) AND (v1.max_c>30);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	2	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	3	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	3	Using where
 +EXPLAIN FORMAT=JSON SELECT *
 +FROM t2,
 +(
 +SELECT a, b, max(c) AS max_c
 +FROM t1
 +GROUP BY a
 +HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND
 +(v1.a=t2.x) AND (v1.max_c>30);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t2.x = 1"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 3,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 1 and v1.b = 1 and v1.max_c > 30"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c > 37 and max_c > 30 and t1.b = 1",
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.a = 1"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT *
 +FROM t2,
 +(
 +SELECT a, b, d, max(c) AS max_c
 +FROM t1
 +GROUP BY a,d
 +HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND (v1.b=v1.d) AND
 +(v1.a=t2.x) AND (v1.max_c>30);
 +x	y	z	a	b	d	max_c
 +1	1	66	1	1	1	66
 +1	12	32	1	1	1	66
 +EXPLAIN SELECT *
 +FROM t2,
 +(
 +SELECT a, b, d, max(c) AS max_c
 +FROM t1
 +GROUP BY a,d
 +HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND (v1.b=v1.d) AND
 +(v1.a=t2.x) AND (v1.max_c>30);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	2	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	3	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	3	Using where
 +EXPLAIN FORMAT=JSON SELECT *
 +FROM t2,
 +(
 +SELECT a, b, d, max(c) AS max_c
 +FROM t1
 +GROUP BY a,d
 +HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND (v1.b=v1.d) AND
 +(v1.a=t2.x) AND (v1.max_c>30);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t2.x = 1"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 3,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 1 and v1.b = 1 and v1.d = 1 and v1.max_c > 30"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "max_c > 37 and max_c > 30 and t1.b = 1",
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100,
 +            "attached_condition": "t1.a = 1 and t1.d = 1"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +#
 +# MDEV-15765: pushing condition with temporal constants
 +#             into constant tables
 +#
 +select * from (select  date('2018-01-01') as d
 +union all
 +select  date('2018-01-01') as d) as t
 +where t.d between date ('2017-01-01') and date ('2019-01-01');
 +d
 +2018-01-01
 +2018-01-01
 +select * from (select  date('2018-01-01') as d) as t
 +where t.d between date ('2017-01-01') and date ('2019-01-01');
 +d
 +2018-01-01
 +#
 +# MDEV-16088: pushdown into derived defined in the IN subquery
 +#
 +CREATE TABLE t1 (a INT, b INT);
 +CREATE TABLE t2 (e INT, f INT, g INT);
 +INSERT INTO t1 VALUES (1,14),(2,13),(1,19),(2,32),(3,24);
 +INSERT INTO t2 VALUES (1,19,2),(3,24,1),(1,12,2),(3,11,3),(2,32,1);
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e,d_tab.max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) AS max_f
 +FROM t2
 +GROUP BY t2.e
 +HAVING max_f>18
 +) as d_tab
 +WHERE d_tab.e>1
 +)
 +;
 +a	b
 +2	32
 +3	24
 +EXPLAIN SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e,d_tab.max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) AS max_f
 +FROM t2
 +GROUP BY t2.e
 +HAVING max_f>18
 +) as d_tab
 +WHERE d_tab.e>1
 +)
 +;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	5	
 +1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	8	func,func	1	
 +2	MATERIALIZED	<derived3>	ALL	NULL	NULL	NULL	NULL	5	Using where
 +3	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	5	Using where; Using temporary; Using filesort
 +EXPLAIN FORMAT=JSON SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e,d_tab.max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) AS max_f
 +FROM t2
 +GROUP BY t2.e
 +HAVING max_f>18
 +) as d_tab
 +WHERE d_tab.e>1
 +)
 +;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 5,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "<subquery2>",
 +      "access_type": "eq_ref",
 +      "possible_keys": ["distinct_key"],
 +      "key": "distinct_key",
 +      "key_length": "8",
 +      "used_key_parts": ["e", "max_f"],
 +      "ref": ["func", "func"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "<derived3>",
 +            "access_type": "ALL",
 +            "rows": 5,
 +            "filtered": 100,
 +            "attached_condition": "d_tab.e > 1",
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 3,
 +                "having_condition": "max_f > 18",
 +                "filesort": {
 +                  "sort_key": "t2.e",
 +                  "temporary_table": {
 +                    "table": {
 +                      "table_name": "t2",
 +                      "access_type": "ALL",
 +                      "rows": 5,
 +                      "filtered": 100,
 +                      "attached_condition": "t2.e > 1"
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e,d_tab.max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) AS max_f
 +FROM t2
 +GROUP BY t2.e
 +HAVING max_f>18
 +) as d_tab
 +WHERE d_tab.max_f<25
 +)
 +;
 +a	b
 +1	19
 +3	24
 +EXPLAIN SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e,d_tab.max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) AS max_f
 +FROM t2
 +GROUP BY t2.e
 +HAVING max_f>18
 +) as d_tab
 +WHERE d_tab.max_f<25
 +)
 +;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	5	
 +1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	8	func,func	1	
 +2	MATERIALIZED	<derived3>	ALL	NULL	NULL	NULL	NULL	5	Using where
 +3	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	5	Using temporary; Using filesort
 +EXPLAIN FORMAT=JSON SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e,d_tab.max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) AS max_f
 +FROM t2
 +GROUP BY t2.e
 +HAVING max_f>18
 +) as d_tab
 +WHERE d_tab.max_f<25
 +)
 +;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 5,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "<subquery2>",
 +      "access_type": "eq_ref",
 +      "possible_keys": ["distinct_key"],
 +      "key": "distinct_key",
 +      "key_length": "8",
 +      "used_key_parts": ["e", "max_f"],
 +      "ref": ["func", "func"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "<derived3>",
 +            "access_type": "ALL",
 +            "rows": 5,
 +            "filtered": 100,
 +            "attached_condition": "d_tab.max_f < 25",
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 3,
 +                "having_condition": "max_f > 18 and max_f < 25",
 +                "filesort": {
 +                  "sort_key": "t2.e",
 +                  "temporary_table": {
 +                    "table": {
 +                      "table_name": "t2",
 +                      "access_type": "ALL",
 +                      "rows": 5,
 +                      "filtered": 100
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +FROM t2
 +GROUP BY t2.e
 +) as d_tab
 +WHERE d_tab.e>1
 +GROUP BY d_tab.g
 +)
 +;
 +a	b
 +2	32
 +EXPLAIN SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +FROM t2
 +GROUP BY t2.e
 +) as d_tab
 +WHERE d_tab.e>1
 +GROUP BY d_tab.g
 +)
 +;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	5	Using where
 +1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	8	test.t1.a,test.t1.b	1	
 +2	MATERIALIZED	<derived3>	ALL	NULL	NULL	NULL	NULL	5	Using where; Using temporary
 +3	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	5	Using where; Using temporary; Using filesort
 +EXPLAIN FORMAT=JSON SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +FROM t2
 +GROUP BY t2.e
 +) as d_tab
 +WHERE d_tab.e>1
 +GROUP BY d_tab.g
 +)
 +;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 5,
 +      "filtered": 100,
 +      "attached_condition": "t1.a is not null and t1.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<subquery2>",
 +      "access_type": "eq_ref",
 +      "possible_keys": ["distinct_key"],
 +      "key": "distinct_key",
 +      "key_length": "8",
 +      "used_key_parts": ["e", "max_f"],
 +      "ref": ["test.t1.a", "test.t1.b"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "temporary_table": {
 +            "table": {
 +              "table_name": "<derived3>",
 +              "access_type": "ALL",
 +              "rows": 5,
 +              "filtered": 100,
 +              "attached_condition": "d_tab.e > 1",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "filesort": {
 +                    "sort_key": "t2.e",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t2",
 +                        "access_type": "ALL",
 +                        "rows": 5,
 +                        "filtered": 100,
 +                        "attached_condition": "t2.e > 1"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +FROM t2
 +GROUP BY t2.e
 +) as d_tab
 +WHERE d_tab.max_f>20
 +GROUP BY d_tab.g
 +)
 +;
 +a	b
 +2	32
 +EXPLAIN SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +FROM t2
 +GROUP BY t2.e
 +) as d_tab
 +WHERE d_tab.max_f>20
 +GROUP BY d_tab.g
 +)
 +;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	5	Using where
 +1	PRIMARY	<subquery2>	eq_ref	distinct_key	distinct_key	8	test.t1.a,test.t1.b	1	
 +2	MATERIALIZED	<derived3>	ALL	NULL	NULL	NULL	NULL	5	Using where; Using temporary
 +3	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	5	Using temporary; Using filesort
 +EXPLAIN FORMAT=JSON SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +(
 +SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +FROM (
 +SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +FROM t2
 +GROUP BY t2.e
 +) as d_tab
 +WHERE d_tab.max_f>20
 +GROUP BY d_tab.g
 +)
 +;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 5,
 +      "filtered": 100,
 +      "attached_condition": "t1.a is not null and t1.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<subquery2>",
 +      "access_type": "eq_ref",
 +      "possible_keys": ["distinct_key"],
 +      "key": "distinct_key",
 +      "key_length": "8",
 +      "used_key_parts": ["e", "max_f"],
 +      "ref": ["test.t1.a", "test.t1.b"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "temporary_table": {
 +            "table": {
 +              "table_name": "<derived3>",
 +              "access_type": "ALL",
 +              "rows": 5,
 +              "filtered": 100,
 +              "attached_condition": "d_tab.max_f > 20",
 +              "materialized": {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "having_condition": "max_f > 20",
 +                  "filesort": {
 +                    "sort_key": "t2.e",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t2",
 +                        "access_type": "ALL",
 +                        "rows": 5,
 +                        "filtered": 100
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1,t2;
 +#
 +# MDEV-15765: pushing condition with IN subquery defined with constants
 +#             using substitution
 +#
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (1),(2);
 +SELECT * FROM
 +(
 +SELECT DISTINCT * FROM t1
 +) der_tab
 +WHERE (a>0 AND a<2 OR a IN (2,3)) AND
 +(a=2 OR 0);
 +a
 +2
 +DROP TABLE t1;
 +#
 +# MDEV-16386: pushing condition into the HAVING clause when ambiguous
 +#             fields warning appears
 +#
 +CREATE TABLE t1 (a INT, b INT);
 +INSERT INTO t1 VALUES (1,2),(2,3),(3,4);
 +SELECT * FROM
 +(
 +SELECT t1.b AS a
 +FROM t1
 +GROUP BY t1.a
 +) dt
 +WHERE (dt.a=2);
 +a
 +2
 +EXPLAIN FORMAT=JSON SELECT * FROM
 +(
 +SELECT t1.b AS a
 +FROM t1
 +GROUP BY t1.a
 +) dt
 +WHERE (dt.a=2);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "dt.a = 2",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "a = 2",
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM
 +(
 +SELECT t1.b AS a
 +FROM t1
 +GROUP BY t1.a
 +HAVING (t1.a<3)
 +) dt
 +WHERE (dt.a>1);
 +a
 +2
 +3
 +EXPLAIN FORMAT=JSON SELECT * FROM
 +(
 +SELECT t1.b AS a
 +FROM t1
 +GROUP BY t1.a
 +HAVING (t1.a<3)
 +) dt
 +WHERE (dt.a>1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "dt.a > 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "t1.a < 3 and a > 1",
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM
 +(
 +SELECT 'ab' AS a
 +FROM t1
 +GROUP BY t1.a
 +) dt
 +WHERE (dt.a='ab');
 +a
 +ab
 +ab
 +ab
 +EXPLAIN FORMAT=JSON SELECT * FROM
 +(
 +SELECT 'ab' AS a
 +FROM t1
 +GROUP BY t1.a
 +) dt
 +WHERE (dt.a='ab');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "dt.a = 'ab'",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM
 +(
 +SELECT 1 AS a
 +FROM t1
 +GROUP BY t1.a
 +) dt
 +WHERE (dt.a=1);
 +a
 +1
 +1
 +1
 +EXPLAIN FORMAT=JSON SELECT * FROM
 +(
 +SELECT 1 AS a
 +FROM t1
 +GROUP BY t1.a
 +) dt
 +WHERE (dt.a=1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "dt.a = 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1;
 +#
 +# MDEV-16517: pushdown condition with the IN predicate defined
 +#             with non-constant values
 +#
 +CREATE TABLE t1 (a INT, b INT);
 +INSERT INTO t1 VALUES (1,2),(1,3);
 +SELECT * FROM
 +(
 +SELECT t1.a
 +FROM t1
 +WHERE 1 IN (0,t1.a)
 +GROUP BY t1.a
 +) AS dt1
 +JOIN
 +(
 +SELECT t1.a
 +FROM t1
 +WHERE 1 IN (0,t1.a)
 +) AS dt2
 +ON dt1.a = dt2.a;
 +a	a
 +1	1
 +1	1
 +EXPLAIN FORMAT=JSON SELECT * FROM
 +(
 +SELECT t1.a
 +FROM t1
 +WHERE 1 IN (0,t1.a)
 +GROUP BY t1.a
 +) AS dt1
 +JOIN
 +(
 +SELECT t1.a
 +FROM t1
 +WHERE 1 IN (0,t1.a)
 +) AS dt2
 +ON dt1.a = dt2.a;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "1 in (0,dt1.a)",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 2,
 +                "filtered": 100,
 +                "attached_condition": "1 in (0,t1.a) and 1 in (0,t1.a)"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t1",
 +        "access_type": "ALL",
 +        "rows": 2,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t1.a = dt1.a"
 +    }
 +  }
 +}
 +SELECT * FROM
 +(
 +SELECT t1.a,MAX(t1.b)
 +FROM t1
 +GROUP BY t1.a
 +) AS dt, t1
 +WHERE dt.a=t1.a AND dt.a IN (1,t1.a);
 +a	MAX(t1.b)	a	b
 +1	3	1	2
 +1	3	1	3
 +EXPLAIN FORMAT=JSON SELECT * FROM
 +(
 +SELECT t1.a,MAX(t1.b)
 +FROM t1
 +GROUP BY t1.a
 +) AS dt, t1
 +WHERE dt.a=t1.a AND dt.a IN (1,t1.a);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "dt.a in (1,dt.a)",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 2,
 +                "filtered": 100,
 +                "attached_condition": "t1.a in (1,t1.a)"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t1",
 +        "access_type": "ALL",
 +        "rows": 2,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t1.a = dt.a"
 +    }
 +  }
 +}
 +DROP TABLE t1;
 +#
 +# MDEV-15087: error from inexpensive subquery before check
 +#                   for condition pushdown into derived
 +#
 +CREATE TABLE t1 (i1 int, v1 varchar(1));
 +INSERT INTO t1 VALUES (7,'x');
 +CREATE TABLE t2 (i1 int);
 +INSERT INTO t2 VALUES (8);
 +CREATE TABLE t3 (i1 int ,v1 varchar(1), v2 varchar(1));
 +INSERT INTO t3 VALUES (4, 'v','v'),(62,'v','k'),(7, 'n', NULL);
 +SELECT 1
 +FROM (t1 AS a1
 +JOIN (((SELECT  DISTINCT t3.*
 +FROM t3) AS a2
 +JOIN t1 ON (t1.v1 = a2.v2))) ON (t1.v1 = a2.v1))
 +WHERE (SELECT  BIT_COUNT(t2.i1)
 +FROM (t2 JOIN t3)) IS NULL;
 +ERROR 21000: Subquery returns more than 1 row
 +DROP TABLE t1, t2, t3;
 +#
 +# MDEV-16614 signal 7 after calling stored procedure, that uses regexp
 +#
 +CREATE PROCEDURE p1(m1 varchar(5), m2 varchar(5))
 +BEGIN
 +SELECT a FROM
 +(SELECT "aa" a) t
 +JOIN (SELECT "aa" b) t1 on t.a=t1.b
 +WHERE t.a regexp m1 and t1.b regexp m2
 +GROUP BY a;
 +END$$
 +CALL p1('a','a');
 +a
 +aa
 +DROP PROCEDURE p1;
 +CREATE PROCEDURE p1(m1 varchar(5))
 +BEGIN
 +SELECT a FROM (SELECT "aa" a) t WHERE t.a regexp m1;
 +END$$
 +CALL p1('a');
 +a
 +aa
 +DROP PROCEDURE p1;
 +SELECT a FROM (SELECT "aa" a) t WHERE REGEXP_INSTR(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
 +a
 +aa
 +CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
 +BEGIN
 +RETURN 1;
 +END;$$
 +CREATE OR REPLACE PROCEDURE p1(m1 varchar(5))
 +BEGIN
 +SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, m1);
 +END$$
 +CALL p1('a');
 +a
 +aa
 +DROP PROCEDURE p1;
 +DROP FUNCTION f1;
 +CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
 +BEGIN
 +RETURN 1;
 +END;$$
 +SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
 +a
 +aa
 +DROP FUNCTION f1;
 +#
 +# MDEV-17011: condition pushdown into materialized derived used
 +#             in INSERT SELECT, multi-table UPDATE and DELETE
 +#
 +CREATE TABLE t1 (a int ,b int) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES
 +(1, 1), (1, 2), (2, 1), (2, 2), (3,1), (3,3), (4,2);
 +CREATE TABLE t2 (a int) ENGINE MYISAM;
 +INSERT INTO t2 VALUES
 +(3), (7), (1), (4), (1);
 +CREATE TABLE t3 (a int, b int) ENGINE MYISAM;
 +EXPLAIN FORMAT=JSON INSERT INTO t3
 +SELECT * FROM (SELECT a, count(*) as c FROM t1 GROUP BY a) t WHERE a<=2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 7,
 +      "filtered": 100,
 +      "attached_condition": "t.a <= 2",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 7,
 +                "filtered": 100,
 +                "attached_condition": "t1.a <= 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +INSERT INTO t3
 +SELECT * FROM (SELECT a, count(*) as c FROM t1 GROUP BY a) t WHERE a<=2;
 +SELECT * FROM t3;
 +a	b
 +1	2
 +2	2
 +EXPLAIN FORMAT=JSON UPDATE t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t SET t2.a=t.c+10
 +WHERE t2.a= t.c and t.a>=3;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 5,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "8",
 +      "used_key_parts": ["c"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = t.c and t.a >= 3",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t1.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 7,
 +                "filtered": 100,
 +                "attached_condition": "t1.a >= 3"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +UPDATE t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t SET t2.a=t.c+10
 +WHERE t2.a= t.c and t.a>=3;
 +SELECT * FROM t2;
 +a
 +3
 +7
 +11
 +4
 +11
 +EXPLAIN FORMAT=JSON DELETE t2 FROM t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t
 +WHERE t2.a= t.c+9 and t.a=2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 5,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 7,
 +      "filtered": 100,
 +      "attached_condition": "t.a = 2 and t2.a = t.c + 9",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 7,
 +            "filtered": 100,
 +            "attached_condition": "t1.a = 2"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DELETE t2 FROM t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t
 +WHERE t2.a= t.c+9 and t.a=2;
 +SELECT * FROM t2;
 +a
 +3
 +7
 +4
 +DROP TABLE t1,t2,t3;
 +#
 +# MDEV-16765: pushdown condition with the CASE structure
 +#             defined with Item_cond item
 +#
 +CREATE TABLE t1(a INT, b INT);
 +INSERT INTO t1 VALUES (1,2), (3,4), (2,3);
 +SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.max_a=1) OR (tab2.max_a=2))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +max_a	b
 +1	2
 +1	3
 +EXPLAIN FORMAT=JSON SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.max_a=1) OR (tab2.max_a=2))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "case when tab2.max_a = 1 or tab2.max_a = 2 then 1 else 0 end = 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "case when max_a = 1 or max_a = 2 then 1 else 0 end = 1",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.max_a=1) OR ((tab2.max_a>2) AND (tab2.max_a<4)))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +max_a	b
 +1	2
 +1	4
 +EXPLAIN FORMAT=JSON SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.max_a=1) OR ((tab2.max_a>2) AND (tab2.max_a<4)))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "case when tab2.max_a = 1 or tab2.max_a > 2 and tab2.max_a < 4 then 1 else 0 end = 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "case when max_a = 1 or max_a > 2 and max_a < 4 then 1 else 0 end = 1",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.max_a>1) AND ((tab2.max_a=2) OR (tab2.max_a>2)))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +max_a	b
 +1	3
 +1	4
 +EXPLAIN FORMAT=JSON SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.max_a>1) AND ((tab2.max_a=2) OR (tab2.max_a>2)))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "case when tab2.max_a > 1 and (tab2.max_a = 2 or tab2.max_a > 2) then 1 else 0 end = 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "having_condition": "case when max_a > 1 and (max_a = 2 or max_a > 2) then 1 else 0 end = 1",
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.b=2) OR (tab2.b=4))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +max_a	b
 +1	2
 +1	4
 +EXPLAIN FORMAT=JSON SELECT *
 +FROM
 +(
 +SELECT CASE WHEN ((tab2.b=2) OR (tab2.b=4))
 +THEN 1 ELSE 0 END AS max_a,b
 +FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "case when tab2.b = 2 or tab2.b = 4 then 1 else 0 end = 1",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "filesort": {
 +            "sort_key": "t1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t1",
 +                "access_type": "ALL",
 +                "rows": 3,
 +                "filtered": 100,
 +                "attached_condition": "case when t1.b = 2 or t1.b = 4 then 1 else 0 end = 1"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1;
 +#
 +# MDEV-16803: pushdown condition with IN predicate in the derived table
 +#             defined with several SELECT statements
 +#
 +CREATE TABLE t1 (a INT, b INT);
 +INSERT INTO t1 VALUES (1,2),(3,2),(1,1);
 +SELECT * FROM
 +(
 +SELECT a,b,1 as c
 +FROM t1
 +UNION ALL
 +SELECT a,b,2 as c
 +FROM t1
 +) AS tab
 +WHERE ((a,b) IN ((1,2),(3,2)));
 +a	b	c
 +1	2	1
 +3	2	1
 +1	2	2
 +3	2	2
 +DROP TABLE t1;
 +#
 +# MDEV-17354: INSERT SELECT with condition pushdown into derived
 +#
 +CREATE TABLE t1 (f INT NOT NULL);
 +INSERT INTO t1 VALUES (3), (7), (3);
 +CREATE ALGORITHM= TEMPTABLE VIEW v1 AS SELECT * FROM ( SELECT * FROM t1 ) AS sq;
 +INSERT INTO t1
 +SELECT * FROM ( SELECT t1.f FROM v1 JOIN t1 ) AS t WHERE f IS NOT NULL;
 +EXPLAIN INSERT INTO t1
 +SELECT * FROM ( SELECT t1.f FROM v1 JOIN t1 ) AS t WHERE f IS NOT NULL;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	144	Using where
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	12	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	12	Using where; Using join buffer (flat, BNL join)
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	12	
 +EXPLAIN FORMAT=JSON INSERT INTO t1
 +SELECT * FROM ( SELECT t1.f FROM v1 JOIN t1 ) AS t WHERE f IS NOT NULL;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 144,
 +      "filtered": 100,
 +      "attached_condition": "t.f is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "<derived3>",
 +            "access_type": "ALL",
 +            "rows": 12,
 +            "filtered": 100,
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 3,
 +                "table": {
 +                  "table_name": "t1",
 +                  "access_type": "ALL",
 +                  "rows": 12,
 +                  "filtered": 100
 +                }
 +              }
 +            }
 +          },
 +          "block-nl-join": {
 +            "table": {
 +              "table_name": "t1",
 +              "access_type": "ALL",
 +              "rows": 12,
 +              "filtered": 100,
 +              "attached_condition": "t1.f is not null"
 +            },
 +            "buffer_type": "flat",
 +            "buffer_size": "256Kb",
 +            "join_type": "BNL"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM t1;
 +f
 +3
 +7
 +3
 +3
 +3
 +3
 +7
 +7
 +7
 +3
 +3
 +3
 +DELETE FROM t1;
 +INSERT INTO t1 VALUES (3), (7), (3);
 +INSERT INTO t1
 +SELECT * FROM ( SELECT t1.f FROM v1 JOIN t1 ON v1.f=t1.f) AS t
 +WHERE f IS NOT NULL;
 +EXPLAIN FORMAT=JSON INSERT INTO t1
 +SELECT * FROM ( SELECT t1.f FROM v1 JOIN t1 ON v1.f=t1.f) AS t
 +WHERE f IS NOT NULL;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 16,
 +      "filtered": 100,
 +      "attached_condition": "t.f is not null",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 8,
 +            "filtered": 100,
 +            "attached_condition": "t1.f is not null"
 +          },
 +          "table": {
 +            "table_name": "<derived3>",
 +            "access_type": "ref",
 +            "possible_keys": ["key0"],
 +            "key": "key0",
 +            "key_length": "4",
 +            "used_key_parts": ["f"],
 +            "ref": ["test.t1.f"],
 +            "rows": 2,
 +            "filtered": 100,
 +            "materialized": {
 +              "query_block": {
 +                "select_id": 3,
 +                "table": {
 +                  "table_name": "t1",
 +                  "access_type": "ALL",
 +                  "rows": 8,
 +                  "filtered": 100,
 +                  "attached_condition": "t1.f is not null"
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * FROM t1;
 +f
 +3
 +7
 +3
 +3
 +3
 +7
 +3
 +3
 +DROP VIEW v1;
 +DROP TABLE t1;
 +#
 +# MDEV-17574: pushdown into derived from mergeable view
 +#             used in multi-table UPDATE
 +#             pushdown into materialized derived from mergeable view
 +#             used in SELECT
 +#
 +CREATE TABLE t1 (f1 text, f2 int);
 +INSERT INTO t1 VALUES ('x',1), ('y',2);
 +CREATE VIEW v1 AS SELECT f2 FROM ( SELECT f2 FROM t1 ) AS t;
 +UPDATE v1, t1 SET t1.f1 = 'z' WHERE v1.f2 < 2 AND t1.f2 = v1.f2;
 +EXPLAIN FORMAT=JSON UPDATE v1, t1 SET t1.f1 = 'z' WHERE v1.f2 < 2 AND t1.f2 = v1.f2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t.f2 < 2",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t1",
 +            "access_type": "ALL",
 +            "rows": 2,
 +            "filtered": 100,
 +            "attached_condition": "t1.f2 < 2"
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t1.f2 = t.f2"
 +    }
 +  }
 +}
 +SELECT * FROM t1;
 +f1	f2
 +z	1
 +y	2
 +CREATE VIEW v2 AS SELECT f2 FROM ( SELECT DISTINCT f2 FROM t1 ) AS t;
 +SELECT * FROM v2, t1 WHERE v2.f2 < 2 AND t1.f2 = v2.f2;
 +f2	f1	f2
 +1	z	1
 +EXPLAIN FORMAT=JSON SELECT * FROM v2, t1 WHERE v2.f2 < 2 AND t1.f2 = v2.f2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t.f2 < 2",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 3,
 +          "temporary_table": {
 +            "table": {
 +              "table_name": "t1",
 +              "access_type": "ALL",
 +              "rows": 2,
 +              "filtered": 100,
 +              "attached_condition": "t1.f2 < 2"
 +            }
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t1",
 +        "access_type": "ALL",
 +        "rows": 2,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t1.f2 = t.f2"
 +    }
 +  }
 +}
 +DROP VIEW v1,v2;
 +DROP TABLE t1;
 +#
 +# MDEV-18383: pushdown condition with the IF structure
 +#             defined with Item_cond item
 +#
 +CREATE TABLE t1(a INT, b INT);
 +CREATE TABLE t2(c INT, d INT);
 +INSERT INTO t1 VALUES (1,2),(3,4),(5,6);
 +INSERT INTO t2 VALUES (1,3),(3,7),(5,1);
 +SELECT *
 +FROM t1,
 +(
 +SELECT MAX(d) AS max_d,c
 +FROM t2
 +GROUP BY c
 +) AS tab
 +WHERE t1.a=tab.c AND
 +IF(2,t1.a=1 OR t1.b>5,1=1);
 +a	b	max_d	c
 +1	2	3	1
 +5	6	1	5
 +DROP TABLE t1,t2;
 +#
 +# MDEV-19139: pushdown condition with Item_func_set_user_var
 +#
 +CREATE TABLE t1 (a INT, b INT);
 +CREATE VIEW v1 AS SELECT a, MAX(b) FROM t1 GROUP BY a;
 +SELECT * FROM (SELECT 1 FROM v1 UNION (SELECT 1 FROM v1 WHERE @a := uuid())) dt;
 +1
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM (SELECT 1 FROM v1 UNION (SELECT 1 FROM v1 WHERE @a := uuid())) dt;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "table": {
 +                    "message": "no matching row in const table"
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "message": "no matching row in const table"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP TABLE t1;
 +DROP VIEW v1;
 +#
 +# MDEV-21388 Wrong result of DAYNAME()=xxx in combination with condition_pushdown_for_derived=on
 +#
 +CREATE TABLE t1 (a INT, b DATE, c INT);
 +INSERT INTO t1 VALUES
 +(1,'2001-01-21',345),
 +(6,'2001-01-20',315),
 +(6,'2001-01-20',214);
 +CREATE TABLE t2 (a INT, b INT);
 +INSERT INTO t2 VALUES (2,19), (7,20);
 +CREATE VIEW v1 AS SELECT a, b, max(c) AS max_c FROM t1
 +GROUP BY a,b HAVING max_c < 707;
 +SELECT *, dayname(v1.b) FROM v1,t2 WHERE (v1.max_c>214) AND (t2.a>v1.a);
 +a	b	max_c	a	b	dayname(v1.b)
 +1	2001-01-21	345	2	19	Sunday
 +1	2001-01-21	345	7	20	Sunday
 +6	2001-01-20	315	7	20	Saturday
 +SET optimizer_switch='condition_pushdown_for_derived=off';
 +SELECT *, dayname(v1.b) FROM v1,t2 WHERE (v1.max_c>214) AND (t2.a>v1.a) AND dayname(v1.b)='Sunday';
 +a	b	max_c	a	b	dayname(v1.b)
 +1	2001-01-21	345	2	19	Sunday
 +1	2001-01-21	345	7	20	Sunday
 +SET optimizer_switch='condition_pushdown_for_derived=on';
 +SELECT *, dayname(v1.b) FROM v1,t2 WHERE (v1.max_c>214) AND (t2.a>v1.a) AND dayname(v1.b)='Sunday';
 +a	b	max_c	a	b	dayname(v1.b)
 +1	2001-01-21	345	2	19	Sunday
 +1	2001-01-21	345	7	20	Sunday
 +DROP VIEW v1;
 +DROP TABLE t1, t2;
 +SET optimizer_switch=DEFAULT;
 +#
 +# MDEV-17177: an attempt to push down IN predicate when one of
 +#             the arguments is too complex to be cloned
 +#
 +CREATE TABLE t1 (a VARCHAR(8));
 +INSERT INTO t1 VALUES ('abc'),('def');
 +CREATE VIEW v1 AS SELECT * FROM t1 GROUP BY a;
 +SELECT * FROM v1 WHERE IF( a REGEXP 'def', 'foo', a ) IN ('abc', 'foobar');
 +a
 +abc
 +DROP VIEW v1;
 +DROP TABLE t1;
 +#
 +# MDEV-19179: pushdown into UNION of aggregation selects whose
 +#             corresponding columns have different names
 +#
 +create table t1 (a int);
 +insert into t1 values (3), (7), (1);
 +select *
 +from (select min(a) as x from t1 union all select max(a) as y from t1) t
 +where x>0;
 +x
 +1
 +7
 +explain extended select *
 +from (select min(a) as x from t1 union all select max(a) as y from t1) t
 +where x>0;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	6	100.00	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	3	100.00	
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	3	100.00	
 +Warnings:
 +Note	1003	/* select#1 */ select `t`.`x` AS `x` from (/* select#2 */ select min(`test`.`t1`.`a`) AS `x` from `test`.`t1` having `x` > 0 union all /* select#3 */ select max(`test`.`t1`.`a`) AS `x` from `test`.`t1` having `x` > 0) `t` where `t`.`x` > 0
 +prepare stmt from "select *
 +from (select min(a) as x from t1 union all select max(a) as y from t1) t
 +where x>0";
 +execute stmt;
 +x
 +1
 +7
 +execute stmt;
 +x
 +1
 +7
 +deallocate prepare stmt;
 +create view v1(m) as
 +select min(a) as x from t1 union all select max(a) as y from t1;
 +select * from v1 where m > 0;
 +m
 +1
 +7
 +drop view v1;
 +drop table t1;
 +#
 +# MDEV-25635: pushdown into grouping view using aggregate functions
 +#             with constant arguments via a mergeable derived table
 +#
 +create table t1 (a int);
 +insert into t1 values (3), (7), (1), (3), (7), (7), (3);
 +create view v1 as select a, sum(1) as f, sum(1) as g from t1 group by a;
 +select * from v1;
 +a	f	g
 +1	1	1
 +3	3	3
 +7	3	3
 +select * from (select * from v1) as dt where a=f and a=g;
 +a	f	g
 +1	1	1
 +3	3	3
 +explain extended select * from (select * from v1) as dt where a=f and a=g;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	7	100.00	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	7	100.00	Using temporary; Using filesort
 +Warnings:
 +Note	1003	/* select#1 */ select `v1`.`a` AS `a`,`v1`.`f` AS `f`,`v1`.`g` AS `g` from `test`.`v1` where `v1`.`a` = `v1`.`f` and `v1`.`a` = `v1`.`g`
 +create view v2 as select a, min(1) as f, min(1) as g from t1 group by a;
 +select * from v2;
 +a	f	g
 +1	1	1
 +3	1	1
 +7	1	1
 +select * from (select * from v2) as dt where a=f and a=g;
 +a	f	g
 +1	1	1
 +explain extended select * from (select * from v2) as dt where a=f and a=g;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	7	100.00	Using where
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	7	100.00	Using temporary; Using filesort
 +Warnings:
 +Note	1003	/* select#1 */ select `v2`.`a` AS `a`,`v2`.`f` AS `f`,`v2`.`g` AS `g` from `test`.`v2` where `v2`.`a` = `v2`.`f` and `v2`.`a` = `v2`.`g`
 +drop view v1,v2;
 +drop table t1;
++#
++# MDEV-25969: Condition pushdown into derived table doesn't work if select list uses SP
++#
++create function f1(a int) returns int DETERMINISTIC return (a+1);
++create table t1 (
++pk int primary key,
++a int,
++b int,
++key(a)
++);
++create table t2(a int);
++insert into t2 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
++create table t3(a int);
++insert into t3 select A.a + B.a* 10 + C.a * 100 from t2 A, t2 B, t2 C;
++insert into t1 select a,a,a from t3;
++create view v1 as
++select
++t1.a as col1,
++f1(t1.b) as col2
++from
++t1;
++create view v2 as
++select
++t1.a as col1,
++f1(t1.b) as col2
++from
++t1;
++create view v3 as
++select col2, col1 from v1
++union all
++select col2, col1 from v2;
++explain select * from v3 where col1=123;
++id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
++1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	2	Using where
++2	DERIVED	t1	ref	a	a	5	const	1	
++3	UNION	t1	ref	a	a	5	const	1	
++# This must use ref accesses for reading table t1, not full scans:
++explain format=json
++select * from v3 where col1=123 and col2=321;
++EXPLAIN
++{
++  "query_block": {
++    "select_id": 1,
++    "table": {
++      "table_name": "<derived2>",
++      "access_type": "ALL",
++      "rows": 2,
++      "filtered": 100,
++      "attached_condition": "v3.col1 = 123 and v3.col2 = 321",
++      "materialized": {
++        "query_block": {
++          "union_result": {
++            "table_name": "<union2,3>",
++            "access_type": "ALL",
++            "query_specifications": [
++              {
++                "query_block": {
++                  "select_id": 2,
++                  "table": {
++                    "table_name": "t1",
++                    "access_type": "ref",
++                    "possible_keys": ["a"],
++                    "key": "a",
++                    "key_length": "5",
++                    "used_key_parts": ["a"],
++                    "ref": ["const"],
++                    "rows": 1,
++                    "filtered": 100
++                  }
++                }
++              },
++              {
++                "query_block": {
++                  "select_id": 3,
++                  "table": {
++                    "table_name": "t1",
++                    "access_type": "ref",
++                    "possible_keys": ["a"],
++                    "key": "a",
++                    "key_length": "5",
++                    "used_key_parts": ["a"],
++                    "ref": ["const"],
++                    "rows": 1,
++                    "filtered": 100
++                  }
++                }
++              }
++            ]
++          }
++        }
++      }
++    }
++  }
++}
++drop function f1;
++drop view v1,v2,v3;
++drop table t1, t2,t3;
++#
++# Another testcase, with pushdown through GROUP BY
++#
++create table t1 (a int, b  int);
++insert into t1 values (1,1),(2,2),(3,3);
++create function f1(a int) returns int DETERMINISTIC return (a+1);
++create view v2(a, a2, s) as 
++select a, f1(a), sum(b) from t1 group by a, f1(a);
++# Here, 
++#   "(s+1) > 10" will be pushed into HAVING
++#   "a > 1" will be pushed all the way to the table scan on t1
++#   "a2>123" will be pushed into HAVING (as it refers to an SP call which
++#                                       prevents pushing it to the WHERE)
++explain format=json
++select * from v2 where (s+1) > 10 AND a > 1 and a2>123;
++EXPLAIN
++{
++  "query_block": {
++    "select_id": 1,
++    "table": {
++      "table_name": "<derived2>",
++      "access_type": "ALL",
++      "rows": 3,
++      "filtered": 100,
++      "attached_condition": "v2.s + 1 > 10 and v2.a > 1 and v2.a2 > 123",
++      "materialized": {
++        "query_block": {
++          "select_id": 2,
++          "having_condition": "s + 1 > 10 and a2 > 123",
++          "filesort": {
++            "sort_key": "t1.a, f1(t1.a)",
++            "temporary_table": {
++              "table": {
++                "table_name": "t1",
++                "access_type": "ALL",
++                "rows": 3,
++                "filtered": 100,
++                "attached_condition": "t1.a > 1"
++              }
++            }
++          }
++        }
++      }
++    }
++  }
++}
++drop view v2;
++drop function f1;
++drop table t1;
 +# End of 10.2 tests
 +#
 +# MDEV-14579: pushdown conditions into materialized views/derived tables
 +# that are defined with EXIST or/and INTERSECT
 +#
 +create table t1 (a int, b int, c int);
 +create table t2 (a int, b int, c int);
 +insert into t1 values
 +(1,21,345), (1,33,7), (8,33,114), (1,21,500), (1,19,117), (5,14,787),
 +(8,33,123), (9,10,211), (5,16,207), (1,33,988), (5,27,132), (1,21,104),
 +(6,20,309), (6,20,315), (1,21,101), (4,33,404), (9,10,800), (1,21,123);
 +insert into t2 values
 +(2,3,207), (1,16,909), (5,14,312),
 +(5,33,207), (6,20,211), (1,19,132),
 +(8,33,117), (3,21,231), (6,23,303);
 +create view v1 as
 +select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c < 300
 +intersect
 +select a, b, min(c) as c from t1
 +where t1.b>10 group by a,b having c > 100;
 +# using intersect in view definition
 +# conjunctive subformulas : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +a	b	c	a	b	c
 +1	21	101	1	16	909
 +1	19	117	1	16	909
 +1	21	101	1	19	132
 +1	19	117	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +a	b	c	a	b	c
 +1	21	101	1	16	909
 +1	19	117	1	16	909
 +1	21	101	1	19	132
 +1	19	117	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 5 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# conjunctive subformulas : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a=8);
 +a	b	c	a	b	c
 +8	33	114	8	33	117
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a=8);
 +a	b	c	a	b	c
 +8	33	114	8	33	117
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a=8);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a=8);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 8"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 18,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 8"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 8"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 8 and t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# conjunctive subformulas : pushing into WHERE using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (t2.a=8);
 +a	b	c	a	b	c
 +8	33	114	8	33	117
 +select * from v1,t2 where (v1.a=t2.a) and (t2.a=8);
 +a	b	c	a	b	c
 +8	33	114	8	33	117
 +explain select * from v1,t2 where (v1.a=t2.a) and (t2.a=8);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (t2.a=8);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 8"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 18,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 8"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 8"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 8 and t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# conjunctive subformulas : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.c>200);
 +a	b	c	a	b	c
 +5	16	207	5	14	312
 +5	16	207	5	33	207
 +select * from v1,t2 where (v1.a=t2.a) and (v1.c>200);
 +a	b	c	a	b	c
 +5	16	207	5	14	312
 +5	16	207	5	33	207
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.c>200);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.c>200);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# conjunctive subformulas : pushing into WHERE
 +# conjunctive subformulas : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>110);
 +a	b	c	a	b	c
 +1	19	117	1	16	909
 +1	19	117	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>110);
 +a	b	c	a	b	c
 +1	19	117	1	16	909
 +1	19	117	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>110);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>110);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 5 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 110",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and c > 110",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100 and c > 110",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# extracted or formula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +a	b	c	a	b	c
 +5	16	207	5	14	312
 +5	16	207	5	33	207
 +8	33	114	8	33	117
 +select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +a	b	c	a	b	c
 +5	16	207	5	14	312
 +5	16	207	5	33	207
 +8	33	114	8	33	117
 +explain select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.b > 27 or v1.b < 19",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and (t1.b > 27 or t1.b < 19)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and (t1.b > 27 or t1.b < 19)"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# extracted or formula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c>200) or (v1.c<105));
 +a	b	c	a	b	c
 +1	21	101	1	16	909
 +5	16	207	5	14	312
 +5	16	207	5	33	207
 +1	21	101	1	19	132
 +select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c>200) or (v1.c<105));
 +a	b	c	a	b	c
 +1	21	101	1	16	909
 +5	16	207	5	14	312
 +5	16	207	5	33	207
 +1	21	101	1	19	132
 +explain select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c>200) or (v1.c<105));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c>200) or (v1.c<105));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 200 or v1.c < 105",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and (c > 200 or c < 105)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100 and (c > 200 or c < 105)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# extracted or formula : pushing into WHERE
 +# extracted or formula : pushing into HAVING using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +((v1.a>3) and (t2.c>110) and (v1.c=t2.c)) or
 +((v1.a=1) and (v1.c<110));
 +a	b	c	a	b	c
 +1	21	101	2	3	207
 +1	21	101	1	16	909
 +1	21	101	5	14	312
 +1	21	101	5	33	207
 +1	21	101	6	20	211
 +1	21	101	1	19	132
 +1	21	101	8	33	117
 +1	21	101	3	21	231
 +1	21	101	6	23	303
 +5	16	207	2	3	207
 +5	16	207	5	33	207
 +5	27	132	1	19	132
 +select * from v1,t2 where
 +((v1.a>3) and (t2.c>110) and (v1.c=t2.c)) or
 +((v1.a=1) and (v1.c<110));
 +a	b	c	a	b	c
 +1	21	101	2	3	207
 +1	21	101	1	16	909
 +1	21	101	5	14	312
 +1	21	101	5	33	207
 +1	21	101	6	20	211
 +1	21	101	1	19	132
 +1	21	101	8	33	117
 +1	21	101	3	21	231
 +1	21	101	6	23	303
 +5	16	207	2	3	207
 +5	16	207	5	33	207
 +5	27	132	1	19	132
 +explain select * from v1,t2 where
 +((v1.a>3) and (t2.c>110) and (v1.c=t2.c)) or
 +((v1.a=1) and (v1.c<110));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where
 +((v1.a>3) and (t2.c>110) and (v1.c=t2.c)) or
 +((v1.a=1) and (v1.c<110));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 18,
 +        "filtered": 100,
 +        "attached_condition": "v1.a > 3 or v1.a = 1 and v1.c < 110"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.c = t2.c and v1.a > 3 and t2.c > 110 or v1.a = 1 and v1.c < 110",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and (t1.a > 3 and c > 110 or c < 110 and t1.a = 1)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and (t1.a > 3 or t1.a = 1)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100 and (t1.a > 3 and c > 110 or c < 110 and t1.a = 1)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and (t1.a > 3 or t1.a = 1)"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using intersect in view definition
 +# prepare of a query
 +# conjunctive subformulas : pushing into WHERE
 +# conjunctive subformulas : pushing into HAVING
 +prepare stmt from "select * from v1,t2
 +                   where (v1.a=t2.a) and (v1.a<5) and (v1.c>110);";
 +execute stmt;
 +a	b	c	a	b	c
 +1	19	117	1	16	909
 +1	19	117	1	19	132
 +execute stmt;
 +a	b	c	a	b	c
 +1	19	117	1	16	909
 +1	19	117	1	19	132
 +deallocate prepare stmt;
 +# using intersect in derived table definition
 +# extracted or formula : pushing into WHERE using equalities
 +# extracted or formula : pushing into HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select *
 +from t2,
 +(select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c < 300
 +intersect
 +select a, b, min(c) as c from t1
 +where t1.b>10 group by a,b having c > 100) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=909)) or
 +((d1.a<4) and (d1.c<200)));
 +a	b	c	a	b	c
 +1	16	909	5	16	207
 +1	19	132	1	19	117
 +3	21	231	1	21	101
 +select *
 +from t2,
 +(select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c < 300
 +intersect
 +select a, b, min(c) as c from t1
 +where t1.b>10 group by a,b having c > 100) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=909)) or
 +((d1.a<4) and (d1.c<200)));
 +a	b	c	a	b	c
 +1	16	909	5	16	207
 +1	19	132	1	19	117
 +3	21	231	1	21	101
 +explain select *
 +from t2,
 +(select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c < 300
 +intersect
 +select a, b, min(c) as c from t1
 +where t1.b>10 group by a,b having c > 100) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=909)) or
 +((d1.a<4) and (d1.c<200)));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.b	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select *
 +from t2,
 +(select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c < 300
 +intersect
 +select a, b, min(c) as c from t1
 +where t1.b>10 group by a,b having c > 100) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=909)) or
 +((d1.a<4) and (d1.c<200)));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t2.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t2.c = 909 and t2.b > 13 or d1.a < 4 and d1.c < 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and (t1.b > 13 or t1.a < 4 and c < 200)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and (t1.b > 13 or t1.a < 4)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 100 and (t1.b > 13 or t1.a < 4 and c < 200)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and (t1.b > 13 or t1.a < 4)"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +except
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300;
 +# using except in view definition
 +# conjunctive subformulas : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +1	21	500	1	16	909
 +1	33	988	1	19	132
 +1	21	500	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +1	21	500	1	16	909
 +1	33	988	1	19	132
 +1	21	500	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 5 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# conjunctive subformulas : pushing into WHERE
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a=6);
 +a	b	c	a	b	c
 +6	20	315	6	20	211
 +6	20	315	6	23	303
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a=6);
 +a	b	c	a	b	c
 +6	20	315	6	20	211
 +6	20	315	6	23	303
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a=6);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a=6);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 6"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 18,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 6"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 6"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 6 and t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# conjunctive subformulas : pushing into WHERE using equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (t2.a=6);
 +a	b	c	a	b	c
 +6	20	315	6	20	211
 +6	20	315	6	23	303
 +select * from v1,t2 where (v1.a=t2.a) and (t2.a=6);
 +a	b	c	a	b	c
 +6	20	315	6	20	211
 +6	20	315	6	23	303
 +explain select * from v1,t2 where (v1.a=t2.a) and (t2.a=6);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (t2.a=6);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a = 6"
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 18,
 +        "filtered": 100,
 +        "attached_condition": "v1.a = 6"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 6"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a = 6 and t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# conjunctive subformulas : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.c>500);
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +5	14	787	5	14	312
 +5	14	787	5	33	207
 +1	33	988	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and (v1.c>500);
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +5	14	787	5	14	312
 +5	14	787	5	33	207
 +1	33	988	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.c>500);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.c>500);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 500",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and c > 500",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300 and c > 500",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# conjunctive subformulas : pushing into WHERE
 +# conjunctive subformulas : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>500);
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +1	33	988	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>500);
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +1	33	988	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>500);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>500);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 5 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 500",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and c > 500",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300 and c > 500",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a < 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# extracted or formula : pushing into WHERE
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +5	14	787	5	14	312
 +5	14	787	5	33	207
 +1	33	988	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +5	14	787	5	14	312
 +5	14	787	5	33	207
 +1	33	988	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.b > 27 or v1.b < 19",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and (t1.b > 27 or t1.b < 19)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and (t1.b > 27 or t1.b < 19)"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# extracted or formula : pushing into HAVING
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c<400) or (v1.c>800));
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +6	20	315	6	20	211
 +1	33	988	1	19	132
 +6	20	315	6	23	303
 +select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c<400) or (v1.c>800));
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +6	20	315	6	20	211
 +1	33	988	1	19	132
 +6	20	315	6	23	303
 +explain select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c<400) or (v1.c>800));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where
 +(v1.a=t2.a) and ((v1.c<400) or (v1.c>800));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c < 400 or v1.c > 800",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and (c < 400 or c > 800)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300 and (c < 400 or c > 800)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# extracted or formula : pushing into WHERE
 +# extracted or formula : pushing into HAVING using equalities
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where
 +(v1.c=t2.c) and
 +((v1.a>1) and (t2.c<500)) or
 +((v1.a=1) and (v1.c>500));
 +a	b	c	a	b	c
 +1	33	988	2	3	207
 +1	33	988	1	16	909
 +1	33	988	5	14	312
 +1	33	988	5	33	207
 +1	33	988	6	20	211
 +1	33	988	1	19	132
 +1	33	988	8	33	117
 +1	33	988	3	21	231
 +1	33	988	6	23	303
 +select * from v1,t2 where
 +(v1.c=t2.c) and
 +((v1.a>1) and (t2.c<500)) or
 +((v1.a=1) and (v1.c>500));
 +a	b	c	a	b	c
 +1	33	988	2	3	207
 +1	33	988	1	16	909
 +1	33	988	5	14	312
 +1	33	988	5	33	207
 +1	33	988	6	20	211
 +1	33	988	1	19	132
 +1	33	988	8	33	117
 +1	33	988	3	21	231
 +1	33	988	6	23	303
 +explain select * from v1,t2 where
 +(v1.c=t2.c) and
 +((v1.a>1) and (t2.c<500)) or
 +((v1.a=1) and (v1.c>500));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where
 +(v1.c=t2.c) and
 +((v1.a>1) and (t2.c<500)) or
 +((v1.a=1) and (v1.c>500));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 18,
 +        "filtered": 100,
 +        "attached_condition": "v1.a > 1 or v1.a = 1 and v1.c > 500"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.c = t2.c and v1.a > 1 and t2.c < 500 or v1.a = 1 and v1.c > 500",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and (t1.a > 1 and c < 500 or c > 500 and t1.a = 1)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and (t1.a > 1 or t1.a = 1)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300 and (t1.a > 1 and c < 500 or c > 500 and t1.a = 1)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and (t1.a > 1 or t1.a = 1)"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +# using except in view definition
 +# prepare of a query
 +# conjunctive subformulas : pushing into WHERE
 +# conjunctive subformulas : pushing into HAVING
 +prepare stmt from "select * from v1,t2
 +                   where (v1.a=t2.a) and (v1.a<5) and (v1.c>500);";
 +execute stmt;
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +1	33	988	1	19	132
 +execute stmt;
 +a	b	c	a	b	c
 +1	33	988	1	16	909
 +1	33	988	1	19	132
 +deallocate prepare stmt;
 +# using except in view definition
 +# extracted or formula : pushing into WHERE using equalities
 +# extracted or formula : pushing into HAVING
 +# pushing equalities
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select *
 +from t2,
 +(select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +except
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=988)) or
 +((d1.a>4) and (d1.c>500)));
 +a	b	c	a	b	c
 +5	14	312	5	14	787
 +select *
 +from t2,
 +(select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +except
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=988)) or
 +((d1.a>4) and (d1.c>500)));
 +a	b	c	a	b	c
 +5	14	312	5	14	787
 +explain select *
 +from t2,
 +(select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +except
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=988)) or
 +((d1.a>4) and (d1.c>500)));
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.b	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select *
 +from t2,
 +(select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +except
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300) as d1
 +where
 +(d1.b=t2.b) and
 +(((t2.b>13) and (t2.c=988)) or
 +((d1.a>4) and (d1.c>500)));
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t2.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t2.c = 988 and t2.b > 13 or d1.a > 4 and d1.c > 500",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and (t1.b > 13 or t1.a > 4 and c > 500)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and (t1.b > 13 or t1.a > 4)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 300 and (t1.b > 13 or t1.a > 4 and c > 500)",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and (t1.b > 13 or t1.a > 4)"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using union and intersect in view definition
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +union
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.a>3 group by a,b having c < 530;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +a	b	c	a	b	c
 +6	20	309	6	20	211
 +6	20	309	6	23	303
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +a	b	c	a	b	c
 +6	20	309	6	20	211
 +6	20	309	6	23	303
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	3	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	UNION	<derived4>	ALL	NULL	NULL	NULL	NULL	18	Using where
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +5	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect4,5>	ALL	NULL	NULL	NULL	NULL	NULL	
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 5 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a > 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "table_name": "<derived4>",
 +                    "access_type": "ALL",
 +                    "rows": 18,
 +                    "filtered": 100,
 +                    "attached_condition": "__3.a > 5 and __3.c > 200",
 +                    "materialized": {
 +                      "query_block": {
 +                        "union_result": {
 +                          "table_name": "<intersect4,5>",
 +                          "access_type": "ALL",
 +                          "query_specifications": [
 +                            {
 +                              "query_block": {
 +                                "select_id": 4,
 +                                "having_condition": "c < 300 and c > 200",
 +                                "filesort": {
 +                                  "sort_key": "t1.a, t1.b",
 +                                  "temporary_table": {
 +                                    "table": {
 +                                      "table_name": "t1",
 +                                      "access_type": "ALL",
 +                                      "rows": 18,
 +                                      "filtered": 100,
 +                                      "attached_condition": "t1.b > 10 and t1.a > 5"
 +                                    }
 +                                  }
 +                                }
 +                              }
 +                            },
 +                            {
 +                              "query_block": {
 +                                "select_id": 5,
 +                                "operation": "INTERSECT",
 +                                "having_condition": "c < 530 and c > 200",
 +                                "filesort": {
 +                                  "sort_key": "t1.a, t1.b",
 +                                  "temporary_table": {
 +                                    "table": {
 +                                      "table_name": "t1",
 +                                      "access_type": "ALL",
 +                                      "rows": 18,
 +                                      "filtered": 100,
 +                                      "attached_condition": "t1.a > 3 and t1.a > 5"
 +                                    }
 +                                  }
 +                                }
 +                              }
 +                            }
 +                          ]
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using union and intersect in view definition
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.a>3 group by a,b having c < 500
 +union
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +8	33	123	8	33	117
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +8	33	123	8	33	117
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	3	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +4	UNION	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	UNIT RESULT	<unit2,3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "v1.c < 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<unit2,3,4>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c < 500 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a > 3 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using union and except in view definition
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +union
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +except
 +select a, b, max(c) as c from t1
 +where t1.a>3 group by a,b having c < 530;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +a	b	c	a	b	c
 +6	20	309	6	20	211
 +6	20	309	6	23	303
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +a	b	c	a	b	c
 +6	20	309	6	20	211
 +6	20	309	6	23	303
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	3	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	UNION	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +4	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	UNIT RESULT	<unit2,3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 5 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<unit2,3,4>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a > 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a > 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 530 and c > 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a > 3 and t1.a > 5"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using union and except in view definition
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, min(c) as c from t1
 +where t1.a<9 group by a,b having c > 200
 +except
 +select a, b, max(c) as c from t1
 +where t1.a>3 group by a,b having c < 500
 +union
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +8	33	123	8	33	117
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +8	33	123	8	33	117
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	3	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +4	UNION	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	UNIT RESULT	<unit2,3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "v1.c < 200",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<unit2,3,4>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 200 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c < 500 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a > 3 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 300 and c < 200",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using except and intersect in view definition
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.a<7 group by a,b having c < 500
 +except
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 150;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<150);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<150);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<150);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +4	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	UNIT RESULT	<unit2,3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<150);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c < 150",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<unit2,3,4>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and c < 150",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c < 500 and c < 150",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 7 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c > 150 and c < 150",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using except and intersect in view definition
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +except
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 150
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.a<7 group by a,b having c < 500;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +a	b	c	a	b	c
 +8	33	123	8	33	117
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +a	b	c	a	b	c
 +8	33	123	8	33	117
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	<derived4>	ALL	NULL	NULL	NULL	NULL	18	Using where
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +5	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect4,5>	ALL	NULL	NULL	NULL	NULL	NULL	
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c < 130",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and c < 130",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "table": {
 +                    "table_name": "<derived4>",
 +                    "access_type": "ALL",
 +                    "rows": 18,
 +                    "filtered": 100,
 +                    "attached_condition": "__3.a > 4 and __3.c < 130",
 +                    "materialized": {
 +                      "query_block": {
 +                        "union_result": {
 +                          "table_name": "<intersect4,5>",
 +                          "access_type": "ALL",
 +                          "query_specifications": [
 +                            {
 +                              "query_block": {
 +                                "select_id": 4,
 +                                "having_condition": "c > 150 and c < 130",
 +                                "filesort": {
 +                                  "sort_key": "t1.a, t1.b",
 +                                  "temporary_table": {
 +                                    "table": {
 +                                      "table_name": "t1",
 +                                      "access_type": "ALL",
 +                                      "rows": 18,
 +                                      "filtered": 100,
 +                                      "attached_condition": "t1.a < 9 and t1.a > 4"
 +                                    }
 +                                  }
 +                                }
 +                              }
 +                            },
 +                            {
 +                              "query_block": {
 +                                "select_id": 5,
 +                                "operation": "INTERSECT",
 +                                "having_condition": "c < 500 and c < 130",
 +                                "filesort": {
 +                                  "sort_key": "t1.a, t1.b",
 +                                  "temporary_table": {
 +                                    "table": {
 +                                      "table_name": "t1",
 +                                      "access_type": "ALL",
 +                                      "rows": 18,
 +                                      "filtered": 100,
 +                                      "attached_condition": "t1.a < 7 and t1.a > 4"
 +                                    }
 +                                  }
 +                                }
 +                              }
 +                            }
 +                          ]
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using except, intersect and union in view definition
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +except
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 150
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.a<7 group by a,b having c < 500
 +union
 +select a, b, max(c) as c from t1
 +where t1.a<7 group by a,b having c < 120;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +a	b	c	a	b	c
 +8	33	123	8	33	117
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +a	b	c	a	b	c
 +8	33	123	8	33	117
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	3	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	<derived4>	ALL	NULL	NULL	NULL	NULL	18	Using where
 +4	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +5	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect4,5>	ALL	NULL	NULL	NULL	NULL	NULL	
 +6	UNION	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	UNIT RESULT	<unit2,3,6>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "v1.c < 130",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<unit2,3,6>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c < 300 and c < 130",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "table": {
 +                    "table_name": "<derived4>",
 +                    "access_type": "ALL",
 +                    "rows": 18,
 +                    "filtered": 100,
 +                    "attached_condition": "__3.a > 4 and __3.c < 130",
 +                    "materialized": {
 +                      "query_block": {
 +                        "union_result": {
 +                          "table_name": "<intersect4,5>",
 +                          "access_type": "ALL",
 +                          "query_specifications": [
 +                            {
 +                              "query_block": {
 +                                "select_id": 4,
 +                                "having_condition": "c > 150 and c < 130",
 +                                "filesort": {
 +                                  "sort_key": "t1.a, t1.b",
 +                                  "temporary_table": {
 +                                    "table": {
 +                                      "table_name": "t1",
 +                                      "access_type": "ALL",
 +                                      "rows": 18,
 +                                      "filtered": 100,
 +                                      "attached_condition": "t1.a < 9 and t1.a > 4"
 +                                    }
 +                                  }
 +                                }
 +                              }
 +                            },
 +                            {
 +                              "query_block": {
 +                                "select_id": 5,
 +                                "operation": "INTERSECT",
 +                                "having_condition": "c < 500 and c < 130",
 +                                "filesort": {
 +                                  "sort_key": "t1.a, t1.b",
 +                                  "temporary_table": {
 +                                    "table": {
 +                                      "table_name": "t1",
 +                                      "access_type": "ALL",
 +                                      "rows": 18,
 +                                      "filtered": 100,
 +                                      "attached_condition": "t1.a < 7 and t1.a > 4"
 +                                    }
 +                                  }
 +                                }
 +                              }
 +                            }
 +                          ]
 +                        }
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 6,
 +                  "operation": "UNION",
 +                  "having_condition": "c < 120 and c < 130",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 7 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using intersect in view definition
 +# using embedded view
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 120;
 +create view v2 as
 +select a, b, max(c) as c from v1
 +where v1.a<7 group by a,b;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +explain select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +4	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v2.c < 150",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "c < 150",
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 18,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 7 and v1.a > 4",
 +                "materialized": {
 +                  "query_block": {
 +                    "union_result": {
 +                      "table_name": "<intersect3,4>",
 +                      "access_type": "ALL",
 +                      "query_specifications": [
 +                        {
 +                          "query_block": {
 +                            "select_id": 3,
 +                            "having_condition": "c < 300",
 +                            "filesort": {
 +                              "sort_key": "t1.a, t1.b",
 +                              "temporary_table": {
 +                                "table": {
 +                                  "table_name": "t1",
 +                                  "access_type": "ALL",
 +                                  "rows": 18,
 +                                  "filtered": 100,
 +                                  "attached_condition": "t1.b > 10 and t1.a < 7 and t1.a > 4"
 +                                }
 +                              }
 +                            }
 +                          }
 +                        },
 +                        {
 +                          "query_block": {
 +                            "select_id": 4,
 +                            "operation": "INTERSECT",
 +                            "having_condition": "c > 120",
 +                            "filesort": {
 +                              "sort_key": "t1.a, t1.b",
 +                              "temporary_table": {
 +                                "table": {
 +                                  "table_name": "t1",
 +                                  "access_type": "ALL",
 +                                  "rows": 18,
 +                                  "filtered": 100,
 +                                  "attached_condition": "t1.a < 9 and t1.a < 7 and t1.a > 4"
 +                                }
 +                              }
 +                            }
 +                          }
 +                        }
 +                      ]
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1,v2;
 +# using except in view definition
 +# using embedded view
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c < 300
 +except
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a,b having c > 150;
 +create view v2 as
 +select a, b, max(c) as c from v1
 +where v1.a<7 group by a,b;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +a	b	c	a	b	c
 +5	27	132	5	14	312
 +5	27	132	5	33	207
 +explain select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	<derived3>	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +4	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v2.c < 150",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "having_condition": "c < 150",
 +          "filesort": {
 +            "sort_key": "v1.a, v1.b",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "<derived3>",
 +                "access_type": "ALL",
 +                "rows": 18,
 +                "filtered": 100,
 +                "attached_condition": "v1.a < 7 and v1.a > 4",
 +                "materialized": {
 +                  "query_block": {
 +                    "union_result": {
 +                      "table_name": "<except3,4>",
 +                      "access_type": "ALL",
 +                      "query_specifications": [
 +                        {
 +                          "query_block": {
 +                            "select_id": 3,
 +                            "having_condition": "c < 300",
 +                            "filesort": {
 +                              "sort_key": "t1.a, t1.b",
 +                              "temporary_table": {
 +                                "table": {
 +                                  "table_name": "t1",
 +                                  "access_type": "ALL",
 +                                  "rows": 18,
 +                                  "filtered": 100,
 +                                  "attached_condition": "t1.b > 10 and t1.a < 7 and t1.a > 4"
 +                                }
 +                              }
 +                            }
 +                          }
 +                        },
 +                        {
 +                          "query_block": {
 +                            "select_id": 4,
 +                            "operation": "EXCEPT",
 +                            "having_condition": "c > 150",
 +                            "filesort": {
 +                              "sort_key": "t1.a, t1.b",
 +                              "temporary_table": {
 +                                "table": {
 +                                  "table_name": "t1",
 +                                  "access_type": "ALL",
 +                                  "rows": 18,
 +                                  "filtered": 100,
 +                                  "attached_condition": "t1.a < 9 and t1.a < 7 and t1.a > 4"
 +                                }
 +                              }
 +                            }
 +                          }
 +                        }
 +                      ]
 +                    }
 +                  }
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1,v2;
 +# using intersect in view definition
 +# conditions are pushed in different parts of selects
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a having c > 300
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.b<21 group by b having c > 200;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.b>12) and (v1.c<450);
 +a	b	c	a	b	c
 +6	20	315	6	20	211
 +6	20	315	6	23	303
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.b>12) and (v1.c<450);
 +a	b	c	a	b	c
 +6	20	315	6	20	211
 +6	20	315	6	23	303
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.b>12) and (v1.c<450);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	INTERSECT RESULT	<intersect2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.b>12) and (v1.c<450);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 4 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.b > 12 and v1.c < 450",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<intersect2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 300 and t1.b > 12 and c < 450",
 +                  "filesort": {
 +                    "sort_key": "t1.a",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a > 4"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c > 200 and t1.a > 4 and c < 450",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b < 21 and t1.b > 12"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using except in view definition
 +# conditions are pushed in different parts of selects
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.b>20 group by a having c > 300
 +except
 +select a, b, max(c) as c from t1
 +where t1.a<7 group by b having c > 150;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a<2) and (v1.b<30) and (v1.c>450);
 +a	b	c	a	b	c
 +1	21	988	1	16	909
 +1	21	988	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a<2) and (v1.b<30) and (v1.c>450);
 +a	b	c	a	b	c
 +1	21	988	1	16	909
 +1	21	988	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a<2) and (v1.b<30) and (v1.c>450);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a<2) and (v1.b<30) and (v1.c>450);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a < 2 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.b < 30 and v1.c > 450",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 300 and t1.b < 30 and c > 450",
 +                  "filesort": {
 +                    "sort_key": "t1.a",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 20 and t1.a < 2"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c > 150 and t1.a < 2 and c > 450",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 7 and t1.b < 30"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using except and union in view definition
 +# conditions are pushed in different parts of selects
 +# conjunctive subformulas : pushing into HAVING
 +# extracted or formula : pushing into WHERE
 +# extracted or formula : pushing into HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.b>20 group by a having c > 300
 +except
 +select a, b, max(c) as c from t1
 +where t1.a<7 group by b having c > 150;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and ((v1.a<2) or (v1.a<5)) and (v1.c>450);
 +a	b	c	a	b	c
 +1	21	988	1	16	909
 +1	21	988	1	19	132
 +select * from v1,t2 where (v1.a=t2.a) and ((v1.a<2) or (v1.a<5)) and (v1.c>450);
 +a	b	c	a	b	c
 +1	21	988	1	16	909
 +1	21	988	1	19	132
 +explain select * from v1,t2 where (v1.a=t2.a) and ((v1.a<2) or (v1.a<5)) and (v1.c>450);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	2	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	EXCEPT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	EXCEPT RESULT	<except2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and ((v1.a<2) or (v1.a<5)) and (v1.c>450);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "(t2.a < 2 or t2.a < 5) and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.c > 450",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<except2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 300 and c > 450",
 +                  "filesort": {
 +                    "sort_key": "t1.a",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 20 and (t1.a < 2 or t1.a < 5)"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "EXCEPT",
 +                  "having_condition": "c > 150 and (t1.a < 2 or t1.a < 5) and c > 450",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 7"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using union and intersect in view definition
 +# conditions are pushed in different parts of selects
 +# conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +select a, b, max(c) as c from t1
 +where t1.a<9 group by a having c > 100
 +intersect
 +select a, b, max(c) as c from t1
 +where t1.a>3 group by b having c < 800
 +union
 +select a, b, max(c) as c from t1
 +where t1.b>10 group by a,b having c > 300;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.a=t2.a) and (v1.a>1) and (v1.b > 12) and (v1.c>400);
 +a	b	c	a	b	c
 +5	14	787	5	14	312
 +5	14	787	5	33	207
 +select * from v1,t2 where (v1.a=t2.a) and (v1.a>1) and (v1.b > 12) and (v1.c>400);
 +a	b	c	a	b	c
 +5	14	787	5	14	312
 +5	14	787	5	33	207
 +explain select * from v1,t2 where (v1.a=t2.a) and (v1.a>1) and (v1.b > 12) and (v1.c>400);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.a	3	Using where
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +3	INTERSECT	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +4	UNION	t1	ALL	NULL	NULL	NULL	NULL	18	Using where; Using temporary; Using filesort
 +NULL	UNIT RESULT	<unit2,3,4>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.a=t2.a) and (v1.a>1) and (v1.b > 12) and (v1.c>400);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.a > 1 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "v1.b > 12 and v1.c > 400",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<unit2,3,4>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "having_condition": "c > 100 and t1.b > 12 and c > 400",
 +                  "filesort": {
 +                    "sort_key": "t1.a",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a < 9 and t1.a > 1"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "INTERSECT",
 +                  "having_condition": "c < 800 and t1.a > 1 and c > 400",
 +                  "filesort": {
 +                    "sort_key": "t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.a > 3 and t1.b > 12"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "operation": "UNION",
 +                  "having_condition": "c > 300 and c > 400",
 +                  "filesort": {
 +                    "sort_key": "t1.a, t1.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t1",
 +                        "access_type": "ALL",
 +                        "rows": 18,
 +                        "filtered": 100,
 +                        "attached_condition": "t1.b > 10 and t1.a > 1 and t1.b > 12"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +create table t3 (a int, b int, c int);
 +insert into t3 values
 +(1,21,345), (2,33,7), (8,33,114), (3,21,500), (1,19,107), (5,14,787),
 +(4,33,123), (9,10,211), (11,16,207), (10,33,988), (5,27,132), (12,21,104),
 +(6,20,309), (16,20,315), (16,21,101), (18,33,404), (19,10,800), (10,21,123),
 +(17,11,708), (6,20,214);
 +create index i1 on t3(a);
 +# conjunctive subformulas : pushing into WHERE
 +# pushed condition gives range access
 +create view v1 as
 +select a, b, max(c) as max_c from t3
 +where a>0 group by a;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.b=t2.b) and (v1.a<5);
 +a	b	max_c	a	b	c
 +4	33	123	5	33	207
 +2	33	7	5	33	207
 +4	33	123	8	33	117
 +2	33	7	8	33	117
 +3	21	500	3	21	231
 +1	21	345	3	21	231
 +select * from v1,t2 where (v1.b=t2.b) and (v1.a<5);
 +a	b	max_c	a	b	c
 +1	21	345	3	21	231
 +2	33	7	5	33	207
 +2	33	7	8	33	117
 +3	21	500	3	21	231
 +4	33	123	5	33	207
 +4	33	123	8	33	117
 +explain select * from v1,t2 where (v1.b=t2.b) and (v1.a<5);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	5	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t3	range	i1	i1	5	NULL	5	Using index condition
 +explain format=json select * from v1,t2 where (v1.b=t2.b) and (v1.a<5);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "<derived2>",
 +        "access_type": "ALL",
 +        "rows": 5,
 +        "filtered": 80,
 +        "attached_condition": "v1.a < 5"
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "v1.b = t2.b",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t3",
 +            "access_type": "range",
 +            "possible_keys": ["i1"],
 +            "key": "i1",
 +            "key_length": "5",
 +            "used_key_parts": ["a"],
 +            "rows": 5,
 +            "filtered": 100,
 +            "index_condition": "t3.a > 0 and t3.a < 5"
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +# using union in view definition
 +# conjunctive subformulas : pushing into WHERE
 +# pushed condition gives range access
 +create view v1 as
 +select a, b, max(c) as c from t3
 +where t3.a>1 group by a
 +union
 +select a, b, max(c) as c from t3
 +where t3.a>2 group by a;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.b=t2.b) and (v1.a<4);
 +a	b	c	a	b	c
 +2	33	7	5	33	207
 +2	33	7	8	33	117
 +3	21	500	3	21	231
 +select * from v1,t2 where (v1.b=t2.b) and (v1.a<4);
 +a	b	c	a	b	c
 +2	33	7	5	33	207
 +2	33	7	8	33	117
 +3	21	500	3	21	231
 +explain select * from v1,t2 where (v1.b=t2.b) and (v1.a<4);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	3	Using where
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where; Using join buffer (flat, BNL join)
 +2	DERIVED	t3	range	i1	i1	5	NULL	2	Using index condition
 +3	UNION	t3	range	i1	i1	5	NULL	1	Using index condition
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.b=t2.b) and (v1.a<4);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 3,
 +      "filtered": 100,
 +      "attached_condition": "v1.a < 4",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "table": {
 +                    "table_name": "t3",
 +                    "access_type": "range",
 +                    "possible_keys": ["i1"],
 +                    "key": "i1",
 +                    "key_length": "5",
 +                    "used_key_parts": ["a"],
 +                    "rows": 2,
 +                    "filtered": 100,
 +                    "index_condition": "t3.a > 1 and t3.a < 4"
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "table_name": "t3",
 +                    "access_type": "range",
 +                    "possible_keys": ["i1"],
 +                    "key": "i1",
 +                    "key_length": "5",
 +                    "used_key_parts": ["a"],
 +                    "rows": 1,
 +                    "filtered": 100,
 +                    "index_condition": "t3.a > 2 and t3.a < 4"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    },
 +    "block-nl-join": {
 +      "table": {
 +        "table_name": "t2",
 +        "access_type": "ALL",
 +        "rows": 9,
 +        "filtered": 100
 +      },
 +      "buffer_type": "flat",
 +      "buffer_size": "256Kb",
 +      "join_type": "BNL",
 +      "attached_condition": "t2.b = v1.b"
 +    }
 +  }
 +}
 +drop view v1;
 +# using union in view definition
 +# conjunctive subformulas : pushing into WHERE
 +# pushed condition gives range access in one of the selects
 +create view v1 as
 +select a, b, max(c) as c from t3
 +where t3.a>1 group by a
 +union
 +select a, b, max(c) as c from t3
 +where t3.b<21 group by b;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where (v1.b=t2.b) and (v1.a<3);
 +a	b	c	a	b	c
 +2	33	7	5	33	207
 +1	19	107	1	19	132
 +2	33	7	8	33	117
 +select * from v1,t2 where (v1.b=t2.b) and (v1.a<3);
 +a	b	c	a	b	c
 +2	33	7	5	33	207
 +1	19	107	1	19	132
 +2	33	7	8	33	117
 +explain select * from v1,t2 where (v1.b=t2.b) and (v1.a<3);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	9	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t2.b	2	Using where
 +2	DERIVED	t3	range	i1	i1	5	NULL	1	Using index condition
 +3	UNION	t3	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +NULL	UNION RESULT	<union2,3>	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain format=json select * from v1,t2 where (v1.b=t2.b) and (v1.a<3);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 9,
 +      "filtered": 100,
 +      "attached_condition": "t2.b is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "ref": ["test.t2.b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "v1.a < 3",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "table": {
 +                    "table_name": "t3",
 +                    "access_type": "range",
 +                    "possible_keys": ["i1"],
 +                    "key": "i1",
 +                    "key_length": "5",
 +                    "used_key_parts": ["a"],
 +                    "rows": 1,
 +                    "filtered": 100,
 +                    "index_condition": "t3.a > 1 and t3.a < 3"
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "having_condition": "t3.a < 3",
 +                  "filesort": {
 +                    "sort_key": "t3.b",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t3",
 +                        "access_type": "ALL",
 +                        "rows": 20,
 +                        "filtered": 100,
 +                        "attached_condition": "t3.b < 21"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop view v1;
 +alter table t3 drop index i1;
 +drop table t1,t2,t3;
 +#
 +# MDEV-10855: Pushdown into derived with window functions
 +#
 +set @save_optimizer_switch= @@optimizer_switch;
 +set optimizer_switch='split_materialized=off';
 +create table t1 (a int, c varchar(16));
 +insert into t1 values
 +(8,'aa'), (5,'cc'), (1,'bb'), (2,'aa'), (9,'cc'),
 +(7,'aa'), (2,'aa'), (7,'bb');
 +create table t2 (a int, b int, c varchar(16), index idx(a,c));
 +insert into t2 values
 +(7,10,'cc'), (1,20,'aa'), (2,23,'bb'), (7,18,'cc'), (1,30,'bb'),
 +(4,71,'xx'), (3,15,'aa'), (7,82,'bb'), (8,12,'dd'), (4,15,'aa'),
 +(11,33,'yy'), (10,42,'zz'), (4,53,'xx'), (10,17,'yy'), (7,12,'bb'),
 +(8,20,'dd'), (7,32,'bb'), (1,50,'aa'), (3,40,'bb'), (3,77,'aa');
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from (select a, c, sum(b) over (partition by a,c) from t2) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum(b) over (partition by a,c)
 +3	aa	92
 +3	aa	92
 +3	bb	40
 +4	aa	15
 +7	bb	126
 +7	bb	126
 +7	bb	126
 +7	cc	28
 +7	cc	28
 +select * from (select a, c, sum(b) over (partition by a,c) from t2) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum(b) over (partition by a,c)
 +3	aa	92
 +3	aa	92
 +3	bb	40
 +4	aa	15
 +7	bb	126
 +7	bb	126
 +7	bb	126
 +7	cc	28
 +7	cc	28
 +explain select * from (select a, c, sum(b) over (partition by a,c) from t2) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	16	Using where
 +2	DERIVED	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary
 +explain format=json select * from (select a, c, sum(b) over (partition by a,c) from t2) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 16,
 +      "filtered": 100,
 +      "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "window_functions_computation": {
 +            "sorts": {
 +              "filesort": {
 +                "sort_key": "t2.a, t2.c"
 +              }
 +            },
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx"],
 +                "rows": 20,
 +                "filtered": 80,
 +                "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +n	a	c	s
 +1	3	aa	92
 +1	3	aa	92
 +1	3	bb	40
 +1	4	aa	15
 +1	7	bb	126
 +1	7	bb	126
 +1	7	bb	126
 +1	7	cc	28
 +1	7	cc	28
 +2	3	aa	132
 +2	3	aa	132
 +2	3	bb	132
 +2	4	aa	139
 +2	7	bb	154
 +2	7	bb	154
 +2	7	bb	154
 +2	7	cc	154
 +2	7	cc	154
 +select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +n	a	c	s
 +1	3	aa	92
 +1	3	aa	92
 +1	3	bb	40
 +1	4	aa	15
 +1	7	bb	126
 +1	7	bb	126
 +1	7	bb	126
 +1	7	cc	28
 +1	7	cc	28
 +2	3	aa	132
 +2	3	aa	132
 +2	3	bb	132
 +2	4	aa	139
 +2	7	bb	154
 +2	7	bb	154
 +2	7	bb	154
 +2	7	cc	154
 +2	7	cc	154
 +explain select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	32	Using where
 +2	DERIVED	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary
 +3	UNION	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary
 +explain format=json select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 32,
 +      "filtered": 100,
 +      "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "window_functions_computation": {
 +                    "sorts": {
 +                      "filesort": {
 +                        "sort_key": "t2.a, t2.c"
 +                      }
 +                    },
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t2",
 +                        "access_type": "ALL",
 +                        "possible_keys": ["idx"],
 +                        "rows": 20,
 +                        "filtered": 80,
 +                        "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "window_functions_computation": {
 +                    "sorts": {
 +                      "filesort": {
 +                        "sort_key": "t2.a"
 +                      }
 +                    },
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t2",
 +                        "access_type": "ALL",
 +                        "possible_keys": ["idx"],
 +                        "rows": 20,
 +                        "filtered": 80,
 +                        "attached_condition": "t2.a > 2"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select *
 +from (select a, c, sum(b) over (partition by a,c) as s from t2) as t, t1
 +where t1.a=t.a and t1.c=t.c and t1.c in ('aa','bb','cc');
 +a	c	s	a	c
 +1	bb	30	1	bb
 +7	bb	126	7	bb
 +7	bb	126	7	bb
 +7	bb	126	7	bb
 +select *
 +from (select a, c, sum(b) over (partition by a,c) as s from t2) as t, t1
 +where t1.a=t.a and t1.c=t.c and t1.c in ('aa','bb','cc');
 +a	c	s	a	c
 +1	bb	30	1	bb
 +7	bb	126	7	bb
 +7	bb	126	7	bb
 +7	bb	126	7	bb
 +explain select *
 +from (select a, c, sum(b) over (partition by a,c) as s from t2) as t, t1
 +where t1.a=t.a and t1.c=t.c and t1.c in ('aa','bb','cc');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	8	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	24	test.t1.a,test.t1.c	2	
 +2	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary
 +explain format=json select *
 +from (select a, c, sum(b) over (partition by a,c) as s from t2) as t, t1
 +where t1.a=t.a and t1.c=t.c and t1.c in ('aa','bb','cc');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 8,
 +      "filtered": 100,
 +      "attached_condition": "t1.c in ('aa','bb','cc') and t1.a is not null and t1.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "24",
 +      "used_key_parts": ["a", "c"],
 +      "ref": ["test.t1.a", "test.t1.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "window_functions_computation": {
 +            "sorts": {
 +              "filesort": {
 +                "sort_key": "t2.a, t2.c"
 +              }
 +            },
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t2.c in ('aa','bb','cc')"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +union all
 +select 3 as n, a, c, sum(b) as s from t2 group by a
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +n	a	c	s
 +1	3	aa	92
 +1	3	aa	92
 +1	3	bb	40
 +1	4	aa	15
 +1	7	bb	126
 +1	7	bb	126
 +1	7	bb	126
 +1	7	cc	28
 +1	7	cc	28
 +2	3	aa	132
 +2	3	aa	132
 +2	3	bb	132
 +2	4	aa	139
 +2	7	bb	154
 +2	7	bb	154
 +2	7	bb	154
 +2	7	cc	154
 +2	7	cc	154
 +3	3	aa	132
 +3	7	cc	154
 +select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +union all
 +select 3 as n, a, c, sum(b) as s from t2 group by a
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +n	a	c	s
 +1	3	aa	92
 +1	3	aa	92
 +1	3	bb	40
 +1	4	aa	15
 +1	7	bb	126
 +1	7	bb	126
 +1	7	bb	126
 +1	7	cc	28
 +1	7	cc	28
 +2	3	aa	132
 +2	3	aa	132
 +2	3	bb	132
 +2	4	aa	139
 +2	7	bb	154
 +2	7	bb	154
 +2	7	bb	154
 +2	7	cc	154
 +2	7	cc	154
 +3	3	aa	132
 +3	7	cc	154
 +explain select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +union all
 +select 3 as n, a, c, sum(b) as s from t2 group by a
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	48	Using where
 +2	DERIVED	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary
 +3	UNION	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary
 +4	UNION	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary; Using filesort
 +explain format=json select * from
 +(
 +select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +union all
 +select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +union all
 +select 3 as n, a, c, sum(b) as s from t2 group by a
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 48,
 +      "filtered": 100,
 +      "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3,4>",
 +            "access_type": "ALL",
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "window_functions_computation": {
 +                    "sorts": {
 +                      "filesort": {
 +                        "sort_key": "t2.a, t2.c"
 +                      }
 +                    },
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t2",
 +                        "access_type": "ALL",
 +                        "possible_keys": ["idx"],
 +                        "rows": 20,
 +                        "filtered": 80,
 +                        "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "window_functions_computation": {
 +                    "sorts": {
 +                      "filesort": {
 +                        "sort_key": "t2.a"
 +                      }
 +                    },
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t2",
 +                        "access_type": "ALL",
 +                        "possible_keys": ["idx"],
 +                        "rows": 20,
 +                        "filtered": 80,
 +                        "attached_condition": "t2.a > 2"
 +                      }
 +                    }
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 4,
 +                  "operation": "UNION",
 +                  "having_condition": "t2.c in ('aa','bb','cc')",
 +                  "filesort": {
 +                    "sort_key": "t2.a",
 +                    "temporary_table": {
 +                      "table": {
 +                        "table_name": "t2",
 +                        "access_type": "ALL",
 +                        "possible_keys": ["idx"],
 +                        "rows": 20,
 +                        "filtered": 80,
 +                        "attached_condition": "t2.a > 2"
 +                      }
 +                    }
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a,c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum_b	avg_b
 +3	aa	92	46.0000
 +3	aa	92	46.0000
 +3	bb	40	40.0000
 +4	aa	15	15.0000
 +7	bb	126	42.0000
 +7	bb	126	42.0000
 +7	bb	126	42.0000
 +7	cc	28	14.0000
 +7	cc	28	14.0000
 +select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a,c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum_b	avg_b
 +3	aa	92	46.0000
 +3	aa	92	46.0000
 +3	bb	40	40.0000
 +4	aa	15	15.0000
 +7	bb	126	42.0000
 +7	bb	126	42.0000
 +7	bb	126	42.0000
 +7	cc	28	14.0000
 +7	cc	28	14.0000
 +explain select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a,c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	16	Using where
 +2	DERIVED	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary
 +explain format=json select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a,c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 16,
 +      "filtered": 100,
 +      "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "window_functions_computation": {
 +            "sorts": {
 +              "filesort": {
 +                "sort_key": "t2.a, t2.c"
 +              }
 +            },
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx"],
 +                "rows": 20,
 +                "filtered": 80,
 +                "attached_condition": "t2.a > 2 and t2.c in ('aa','bb','cc')"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum_b	avg_b
 +3	aa	92	44.0000
 +3	aa	92	44.0000
 +3	bb	40	44.0000
 +4	aa	15	46.3333
 +7	bb	126	30.8000
 +7	bb	126	30.8000
 +7	bb	126	30.8000
 +7	cc	28	30.8000
 +7	cc	28	30.8000
 +select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum_b	avg_b
 +3	aa	92	44.0000
 +3	aa	92	44.0000
 +3	bb	40	44.0000
 +4	aa	15	46.3333
 +7	bb	126	30.8000
 +7	bb	126	30.8000
 +7	bb	126	30.8000
 +7	cc	28	30.8000
 +7	cc	28	30.8000
 +explain select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	16	Using where
 +2	DERIVED	t2	ALL	idx	NULL	NULL	NULL	20	Using where; Using temporary
 +explain format=json select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by a) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 16,
 +      "filtered": 100,
 +      "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "window_functions_computation": {
 +            "sorts": {
 +              "filesort": {
 +                "sort_key": "t2.a, t2.c"
 +              }
 +            },
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx"],
 +                "rows": 20,
 +                "filtered": 80,
 +                "attached_condition": "t2.a > 2"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum_b	avg_b
 +3	aa	92	35.4000
 +3	aa	92	35.4000
 +3	bb	40	36.5000
 +4	aa	15	35.4000
 +7	bb	126	36.5000
 +7	bb	126	36.5000
 +7	bb	126	36.5000
 +7	cc	28	14.0000
 +7	cc	28	14.0000
 +select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +a	c	sum_b	avg_b
 +3	aa	92	35.4000
 +3	aa	92	35.4000
 +3	bb	40	36.5000
 +4	aa	15	35.4000
 +7	bb	126	36.5000
 +7	bb	126	36.5000
 +7	bb	126	36.5000
 +7	cc	28	14.0000
 +7	cc	28	14.0000
 +explain select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	20	Using where
 +2	DERIVED	t2	ALL	NULL	NULL	NULL	NULL	20	Using where; Using temporary
 +explain format=json select * from (select a, c,
 +sum(b) over (partition by a,c) as sum_b,
 +avg(b) over (partition by c) as avg_b
 +from t2 ) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "rows": 20,
 +      "filtered": 100,
 +      "attached_condition": "t.a > 2 and t.c in ('aa','bb','cc')",
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "window_functions_computation": {
 +            "sorts": {
 +              "filesort": {
 +                "sort_key": "t2.a, t2.c"
 +              },
 +              "filesort": {
 +                "sort_key": "t2.c"
 +              }
 +            },
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "rows": 20,
 +                "filtered": 100,
 +                "attached_condition": "t2.c in ('aa','bb','cc')"
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop table t1,t2;
 +set optimizer_switch= @save_optimizer_switch;
 +#
 +# MDEV-13369: Optimization for equi-joins of grouping derived tables
 +#             (Splitting derived tables / views with GROUP BY)
 +# MDEV-13389: Optimization for equi-joins of derived tables with WF
 +#             (Splitting derived tables / views with window functions)
 +#
 +create table t1 (a int, b int, index idx_b(b)) engine=myisam;
 +insert into t1 values
 +(8,3), (5,7), (1,2), (2,1), (9,7), (7,5), (2,2), (7,3),
 +(9,3), (8,1), (4,5), (2,3);
 +create table t2 (a int, b int, c char(127), index idx_a(a)) engine=myisam;
 +insert into t2 values
 +(7,10,'x'), (1,20,'a'), (2,23,'b'), (7,18,'z'), (1,30,'c'),
 +(4,71,'d'), (3,15,'x'), (7,82,'y'), (8,12,'t'), (4,15,'b'),
 +(11,33,'a'), (10,42,'u'), (4,53,'p'), (10,17,'r'), (2,90,'x'),
 +(17,10,'s'), (11,20,'v'), (12,23,'y'), (17,18,'a'), (11,30,'d'),
 +(24,71,'h'), (23,15,'i'), (27,82,'k'), (28,12,'p'), (24,15,'q'),
 +(31,33,'f'), (30,42,'h'), (40,53,'m'), (30,17,'o'), (21,90,'b'),
 +(37,10,'e'), (31,20,'g'), (32,23,'f'), (37,18,'n'), (41,30,'l'),
 +(54,71,'j'), (53,15,'w'), (57,82,'z'), (58,12,'k'), (54,15,'p'),
 +(61,33,'c'), (60,42,'a'), (62,53,'x'), (67,17,'g'), (64,90,'v');
 +insert into t2 select a+10, b+10, concat(c,'f') from t2;
 +analyze table t1,t2;
 +Table	Op	Msg_type	Msg_text
 +test.t1	analyze	status	OK
 +test.t2	analyze	status	OK
 +set statement optimizer_switch='split_materialized=off' for select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.c) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b < 3;
 +a	s	m
 +2	113	b
 +8	12	t
 +1	50	a
 +2	113	b
 +select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.c) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b < 3;
 +a	s	m
 +2	113	b
 +8	12	t
 +1	50	a
 +2	113	b
 +explain extended select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.c) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b < 3;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t1	range	idx_b	idx_b	5	NULL	4	100.00	Using index condition; Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t1.a	2	100.00	
 +2	LATERAL DERIVED	t2	ref	idx_a	idx_a	5	test.t1.a	2	100.00	
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`t`.`s` AS `s`,`t`.`m` AS `m` from `test`.`t1` join (/* select#2 */ select `test`.`t2`.`a` AS `a`,sum(`test`.`t2`.`b`) AS `s`,min(`test`.`t2`.`c`) AS `m` from `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` group by `test`.`t2`.`a`) `t` where `t`.`a` = `test`.`t1`.`a` and `test`.`t1`.`b` < 3
 +explain format=json select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.c) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b < 3;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "range",
 +      "possible_keys": ["idx_b"],
 +      "key": "idx_b",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "index_condition": "t1.b < 3",
 +      "attached_condition": "t1.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "outer_ref_condition": "t1.a is not null",
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ref",
 +            "possible_keys": ["idx_a"],
 +            "key": "idx_a",
 +            "key_length": "5",
 +            "used_key_parts": ["a"],
 +            "ref": ["test.t1.a"],
 +            "rows": 2,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +prepare stmt from "select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.c) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b < 3";
 +execute stmt;
 +a	s	m
 +2	113	b
 +8	12	t
 +1	50	a
 +2	113	b
 +execute stmt;
 +a	s	m
 +2	113	b
 +8	12	t
 +1	50	a
 +2	113	b
 +deallocate prepare stmt;
 +set statement optimizer_switch='split_materialized=off' for select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.b) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b <= 5;
 +a	s	m
 +8	12	12
 +1	50	20
 +2	113	23
 +7	110	10
 +2	113	23
 +7	110	10
 +8	12	12
 +4	139	15
 +2	113	23
 +select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.b) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b <= 5;
 +a	s	m
 +8	12	12
 +1	50	20
 +2	113	23
 +7	110	10
 +2	113	23
 +7	110	10
 +8	12	12
 +4	139	15
 +2	113	23
 +explain extended select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.b) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b <= 5;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t1	ALL	idx_b	NULL	NULL	NULL	12	75.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t1.a	9	100.00	
 +2	DERIVED	t2	ALL	idx_a	NULL	NULL	NULL	90	100.00	Using temporary; Using filesort
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`t`.`s` AS `s`,`t`.`m` AS `m` from `test`.`t1` join (/* select#2 */ select `test`.`t2`.`a` AS `a`,sum(`test`.`t2`.`b`) AS `s`,min(`test`.`t2`.`b`) AS `m` from `test`.`t2` group by `test`.`t2`.`a`) `t` where `t`.`a` = `test`.`t1`.`a` and `test`.`t1`.`b` <= 5
 +explain format=json select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.b) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b <= 5;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "possible_keys": ["idx_b"],
 +      "rows": 12,
 +      "filtered": 75,
 +      "attached_condition": "t1.b <= 5 and t1.a is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t1.a"],
 +      "rows": 9,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t2.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t2",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx_a"],
 +                "rows": 90,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +prepare stmt from "select t1.a,t.s,t.m
 +from t1 join
 +(select a, sum(t2.b) as s, min(t2.b) as m from t2 group by t2.a) t
 +on t1.a=t.a
 +where t1.b <= 5";
 +execute stmt;
 +a	s	m
 +8	12	12
 +1	50	20
 +2	113	23
 +7	110	10
 +2	113	23
 +7	110	10
 +8	12	12
 +4	139	15
 +2	113	23
 +execute stmt;
 +a	s	m
 +8	12	12
 +1	50	20
 +2	113	23
 +7	110	10
 +2	113	23
 +7	110	10
 +8	12	12
 +4	139	15
 +2	113	23
 +deallocate prepare stmt;
 +delete from t1 where t1.b between 2 and 5;
 +set statement optimizer_switch='split_materialized=off' for select t1.a,t.max,t.min
 +from t1 left join
 +(select a, max(t2.b) max, min(t2.b) min from t2 group by t2.a) t
 +on t1.a=t.a;
 +a	max	min
 +5	NULL	NULL
 +2	90	23
 +9	NULL	NULL
 +8	12	12
 +select t1.a,t.max,t.min
 +from t1 left join
 +(select a, max(t2.b) max, min(t2.b) min from t2 group by t2.a) t
 +on t1.a=t.a;
 +a	max	min
 +5	NULL	NULL
 +2	90	23
 +9	NULL	NULL
 +8	12	12
 +explain extended select t1.a,t.max,t.min
 +from t1 left join
 +(select a, max(t2.b) max, min(t2.b) min from t2 group by t2.a) t
 +on t1.a=t.a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t1	ALL	NULL	NULL	NULL	NULL	4	100.00	
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t1.a	2	100.00	Using where
 +2	LATERAL DERIVED	t2	ref	idx_a	idx_a	5	test.t1.a	2	100.00	
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t1`.`a` AS `a`,`t`.`max` AS `max`,`t`.`min` AS `min` from `test`.`t1` left join (/* select#2 */ select `test`.`t2`.`a` AS `a`,max(`test`.`t2`.`b`) AS `max`,min(`test`.`t2`.`b`) AS `min` from `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` group by `test`.`t2`.`a`) `t` on(`t`.`a` = `test`.`t1`.`a` and `test`.`t1`.`a` is not null) where 1
 +explain format=json select t1.a,t.max,t.min
 +from t1 left join
 +(select a, max(t2.b) max, min(t2.b) min from t2 group by t2.a) t
 +on t1.a=t.a;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "const_condition": "1",
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "rows": 4,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t1.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "trigcond(trigcond(t1.a is not null))",
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "outer_ref_condition": "t1.a is not null",
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ref",
 +            "possible_keys": ["idx_a"],
 +            "key": "idx_a",
 +            "key_length": "5",
 +            "used_key_parts": ["a"],
 +            "ref": ["test.t1.a"],
 +            "rows": 2,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +create table t3 (a int, b int, c char(127), index idx_b(b)) engine=myisam;
 +insert into t3 values
 +(8,11,'aa'), (5,15,'cc'), (1,14,'bb'), (2,12,'aa'), (7,17,'cc'),
 +(7,18,'aa'), (2,11,'aa'), (7,10,'bb'), (3,11,'dd'), (4,12,'ee'),
 +(5,14,'dd'), (9,12,'ee');
 +create table t4 (a int, b int, c char(127), index idx(a,c)) engine=myisam;
 +insert into t4 values
 +(7,10,'cc'), (1,20,'aa'), (2,23,'bb'), (7,18,'cc'), (1,30,'bb'),
 +(4,71,'xx'), (3,15,'aa'), (7,82,'aa'), (8,12,'dd'), (4,15,'aa'),
 +(11,33,'yy'), (10,42,'zz'), (4,53,'xx'), (10,17,'yy'), (7,12,'cc'),
 +(8,20,'dd'), (7,32,'bb'), (1,50,'aa'), (3,40,'bb'), (3,77,'aa');
 +insert into t4 select a+10, b+10, concat(c,'f') from t4;
 +analyze table t3,t4;
 +Table	Op	Msg_type	Msg_text
 +test.t3	analyze	status	OK
 +test.t4	analyze	status	OK
 +set statement optimizer_switch='split_materialized=off' for select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +a	c	max	min
 +7	cc	18	10
 +7	aa	82	82
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +a	c	max	min
 +7	cc	18	10
 +7	aa	82	82
 +explain extended select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t3	range	idx_b	idx_b	5	NULL	3	100.00	Using index condition; Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	133	test.t3.a,test.t3.c	2	100.00	
 +2	LATERAL DERIVED	t4	ref	idx	idx	133	test.t3.a,test.t3.c	1	100.00	
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t3`.`a` AS `a`,`test`.`t3`.`c` AS `c`,`t`.`max` AS `max`,`t`.`min` AS `min` from `test`.`t3` join (/* select#2 */ select `test`.`t4`.`a` AS `a`,`test`.`t4`.`c` AS `c`,max(`test`.`t4`.`b`) AS `max`,min(`test`.`t4`.`b`) AS `min` from `test`.`t4` where `test`.`t4`.`a` = `test`.`t3`.`a` and `test`.`t4`.`c` = `test`.`t3`.`c` group by `test`.`t4`.`a`,`test`.`t4`.`c`) `t` where `t`.`a` = `test`.`t3`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t3`.`b` > 15
 +explain format=json select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "range",
 +      "possible_keys": ["idx_b"],
 +      "key": "idx_b",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "index_condition": "t3.b > 15",
 +      "attached_condition": "t3.a is not null and t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "133",
 +      "used_key_parts": ["a", "c"],
 +      "ref": ["test.t3.a", "test.t3.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "outer_ref_condition": "t3.a is not null and t3.c is not null",
 +          "table": {
 +            "table_name": "t4",
 +            "access_type": "ref",
 +            "possible_keys": ["idx"],
 +            "key": "idx",
 +            "key_length": "133",
 +            "used_key_parts": ["a", "c"],
 +            "ref": ["test.t3.a", "test.t3.c"],
 +            "rows": 1,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='split_materialized=off' for select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +a	c	max	min
 +1	bb	30	30
 +7	bb	32	32
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +a	c	max	min
 +1	bb	30	30
 +7	bb	32	32
 +explain extended select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t3	ALL	idx_b	NULL	NULL	NULL	12	75.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	133	test.t3.a,test.t3.c	4	100.00	
 +2	DERIVED	t4	ALL	idx	NULL	NULL	NULL	40	100.00	Using temporary; Using filesort
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t3`.`a` AS `a`,`test`.`t3`.`c` AS `c`,`t`.`max` AS `max`,`t`.`min` AS `min` from `test`.`t3` join (/* select#2 */ select `test`.`t4`.`a` AS `a`,`test`.`t4`.`c` AS `c`,max(`test`.`t4`.`b`) AS `max`,min(`test`.`t4`.`b`) AS `min` from `test`.`t4` group by `test`.`t4`.`a`,`test`.`t4`.`c`) `t` where `t`.`a` = `test`.`t3`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t3`.`b` <= 15
 +explain format=json select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ALL",
 +      "possible_keys": ["idx_b"],
 +      "rows": 12,
 +      "filtered": 75,
 +      "attached_condition": "t3.b <= 15 and t3.a is not null and t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "133",
 +      "used_key_parts": ["a", "c"],
 +      "ref": ["test.t3.a", "test.t3.c"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t4.a, t4.c",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t4",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx"],
 +                "rows": 40,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='split_materialized=off' for select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +a	c	max	min
 +7	cc	18	10
 +7	aa	82	82
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +a	c	max	min
 +7	cc	18	10
 +7	aa	82	82
 +explain extended select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t3	range	idx_b	idx_b	5	NULL	3	100.00	Using index condition; Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	133	test.t3.a,test.t3.c	2	100.00	
 +2	LATERAL DERIVED	t4	ref	idx	idx	133	test.t3.a,test.t3.c	1	100.00	
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t3`.`a` AS `a`,`test`.`t3`.`c` AS `c`,`t`.`max` AS `max`,`t`.`min` AS `min` from `test`.`t3` join (/* select#2 */ select `test`.`t4`.`a` AS `a`,`test`.`t4`.`c` AS `c`,max(`test`.`t4`.`b`) AS `max`,min(`test`.`t4`.`b`) AS `min` from `test`.`t4` where `test`.`t4`.`a` = `test`.`t3`.`a` and `test`.`t4`.`c` = `test`.`t3`.`c` group by `test`.`t4`.`c`,`test`.`t4`.`a`) `t` where `t`.`a` = `test`.`t3`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t3`.`b` > 15
 +explain format=json select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "range",
 +      "possible_keys": ["idx_b"],
 +      "key": "idx_b",
 +      "key_length": "5",
 +      "used_key_parts": ["b"],
 +      "rows": 3,
 +      "filtered": 100,
 +      "index_condition": "t3.b > 15",
 +      "attached_condition": "t3.a is not null and t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "133",
 +      "used_key_parts": ["a", "c"],
 +      "ref": ["test.t3.a", "test.t3.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "outer_ref_condition": "t3.a is not null and t3.c is not null",
 +          "table": {
 +            "table_name": "t4",
 +            "access_type": "ref",
 +            "possible_keys": ["idx"],
 +            "key": "idx",
 +            "key_length": "133",
 +            "used_key_parts": ["a", "c"],
 +            "ref": ["test.t3.a", "test.t3.c"],
 +            "rows": 1,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='split_materialized=off' for select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +a	c	max	min
 +1	bb	30	30
 +7	bb	32	32
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +a	c	max	min
 +1	bb	30	30
 +7	bb	32	32
 +explain extended select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t3	ALL	idx_b	NULL	NULL	NULL	12	75.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	133	test.t3.a,test.t3.c	4	100.00	
 +2	DERIVED	t4	ALL	idx	NULL	NULL	NULL	40	100.00	Using temporary; Using filesort
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t3`.`a` AS `a`,`test`.`t3`.`c` AS `c`,`t`.`max` AS `max`,`t`.`min` AS `min` from `test`.`t3` join (/* select#2 */ select `test`.`t4`.`a` AS `a`,`test`.`t4`.`c` AS `c`,max(`test`.`t4`.`b`) AS `max`,min(`test`.`t4`.`b`) AS `min` from `test`.`t4` group by `test`.`t4`.`c`,`test`.`t4`.`a`) `t` where `t`.`a` = `test`.`t3`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t3`.`b` <= 15
 +explain format=json select t3.a,t3.c,t.max,t.min
 +from t3 join
 +(select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ALL",
 +      "possible_keys": ["idx_b"],
 +      "rows": 12,
 +      "filtered": 75,
 +      "attached_condition": "t3.b <= 15 and t3.a is not null and t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "133",
 +      "used_key_parts": ["a", "c"],
 +      "ref": ["test.t3.a", "test.t3.c"],
 +      "rows": 4,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t4.c, t4.a",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t4",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx"],
 +                "rows": 40,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop index idx_a on t2;
 +create index idx on t2(c,b);
 +create index idx_a on t3(a);
 +create index idx_c on t4(c);
 +insert into t3 select a+10, b+10, concat(c,'f') from t3;
 +insert into t3 select a+100, b+100, concat(c,'g')  from t3;
 +insert into t4 select a+100, b+100, concat(c,'g') from t4;
 +insert into t4 select a+1000, b+1000, concat(c,'h') from t4;
 +analyze table t2,t3,t4;
 +Table	Op	Msg_type	Msg_text
 +test.t2	analyze	status	OK
 +test.t3	analyze	status	OK
 +test.t4	analyze	status	OK
 +set statement optimizer_switch='split_materialized=off' for select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +a	b	c	t_c	max	min
 +7	82	y	aa	82	15
 +7	82	y	bb	40	23
 +7	82	y	cc	18	10
 +select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +a	b	c	t_c	max	min
 +7	82	y	aa	82	15
 +7	82	y	bb	40	23
 +7	82	y	cc	18	10
 +explain extended select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t2	range	idx	idx	133	NULL	2	100.00	Using index condition; Using where
 +1	PRIMARY	t3	ref	idx_a	idx_a	5	test.t2.a	2	100.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	128	test.t3.c	2	100.00	
 +2	LATERAL DERIVED	t4	ref	idx_c	idx_c	128	test.t3.c	3	100.00	
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`t`.`c` AS `t_c`,`t`.`max` AS `max`,`t`.`min` AS `min` from `test`.`t2` join `test`.`t3` join (/* select#2 */ select `test`.`t4`.`c` AS `c`,max(`test`.`t4`.`b`) AS `max`,min(`test`.`t4`.`b`) AS `min` from `test`.`t4` where `test`.`t4`.`c` = `test`.`t3`.`c` group by `test`.`t4`.`c`) `t` where `test`.`t3`.`a` = `test`.`t2`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t2`.`b` between 80 and 85 and `test`.`t2`.`c` in ('y','z')
 +explain format=json select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "range",
 +      "possible_keys": ["idx"],
 +      "key": "idx",
 +      "key_length": "133",
 +      "used_key_parts": ["c", "b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "index_condition": "t2.b between 80 and 85 and t2.c in ('y','z')",
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ref",
 +      "possible_keys": ["idx_a"],
 +      "key": "idx_a",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "128",
 +      "used_key_parts": ["c"],
 +      "ref": ["test.t3.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "outer_ref_condition": "t3.c is not null",
 +          "table": {
 +            "table_name": "t4",
 +            "access_type": "ref",
 +            "possible_keys": ["idx_c"],
 +            "key": "idx_c",
 +            "key_length": "128",
 +            "used_key_parts": ["c"],
 +            "ref": ["test.t3.c"],
 +            "rows": 3,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='split_materialized=off' for select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +a	b	c	t_c	max	min
 +7	10	x	cc	18	10
 +7	10	x	aa	82	15
 +7	10	x	bb	40	23
 +1	20	a	bb	40	23
 +2	23	b	aa	82	15
 +2	23	b	aa	82	15
 +7	18	z	cc	18	10
 +7	18	z	aa	82	15
 +7	18	z	bb	40	23
 +1	30	c	bb	40	23
 +3	15	x	dd	20	12
 +8	12	t	aa	82	15
 +11	33	a	bbf	50	33
 +17	10	s	ccf	28	20
 +17	10	s	aaf	92	25
 +17	10	s	bbf	50	33
 +11	20	v	bbf	50	33
 +12	23	y	aaf	92	25
 +12	23	y	aaf	92	25
 +17	18	a	ccf	28	20
 +17	18	a	aaf	92	25
 +17	18	a	bbf	50	33
 +11	30	d	bbf	50	33
 +17	20	xf	ccf	28	20
 +17	20	xf	aaf	92	25
 +17	20	xf	bbf	50	33
 +11	30	af	bbf	50	33
 +12	33	bf	aaf	92	25
 +12	33	bf	aaf	92	25
 +17	28	zf	ccf	28	20
 +17	28	zf	aaf	92	25
 +17	28	zf	bbf	50	33
 +13	25	xf	ddf	30	22
 +18	22	tf	aaf	92	25
 +select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +a	b	c	t_c	max	min
 +7	10	x	cc	18	10
 +7	10	x	aa	82	15
 +7	10	x	bb	40	23
 +1	20	a	bb	40	23
 +2	23	b	aa	82	15
 +2	23	b	aa	82	15
 +7	18	z	cc	18	10
 +7	18	z	aa	82	15
 +7	18	z	bb	40	23
 +1	30	c	bb	40	23
 +3	15	x	dd	20	12
 +8	12	t	aa	82	15
 +11	33	a	bbf	50	33
 +17	10	s	ccf	28	20
 +17	10	s	aaf	92	25
 +17	10	s	bbf	50	33
 +11	20	v	bbf	50	33
 +12	23	y	aaf	92	25
 +12	23	y	aaf	92	25
 +17	18	a	ccf	28	20
 +17	18	a	aaf	92	25
 +17	18	a	bbf	50	33
 +11	30	d	bbf	50	33
 +17	20	xf	ccf	28	20
 +17	20	xf	aaf	92	25
 +17	20	xf	bbf	50	33
 +11	30	af	bbf	50	33
 +12	33	bf	aaf	92	25
 +12	33	bf	aaf	92	25
 +17	28	zf	ccf	28	20
 +17	28	zf	aaf	92	25
 +17	28	zf	bbf	50	33
 +13	25	xf	ddf	30	22
 +18	22	tf	aaf	92	25
 +explain extended select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	90	100.00	Using where
 +1	PRIMARY	t3	ref	idx_a	idx_a	5	test.t2.a	2	100.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	128	test.t3.c	10	100.00	
 +2	DERIVED	t4	ALL	idx_c	NULL	NULL	NULL	160	100.00	Using temporary; Using filesort
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`t`.`c` AS `t_c`,`t`.`max` AS `max`,`t`.`min` AS `min` from `test`.`t2` join `test`.`t3` join (/* select#2 */ select `test`.`t4`.`c` AS `c`,max(`test`.`t4`.`b`) AS `max`,min(`test`.`t4`.`b`) AS `min` from `test`.`t4` group by `test`.`t4`.`c`) `t` where `test`.`t3`.`a` = `test`.`t2`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t2`.`b` < 40
 +explain format=json select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 90,
 +      "filtered": 100,
 +      "attached_condition": "t2.b < 40 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ref",
 +      "possible_keys": ["idx_a"],
 +      "key": "idx_a",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "128",
 +      "used_key_parts": ["c"],
 +      "ref": ["test.t3.c"],
 +      "rows": 10,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "filesort": {
 +            "sort_key": "t4.c",
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t4",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx_c"],
 +                "rows": 160,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='split_materialized=off' for select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +a	b	c	a	b	c	c	b	sum(b) over (partition by c)
 +7	82	y	7	10	bb	bb	23	125
 +7	82	y	7	10	bb	bb	30	125
 +7	82	y	7	10	bb	bb	32	125
 +7	82	y	7	10	bb	bb	40	125
 +7	82	y	7	17	cc	cc	10	40
 +7	82	y	7	17	cc	cc	12	40
 +7	82	y	7	17	cc	cc	18	40
 +7	82	y	7	18	aa	aa	15	259
 +7	82	y	7	18	aa	aa	15	259
 +7	82	y	7	18	aa	aa	20	259
 +7	82	y	7	18	aa	aa	50	259
 +7	82	y	7	18	aa	aa	77	259
 +7	82	y	7	18	aa	aa	82	259
 +select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +a	b	c	a	b	c	c	b	sum(b) over (partition by c)
 +7	82	y	7	10	bb	bb	23	125
 +7	82	y	7	10	bb	bb	30	125
 +7	82	y	7	10	bb	bb	32	125
 +7	82	y	7	10	bb	bb	40	125
 +7	82	y	7	17	cc	cc	10	40
 +7	82	y	7	17	cc	cc	12	40
 +7	82	y	7	17	cc	cc	18	40
 +7	82	y	7	18	aa	aa	15	259
 +7	82	y	7	18	aa	aa	15	259
 +7	82	y	7	18	aa	aa	20	259
 +7	82	y	7	18	aa	aa	50	259
 +7	82	y	7	18	aa	aa	77	259
 +7	82	y	7	18	aa	aa	82	259
 +explain extended select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t2	range	idx	idx	133	NULL	2	100.00	Using index condition; Using where
 +1	PRIMARY	t3	ref	idx_a	idx_a	5	test.t2.a	2	100.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	128	test.t3.c	2	100.00	
 +2	LATERAL DERIVED	t4	ref	idx_c	idx_c	128	test.t3.c	3	100.00	Using temporary
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`t`.`c` AS `c`,`t`.`b` AS `b`,`t`.`sum(b) over (partition by c)` AS `sum(b) over (partition by c)` from `test`.`t2` join `test`.`t3` join (/* select#2 */ select `test`.`t4`.`c` AS `c`,`test`.`t4`.`b` AS `b`,sum(`test`.`t4`.`b`) over ( partition by `test`.`t4`.`c`) AS `sum(b) over (partition by c)` from `test`.`t4` where `test`.`t4`.`c` = `test`.`t3`.`c`) `t` where `test`.`t3`.`a` = `test`.`t2`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t2`.`b` between 80 and 85 and `test`.`t2`.`c` in ('y','z')
 +explain format=json select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "range",
 +      "possible_keys": ["idx"],
 +      "key": "idx",
 +      "key_length": "133",
 +      "used_key_parts": ["c", "b"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "index_condition": "t2.b between 80 and 85 and t2.c in ('y','z')",
 +      "attached_condition": "t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ref",
 +      "possible_keys": ["idx_a"],
 +      "key": "idx_a",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "128",
 +      "used_key_parts": ["c"],
 +      "ref": ["test.t3.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "outer_ref_condition": "t3.c is not null",
 +          "window_functions_computation": {
 +            "sorts": {
 +              "filesort": {
 +                "sort_key": "t4.c"
 +              }
 +            },
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t4",
 +                "access_type": "ref",
 +                "possible_keys": ["idx_c"],
 +                "key": "idx_c",
 +                "key_length": "128",
 +                "used_key_parts": ["c"],
 +                "ref": ["test.t3.c"],
 +                "rows": 3,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set statement optimizer_switch='split_materialized=off' for select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +a	b	c	a	b	c	c	b	sum(b) over (partition by c)
 +1	20	a	1	14	bb	bb	23	125
 +1	20	a	1	14	bb	bb	30	125
 +1	20	a	1	14	bb	bb	32	125
 +1	20	a	1	14	bb	bb	40	125
 +1	30	c	1	14	bb	bb	23	125
 +1	30	c	1	14	bb	bb	30	125
 +1	30	c	1	14	bb	bb	32	125
 +1	30	c	1	14	bb	bb	40	125
 +11	20	v	11	24	bbf	bbf	33	165
 +11	20	v	11	24	bbf	bbf	40	165
 +11	20	v	11	24	bbf	bbf	42	165
 +11	20	v	11	24	bbf	bbf	50	165
 +11	30	af	11	24	bbf	bbf	33	165
 +11	30	af	11	24	bbf	bbf	40	165
 +11	30	af	11	24	bbf	bbf	42	165
 +11	30	af	11	24	bbf	bbf	50	165
 +11	30	d	11	24	bbf	bbf	33	165
 +11	30	d	11	24	bbf	bbf	40	165
 +11	30	d	11	24	bbf	bbf	42	165
 +11	30	d	11	24	bbf	bbf	50	165
 +11	33	a	11	24	bbf	bbf	33	165
 +11	33	a	11	24	bbf	bbf	40	165
 +11	33	a	11	24	bbf	bbf	42	165
 +11	33	a	11	24	bbf	bbf	50	165
 +12	23	y	12	21	aaf	aaf	25	319
 +12	23	y	12	21	aaf	aaf	25	319
 +12	23	y	12	21	aaf	aaf	30	319
 +12	23	y	12	21	aaf	aaf	60	319
 +12	23	y	12	21	aaf	aaf	87	319
 +12	23	y	12	21	aaf	aaf	92	319
 +12	23	y	12	22	aaf	aaf	25	319
 +12	23	y	12	22	aaf	aaf	25	319
 +12	23	y	12	22	aaf	aaf	30	319
 +12	23	y	12	22	aaf	aaf	60	319
 +12	23	y	12	22	aaf	aaf	87	319
 +12	23	y	12	22	aaf	aaf	92	319
 +12	33	bf	12	21	aaf	aaf	25	319
 +12	33	bf	12	21	aaf	aaf	25	319
 +12	33	bf	12	21	aaf	aaf	30	319
 +12	33	bf	12	21	aaf	aaf	60	319
 +12	33	bf	12	21	aaf	aaf	87	319
 +12	33	bf	12	21	aaf	aaf	92	319
 +12	33	bf	12	22	aaf	aaf	25	319
 +12	33	bf	12	22	aaf	aaf	25	319
 +12	33	bf	12	22	aaf	aaf	30	319
 +12	33	bf	12	22	aaf	aaf	60	319
 +12	33	bf	12	22	aaf	aaf	87	319
 +12	33	bf	12	22	aaf	aaf	92	319
 +13	25	xf	13	21	ddf	ddf	22	52
 +13	25	xf	13	21	ddf	ddf	30	52
 +17	10	s	17	20	bbf	bbf	33	165
 +17	10	s	17	20	bbf	bbf	40	165
 +17	10	s	17	20	bbf	bbf	42	165
 +17	10	s	17	20	bbf	bbf	50	165
 +17	10	s	17	27	ccf	ccf	20	70
 +17	10	s	17	27	ccf	ccf	22	70
 +17	10	s	17	27	ccf	ccf	28	70
 +17	10	s	17	28	aaf	aaf	25	319
 +17	10	s	17	28	aaf	aaf	25	319
 +17	10	s	17	28	aaf	aaf	30	319
 +17	10	s	17	28	aaf	aaf	60	319
 +17	10	s	17	28	aaf	aaf	87	319
 +17	10	s	17	28	aaf	aaf	92	319
 +17	18	a	17	20	bbf	bbf	33	165
 +17	18	a	17	20	bbf	bbf	40	165
 +17	18	a	17	20	bbf	bbf	42	165
 +17	18	a	17	20	bbf	bbf	50	165
 +17	18	a	17	27	ccf	ccf	20	70
 +17	18	a	17	27	ccf	ccf	22	70
 +17	18	a	17	27	ccf	ccf	28	70
 +17	18	a	17	28	aaf	aaf	25	319
 +17	18	a	17	28	aaf	aaf	25	319
 +17	18	a	17	28	aaf	aaf	30	319
 +17	18	a	17	28	aaf	aaf	60	319
 +17	18	a	17	28	aaf	aaf	87	319
 +17	18	a	17	28	aaf	aaf	92	319
 +17	20	xf	17	20	bbf	bbf	33	165
 +17	20	xf	17	20	bbf	bbf	40	165
 +17	20	xf	17	20	bbf	bbf	42	165
 +17	20	xf	17	20	bbf	bbf	50	165
 +17	20	xf	17	27	ccf	ccf	20	70
 +17	20	xf	17	27	ccf	ccf	22	70
 +17	20	xf	17	27	ccf	ccf	28	70
 +17	20	xf	17	28	aaf	aaf	25	319
 +17	20	xf	17	28	aaf	aaf	25	319
 +17	20	xf	17	28	aaf	aaf	30	319
 +17	20	xf	17	28	aaf	aaf	60	319
 +17	20	xf	17	28	aaf	aaf	87	319
 +17	20	xf	17	28	aaf	aaf	92	319
 +17	28	zf	17	20	bbf	bbf	33	165
 +17	28	zf	17	20	bbf	bbf	40	165
 +17	28	zf	17	20	bbf	bbf	42	165
 +17	28	zf	17	20	bbf	bbf	50	165
 +17	28	zf	17	27	ccf	ccf	20	70
 +17	28	zf	17	27	ccf	ccf	22	70
 +17	28	zf	17	27	ccf	ccf	28	70
 +17	28	zf	17	28	aaf	aaf	25	319
 +17	28	zf	17	28	aaf	aaf	25	319
 +17	28	zf	17	28	aaf	aaf	30	319
 +17	28	zf	17	28	aaf	aaf	60	319
 +17	28	zf	17	28	aaf	aaf	87	319
 +17	28	zf	17	28	aaf	aaf	92	319
 +18	22	tf	18	21	aaf	aaf	25	319
 +18	22	tf	18	21	aaf	aaf	25	319
 +18	22	tf	18	21	aaf	aaf	30	319
 +18	22	tf	18	21	aaf	aaf	60	319
 +18	22	tf	18	21	aaf	aaf	87	319
 +18	22	tf	18	21	aaf	aaf	92	319
 +2	23	b	2	11	aa	aa	15	259
 +2	23	b	2	11	aa	aa	15	259
 +2	23	b	2	11	aa	aa	20	259
 +2	23	b	2	11	aa	aa	50	259
 +2	23	b	2	11	aa	aa	77	259
 +2	23	b	2	11	aa	aa	82	259
 +2	23	b	2	12	aa	aa	15	259
 +2	23	b	2	12	aa	aa	15	259
 +2	23	b	2	12	aa	aa	20	259
 +2	23	b	2	12	aa	aa	50	259
 +2	23	b	2	12	aa	aa	77	259
 +2	23	b	2	12	aa	aa	82	259
 +3	15	x	3	11	dd	dd	12	32
 +3	15	x	3	11	dd	dd	20	32
 +7	10	x	7	10	bb	bb	23	125
 +7	10	x	7	10	bb	bb	30	125
 +7	10	x	7	10	bb	bb	32	125
 +7	10	x	7	10	bb	bb	40	125
 +7	10	x	7	17	cc	cc	10	40
 +7	10	x	7	17	cc	cc	12	40
 +7	10	x	7	17	cc	cc	18	40
 +7	10	x	7	18	aa	aa	15	259
 +7	10	x	7	18	aa	aa	15	259
 +7	10	x	7	18	aa	aa	20	259
 +7	10	x	7	18	aa	aa	50	259
 +7	10	x	7	18	aa	aa	77	259
 +7	10	x	7	18	aa	aa	82	259
 +7	18	z	7	10	bb	bb	23	125
 +7	18	z	7	10	bb	bb	30	125
 +7	18	z	7	10	bb	bb	32	125
 +7	18	z	7	10	bb	bb	40	125
 +7	18	z	7	17	cc	cc	10	40
 +7	18	z	7	17	cc	cc	12	40
 +7	18	z	7	17	cc	cc	18	40
 +7	18	z	7	18	aa	aa	15	259
 +7	18	z	7	18	aa	aa	15	259
 +7	18	z	7	18	aa	aa	20	259
 +7	18	z	7	18	aa	aa	50	259
 +7	18	z	7	18	aa	aa	77	259
 +7	18	z	7	18	aa	aa	82	259
 +8	12	t	8	11	aa	aa	15	259
 +8	12	t	8	11	aa	aa	15	259
 +8	12	t	8	11	aa	aa	20	259
 +8	12	t	8	11	aa	aa	50	259
 +8	12	t	8	11	aa	aa	77	259
 +8	12	t	8	11	aa	aa	82	259
 +select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +a	b	c	a	b	c	c	b	sum(b) over (partition by c)
 +1	20	a	1	14	bb	bb	23	125
 +1	20	a	1	14	bb	bb	30	125
 +1	20	a	1	14	bb	bb	32	125
 +1	20	a	1	14	bb	bb	40	125
 +1	30	c	1	14	bb	bb	23	125
 +1	30	c	1	14	bb	bb	30	125
 +1	30	c	1	14	bb	bb	32	125
 +1	30	c	1	14	bb	bb	40	125
 +11	20	v	11	24	bbf	bbf	33	165
 +11	20	v	11	24	bbf	bbf	40	165
 +11	20	v	11	24	bbf	bbf	42	165
 +11	20	v	11	24	bbf	bbf	50	165
 +11	30	af	11	24	bbf	bbf	33	165
 +11	30	af	11	24	bbf	bbf	40	165
 +11	30	af	11	24	bbf	bbf	42	165
 +11	30	af	11	24	bbf	bbf	50	165
 +11	30	d	11	24	bbf	bbf	33	165
 +11	30	d	11	24	bbf	bbf	40	165
 +11	30	d	11	24	bbf	bbf	42	165
 +11	30	d	11	24	bbf	bbf	50	165
 +11	33	a	11	24	bbf	bbf	33	165
 +11	33	a	11	24	bbf	bbf	40	165
 +11	33	a	11	24	bbf	bbf	42	165
 +11	33	a	11	24	bbf	bbf	50	165
 +12	23	y	12	21	aaf	aaf	25	319
 +12	23	y	12	21	aaf	aaf	25	319
 +12	23	y	12	21	aaf	aaf	30	319
 +12	23	y	12	21	aaf	aaf	60	319
 +12	23	y	12	21	aaf	aaf	87	319
 +12	23	y	12	21	aaf	aaf	92	319
 +12	23	y	12	22	aaf	aaf	25	319
 +12	23	y	12	22	aaf	aaf	25	319
 +12	23	y	12	22	aaf	aaf	30	319
 +12	23	y	12	22	aaf	aaf	60	319
 +12	23	y	12	22	aaf	aaf	87	319
 +12	23	y	12	22	aaf	aaf	92	319
 +12	33	bf	12	21	aaf	aaf	25	319
 +12	33	bf	12	21	aaf	aaf	25	319
 +12	33	bf	12	21	aaf	aaf	30	319
 +12	33	bf	12	21	aaf	aaf	60	319
 +12	33	bf	12	21	aaf	aaf	87	319
 +12	33	bf	12	21	aaf	aaf	92	319
 +12	33	bf	12	22	aaf	aaf	25	319
 +12	33	bf	12	22	aaf	aaf	25	319
 +12	33	bf	12	22	aaf	aaf	30	319
 +12	33	bf	12	22	aaf	aaf	60	319
 +12	33	bf	12	22	aaf	aaf	87	319
 +12	33	bf	12	22	aaf	aaf	92	319
 +13	25	xf	13	21	ddf	ddf	22	52
 +13	25	xf	13	21	ddf	ddf	30	52
 +17	10	s	17	20	bbf	bbf	33	165
 +17	10	s	17	20	bbf	bbf	40	165
 +17	10	s	17	20	bbf	bbf	42	165
 +17	10	s	17	20	bbf	bbf	50	165
 +17	10	s	17	27	ccf	ccf	20	70
 +17	10	s	17	27	ccf	ccf	22	70
 +17	10	s	17	27	ccf	ccf	28	70
 +17	10	s	17	28	aaf	aaf	25	319
 +17	10	s	17	28	aaf	aaf	25	319
 +17	10	s	17	28	aaf	aaf	30	319
 +17	10	s	17	28	aaf	aaf	60	319
 +17	10	s	17	28	aaf	aaf	87	319
 +17	10	s	17	28	aaf	aaf	92	319
 +17	18	a	17	20	bbf	bbf	33	165
 +17	18	a	17	20	bbf	bbf	40	165
 +17	18	a	17	20	bbf	bbf	42	165
 +17	18	a	17	20	bbf	bbf	50	165
 +17	18	a	17	27	ccf	ccf	20	70
 +17	18	a	17	27	ccf	ccf	22	70
 +17	18	a	17	27	ccf	ccf	28	70
 +17	18	a	17	28	aaf	aaf	25	319
 +17	18	a	17	28	aaf	aaf	25	319
 +17	18	a	17	28	aaf	aaf	30	319
 +17	18	a	17	28	aaf	aaf	60	319
 +17	18	a	17	28	aaf	aaf	87	319
 +17	18	a	17	28	aaf	aaf	92	319
 +17	20	xf	17	20	bbf	bbf	33	165
 +17	20	xf	17	20	bbf	bbf	40	165
 +17	20	xf	17	20	bbf	bbf	42	165
 +17	20	xf	17	20	bbf	bbf	50	165
 +17	20	xf	17	27	ccf	ccf	20	70
 +17	20	xf	17	27	ccf	ccf	22	70
 +17	20	xf	17	27	ccf	ccf	28	70
 +17	20	xf	17	28	aaf	aaf	25	319
 +17	20	xf	17	28	aaf	aaf	25	319
 +17	20	xf	17	28	aaf	aaf	30	319
 +17	20	xf	17	28	aaf	aaf	60	319
 +17	20	xf	17	28	aaf	aaf	87	319
 +17	20	xf	17	28	aaf	aaf	92	319
 +17	28	zf	17	20	bbf	bbf	33	165
 +17	28	zf	17	20	bbf	bbf	40	165
 +17	28	zf	17	20	bbf	bbf	42	165
 +17	28	zf	17	20	bbf	bbf	50	165
 +17	28	zf	17	27	ccf	ccf	20	70
 +17	28	zf	17	27	ccf	ccf	22	70
 +17	28	zf	17	27	ccf	ccf	28	70
 +17	28	zf	17	28	aaf	aaf	25	319
 +17	28	zf	17	28	aaf	aaf	25	319
 +17	28	zf	17	28	aaf	aaf	30	319
 +17	28	zf	17	28	aaf	aaf	60	319
 +17	28	zf	17	28	aaf	aaf	87	319
 +17	28	zf	17	28	aaf	aaf	92	319
 +18	22	tf	18	21	aaf	aaf	25	319
 +18	22	tf	18	21	aaf	aaf	25	319
 +18	22	tf	18	21	aaf	aaf	30	319
 +18	22	tf	18	21	aaf	aaf	60	319
 +18	22	tf	18	21	aaf	aaf	87	319
 +18	22	tf	18	21	aaf	aaf	92	319
 +2	23	b	2	11	aa	aa	15	259
 +2	23	b	2	11	aa	aa	15	259
 +2	23	b	2	11	aa	aa	20	259
 +2	23	b	2	11	aa	aa	50	259
 +2	23	b	2	11	aa	aa	77	259
 +2	23	b	2	11	aa	aa	82	259
 +2	23	b	2	12	aa	aa	15	259
 +2	23	b	2	12	aa	aa	15	259
 +2	23	b	2	12	aa	aa	20	259
 +2	23	b	2	12	aa	aa	50	259
 +2	23	b	2	12	aa	aa	77	259
 +2	23	b	2	12	aa	aa	82	259
 +3	15	x	3	11	dd	dd	12	32
 +3	15	x	3	11	dd	dd	20	32
 +7	10	x	7	10	bb	bb	23	125
 +7	10	x	7	10	bb	bb	30	125
 +7	10	x	7	10	bb	bb	32	125
 +7	10	x	7	10	bb	bb	40	125
 +7	10	x	7	17	cc	cc	10	40
 +7	10	x	7	17	cc	cc	12	40
 +7	10	x	7	17	cc	cc	18	40
 +7	10	x	7	18	aa	aa	15	259
 +7	10	x	7	18	aa	aa	15	259
 +7	10	x	7	18	aa	aa	20	259
 +7	10	x	7	18	aa	aa	50	259
 +7	10	x	7	18	aa	aa	77	259
 +7	10	x	7	18	aa	aa	82	259
 +7	18	z	7	10	bb	bb	23	125
 +7	18	z	7	10	bb	bb	30	125
 +7	18	z	7	10	bb	bb	32	125
 +7	18	z	7	10	bb	bb	40	125
 +7	18	z	7	17	cc	cc	10	40
 +7	18	z	7	17	cc	cc	12	40
 +7	18	z	7	17	cc	cc	18	40
 +7	18	z	7	18	aa	aa	15	259
 +7	18	z	7	18	aa	aa	15	259
 +7	18	z	7	18	aa	aa	20	259
 +7	18	z	7	18	aa	aa	50	259
 +7	18	z	7	18	aa	aa	77	259
 +7	18	z	7	18	aa	aa	82	259
 +8	12	t	8	11	aa	aa	15	259
 +8	12	t	8	11	aa	aa	15	259
 +8	12	t	8	11	aa	aa	20	259
 +8	12	t	8	11	aa	aa	50	259
 +8	12	t	8	11	aa	aa	77	259
 +8	12	t	8	11	aa	aa	82	259
 +explain extended select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t2	ALL	NULL	NULL	NULL	NULL	90	100.00	Using where
 +1	PRIMARY	t3	ref	idx_a	idx_a	5	test.t2.a	2	100.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	128	test.t3.c	10	100.00	
 +2	DERIVED	t4	ALL	idx_c	NULL	NULL	NULL	160	100.00	Using temporary
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t2`.`c` AS `c`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t3`.`c` AS `c`,`t`.`c` AS `c`,`t`.`b` AS `b`,`t`.`sum(b) over (partition by c)` AS `sum(b) over (partition by c)` from `test`.`t2` join `test`.`t3` join (/* select#2 */ select `test`.`t4`.`c` AS `c`,`test`.`t4`.`b` AS `b`,sum(`test`.`t4`.`b`) over ( partition by `test`.`t4`.`c`) AS `sum(b) over (partition by c)` from `test`.`t4`) `t` where `test`.`t3`.`a` = `test`.`t2`.`a` and `t`.`c` = `test`.`t3`.`c` and `test`.`t2`.`b` < 40
 +explain format=json select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t2",
 +      "access_type": "ALL",
 +      "rows": 90,
 +      "filtered": 100,
 +      "attached_condition": "t2.b < 40 and t2.a is not null"
 +    },
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ref",
 +      "possible_keys": ["idx_a"],
 +      "key": "idx_a",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t2.a"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t3.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "128",
 +      "used_key_parts": ["c"],
 +      "ref": ["test.t3.c"],
 +      "rows": 10,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "window_functions_computation": {
 +            "sorts": {
 +              "filesort": {
 +                "sort_key": "t4.c"
 +              }
 +            },
 +            "temporary_table": {
 +              "table": {
 +                "table_name": "t4",
 +                "access_type": "ALL",
 +                "possible_keys": ["idx_c"],
 +                "rows": 160,
 +                "filtered": 100
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +drop table t1,t2,t3,t4;
 +#
 +# MDEV-13709: Optimization for semi-joins of grouping derived tables
 +#             (Splitting derived tables / views with GROUP BY)
 +#
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(9),(3);
 +CREATE TABLE t2 (a int, i int);
 +INSERT INTO t2 VALUES (1,9),(2,3),(3,7),(4,1);
 +CREATE TABLE t3 (a int, c char(127), index(c));
 +INSERT INTO t3 VALUES (1,'foo'),(3,'bar'),(4,'foo'),(2,'bar');
 +INSERT INTO t3 SELECT a, concat(c,'a') FROM t3;
 +CREATE TABLE t4 (a int, c char(127), index(a));
 +INSERT INTO t4 VALUES
 +(3,'abc'),(1,'foo'),(4,'def'),(8,'xxx'),(3,'yyy'),
 +(5,'zzz'),(9,'xyz'),(2,'yxz'),(5,'zxy'),(7,'zyx') ;
 +ANALYZE TABLE t1,t2,t3,t4;
 +Table	Op	Msg_type	Msg_text
 +test.t1	analyze	status	OK
 +test.t2	analyze	status	OK
 +test.t3	analyze	status	OK
 +test.t4	analyze	status	OK
 +CREATE VIEW v1 AS
 +SELECT c FROM t3
 +WHERE a IN ( SELECT t2.a FROM t1 JOIN t2 WHERE t1.i = t2.i ) GROUP BY c ;
 +set statement optimizer_switch='split_materialized=off' for SELECT * FROM t4 WHERE c IN ( SELECT c FROM v1 ) and a < 2;
 +a	c
 +1	foo
 +SELECT * FROM t4 WHERE c IN ( SELECT c FROM v1 ) and a < 2;
 +a	c
 +1	foo
 +explain extended SELECT * FROM t4 WHERE c IN ( SELECT c FROM v1 ) and a < 2;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t4	range	a	a	5	NULL	1	100.00	Using index condition; Using where
 +1	PRIMARY	<derived3>	ref	key0	key0	128	test.t4.c	2	100.00	FirstMatch(t4)
 +3	LATERAL DERIVED	t3	ref	c	c	128	test.t4.c	2	100.00	
 +3	LATERAL DERIVED	<subquery4>	eq_ref	distinct_key	distinct_key	4	func	1	100.00	
 +4	MATERIALIZED	t1	ALL	NULL	NULL	NULL	NULL	3	100.00	
 +4	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	4	100.00	Using where; Using join buffer (flat, BNL join)
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t4`.`a` AS `a`,`test`.`t4`.`c` AS `c` from `test`.`t4` semi join (`test`.`v1`) where `v1`.`c` = `test`.`t4`.`c` and `test`.`t4`.`a` < 2
 +explain format=json SELECT * FROM t4 WHERE c IN ( SELECT c FROM v1 ) and a < 2;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t4",
 +      "access_type": "range",
 +      "possible_keys": ["a"],
 +      "key": "a",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "index_condition": "t4.a < 2",
 +      "attached_condition": "t4.c is not null"
 +    },
 +    "table": {
 +      "table_name": "<derived3>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "128",
 +      "used_key_parts": ["c"],
 +      "ref": ["test.t4.c"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "first_match": "t4",
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "const_condition": "1",
 +          "outer_ref_condition": "t4.c is not null",
 +          "table": {
 +            "table_name": "t3",
 +            "access_type": "ref",
 +            "possible_keys": ["c"],
 +            "key": "c",
 +            "key_length": "128",
 +            "used_key_parts": ["c"],
 +            "ref": ["test.t4.c"],
 +            "rows": 2,
 +            "filtered": 100
 +          },
 +          "table": {
 +            "table_name": "<subquery4>",
 +            "access_type": "eq_ref",
 +            "possible_keys": ["distinct_key"],
 +            "key": "distinct_key",
 +            "key_length": "4",
 +            "used_key_parts": ["a"],
 +            "ref": ["func"],
 +            "rows": 1,
 +            "filtered": 100,
 +            "materialized": {
 +              "unique": 1,
 +              "query_block": {
 +                "select_id": 4,
 +                "table": {
 +                  "table_name": "t1",
 +                  "access_type": "ALL",
 +                  "rows": 3,
 +                  "filtered": 100
 +                },
 +                "block-nl-join": {
 +                  "table": {
 +                    "table_name": "t2",
 +                    "access_type": "ALL",
 +                    "rows": 4,
 +                    "filtered": 100
 +                  },
 +                  "buffer_type": "flat",
 +                  "buffer_size": "256Kb",
 +                  "join_type": "BNL",
 +                  "attached_condition": "t2.i = t1.i and t2.i = t1.i"
 +                }
 +              }
 +            }
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v1;
 +DROP TABLE t1,t2,t3,t4;
 +#
 +# MDEV-13710: Optimization for equi-joins of grouping derived tables
 +#             (Splitting derived tables / views with GROUP BY) :
 +#             FROM list of the derived table contains constant tables
 +#
 +CREATE TABLE t1 (a int, INDEX(a)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (9),(5),(1);
 +CREATE TABLE t2 (b int) ENGINE=MyISAM;
 +CREATE TABLE t3 (c varchar(8), d int) ENGINE=MyISAM;
 +INSERT INTO t3 VALUES ('foo',2),('bar',6);
 +CREATE VIEW v1 AS SELECT a FROM t1, t2 GROUP BY a;
 +SELECT * FROM t3
 +WHERE d IN ( SELECT * FROM v1 ) AND c LIKE 'z%' OR c IS NULL;
 +c	d
 +DROP VIEW v1;
 +DROP TABLE t1,t2,t3;
 +#
 +# MDEV-13734: Optimization for equi-joins of grouping derived tables
 +#             (Splitting derived tables / views with GROUP BY) :
 +#             derived table / view is empty
 +#
 +CREATE TABLE t1 (a int, b int, INDEX(a)) ENGINE=MyISAM;
 +CREATE TABLE t2 (c int) ENGINE=MyISAM;
 +CREATE VIEW v1 AS SELECT a, b FROM t1 STRAIGHT_JOIN t2;
 +CREATE VIEW v2 AS SELECT a, max(b) as bmax FROM v1 GROUP BY a;
 +CREATE VIEW v3 AS SELECT v2.* FROM t1 JOIN v2 ON t1.b = v2.bmax ;
 +SELECT * FROM v3 JOIN t1 ON (bmax = b);
 +a	bmax	a	b
 +DROP VIEW v1,v2,v3;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-14845: Impossible where for derived with GROUP BY
 +#
 +CREATE TABLE t1 (pk INT PRIMARY KEY);
 +INSERT INTO t1 VALUES (1),(2);
 +WITH cte AS ( SELECT pk FROM t1 WHERE pk IS NULL GROUP BY pk )
 +SELECT * FROM cte;
 +pk
 +EXPLAIN EXTENDED WITH cte AS ( SELECT pk FROM t1 WHERE pk IS NULL GROUP BY pk )
 +SELECT * FROM cte;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	<derived2>	system	NULL	NULL	NULL	NULL	0	0.00	Const row not found
 +2	DERIVED	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	Impossible WHERE
 +Warnings:
 +Note	1003	with cte as (/* select#2 */ select `test`.`t1`.`pk` AS `pk` from `test`.`t1` where 0 group by `test`.`t1`.`pk`)/* select#1 */ select NULL AS `pk` from `cte`
 +DROP TABLE t1;
 +#
 +# MDEV-14880: assertion failure in optimizer when splitting is applied
 +#
 +CREATE TABLE t1 (pk1 INT PRIMARY KEY, f INT) ENGINE=Aria;
 +INSERT INTO t1 VALUES (1,0),(2,0);
 +CREATE TABLE t2 (pk2 INT PRIMARY KEY) ENGINE=Aria;
 +INSERT INTO t2 VALUES (1),(2),(3);
 +CREATE VIEW v2 AS SELECT pk2, COUNT(*) AS cnt FROM t2 GROUP BY pk2;
 +SELECT * FROM t1 INNER JOIN v2 ON pk1 = pk2 WHERE f <> 5;
 +pk1	f	pk2	cnt
 +1	0	1	1
 +2	0	2	1
 +EXPLAIN EXTENDED SELECT * FROM t1 INNER JOIN v2 ON pk1 = pk2 WHERE f <> 5;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t1	ALL	PRIMARY	NULL	NULL	NULL	2	100.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	4	test.t1.pk1	2	100.00	
 +2	LATERAL DERIVED	t2	eq_ref	PRIMARY	PRIMARY	4	test.t1.pk1	1	100.00	Using index
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t1`.`pk1` AS `pk1`,`test`.`t1`.`f` AS `f`,`v2`.`pk2` AS `pk2`,`v2`.`cnt` AS `cnt` from `test`.`t1` join `test`.`v2` where `v2`.`pk2` = `test`.`t1`.`pk1` and `test`.`t1`.`f` <> 5
 +EXPLAIN FORMAT=JSON SELECT * FROM t1 INNER JOIN v2 ON pk1 = pk2 WHERE f <> 5;
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ALL",
 +      "possible_keys": ["PRIMARY"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t1.f <> 5"
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "4",
 +      "used_key_parts": ["pk2"],
 +      "ref": ["test.t1.pk1"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "eq_ref",
 +            "possible_keys": ["PRIMARY"],
 +            "key": "PRIMARY",
 +            "key_length": "4",
 +            "used_key_parts": ["pk2"],
 +            "ref": ["test.t1.pk1"],
 +            "rows": 1,
 +            "filtered": 100,
 +            "using_index": true
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-15017: splittable table is constant table
 +#
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +CREATE TABLE t2 (pk INT, b INT, PRIMARY KEY (pk)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (1,2),(3,4);
 +CREATE VIEW v2 AS SELECT pk, MIN(b) FROM t2 GROUP BY pk;
 +SELECT * FROM t1 LEFT JOIN v2 ON (a = pk);
 +a	pk	MIN(b)
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-14994: splittable table with no rows
 +#
 +CREATE TABLE t1 (f INT PRIMARY KEY) ENGINE=MyISAM;
 +CREATE VIEW v1 AS SELECT a.* FROM t1 AS a STRAIGHT_JOIN t1 AS b;
 +CREATE VIEW v2 AS SELECT f FROM v1 GROUP BY f;
 +SELECT * FROM v1 JOIN v2 ON v1.f = v2.f;
 +f	f
 +EXPLAIN EXTENDED
 +SELECT * FROM v1 JOIN v2 ON v1.f = v2.f;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	Impossible WHERE noticed after reading const tables
 +3	DERIVED	NULL	NULL	NULL	NULL	NULL	NULL	NULL	NULL	no matching row in const table
 +Warnings:
 +Note	1003	/* select#1 */ select NULL AS `f`,`v2`.`f` AS `f` from `test`.`t1` `a` straight_join `test`.`t1` `b` join `test`.`v2` where 0
 +DROP VIEW v1,v2;
 +DROP TABLE t1;
 +#
 +# MDEV-15899: derived with WF without any key access
 +#
 +create table t1 (f1 int, f2 int, f4 int);
 +insert into t1 values
 +(3,1,1), (3,0,9), (0,1,8), (9,0,0), (3,0,9);
 +with
 +cte as (select  median(f2) over (partition by f1) as k1 from t1 order by f1),
 +cte1 as (select median(f4) over (partition by f1) as k2 from t1)
 +select k1,k2 from cte1, cte;
 +k1	k2
 +0.0000000000	0.0000000000
 +0.0000000000	0.0000000000
 +0.0000000000	0.0000000000
 +0.0000000000	0.0000000000
 +0.0000000000	8.0000000000
 +0.0000000000	8.0000000000
 +0.0000000000	8.0000000000
 +0.0000000000	8.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +0.0000000000	9.0000000000
 +1.0000000000	0.0000000000
 +1.0000000000	8.0000000000
 +1.0000000000	9.0000000000
 +1.0000000000	9.0000000000
 +1.0000000000	9.0000000000
 +explain with
 +cte as (select  median(f2) over (partition by f1) as k1 from t1 order by f1),
 +cte1 as (select median(f4) over (partition by f1) as k2 from t1)
 +select k1,k2 from cte1, cte;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived3>	ALL	NULL	NULL	NULL	NULL	5	
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	5	Using join buffer (flat, BNL join)
 +3	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	5	Using temporary
 +2	DERIVED	t1	ALL	NULL	NULL	NULL	NULL	5	Using temporary; Using filesort
 +drop table t1;
 +#
 +# MDEV-16104: embedded splittable materialized derived/views
 +#
 +CREATE TABLE t1 (f int PRIMARY KEY) ENGINE=MyISAM;
 +INSERT INTO t1
 +VALUES (3), (7), (1), (4), (8), (5), (9);
 +CREATE ALGORITHM=MERGE VIEW v1 AS
 +SELECT a2.*
 +FROM
 +( SELECT f, COUNT(*) as c FROM t1 GROUP BY f ) AS a1
 +JOIN
 +t1 AS a2
 +USING (f);
 +EXPLAIN EXTENDED
 +SELECT * FROM ( SELECT STRAIGHT_JOIN f, COUNT(*) as c FROM v1 GROUP BY f ) AS s;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	7	100.00	
 +2	DERIVED	<derived4>	ALL	NULL	NULL	NULL	NULL	7	100.00	Using temporary; Using filesort
 +2	DERIVED	a2	eq_ref	PRIMARY	PRIMARY	4	a1.f	1	100.00	Using index
 +4	DERIVED	t1	index	PRIMARY	PRIMARY	4	NULL	7	100.00	Using index; Using temporary; Using filesort
 +Warnings:
 +Note	1003	/* select#1 */ select `s`.`f` AS `f`,`s`.`c` AS `c` from (/* select#2 */ select straight_join `a2`.`f` AS `f`,count(0) AS `c` from ((/* select#4 */ select `test`.`t1`.`f` AS `f`,count(0) AS `c` from `test`.`t1` group by `test`.`t1`.`f`)) `a1` join `test`.`t1` `a2` where `a2`.`f` = `a1`.`f` group by `a2`.`f`) `s`
 +SELECT * FROM ( SELECT STRAIGHT_JOIN f, COUNT(*) as c FROM v1 GROUP BY f ) AS s;
 +f	c
 +1	1
 +3	1
 +4	1
 +5	1
 +7	1
 +8	1
 +9	1
 +DROP VIEW v1;
 +DROP TABLE t1;
 +#
 +# MDEV-16801: splittable materialized derived/views with
 +#             one grouping field from table without keys
 +#
 +CREATE TABLE t1 (a int, b int, INDEX idx_a(a), INDEX idx_b(b)) ENGINE=MYISAM;
 +CREATE TABLE t2 (c int) ENGINE=MYISAM;
 +CREATE TABLE t3 (d int) ENGINE=MYISAM;
 +INSERT INTO t1 VALUES
 +(77,7), (11,1), (33,3), (44,4), (8,88),
 +(78,7), (98,9), (38,3), (28,2), (79,7),
 +(58,5), (42,4), (71,7), (27,2), (91,9);
 +INSERT INTO t1 SELECT a+100, b+10 FROM t1;
 +INSERT INTO t2 VALUES
 +(100), (700), (200), (100), (200);
 +INSERT INTO t3 VALUES
 +(3), (4), (1), (8), (3);
 +ANALYZE tables t1,t2,t3;
 +Table	Op	Msg_type	Msg_text
 +test.t1	analyze	status	OK
 +test.t2	analyze	status	OK
 +test.t3	analyze	status	OK
 +SELECT *
 +FROM t3,
 +(SELECT t1.b, t2.c
 +FROM  t1, t2
 +GROUP BY t1.b,t2.c) dt
 +WHERE t3.d = dt.b;
 +d	b	c
 +3	3	700
 +3	3	200
 +3	3	100
 +4	4	700
 +4	4	200
 +4	4	100
 +1	1	700
 +1	1	200
 +1	1	100
 +3	3	700
 +3	3	200
 +3	3	100
 +EXPLAIN EXTENDED SELECT *
 +FROM t3,
 +(SELECT t1.b, t2.c
 +FROM  t1, t2
 +GROUP BY t1.b,t2.c) dt
 +WHERE t3.d = dt.b;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	5	100.00	Using where
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t3.d	2	100.00	
 +2	LATERAL DERIVED	t1	ref	idx_b	idx_b	5	test.t3.d	2	100.00	Using index; Using temporary; Using filesort
 +2	LATERAL DERIVED	t2	ALL	NULL	NULL	NULL	NULL	5	100.00	Using join buffer (flat, BNL join)
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t3`.`d` AS `d`,`dt`.`b` AS `b`,`dt`.`c` AS `c` from `test`.`t3` join (/* select#2 */ select `test`.`t1`.`b` AS `b`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`b` = `test`.`t3`.`d` group by `test`.`t1`.`b`,`test`.`t2`.`c`) `dt` where `dt`.`b` = `test`.`t3`.`d`
 +DROP TABLE t1,t2,t3;
 +#
 +# MDEV-17419: splittable materialized derived/view
 +#             when join_cache_level = 4
 +#
 +set join_cache_level = 4;
 +CREATE TABLE t1 (
 +id INT UNSIGNED NOT NULL AUTO_INCREMENT,
 +username VARCHAR(50) NULL DEFAULT '0',
 +PRIMARY KEY (id)
 +) COLLATE='utf8_general_ci';
 +CREATE TABLE t2 (
 +id INT UNSIGNED NOT NULL AUTO_INCREMENT,
 +userid INT UNSIGNED NOT NULL,
 +logindate DATETIME NOT NULL,
 +PRIMARY KEY (id)
 +) COLLATE='utf8_general_ci';
 +INSERT INTO t1 (id, username) VALUES
 +(1,"user1"), (2, "user2");
 +INSERT INTO t2 (id, userid, logindate) VALUES
 +(1,1,"2015-06-19 12:17:02.828"),
 +(2,1,"2016-06-19 12:17:02.828"),
 +(3,2,"2017-06-19 12:17:02.828"),
 +(4,2,"2018-06-19 12:17:02.828");
 +EXPLAIN select * from t1 as u
 +left join
 +(select * from t2 as au group by au.userid) as auditlastlogin
 +on u.id=auditlastlogin.userid;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	u	ALL	NULL	NULL	NULL	NULL	2	
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.u.id	2	
 +2	DERIVED	au	ALL	NULL	NULL	NULL	NULL	4	Using temporary; Using filesort
 +select * from t1 as u
 +left join
 +(select * from t2 as au group by au.userid) as auditlastlogin
 +on u.id=auditlastlogin.userid;
 +id	username	id	userid	logindate
 +1	user1	1	1	2015-06-19 12:17:02
 +2	user2	3	2	2017-06-19 12:17:02
 +set join_cache_level=default;
 +DROP TABLE t1,t2;
 +#
 +# MDEV-21614: potentially splittable materialized derived/view
 +#             within materialized semi-join
 +#
 +create table t1 (
 +id int not null auto_increment primary key,
 +a int not null
 +) engine=myisam;
 +create table t2 (
 +id int not null auto_increment primary key,
 +ro_id int not null,
 +flag int not null, key (ro_id)
 +) engine=myisam;
 +insert into t1(a) select seq+100 from seq_1_to_20;
 +insert into t2(ro_id,flag) select seq, 1 from seq_1_to_20;
 +insert into t2(ro_id,flag) select seq, 0 from seq_1_to_20;
 +create view v1 as
 +select t1.* from t1 left join t2 on (t1.id = t2.ro_id AND t2.flag = 1)
 +group by t1.id;
 +select id, a from t1 where  id in (select id from v1);
 +id	a
 +1	101
 +2	102
 +3	103
 +4	104
 +5	105
 +6	106
 +7	107
 +8	108
 +9	109
 +10	110
 +11	111
 +12	112
 +13	113
 +14	114
 +15	115
 +16	116
 +17	117
 +18	118
 +19	119
 +20	120
 +explain extended select id, a from t1 where  id in (select id from v1);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t1	ALL	PRIMARY	NULL	NULL	NULL	20	100.00	
 +1	PRIMARY	<derived3>	ref	key0	key0	4	test.t1.id	2	100.00	FirstMatch(t1)
 +3	LATERAL DERIVED	t1	eq_ref	PRIMARY	PRIMARY	4	test.t1.id	1	100.00	
 +3	LATERAL DERIVED	t2	ref	ro_id	ro_id	4	test.t1.id	1	100.00	Using where
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` semi join (`test`.`v1`) where `v1`.`id` = `test`.`t1`.`id`
 +select id, a from t1
 +where id in (select id
 +from (select t1.* from t1 left join t2
 +on (t1.id = t2.ro_id AND t2.flag = 1)
 +group by t1.id) dt);
 +id	a
 +1	101
 +2	102
 +3	103
 +4	104
 +5	105
 +6	106
 +7	107
 +8	108
 +9	109
 +10	110
 +11	111
 +12	112
 +13	113
 +14	114
 +15	115
 +16	116
 +17	117
 +18	118
 +19	119
 +20	120
 +explain extended select id, a from t1
 +where id in (select id
 +from (select t1.* from t1 left join t2
 +on (t1.id = t2.ro_id AND t2.flag = 1)
 +group by t1.id) dt);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	PRIMARY	t1	ALL	PRIMARY	NULL	NULL	NULL	20	100.00	
 +1	PRIMARY	<derived3>	ref	key0	key0	4	test.t1.id	2	100.00	FirstMatch(t1)
 +3	LATERAL DERIVED	t1	eq_ref	PRIMARY	PRIMARY	4	test.t1.id	1	100.00	
 +3	LATERAL DERIVED	t2	ref	ro_id	ro_id	4	test.t1.id	1	100.00	Using where
 +Warnings:
 +Note	1003	/* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` semi join ((/* select#3 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a` from `test`.`t1` left join `test`.`t2` on(`test`.`t2`.`ro_id` = `test`.`t1`.`id` and `test`.`t2`.`flag` = 1) where `test`.`t1`.`id` = `test`.`t1`.`id` group by `test`.`t1`.`id`) `dt`) where `dt`.`id` = `test`.`t1`.`id`
 +drop view v1;
 +drop table t1,t2;
 +#
 +# MDEV-21883: potentially splittable materialized derived
 +#             that uses a join of 32 tables
 +#
 +CREATE TABLE t (id INT NOT NULL PRIMARY KEY);
 +INSERT INTO t values (1),(2),(3);
 +set statement optimizer_switch='split_materialized=off' for SELECT t.id FROM t
 +LEFT JOIN (
 +SELECT t0.id FROM t AS t0
 +LEFT JOIN t AS t1 ON 0=1
 +LEFT JOIN t AS t2 ON 0=1
 +LEFT JOIN t AS t3 ON 0=1
 +LEFT JOIN t AS t4 ON 0=1
 +LEFT JOIN t AS t5 ON 0=1
 +LEFT JOIN t AS t6 ON 0=1
 +LEFT JOIN t AS t7 ON 0=1
 +LEFT JOIN t AS t8 ON 0=1
 +LEFT JOIN t AS t9 ON 0=1
 +LEFT JOIN t AS t10 ON 0=1
 +LEFT JOIN t AS t11 ON 0=1
 +LEFT JOIN t AS t12 ON 0=1
 +LEFT JOIN t AS t13 ON 0=1
 +LEFT JOIN t AS t14 ON 0=1
 +LEFT JOIN t AS t15 ON 0=1
 +LEFT JOIN t AS t16 ON 0=1
 +LEFT JOIN t AS t17 ON 0=1
 +LEFT JOIN t AS t18 ON 0=1
 +LEFT JOIN t AS t19 ON 0=1
 +LEFT JOIN t AS t20 ON 0=1
 +LEFT JOIN t AS t21 ON 0=1
 +LEFT JOIN t AS t22 ON 0=1
 +LEFT JOIN t AS t23 ON 0=1
 +LEFT JOIN t AS t24 ON 0=1
 +LEFT JOIN t AS t25 ON 0=1
 +LEFT JOIN t AS t26 ON 0=1
 +LEFT JOIN t AS t27 ON 0=1
 +LEFT JOIN t AS t28 ON 0=1
 +LEFT JOIN t AS t29 ON 0=1
 +LEFT JOIN t AS t30 ON 0=1
 +LEFT JOIN t AS t31 ON 0=1
 +GROUP BY t0.id) AS dt ON dt.id = t.id;
 +id
 +1
 +2
 +3
 +set statement optimizer_switch='split_materialized=on' for SELECT t.id FROM t
 +LEFT JOIN (
 +SELECT t0.id FROM t AS t0
 +LEFT JOIN t AS t1 ON 0=1
 +LEFT JOIN t AS t2 ON 0=1
 +LEFT JOIN t AS t3 ON 0=1
 +LEFT JOIN t AS t4 ON 0=1
 +LEFT JOIN t AS t5 ON 0=1
 +LEFT JOIN t AS t6 ON 0=1
 +LEFT JOIN t AS t7 ON 0=1
 +LEFT JOIN t AS t8 ON 0=1
 +LEFT JOIN t AS t9 ON 0=1
 +LEFT JOIN t AS t10 ON 0=1
 +LEFT JOIN t AS t11 ON 0=1
 +LEFT JOIN t AS t12 ON 0=1
 +LEFT JOIN t AS t13 ON 0=1
 +LEFT JOIN t AS t14 ON 0=1
 +LEFT JOIN t AS t15 ON 0=1
 +LEFT JOIN t AS t16 ON 0=1
 +LEFT JOIN t AS t17 ON 0=1
 +LEFT JOIN t AS t18 ON 0=1
 +LEFT JOIN t AS t19 ON 0=1
 +LEFT JOIN t AS t20 ON 0=1
 +LEFT JOIN t AS t21 ON 0=1
 +LEFT JOIN t AS t22 ON 0=1
 +LEFT JOIN t AS t23 ON 0=1
 +LEFT JOIN t AS t24 ON 0=1
 +LEFT JOIN t AS t25 ON 0=1
 +LEFT JOIN t AS t26 ON 0=1
 +LEFT JOIN t AS t27 ON 0=1
 +LEFT JOIN t AS t28 ON 0=1
 +LEFT JOIN t AS t29 ON 0=1
 +LEFT JOIN t AS t30 ON 0=1
 +LEFT JOIN t AS t31 ON 0=1
 +GROUP BY t0.id) AS dt ON dt.id = t.id;
 +id
 +1
 +2
 +3
 +DROP TABLE t;
 +#
 +# MDEV-23804: Server crashes in st_select_lex::collect_grouping_fields_for_derived
 +#
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (3),(4);
 +CREATE VIEW v1 AS SELECT a FROM t1 UNION VALUES (3),(4);
 +ANALYZE FORMAT=JSON SELECT * from v1 WHERE a=3;
 +ANALYZE
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "r_loops": 1,
 +    "r_total_time_ms": "REPLACED",
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ALL",
 +      "r_loops": 1,
 +      "rows": 4,
 +      "r_rows": 2,
 +      "r_total_time_ms": "REPLACED",
 +      "filtered": 100,
 +      "r_filtered": 50,
 +      "attached_condition": "v1.a = 3",
 +      "materialized": {
 +        "query_block": {
 +          "union_result": {
 +            "table_name": "<union2,3>",
 +            "access_type": "ALL",
 +            "r_loops": 1,
 +            "r_rows": 2,
 +            "query_specifications": [
 +              {
 +                "query_block": {
 +                  "select_id": 2,
 +                  "r_loops": 1,
 +                  "r_total_time_ms": "REPLACED",
 +                  "table": {
 +                    "table_name": "t1",
 +                    "access_type": "ALL",
 +                    "r_loops": 1,
 +                    "rows": 2,
 +                    "r_rows": 2,
 +                    "r_total_time_ms": "REPLACED",
 +                    "filtered": 100,
 +                    "r_filtered": 50,
 +                    "attached_condition": "t1.a = 3"
 +                  }
 +                }
 +              },
 +              {
 +                "query_block": {
 +                  "select_id": 3,
 +                  "operation": "UNION",
 +                  "table": {
 +                    "message": "No tables used"
 +                  }
 +                }
 +              }
 +            ]
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +SELECT * from v1 WHERE a=3;
 +a
 +3
 +DROP VIEW v1;
 +DROP TABLE t1;
 +#
 +# MDEV-25128: Split optimization for join with materialized semi-join
 +#
 +create table t1 (id int, a int, index (a), index (id, a)) engine=myisam;
 +insert into t1 values
 +(17,1),(17,3010),(17,3013),(17,3053),(21,2446),(21,2467),(21,2);
 +create table t2 (a int) engine=myisam;
 +insert into t2 values (1),(2),(3);
 +create  table t3 (id int) engine=myisam;
 +insert into t3 values (1),(2);
 +analyze table t1,t2,t3;
 +Table	Op	Msg_type	Msg_text
 +test.t1	analyze	status	OK
 +test.t2	analyze	status	OK
 +test.t3	analyze	status	OK
 +set optimizer_switch="split_materialized=off";
 +select * from t1, (select a from t1 cp2 group by a) dt, t3
 +where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
 +id	a	a	id
 +17	1	1	1
 +21	2	2	2
 +explain select * from t1, (select a from t1 cp2 group by a) dt, t3
 +where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	2	Using where
 +1	PRIMARY	t1	ref	a	a	5	test.t3.id	1	
 +1	PRIMARY	<subquery3>	eq_ref	distinct_key	distinct_key	4	func	1	
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t3.id	2	
 +3	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	3	
 +2	DERIVED	cp2	index	NULL	a	5	NULL	7	Using index
 +explain format=json select * from t1, (select a from t1 cp2 group by a) dt, t3
 +where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t3.`id` is not null and t3.`id` is not null"
 +    },
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ref",
 +      "possible_keys": ["a"],
 +      "key": "a",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t3.id"],
 +      "rows": 1,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "eq_ref",
 +      "possible_keys": ["distinct_key"],
 +      "key": "distinct_key",
 +      "key_length": "4",
 +      "used_key_parts": ["a"],
 +      "ref": ["func"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t3.id"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "query_block": {
 +          "select_id": 2,
 +          "table": {
 +            "table_name": "cp2",
 +            "access_type": "index",
 +            "key": "a",
 +            "key_length": "5",
 +            "used_key_parts": ["a"],
 +            "rows": 7,
 +            "filtered": 100,
 +            "using_index": true
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +set optimizer_switch="split_materialized=default";
 +select * from t1, (select a from t1 cp2 group by a) dt, t3
 +where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
 +id	a	a	id
 +17	1	1	1
 +21	2	2	2
 +explain select * from t1, (select a from t1 cp2 group by a) dt, t3
 +where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	t3	ALL	NULL	NULL	NULL	NULL	2	Using where
 +1	PRIMARY	t1	ref	a	a	5	test.t3.id	1	
 +1	PRIMARY	<subquery3>	eq_ref	distinct_key	distinct_key	4	func	1	
 +1	PRIMARY	<derived2>	ref	key0	key0	5	test.t3.id	2	
 +3	MATERIALIZED	t2	ALL	NULL	NULL	NULL	NULL	3	
 +2	LATERAL DERIVED	cp2	ref	a	a	5	test.t1.a	1	Using index
 +explain format=json select * from t1, (select a from t1 cp2 group by a) dt, t3
 +where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
 +EXPLAIN
 +{
 +  "query_block": {
 +    "select_id": 1,
 +    "table": {
 +      "table_name": "t3",
 +      "access_type": "ALL",
 +      "rows": 2,
 +      "filtered": 100,
 +      "attached_condition": "t3.`id` is not null and t3.`id` is not null"
 +    },
 +    "table": {
 +      "table_name": "t1",
 +      "access_type": "ref",
 +      "possible_keys": ["a"],
 +      "key": "a",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t3.id"],
 +      "rows": 1,
 +      "filtered": 100
 +    },
 +    "table": {
 +      "table_name": "<subquery3>",
 +      "access_type": "eq_ref",
 +      "possible_keys": ["distinct_key"],
 +      "key": "distinct_key",
 +      "key_length": "4",
 +      "used_key_parts": ["a"],
 +      "ref": ["func"],
 +      "rows": 1,
 +      "filtered": 100,
 +      "materialized": {
 +        "unique": 1,
 +        "query_block": {
 +          "select_id": 3,
 +          "table": {
 +            "table_name": "t2",
 +            "access_type": "ALL",
 +            "rows": 3,
 +            "filtered": 100
 +          }
 +        }
 +      }
 +    },
 +    "table": {
 +      "table_name": "<derived2>",
 +      "access_type": "ref",
 +      "possible_keys": ["key0"],
 +      "key": "key0",
 +      "key_length": "5",
 +      "used_key_parts": ["a"],
 +      "ref": ["test.t3.id"],
 +      "rows": 2,
 +      "filtered": 100,
 +      "materialized": {
 +        "lateral": 1,
 +        "query_block": {
 +          "select_id": 2,
 +          "outer_ref_condition": "t1.a is not null",
 +          "table": {
 +            "table_name": "cp2",
 +            "access_type": "ref",
 +            "possible_keys": ["a"],
 +            "key": "a",
 +            "key_length": "5",
 +            "used_key_parts": ["a"],
 +            "ref": ["test.t1.a"],
 +            "rows": 1,
 +            "filtered": 100,
 +            "using_index": true
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
 +prepare stmt from "select * from t1, (select a from t1 cp2 group by a) dt, t3
 +where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2)";
 +execute stmt;
 +id	a	a	id
 +17	1	1	1
 +21	2	2	2
 +execute stmt;
 +id	a	a	id
 +17	1	1	1
 +21	2	2	2
 +deallocate prepare stmt;
 +drop table t1,t2,t3;
 +# End of 10.3 tests
diff --cc mysql-test/main/derived_cond_pushdown.test
index 244ec1453a8,00000000000..9bb9d9b9bcc
mode 100644,000000..100644
--- a/mysql-test/main/derived_cond_pushdown.test
+++ b/mysql-test/main/derived_cond_pushdown.test
@@@ -1,3544 -1,0 +1,3614 @@@
 +--source include/have_sequence.inc
 +--source include/default_optimizer_switch.inc
 +let $no_pushdown= set statement optimizer_switch='condition_pushdown_for_derived=off' for;
 +set @@join_buffer_size=256*1024;
 +
 +create table t1 (a int, b int, c int);
 +create table t2 (a int, b int, c int, d decimal);
 +insert into t1 values
 +  (1,21,345), (1,33,7), (8,33,114), (1,21,500), (1,19,107), (5,14,787),
 +  (8,33,123), (9,10,211), (5,16,207), (1,33,988), (5,27,132), (1,21,104),
 +  (6,20,309), (6,20,315), (1,21,101), (8,33,404), (9,10,800), (1,21,123),
 +  (7,11,708), (6,20,214);
 +insert into t2 values
 +  (2,3,207,207.0000), (1,21,909,12.0000), (7,13,312,406.0000),
 +  (8,64,248,107.0000), (6,20,315,279.3333), (1,19,203,107.0000),
 +  (8,80,800,314.0000), (3,12,231,190.0000), (6,23,303,909.0000);
 +
 +create table t1_double(a int, b double, c double);
 +insert into t1_double values
 +  (1,23.4,14.3333), (1,12.5,18.9), (3,12.5,18.9),
 +  (4,33.4,14.3333), (4,14.3333,13.65), (5,17.89,7.22),
 +  (6,33.4,14.3), (10,33.4,13.65), (11,33.4,13.65);
 +
 +create table t2_double(a int, b double, c double);
 +insert into t2_double values
 +  (1,22.4,14.3333), (1,12.5,18.9), (2,22.4,18.9),
 +  (4,33.4,14.3333), (5,22.4,13.65), (7,17.89,18.9),
 +  (6,33.4,14.3333), (10,31.4,13.65), (12,33.4,13.65);
 +
 +create table t1_char(a char, b char(8), c int);
 +insert into t1_char values
 +  ('a','Ivan',1), ('b','Vika',2), ('b','Inga',6), ('c','Vika',7),
 +  ('b','Ivan',7), ('a','Alex',6), ('b','Inga',5), ('d','Ron',9),
 +  ('d','Harry',2), ('d','Hermione',3), ('c','Ivan',3), ('c','Harry',4);
 +
 +create table t2_char(a char, b char(8), c int);
 +insert into t2_char values
 +  ('b','Ivan',1), ('c','Vinny',3), ('c','Inga',9), ('a','Vika',1),
 +  ('c','Ivan',2), ('b','Ali',6), ('c','Inga',2), ('a','Ron',9),
 +  ('d','Harry',1), ('b','Hermes',3), ('b','Ivan',11), ('b','Harry',4);
 +
 +create table t1_decimal (a decimal(3,1), b decimal(3,1), c int);
 +insert into t1_decimal values
 +  (1,1,23),(2,2,11),(3,3,16),
 +  (1,1,12),(1,1,14),(2,3,15),
 +  (2,1,13),(2,3,11),(3,3,16);
 +
 +create table t2_decimal (a decimal(3,1), b decimal(3,1), c int);
 +insert into t2_decimal values
 +  (2,1,13),(2,2,11),(3,3,16),
 +  (1,3,22),(1,3,14),(2,2,15),
 +  (2,1,43),(2,3,11),(2,3,16);
 +
 +create view v1 as select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +  group by a,b having max_c < 707;
 +
 +create view v2 as select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +  where t1.a>5 group by a,b having max_c < 707;
 +
 +create view v3 as select a, b, min(c) as min_c from t1
 +  where t1.a<10 group by a,b having min_c > 109;
 +
 +create view v4 as
 +  select a, b, min(max_c) as min_c from v1
 +    where (v1.a<15) group by a,b;
 +
 +create view v_union as
 +  select a, b, min(c) as c from t1
 +    where t1.a<10 group by a,b having c > 109
 +      union
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300;
 +
 +create view v2_union as
 +  select a, b, min(c) as c from t1
 +    where t1.a<10 group by a,b having c > 109
 +      union
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +      union
 +  select a, b, avg(c) as c from t1
 +    where t1.c>300 group by a,b having c < 707;
 +
 +create view v3_union as
 +  select a, b, (a+1) as c from t1
 +    where t1.a<10
 +      union
 +  select a, b, c from t1
 +    where t1.b>10 and t1.c>100;
 +
 +create view v4_union as
 +  select a, b, max(c)-100 as c from t1
 +    where t1.a<10 group by a,b having c > 109
 +      union
 +  select a, b, (c+100) as c from t1
 +    where t1.b>10;
 +
 +create view v_double as
 +  select a, avg(a/4) as avg_a, b, c from t1_double
 +    where (b>12.2) group by b,c having (avg_a<22.333);
 +
 +create view v_char as
 +  select a, b, max(c) as max_c from t1_char
 +    group by a,b having max_c < 9;
 +
 +create view v_decimal as
 +  select a, b, avg(c) as avg_c from t1_decimal
 +    group by a,b having (avg_c>12);
 +
 +--echo # conjunctive subformula : pushing into HAVING
 +let $query= select * from v1,t2 where (v1.max_c>214) and (t2.a>v1.a);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from
 +    (select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +      group by a,b having max_c < 707) v1,
 +        t2 where (v1.a=t2.a) and (v1.max_c>300);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formula : pushing into HAVING
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.max_c>300) and (v1.avg_c>t2.d) and (v1.b=t2.b)) or
 +      ((v1.max_c<135) and (v1.max_c<t2.c) and (v1.a=t2.a));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformula : pushing into WHERE
 +let $query= select * from v1,t2 where (v1.a>6) and (t2.b>v1.b);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query= select * from v2,t2 where (v2.b>25) and (t2.a<v2.a);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formula : pushing into WHERE
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.a>7) and (t2.c<v1.max_c)) or ((v1.a<2) and (t2.b<v1.b));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v2,t2 where
 +   ((v2.a>7) and (t2.c<v2.max_c)) or ((v2.a>5) and (t2.b<v2.b));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.a>4) and (v1.b>t2.b) and (v1.max_c=t2.d)) or
 +      ((v1.a<2) and (v1.max_c<t2.c) and (v1.max_c=t2.d));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformulas : pushing into HAVING and WHERE
 +let $query=
 +  select * from v1,t2 where (v1.a<2) and (v1.max_c>400) and (t2.b>v1.b);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v_double as v,t2_double as t where
 +    (v.a=t.a) and (v.avg_a>0.45) and (v.b>10);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v_decimal as v,t2_decimal as t where
 +    (v.a=t.a) and (v.avg_c>15) and (v.b>1);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formula : pushing into HAVING and WHERE
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.a>7) and (v1.max_c>300) and (t2.c<v1.max_c)) or
 +    ((v1.a<4) and (v1.max_c<500) and (t2.b<v1.b));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where ((v1.a<2) and (v1.max_c>120)) or (v1.a>7);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formulas : pushing into WHERE and HAVING
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.a<2) and (v1.max_c>120) and (v1.b=t2.b)) or (v1.a>7);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.a<2) and (v1.max_c<200) and (t2.c>v1.max_c) and (v1.max_c=t2.d)) or
 +      ((v1.a>4) and (v1.max_c<500) and (t2.b<v1.b) and (v1.max_c=t2.c));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # prepare of a query containing extracted or formula
 +prepare stmt from "select * from v1,t2 where
 +  ((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +prepare stmt from
 +  "explain format=json select * from v1,t2 where
 +    ((v1.max_c>400) and (t2.a>v1.a)) or ((v1.max_c<135) and (t2.a<v1.a));";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,t2 where (t2.a=v1.a) and (v1.b=t2.b) and (v1.a=1);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query= select * from v1,t2 where (v1.a=5) and (v1.max_c=t2.d);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformula : pushing into WHERE using equalities
 +let $query= select * from v1,t2 where (t2.a<5) and (v1.a=t2.a);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformula : pushing into HAVING using equalities
 +let $query= select * from v1,t2 where (t2.c>150) and (v1.max_c=t2.c);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted and formula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,t2 where (v1.a=v1.b) and (v1.a=t2.a) and (v1.a=3);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where (v1.a=1) and (v1.b=21) and (t2.a=2);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v_char as v,t2_char as t where
 +    (v.a='c') and (v.b<'Hermes') and ((v.b=t.b) or (v.max_c>20));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted and formula : pushing into WHERE using equalities
 +--echo # pushing equalities
 +let $query=
 +select * from v_decimal as v,t2_decimal as t where
 +    (v.a=v.b) and (v.b=t.b) and ((t.b>1) or (v.a=1));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formula : pushing into HAVING using equalities
 +let $query=
 +  select * from v1,t2
 +    where ((t2.a<4) and (v1.a=t2.a)) or ((t2.c>150) and (v1.max_c=t2.c));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING using equalities
 +let $query=
 +  select * from v1,t2
 +    where ((t2.a>5) and (v1.a=t2.a)) and ((t2.c>250) and (v1.max_c=t2.c));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +--echo # pushing equalities
 +let $query=
 +  select * from
 +    (select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +      group by a,b having max_c < 707) v1,
 +        t2 where (v1.a=8) and (v1.a=t2.a) and (v1.max_c=404);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +let $query=
 +  select * from v1,t2 where
 +    (v1.a>3) and (v1.max_c>200) and (t2.b<v1.b) and (t2.d=v1.max_c);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING using equalities
 +--echo # pushing equalities
 +let $query=
 +  select * from v_double as v,t2_double as t where
 +    (v.b=v.c) and (v.c=t.c) and ((t.c>10) or (v.a=1));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING using equalities
 +let $query=
 +  select * from v_double as v,t2_double as t where
 +    (((v.a>0.2) or (v.b<17)) or (t.c>17)) and (t.c=v.c) and (v.c>18);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into HAVING
 +--echo # pushing equalities
 +let $query=
 +  select * from v_decimal as v,t2_decimal as t where
 +    (((v.a>4) or (v.a=2)) or (v.b>3)) and (v.avg_c=13);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from
 +    (select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +      where t1.a>5 group by a,b having max_c < 707) v1,
 +        t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.a=v1.b);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # nothing to push
 +let $query=
 +  select * from v1,t2 where (t2.a<2) and (t2.c>900);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.b=t2.b);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where
 +    (t2.a=v1.a) or (v1.b=t2.b) and ((v1.a=1) or (v1.a=6));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where (v1.a=1) or (v1.b=21) or (t2.a=2);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,t2 where
 +    (t2.a<2) and (t2.c>900) and ((v1.a<t2.a) or (t2.a<11));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using several derived tables : nothing to push
 +let $query= select * from v1,v2,t2 where
 +  (v1.a=v2.a) and (v1.a=t2.a) and (v2.b<50);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,v2,t2 where
 +    ((v1.a=v2.a) or (v1.a=t2.a)) and (t2.b<50) and (v1.b=v2.b);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v1,v2,t2 where
 +    ((v1.a=v2.a) and (v1.a=t2.a)) or ((v2.b>13) and (t2.c<115));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using several derived tables : pushing in all tables
 +--echo # conjunctive subformula : pushing into HAVING
 +--echo # extracted or formula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,v2,t2 where ((v1.a=v2.a) or (v1.a=t2.a)) and
 +    ((v2.b<50) or (v2.b=19)) and (v1.max_c<300);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using several derived tables : pushing only in one table
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,v2,t2 where
 +    (v1.a=t2.a) and (v1.a=v1.b) and (v1.a=v2.a) and (v2.max_c<300);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using several derived tables : pushing only in one table
 +--echo # extracted and formula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into WHERE using equalities
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,v2,t2 where (v1.a=1) and (v1.b>10) and (v1.b=v2.b);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into WHERE using equalities
 +--echo # pushing equalities
 +let $query=
 +  select * from v_char as v,t2_char as t where
 +    (v.a=t.a) and (t.a='b') and ((v.b='Vika') or (v.b='Ali'));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using several derived tables : pushing in all tables
 +--echo # extracted or formula : pushing into WHERE
 +--echo # conjunctive subformulas : pushing into HAVING
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,v2,v3,t2 where
 +    ((v1.a=v2.a) or (v1.a=t2.a)) and ((v3.b<50) or (v3.b=33))
 +      and (v1.max_c<500) and (v3.a=t2.a) and (v2.max_c>300);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using several derived tables : pushing in all tables
 +--echo # conjunctive subformulas : pushing into HAVING
 +let $query=
 +  select * from
 +    (select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +      where t1.a>5 group by a,b having max_c < 707) v1,
 +    (select a, b, min(c) as min_c from t1
 +      where t1.a>5 group by a,b having min_c < 707) v2,
 +      t2 where (v1.a=v2.a) and (v1.b=t2.b) and (v1.max_c>130) and (v2.min_c<130);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using several derived tables : pushing in all tables
 +--echo # extracted or formulas : pushing into HAVING
 +--echo # conjunctive subformula : pushing into HAVING
 +let $query=
 +  select * from
 +    (select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +      where t1.a>5 group by a,b having max_c < 707) v1,
 +    (select a, b, min(c) as min_c from t1
 +      where t1.a>5 group by a,b having min_c < 707) v2,
 +    (select a, b, avg(c) as avg_c from t1
 +      where t1.a<8 group by a,b) v3,
 +      t2 where (v1.a=v2.a) and (v1.b=v3.b) and ((v3.avg_c>170) or (v3.a<5))
 +        and ((v1.avg_c<400) or (v1.a>1)) and (v2.min_c<200);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted or formula : pushing into HAVING
 +--echo # conjunctive subformula : pushing into WHERE
 +let $query=
 +  select * from
 +    (select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +      group by a,b having max_c < 707) v1,
 +        t2 where ((v1.a=1) or (v1.max_c<300)) and (v1.b>25);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # extracted and formula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into HAVING
 +let $query=
 +  select * from
 +    (select a, b, max(c) as max_c, avg(c) as avg_c from t1
 +      where t1.a>5 group by a,b having max_c < 707) v1,
 +        t2 where (v1.a=t2.a) and (v1.max_c>300) and (v1.b<30);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using query with union
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # conjunctive subformulas : pushing into HAVING and WHERE
 +let $query=
 +  select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (t2.c>800)
 +    union
 +  select * from v1,t2 where (v1.max_c>100) and (v1.a>7) and (t2.d>800);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using query with union
 +--echo # extracted and formula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,t2 where (v1.a<5) and (v1.b=t2.b) and (v1.b=19)
 +    union
 +  select * from v1,t2 where ((v1.max_c>400) or (v1.avg_c>270)) and (v1.a<t2.a);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using query with union
 +--echo # extracted or formula : pushing into HAVING
 +--echo # extracted or formula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,t2 where
 +    ((t2.a=v1.a) or (v1.b=t2.b)) and ((v1.a=1) or (v1.a=6))
 +      union
 +  select * from v1,t2 where ((v1.a>3) and (v1.b>27)) or (v1.max_c>550);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using query with union
 +--echo # extracted or formula : pushing into HAVING
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.a=1) and (v1.a=t2.a)) and ((v1.max_c<500) or (v1.avg_c>500))
 +      union
 +  select * from v2,t2 where
 +    ((v2.a<t2.b) or (v2.max_c>200)) and (v2.b>10) and (t2.a<2)
 +      union
 +  select * from v2,t2 where
 +    (v2.max_c=t2.c) and (v2.b<10);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +let $query= select * from v_union,t2 where (v_union.a<3) and (v_union.c>100);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING
 +let $query=
 +  select * from v_union,t2 where
 +    ((v_union.a<2) or (v_union.c>800)) and (v_union.b>12);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union
 +--echo # conjunctive subformula : pushing into HAVING
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v_union,t2 where
 +    (v_union.a=1) and (v_union.a=t2.a) and (v_union.c<200);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +let $query=
 +  select * from v_char as v,t2_char as t where
 +    (v.a=t.a) and (v.b='Vika') and (v.max_c>2);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union
 +--echo # using several derived tables : pushing in all tables
 +--echo # conjunctive subformula : pushing into WHERE using equalities
 +--echo # pushing equalities
 +let $query=
 +  select * from v_union,v1,t2 where
 +    (v_union.a=v1.a) and (v1.a=t2.a) and (t2.a=1)
 +    and ((v_union.c>800) or (v1.max_c>200));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union
 +--echo # extracted or formula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into HAVING
 +--echo # pushing equalities
 +let $query=
 +  select * from v2_union as v,t2 where
 +    ((v.a=6) or (v.a=8)) and (v.c>200) and (v.a=t2.a);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union of selects without aggregation
 +--echo # extracted conjunctive predicate: pushing in WHERE of both selects
 +let $query=
 +  select * from v3_union as v,t2 where (v.a=t2.a) and (v.c>6);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union of selects without aggregation
 +--echo # extracted conjunctive OR subformula: pushing in WHERE using equalities
 +let $query=
 +  select * from v3_union as v,t2 where (v.a=t2.a) and ((t2.a>1) or (v.b<20));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union of selects without aggregation
 +--echo # extracted the whole condition: in WHERE of both selects
 +let $query=
 +  select * from v3_union as v,t2 where
 +    (v.a=t2.a) and ((v.b=19) or (v.b=21)) and ((v.c<3) or (v.c>600));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union of
 +--echo # a select without aggregation and a select with aggregation
 +--echo # extracted conjunctive predicate: pushing in WHERE of both selects
 +let $query=
 +  select * from v4_union as v,t2 where (v.a=t2.a) and (v.b<20);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using derived table with union of
 +--echo # a select without aggregation and a select with aggregation
 +--echo # extracted subformula: pushing in WHERE of one select
 +--echo # extracted subformula: pushing in HAVING of the other select
 +--echo # extracted sub-subformula: pushing in WHERE of the other select
 +--echo # using an equality in all pushdowns
 +let $query=
 +  select * from v4_union as v,t2 where
 +    (v.a=t2.a) and ((t2.a<3) or (v.b<40)) and (v.c>500);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded derived table : pushing the same conditions
 +--echo # using several derived tables : pushing in all tables
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # extracted and formula : pushing into WHERE
 +let $query=
 +select * from v4,v1 where
 +    (v4.a<13) and (v1.a>5) and (v1.b>12);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : nothing to push
 +--echo # using several derived tables : pushing only in one table
 +--echo # conjunctive subformula : pushing into WHERE
 +let $query=
 +  select * from v4,v1,t2 where
 +    (v4.a=t2.a) and (v4.a=v1.a) and (v1.b>30);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing different conditions
 +--echo # using several derived tables : pushing in all tables
 +--echo # conjunctive subformula : pushing into WHERE using equalities
 +--echo # extracted and formula : pushing into WHERE using equalities
 +--echo # conjunctive subformula : pushing into HAVING
 +let $query=
 +  select * from v4,v1,t2 where
 +    (v4.a=t2.a) and (v4.a>1) and (v4.a=v1.a) and (v4.min_c>100) and (v1.b<30);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing different conditions
 +--echo # using several derived tables : pushing in all tables
 +--echo # extracted or formula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into HAVING
 +let $query=
 +  select * from v4,v1,t2 where
 +    (((v4.b>10) and (v4.a>1)) or (v4.b<20)) and (v1.max_c>200) and (v1.a=v4.a);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing different conditions
 +--echo # using several derived tables : pushing only in one table
 +--echo # extracted or formula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING
 +let $query=
 +  select * from v4,v2 where
 +    ((v4.a>12) and (v4.min_c<300) and (v4.b>13)) or (v4.a<1);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing different conditions
 +--echo # using several derived tables : pushing only in one table
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into HAVING
 +--echo # pushing equalities
 +let $query=
 +  select * from v4,v2 where
 +    (v4.a=v2.b) and (v4.a=v4.b) and (v4.min_c<100);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing the same conditions
 +--echo # using several derived tables : pushing in all tables
 +--echo # extracted and formula : pushing into WHERE using equalities
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v4,v2 where
 +    (v4.a=v2.b) and (v4.a=v4.b) and (v2.b<30);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing the same conditions
 +--echo # using several derived tables : pushing in all tables
 +--echo # extracted or formula : pushing into WHERE using equalities
 +--echo # extracted and formula : pushing into WHERE using equalities
 +--echo # pushing equalities
 +let $query=
 +  select * from v4,v2 where
 +    (v4.a=v2.b) and (v4.a=v4.b) and ((v2.b<30) or (v4.a>2));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing the same conditions
 +--echo # using several derived tables : pushing in all tables
 +--echo # extracted or formula : pushing into WHERE
 +--echo # conjunctive subformula : pushing into WHERE
 +--echo # pushing equalities
 +let $query=
 +  select * from v4,v2 where
 +    (((v4.a<12) and (v4.b>13)) or (v4.a>10)) and
 +    (v4.min_c=v2.max_c) and (v4.min_c>100);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using embedded view : pushing the same conditions
 +--echo # using several derived tables : pushing only in one table
 +--echo # extracted or formula : pushing into WHERE
 +let $query=
 +  select * from v4,v2,t2 where
 +    (((v4.a<12) and (t2.b>13)) or (v4.a>10)) and
 +    (v4.min_c=t2.c) and (t2.c>100);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1,v2,v3,v4;
 +drop view v_union,v2_union,v3_union,v4_union;
 +drop view v_double,v_char,v_decimal;
 +drop table t1,t2,t1_double,t2_double,t1_char,t2_char,t1_decimal,t2_decimal;
 +
 +--echo #
 +--echo # MDEV-10782: condition extracted from a multiple equality
 +--echo #             pushed into HAVING
 +--echo #
 +
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(2);
 +EXPLAIN EXTENDED
 +SELECT *
 +  FROM ( SELECT * FROM ( SELECT MIN(i) as f FROM t1 ) sq1 ) AS sq2
 +    WHERE f = 8;
 +SELECT *
 +  FROM ( SELECT * FROM ( SELECT MIN(i) as f FROM t1 ) sq1 ) AS sq2
 +    WHERE f = 8;
 +SELECT *
 +  FROM ( SELECT * FROM ( SELECT MIN(i) as f FROM t1 ) sq1 ) AS sq2
 +    WHERE f = 1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-10783: pushdown into constant view
 +--echo #
 +
 +CREATE TABLE t1 (i int) ENGINE=MyISAM;
 +CREATE VIEW v AS SELECT 5;
 +SELECT * FROM t1 WHERE 1 IN ( SELECT * FROM v );
 +DROP VIEW v;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-10785: second execution of a query with condition
 +--echo #             pushed into view
 +--echo #
 +
 +CREATE TABLE t1 (i int);
 +CREATE VIEW v1 AS SELECT i FROM t1 WHERE i < 5;
 +CREATE FUNCTION f (in1 int) RETURNS int RETURN in1;
 +CREATE VIEW v2 AS SELECT * FROM v1 GROUP BY i;
 +PREPARE stmt FROM "SELECT * FROM v2 WHERE f(0) <> 2";
 +EXECUTE stmt;
 +EXECUTE stmt;
 +DROP FUNCTION f;
 +DROP VIEW v2,v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-10884: condition pushdown into derived specified by
 +--echo #             1. unit with  SELECT containing ORDER BY ... LIMIT
 +--echo #             2. unit containing global ORDER BY ... LIMIT
 +--echo #
 +
 +create table t1(a int);
 +insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
 +select a from t1 order by a limit 5;
 +
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for
 +select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
 +set statement optimizer_switch='condition_pushdown_for_derived=on' for
 +select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
 +
 +select a from t1 where a < 4 union select a from t1 where a > 5
 +  order by a limit 5;
 +set statement optimizer_switch='condition_pushdown_for_derived=off' for
 +select * from
 +(select a from t1 where a < 4 union select a from t1 where a > 5
 + order by a limit 5) t where t.a not in (2,9);
 +set statement optimizer_switch='condition_pushdown_for_derived=on' for
 +select * from
 +(select a from t1 where a < 4 union select a from t1 where a > 5
 + order by a limit 5) t where t.a not in (2,9);
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-11072: pushdown of the condition obtained
 +--echo #             after constant row substitution
 +--echo #
 +
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +CREATE TABLE t2 (b INT) ENGINE=MyISAM;
 +CREATE OR REPLACE VIEW v2 AS SELECT * FROM t2;
 +CREATE TABLE t3 (c INT) ENGINE=MyISAM;
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
 +
 +SELECT * FROM t1 WHERE a IN (
 +  SELECT b FROM v2 WHERE b < a OR b IN (
 +    SELECT c FROM v3 WHERE c = a
 +  )
 +);
 +
 +INSERT INTO t1 VALUES (2);
 +INSERT INTO t2 VALUES (3), (2);
 +INSERT INTO t3 VALUES (4), (1), (2), (7);
 +
 +SELECT * FROM t1 WHERE a IN (
 +  SELECT b FROM v2 WHERE b < a OR b IN (
 +    SELECT c FROM v3 WHERE c = a
 +  )
 +);
 +
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM t1 WHERE a IN (
 +  SELECT b FROM v2 WHERE b < a OR b IN (
 +    SELECT c FROM v3 WHERE c = a
 +  )
 +);
 +
 +CREATE TABLE t4 (d INT, e INT) ENGINE=MyISAM;
 +INSERT INTO t4 VALUES (1,10),(3,11),(2,10),(2,20),(3,21);
 +CREATE OR REPLACE VIEW v4 AS
 +SELECT d, sum(e) AS s FROM t4 GROUP BY d;
 +
 +let $query =
 +SELECT * FROM t1 WHERE a IN (
 +  SELECT b FROM v2 WHERE b < a OR b IN (
 +    SELECT d FROM v4 WHERE s > a
 +  )
 +);
 +
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +DROP VIEW v2,v3,v4;
 +DROP TABLE t1,t2,t3,t4;
 +
 +--echo #
 +--echo # MDEV-10800: pushdown of the condition obtained
 +--echo #             after constant row substitution
 +--echo #
 +
 +
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1);
 +
 +CREATE TABLE t2 (b INT) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3),(4);
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +
 +SELECT * FROM
 +( SELECT * FROM t1
 +    WHERE EXISTS ( SELECT * FROM v2 WHERE b = a ) ) AS sq;
 +
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM
 +( SELECT * FROM t1
 +    WHERE EXISTS ( SELECT * FROM v2 WHERE b = a ) ) AS sq;
 +
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-11102: condition pushdown into materialized inner table
 +--echo #              of outer join is not applied as not being valid
 +--echo #
 +
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (0),(2);
 +
 +CREATE TABLE t2 (b INT);
 +INSERT INTO t2 VALUES (1),(2);
 +
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +
 +SELECT * FROM t1 LEFT JOIN t2 ON a = b WHERE b IS NULL;
 +
 +SELECT * FROM t1 LEFT JOIN v2 ON a = b WHERE b IS NULL;
 +
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM t1 LEFT JOIN v2 ON a = b WHERE b IS NULL;
 +
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-11103: pushdown condition with ANY subquery
 +--echo #
 +
 +CREATE TABLE t1 (i INT);
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES (1),(2);
 +
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 WHERE i <= ANY ( SELECT 3 );
 +
 +SELECT * FROM v1 WHERE i <= ANY ( SELECT 3 );
 +
 +DROP VIEW v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-11315: condition with outer reference to mergeable derived
 +--echo #
 +
 +CREATE TABLE t1 (pk1 INT PRIMARY KEY, a INT, b INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (10,7,1),(11,0,2);
 +
 +CREATE TABLE t2 (pk2 INT PRIMARY KEY, c INT, d DATETIME) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES
 + (1,4,'2008-09-27 00:34:58'),
 + (2,5,'2007-05-28 00:00:00'),
 + (3,6,'2009-07-25 09:21:20');
 +
 +CREATE VIEW v1 AS SELECT * FROM t1;
 +CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +
 +SELECT * FROM v1 AS sq
 +  WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 AS sq
 +  WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +
 +SELECT * FROM ( SELECT * FROM t1 ) AS sq
 +  WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT * FROM t1 ) AS sq
 +  WHERE b IN ( SELECT pk2 FROM v2 WHERE c > sq.b ) OR b = 100;
 +
 +DROP VIEW v1,v2;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-11313: pushdown of the condition obtained
 +--echo #             after constant row substitution
 +--echo #
 +
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(2);
 +CREATE TABLE t2 (b INT) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (50);
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +
 +SELECT ( SELECT COUNT(*) FROM v1 WHERE a = t2.b ) AS f FROM t2 GROUP BY f;
 +EXPLAIN FORMAT=JSON
 +SELECT ( SELECT COUNT(*) FROM v1 WHERE a = t2.b ) AS f FROM t2 GROUP BY f;
 +
 +CREATE TABLE t3 (a INT, b INT) ENGINE=MYISAM;
 +INSERT INTO t3 VALUES (1,10),(3,11),(2,10),(2,20),(3,21);
 +CREATE VIEW v2 AS SELECT a, sum(b) AS s FROM t3 GROUP BY a ;
 +SELECT ( SELECT COUNT(*) FROM v2 WHERE s < t2.b ) AS f FROM t2 GROUP BY f;
 +EXPLAIN FORMAT=JSON
 +SELECT ( SELECT COUNT(*) FROM v2 WHERE s < t2.b ) AS f FROM t2 GROUP BY f;
 +
 +
 +DROP VIEW v1,v2;
 +DROP TABLE t1,t2,t3;
 +
 +--echo #
 +--echo # MDEV-10882: pushdown of the predicate with cached value
 +--echo #
 +
 +CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL) ENGINE=MyISAM;
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES (1,2),(3,4);
 +
 +CREATE TABLE t2 (c INT NOT NULL) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (5),(6);
 +
 +SELECT a, GROUP_CONCAT(b) FROM v1
 +  WHERE b IN ( SELECT COUNT(c) FROM t2 ) GROUP BY a;
 +
 +EXPLAIN FORMAT=JSON
 +SELECT a, GROUP_CONCAT(b) FROM v1
 +  WHERE b IN ( SELECT COUNT(c) FROM t2 ) GROUP BY a;
 +
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-10836: pushdown of the predicate with cached value
 +--echo #
 +
 +CREATE TABLE t (pk INT PRIMARY KEY, f INT) ENGINE=MyISAM;
 +CREATE ALGORITHM=TEMPTABLE VIEW v AS SELECT * FROM t;
 +INSERT INTO t VALUES (1,1),(3,2);
 +
 +SELECT * FROM v AS v1, v AS v2
 +  WHERE v2.pk > v1.f AND v1.f IN ( SELECT COUNT(pk) FROM t );
 +
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v AS v1, v AS v2
 +  WHERE v2.pk > v1.f AND v1.f IN ( SELECT COUNT(pk) FROM t );
 +
 +DROP VIEW v;
 +DROP TABLE t;
 +
 +--echo #
 +--echo # MDEV-11488: pushdown of the predicate with cached value
 +--echo #
 +
 +CREATE TABLE t1 (i INT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(3),(2);
 +
 +CREATE TABLE t2 (j INT, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3),(4);
 +
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +UPDATE t2 SET j = 2 WHERE j = 3;
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +DROP TABLE t1,t2;
 +
 +CREATE TABLE t1 (i FLOAT) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1.5),(3.2),(2.71);
 +
 +CREATE TABLE t2 (j FLOAT, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3.2),(2.71);
 +
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +DROP TABLE t1,t2;
 +
 +CREATE TABLE t1 (i DECIMAL(10,2)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1.5),(3.21),(2.47);
 +
 +CREATE TABLE t2 (j DECIMAL(10,2), KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (3.21),(4.55);
 +
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +DROP TABLE t1,t2;
 +
 +CREATE TABLE t1 (i VARCHAR(32)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('cc'),('aa'),('ddd');
 +
 +CREATE TABLE t2 (j VARCHAR(16), KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES ('bbb'),('aa');
 +
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +DROP TABLE t1,t2;
 +
 +CREATE TABLE t1 (i DATETIME) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES
 + ('2008-09-27 00:34:58'),('2007-05-28 00:00:00'), ('2009-07-25 09:21:20');
 +
 +CREATE TABLE t2 (j DATETIME, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES
 + ('2007-05-28 00:00:00'), ('2010-08-25 00:00:00');
 +
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +DROP TABLE t1,t2;
 +
 +CREATE TABLE t1 (i DATE) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('2008-09-27'),('2007-05-28'), ('2009-07-25');
 +
 +CREATE TABLE t2 (j DATE, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES ('2007-05-28'), ('2010-08-25');
 +
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +DROP TABLE t1,t2;
 +
 +CREATE TABLE t1 (i TIME) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('00:34:58'),('10:00:02'), ('09:21:20');
 +
 +CREATE TABLE t2 (j TIME, KEY(j)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES ('10:00:02'), ('11:00:10');
 +
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM ( SELECT DISTINCT * FROM t1 ) AS sq
 +  WHERE i IN ( SELECT MIN(j) FROM t2 );
 +
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-11593: pushdown of condition with NULLIF
 +--echo #
 +
 +CREATE TABLE t1 (i INT);
 +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +
 +INSERT INTO t1 VALUES (2), (1);
 +
 +SELECT * FROM v1 WHERE NULLIF(1, i);
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 WHERE NULLIF(1, i);
 +
 +DROP VIEW v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-11608: pushdown of the predicate with cached null value
 +--echo #
 +
 +CREATE TABLE t1 (c VARCHAR(3));
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES ('foo'),('bar');
 +
 +CREATE TABLE t2 (c VARCHAR(3));
 +INSERT INTO t2 VALUES ('foo'),('xyz');
 +
 +SELECT * FROM v1 WHERE v1.c IN ( SELECT MIN(c) FROM t2 WHERE 0 );
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM v1 WHERE v1.c IN ( SELECT MIN(c) FROM t2 WHERE 0 );
 +
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +
 +CREATE TABLE t1 (d DECIMAL(10,2));
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +INSERT INTO t1 VALUES (5.37),(1.1);
 +
 +CREATE TABLE t2 (d DECIMAL(10,2));
 +INSERT INTO t2 VALUES ('1.1'),('2.23');
 +
 +SELECT * FROM v1 WHERE v1.d IN ( SELECT MIN(d) FROM t2 WHERE 0 );
 +
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-11820: second execution of PS for query
 +--echo #             with false subquery predicate in WHERE
 +--echo #
 +
 +CREATE TABLE t1 (c VARCHAR(3)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES ('foo'),('bar');
 +CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
 +CREATE TABLE t2 (a INT);
 +INSERT INTO t2 VALUES (3), (4);
 +
 +PREPARE stmt1 FROM
 +" SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
 +PREPARE stmt2 FROM
 +"EXPLAIN FORMAT=JSON
 + SELECT * FROM v1 WHERE 1 IN (SELECT a FROM t2) OR c = 'foo'";
 +EXECUTE stmt1;
 +EXECUTE stmt2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +INSERT INTO t2 SELECT a+1 FROM t2;
 +EXECUTE stmt1;
 +EXECUTE stmt2;
 +DEALLOCATE PREPARE stmt1;
 +# the result here will change after the merge with the fix for mdev-11859
 +DEALLOCATE PREPARE stmt2;
 +
 +DROP VIEW v1;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-12373: pushdown into derived with side effects is prohibited
 +--echo #
 +
 +CREATE TABLE sales_documents (
 + id           int NOT NULL AUTO_INCREMENT,
 + sale_id      int NULL DEFAULT NULL,
 + type         tinyint unsigned NULL DEFAULT NULL,
 + data         text NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
 + date         date NULL DEFAULT NULL,
 + order_number int unsigned NULL DEFAULT NULL,
 + created_at   int NULL DEFAULT NULL,
 + updated_at   int NULL DEFAULT NULL,
 + generated    tinyint NOT NULL DEFAULT '0',
 + synced_at    int NOT NULL DEFAULT '0',
 + sum          decimal(13,2) NOT NULL DEFAULT '0',
 + PRIMARY KEY (id)
 +);
 +
 +INSERT INTO sales_documents
 +(id, sale_id, type, order_number, data, created_at,
 + updated_at, date, generated, synced_at, sum)
 +VALUES
 +(555, 165, 3, 5, '{}', 1486538300, 1486722835, '2017-02-17', 0, 1486538313, 2320.00),
 +(556, 165, 2, 3, '{}', 1486538304, 1486563125, '2017-02-08', 1, 1486538302, 2320.00),
 +(557, 158, 2, 2, '{}', 1486538661, 1486538661, '2017-02-08', 0, 1486538660, 2320.00),
 +(558, 171, 1, 3, '{}', 1486539104, 1488203405, '2017-02-08', 1, 1486539102, 23230.00),
 +(559, 171, 2, 5, '{}', 1486549233, 1487146010, '2017-02-08', 1, 1486549225, 37690.00),
 +(560, 172, 1, 1, '{}', 1486658260, 1488203409, '2017-02-09', 1, 1486658256, 40312.00),
 +(561, 172, 2, 1, '{}', 1486711997, 1486711997, '2017-02-10', 1, 1486711996, 40312.00),
 +(562, 172, 3, 1, '{}', 1486712104, 1486721395, '2017-02-10', 1, 1486712101, 40312.00),
 +(563, 171, 3, 2, '{}', 1486712953, 1486720244, '2017-02-10', 1, 1486712910, 23230.00),
 +(564, 170, 1, 2, '{}', 1486715948, 1488203410, '2017-02-10', 1, 1486715930, 28873.00),
 +(565, 170, 3, 3, '{}', 1486716782, 1486717426, '2017-02-10', 1, 1486716779, 61948.00),
 +(566, 166, 3, 4, '{}', 1486720947, 1486720947, '2017-02-10', 1, 1486720945, 4640.00),
 +(567, 167, 3, 5, '{}', 1486722741, 1486722783, '2017-02-26', 0, 1486722738, 14755.00),
 +(568, 165, 1, 4, '{}', 1486722849, 1486722849, '2017-02-10', 0, 1486722846, 2320.00),
 +(569, 173, 2, 2, '{}', 1486723073, 1487071275, '2017-02-10', 1, 1486723071, 14282.00),
 +(570, 173, 1, 4, '{}', 1486723100, 1488203412, '2017-02-10', 1, 1486723099, 14282.00),
 +(571, 167, 2, 4, '{}', 1486730859, 1486730859, '2017-02-10', 1, 1486730856, 18655.00),
 +(572, 167, 1, 5, '{}', 1486730883, 1488203412, '2017-02-10', 1, 1486730877, 18655.00),
 +(573, 174, 2, 51, '{}', 1486731622, 1487060259, '2017-02-10', 1, 1486731620, 7140.00),
 +(574, 174, 3, 5, '{}', 1486993472, 1486993472, '2017-02-13', 1, 1488216147, 28020.00),
 +(575, 174, 1, 6, '{}', 1486993530, 1488203412, '2017-02-13', 1, 1486993505, 7140.00),
 +(576, 173, 3, 6, '{}', 1487071425, 1487071425, '2017-02-14', 0, 1487071422, 14282.00),
 +(577, 178, 2, 6, '{}', 1487327372, 1487327372, '2017-02-17', 1, 1487327370, 12321.00),
 +(578, 177, 2, 7, '{}', 1487327394, 1487327394, '2017-02-17', 0, 1487327391, 4270.00),
 +(579, 182, 3, 6, '{}', 1487750589, 1487751693, '2017-02-22', 1, 1487751688, 4270.00),
 +(580, 182, 2, 7, '{}', 1487750601, 1487750663, '2017-02-22', 1, 1487750598, 4270.00),
 +(581, 182, 1, 7, '{}', 1487750694, 1488203412, '2017-02-22', 1, 1487750692, 4270.00),
 +(582, 185, 3, 7, '{}', 1487774051, 1487774051, '2017-02-22', 0, 1487774043, 8913.00),
 +(583, 184, 3, 7, '{}', 1487774071, 1487774235, '2017-02-22', 0, 1487774093, 3285.00),
 +(584, 184, 2, 8, '{}', 1487774074, 1487774074, '2017-02-22', 0, 1487774073, 3285.00),
 +(585, 184, 1, 8, '{}', 1487774081, 1487774081, '2017-02-22', 0, 1487774075, 3285.00),
 +(586, 193, 2, 8, '{}', 1487955294, 1487955318, '2017-02-24', 0, 1487955311, 4270.00),
 +(587, 193, 1, 8, '{}', 1487955324, 1487955324, '2017-02-24', 0, 1487955320, 4270.00),
 +(588, 193, 3, 7, '{}', 1487955341, 1487955341, '2017-02-24', 0, 1487955325, 4270.00),
 +(589, 186, 1, 8, '{}', 1487957291, 1487957464, '2017-02-24', 0, 1487957459, 6960.00),
 +(590, 186, 2, 8, '{}', 1487957308, 1487957468, '2017-02-24', 0, 1487957465, 6960.00),
 +(591, 186, 3, 7, '{}', 1487957312, 1487957473, '2017-02-24', 0, 1487957469, 6960.00),
 +(592, 194, 1, 8, '{}', 1488193293, 1488203412, '2017-02-27', 1, 1488193280, 2320.00),
 +(593, 194, 2, 8, '{}', 1488193304, 1488193304, '2017-02-27', 1, 1488193303, 2320.00),
 +(594, 210, 1, 9, '{}', 1488198896, 1488198896, '2017-02-27', 0, 1488198885, 4270.00),
 +(595, 210, 2, 12, '{}', 1488198901, 1488198901, '2017-02-27', 1, 1488532585, 4270.00),
 +(596, 210, 3, 10, '{}', 1488198904, 1488198904, '2017-02-27', 1, 1488532565, 4270.00),
 +(597, 209, 2, 9, '{}', 1488200016, 1488450772, '2017-02-27', 1, 1488450449, 4270.00),
 +(598, 209, 1, 9, '{}', 1488200020, 1488200063, '2017-02-27', 1, 1488200017, 4271.00),
 +(599, 209, 3, 7, '{}', 1488200053, 1488200053, '2017-02-27', 0, 1488200021, 4271.00),
 +(600, 211, 2, 10, '{}', 1488216265, 1489402027, '2017-02-27', 1, 1488216264, 2320.00),
 +(601, 211, 3, 7, '{}', 1488216281, 1488216281, '2017-02-27', 1, 1488216276, 2320.00),
 +(602, 211, 1, 10, '{}', 1488216283, 1488216283, '2017-02-27', 1, 1488216282, 2320.00),
 +(603, 198, 2, 11, '{}', 1488280125, 1488280125, '2017-02-28', 0, 1488280095, 4270.00),
 +(604, 198, 1, 11, '{}', 1488280160, 1488280160, '2017-02-28', 0, 1488280126, 4270.00),
 +(605, 198, 3, 8, '{}', 1488280440, 1488280440, '2017-02-28', 0, 1488280435, 4270.00),
 +(606, 212, 1, 12, '{}', 1488286301, 1489402168, '2017-02-28', 1, 1488286295, 13825.00),
 +(607, 212, 3, 8, '{}', 1488289644, 1488289690, '2017-02-28', 1, 1488289642, 25295.00),
 +(608, 212, 2, 13, '{}', 1488290350, 1488290431, '2017-02-28', 1, 1488290347, 13133.75),
 +(609, 213, 1, 11, '{}', 1488529470, 1488529470, '2017-03-03', 1, 1488529461, 5660.00),
 +(610, 213, 2, 11, '{}', 1488529484, 1488529484, '2017-03-03', 1, 1488529479, 5660.00),
 +(611, 213, 3, 9, '{}', 1488529493, 1488529493, '2017-03-03', 1, 1488529489, 5660.00),
 +(612, 197, 2, 13, '{}', 1489400715, 1489400715, '2017-03-13', 0, 1489398959, 4270.00),
 +(613, 219, 3, 11, '{}', 1490084337, 1490181958, '2017-03-21', 1, 1490084334, 73526.00),
 +(614, 216, 3, 11, '{}', 1490085757, 1490086717, '2017-03-21', 0, 1490085755, 5377.00);
 +
 +SELECT * FROM
 +(SELECT @row := @row + 1 as row, a.* from (
 +	SELECT t.order_number
 +	FROM sales_documents t
 +	WHERE
 +		t.type = 2 AND
 +		t.date >= '2017-01-01' AND
 +		t.date <= '2017-12-31' AND
 +		t.order_number IS NOT NULL AND
 +		t.generated = 1
 +	GROUP BY t.order_number
 +) a, (SELECT @row := 0) r) t
 +WHERE row <> order_number;
 +
 +DROP TABLE sales_documents;
 +
 +--echo #
 +--echo # MDEV-12845: pushdown from merged derived using equalities
 +--echo #
 +
 +create table t1 (a int);
 +insert into t1 values
 +  (4), (8), (5), (3), (10), (2), (7);
 +
 +create table t2 (b int, c int);
 +insert into t2 values
 +  (2,1), (5,2), (2,2), (4,1), (4,3),
 +  (5,3), (2,4), (4,6), (2,1);
 +
 +create view v1 as
 +select b, sum(c) as s from t2 group by b;
 +
 +create view v2 as
 +select distinct b, c from t2;
 +
 +create view v3 as
 +select b, max(c) as m from t2 group by b;
 +
 +let $q1=
 +select b
 +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t
 +where b > 2;
 +
 +eval $q1;
 +eval explain format=json $q1;
 +
 +let $q2=
 +select a
 +from ( select t1.a, v1.b, v1.s from t1, v1 where t1.a = v1.b ) as t
 +where a > 2;
 +
 +eval $q2;
 +eval explain format=json $q2;
 +
 +let $q3=
 +select a
 +from  ( select t1.a, v2.b, v2.c from t1, v2 where t1.a = v2.b ) as t
 +where a > 2;
 +
 +eval $q3;
 +eval explain format=json $q3;
 +
 +let $q4=
 +select a
 +from  ( select t1.a, v3.b, v3.m from t1, v3 where t1.a = v3.m ) as t
 +where a > 2;
 +
 +eval $q4;
 +eval explain format=json $q4;
 +
 +drop view v1,v2,v3;
 +drop table t1,t2;
 +
 +--echo #
 +--echo # MDEV-13166: pushdown from merged derived
 +--echo #
 +
 +CREATE TABLE t1 (i int) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(2);
 +CREATE VIEW v1 AS SELECT MAX(i) AS f FROM t1;
 +
 +let $q=
 +SELECT * FROM ( SELECT * FROM v1 ) AS sq WHERE f > 0;
 +
 +eval $q;
 +eval explain format=json $q;
 +
 +DROP VIEW v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-13193: pushdown of equality extracted from multiple equality
 +--echo #
 +
 +CREATE TABLE t1 (i1 int, KEY(i1)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (1),(2);
 +
 +CREATE TABLE t2 (i2 int) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (2),(4);
 +
 +CREATE ALGORITHM=TEMPTABLE VIEW v2 AS SELECT * FROM t2;
 +
 +let $q=
 +SELECT * FROM t1, ( SELECT * FROM v2 ) AS sq
 +  WHERE i1 = 1 AND ( i1 = i2 OR i1 = 2 );
 +
 +eval $q;
 +eval explain format=json $q;
 +
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-14237: derived with regexp_substr() in select list
 +--echo #
 +
 +create table t1 (a char(8));
 +insert into t1 values ('b'), ('a'), ('xx');
 +
 +let $q=
 +select *
 +from ( select distinct regexp_substr(t1.a,'^[A-Za-z]+') as f from t1) as t
 +where t.f = 'a' or t.f = 'b';
 +
 +eval $q;
 +eval explain format=json $q;
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-13454: consequence of mdev-14368 fixed for 5.5
 +--echo #
 +
 +SET  sql_mode = 'ONLY_FULL_GROUP_BY';
 +
 +create table t1 (id int, id2 int);
 +insert into t1 values (1,1),(2,3),(3,4),(7,2);
 +
 +create table t2(id2 int);
 +insert  t2 values (1),(2),(3);
 +
 +let $q=
 +SELECT * FROM t1
 +  LEFT OUTER JOIN
 +  (SELECT id2, COUNT(*) as ct FROM t2 GROUP BY id2) vc USING (id2)
 +WHERE (vc.ct>0);
 +
 +eval $q;
 +eval EXPLAIN FORMAT=JSON $q;
 +
 +DROP TABLE t1,t2;
 +
 +SET  sql_mode = DEFAULT;
 +
 +--echo #
 +--echo # MDEV-15579: incorrect removal of sub-formulas to be pushed
 +--echo #             into WHERE of materialized derived with GROUP BY
 +--echo #
 +
 +CREATE TABLE t1 (a INT, b INT, c INT, d INT);
 +CREATE TABLE t2 (x INT, y INT, z INT);
 +
 +INSERT INTO t1 VALUES (1,1,66,1), (1,1,56,2), (3,2,42,3);
 +INSERT INTO t2 VALUES (1,1,66), (1,12,32);
 +
 +let $query=
 +SELECT *
 +FROM t2,
 +(
 +  SELECT a, b, max(c) AS max_c
 +  FROM t1
 +  GROUP BY a
 +  HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND
 +      (v1.a=t2.x) AND (v1.max_c>30);
 +eval $query;
 +eval EXPLAIN $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT *
 +FROM t2,
 +(
 +  SELECT a, b, d, max(c) AS max_c
 +  FROM t1
 +  GROUP BY a,d
 +  HAVING max_c > 37
 +) AS v1
 +WHERE (v1.a=1) AND (v1.b=v1.a) AND (v1.b=v1.d) AND
 +      (v1.a=t2.x) AND (v1.max_c>30);
 +eval $query;
 +eval EXPLAIN $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-15765: pushing condition with temporal constants
 +--echo #             into constant tables
 +--echo #
 +
 +select * from (select  date('2018-01-01') as d
 +               union all
 +               select  date('2018-01-01') as d) as t
 +  where t.d between date ('2017-01-01') and date ('2019-01-01');
 +
 +select * from (select  date('2018-01-01') as d) as t
 +  where t.d between date ('2017-01-01') and date ('2019-01-01');
 +
 +--echo #
 +--echo # MDEV-16088: pushdown into derived defined in the IN subquery
 +--echo #
 +
 +CREATE TABLE t1 (a INT, b INT);
 +CREATE TABLE t2 (e INT, f INT, g INT);
 +INSERT INTO t1 VALUES (1,14),(2,13),(1,19),(2,32),(3,24);
 +INSERT INTO t2 VALUES (1,19,2),(3,24,1),(1,12,2),(3,11,3),(2,32,1);
 +
 +let $query=
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +  (
 +    SELECT d_tab.e,d_tab.max_f
 +    FROM (
 +      SELECT t2.e, MAX(t2.f) AS max_f
 +      FROM t2
 +      GROUP BY t2.e
 +      HAVING max_f>18
 +    ) as d_tab
 +    WHERE d_tab.e>1
 +  )
 +;
 +eval $query;
 +eval EXPLAIN $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +  (
 +    SELECT d_tab.e,d_tab.max_f
 +    FROM (
 +      SELECT t2.e, MAX(t2.f) AS max_f
 +      FROM t2
 +      GROUP BY t2.e
 +      HAVING max_f>18
 +    ) as d_tab
 +    WHERE d_tab.max_f<25
 +  )
 +;
 +eval $query;
 +eval EXPLAIN $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +  (
 +    SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +    FROM (
 +      SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +      FROM t2
 +      GROUP BY t2.e
 +    ) as d_tab
 +    WHERE d_tab.e>1
 +    GROUP BY d_tab.g
 +  )
 +;
 +eval $query;
 +eval EXPLAIN $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT * FROM t1
 +WHERE (t1.a,t1.b) IN
 +  (
 +    SELECT d_tab.e, MAX(d_tab.max_f) AS max_f
 +    FROM (
 +      SELECT t2.e, MAX(t2.f) as max_f, t2.g
 +      FROM t2
 +      GROUP BY t2.e
 +    ) as d_tab
 +    WHERE d_tab.max_f>20
 +    GROUP BY d_tab.g
 +  )
 +;
 +eval $query;
 +eval EXPLAIN $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-15765: pushing condition with IN subquery defined with constants
 +--echo #             using substitution
 +--echo #
 +
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (1),(2);
 +SELECT * FROM
 +(
 +  SELECT DISTINCT * FROM t1
 +) der_tab
 +WHERE (a>0 AND a<2 OR a IN (2,3)) AND
 +      (a=2 OR 0);
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-16386: pushing condition into the HAVING clause when ambiguous
 +--echo #             fields warning appears
 +--echo #
 +
 +CREATE TABLE t1 (a INT, b INT);
 +
 +INSERT INTO t1 VALUES (1,2),(2,3),(3,4);
 +
 +let $query=
 +SELECT * FROM
 +(
 +  SELECT t1.b AS a
 +  FROM t1
 +  GROUP BY t1.a
 +) dt
 +WHERE (dt.a=2);
 +eval $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT * FROM
 +(
 +  SELECT t1.b AS a
 +  FROM t1
 +  GROUP BY t1.a
 +  HAVING (t1.a<3)
 +) dt
 +WHERE (dt.a>1);
 +eval $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT * FROM
 +(
 +  SELECT 'ab' AS a
 +  FROM t1
 +  GROUP BY t1.a
 +) dt
 +WHERE (dt.a='ab');
 +eval $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT * FROM
 +(
 +  SELECT 1 AS a
 +  FROM t1
 +  GROUP BY t1.a
 +) dt
 +WHERE (dt.a=1);
 +eval $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-16517: pushdown condition with the IN predicate defined
 +--echo #             with non-constant values
 +--echo #
 +
 +CREATE TABLE t1 (a INT, b INT);
 +INSERT INTO t1 VALUES (1,2),(1,3);
 +
 +let $query=
 +SELECT * FROM
 +(
 +  SELECT t1.a
 +  FROM t1
 +  WHERE 1 IN (0,t1.a)
 +  GROUP BY t1.a
 +) AS dt1
 +JOIN
 +(
 +  SELECT t1.a
 +  FROM t1
 +  WHERE 1 IN (0,t1.a)
 +) AS dt2
 +ON dt1.a = dt2.a;
 +eval $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +
 +let $query=
 +SELECT * FROM
 +(
 +  SELECT t1.a,MAX(t1.b)
 +  FROM t1
 +  GROUP BY t1.a
 +) AS dt, t1
 +WHERE dt.a=t1.a AND dt.a IN (1,t1.a);
 +eval $query;
 +eval EXPLAIN FORMAT=JSON $query;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-15087: error from inexpensive subquery before check
 +--echo #                   for condition pushdown into derived
 +--echo #
 +
 +CREATE TABLE t1 (i1 int, v1 varchar(1));
 +INSERT INTO t1 VALUES (7,'x');
 +
 +CREATE TABLE t2 (i1 int);
 +INSERT INTO t2 VALUES (8);
 +
 +CREATE TABLE t3 (i1 int ,v1 varchar(1), v2 varchar(1));
 +INSERT INTO t3 VALUES (4, 'v','v'),(62,'v','k'),(7, 'n', NULL);
 +
 +--error ER_SUBQUERY_NO_1_ROW
 +SELECT 1
 +FROM (t1 AS a1
 +      JOIN (((SELECT  DISTINCT t3.*
 +              FROM t3) AS a2
 +             JOIN t1 ON (t1.v1 = a2.v2))) ON (t1.v1 = a2.v1))
 +WHERE (SELECT  BIT_COUNT(t2.i1)
 +       FROM (t2 JOIN t3)) IS NULL;
 +
 +DROP TABLE t1, t2, t3;
 +
 +--echo #
 +--echo # MDEV-16614 signal 7 after calling stored procedure, that uses regexp
 +--echo #
 +
 +DELIMITER $$;
 +CREATE PROCEDURE p1(m1 varchar(5), m2 varchar(5))
 +BEGIN
 +SELECT a FROM
 +	(SELECT "aa" a) t
 +	JOIN (SELECT "aa" b) t1 on t.a=t1.b
 +WHERE t.a regexp m1 and t1.b regexp m2
 +GROUP BY a;
 +END$$
 +DELIMITER ;$$
 +CALL p1('a','a');
 +DROP PROCEDURE p1;
 +
 +
 +DELIMITER $$;
 +CREATE PROCEDURE p1(m1 varchar(5))
 +BEGIN
 +  SELECT a FROM (SELECT "aa" a) t WHERE t.a regexp m1;
 +END$$
 +DELIMITER ;$$
 +CALL p1('a');
 +DROP PROCEDURE p1;
 +
 +
 +SELECT a FROM (SELECT "aa" a) t WHERE REGEXP_INSTR(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
 +
 +
 +DELIMITER $$;
 +CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
 +BEGIN
 +  RETURN 1;
 +END;$$
 +CREATE OR REPLACE PROCEDURE p1(m1 varchar(5))
 +BEGIN
 +  SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, m1);
 +END$$
 +DELIMITER ;$$
 +CALL p1('a');
 +DROP PROCEDURE p1;
 +DROP FUNCTION f1;
 +
 +
 +DELIMITER $$;
 +CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
 +BEGIN
 +  RETURN 1;
 +END;$$
 +DELIMITER ;$$
 +SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
 +DROP FUNCTION f1;
 +
 +--echo #
 +--echo # MDEV-17011: condition pushdown into materialized derived used
 +--echo #             in INSERT SELECT, multi-table UPDATE and DELETE
 +--echo #
 +
 +CREATE TABLE t1 (a int ,b int) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES
 +  (1, 1), (1, 2), (2, 1), (2, 2), (3,1), (3,3), (4,2);
 +
 +CREATE TABLE t2 (a int) ENGINE MYISAM;
 +INSERT INTO t2 VALUES
 +  (3), (7), (1), (4), (1);
 +
 +CREATE TABLE t3 (a int, b int) ENGINE MYISAM;
 +
 +let $q1=
 +INSERT INTO t3
 +SELECT * FROM (SELECT a, count(*) as c FROM t1 GROUP BY a) t WHERE a<=2;
 +
 +eval EXPLAIN FORMAT=JSON $q1;
 +eval $q1;
 +
 +SELECT * FROM t3;
 +
 +let $q2=
 +UPDATE t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t SET t2.a=t.c+10
 +  WHERE t2.a= t.c and t.a>=3;
 +
 +eval EXPLAIN FORMAT=JSON $q2;
 +eval $q2;
 +
 +SELECT * FROM t2;
 +
 +let $q3=
 +DELETE t2 FROM t2, (SELECT a, count(*) as c FROM t1 GROUP BY a) t
 +  WHERE t2.a= t.c+9 and t.a=2;
 +
 +eval EXPLAIN FORMAT=JSON $q3;
 +eval $q3;
 +
 +SELECT * FROM t2;
 +
 +DROP TABLE t1,t2,t3;
 +
 +--echo #
 +--echo # MDEV-16765: pushdown condition with the CASE structure
 +--echo #             defined with Item_cond item
 +--echo #
 +
 +CREATE TABLE t1(a INT, b INT);
 +INSERT INTO t1 VALUES (1,2), (3,4), (2,3);
 +
 +LET $query=
 +SELECT *
 +FROM
 +(
 +  SELECT CASE WHEN ((tab2.max_a=1) OR (tab2.max_a=2))
 +    THEN 1 ELSE 0 END AS max_a,b
 +  FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EVAL $query;
 +EVAL EXPLAIN FORMAT=JSON $query;
 +
 +LET $query=
 +SELECT *
 +FROM
 +(
 +  SELECT CASE WHEN ((tab2.max_a=1) OR ((tab2.max_a>2) AND (tab2.max_a<4)))
 +    THEN 1 ELSE 0 END AS max_a,b
 +  FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EVAL $query;
 +EVAL EXPLAIN FORMAT=JSON $query;
 +
 +LET $query=
 +SELECT *
 +FROM
 +(
 +  SELECT CASE WHEN ((tab2.max_a>1) AND ((tab2.max_a=2) OR (tab2.max_a>2)))
 +    THEN 1 ELSE 0 END AS max_a,b
 +  FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EVAL $query;
 +EVAL EXPLAIN FORMAT=JSON $query;
 +
 +LET $query=
 +SELECT *
 +FROM
 +(
 +  SELECT CASE WHEN ((tab2.b=2) OR (tab2.b=4))
 +    THEN 1 ELSE 0 END AS max_a,b
 +  FROM (SELECT MAX(a) as max_a,b FROM t1 GROUP BY t1.b) AS tab2
 +) AS tab1
 +WHERE (tab1.max_a=1);
 +EVAL $query;
 +EVAL EXPLAIN FORMAT=JSON $query;
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-16803: pushdown condition with IN predicate in the derived table
 +--echo #             defined with several SELECT statements
 +--echo #
 +
 +CREATE TABLE t1 (a INT, b INT);
 +INSERT INTO t1 VALUES (1,2),(3,2),(1,1);
 +
 +SELECT * FROM
 +(
 +  SELECT a,b,1 as c
 +  FROM t1
 +  UNION ALL
 +  SELECT a,b,2 as c
 +  FROM t1
 +) AS tab
 +WHERE ((a,b) IN ((1,2),(3,2)));
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-17354: INSERT SELECT with condition pushdown into derived
 +--echo #
 +
 +CREATE TABLE t1 (f INT NOT NULL);
 +INSERT INTO t1 VALUES (3), (7), (3);
 +
 +CREATE ALGORITHM= TEMPTABLE VIEW v1 AS SELECT * FROM ( SELECT * FROM t1 ) AS sq;
 +
 +let $q1=
 +INSERT INTO t1
 +SELECT * FROM ( SELECT t1.f FROM v1 JOIN t1 ) AS t WHERE f IS NOT NULL;
 +
 +eval $q1;
 +eval EXPLAIN $q1;
 +eval EXPLAIN FORMAT=JSON $q1;
 +SELECT * FROM t1;
 +
 +DELETE FROM t1;
 +INSERT INTO t1 VALUES (3), (7), (3);
 +
 +let $q2=
 +INSERT INTO t1
 +SELECT * FROM ( SELECT t1.f FROM v1 JOIN t1 ON v1.f=t1.f) AS t
 +  WHERE f IS NOT NULL;
 +
 +eval $q2;
 +eval EXPLAIN FORMAT=JSON $q2;
 +SELECT * FROM t1;
 +
 +DROP VIEW v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-17574: pushdown into derived from mergeable view
 +--echo #             used in multi-table UPDATE
 +--echo #             pushdown into materialized derived from mergeable view
 +--echo #             used in SELECT
 +--echo #
 +
 +CREATE TABLE t1 (f1 text, f2 int);
 +INSERT INTO t1 VALUES ('x',1), ('y',2);
 +
 +CREATE VIEW v1 AS SELECT f2 FROM ( SELECT f2 FROM t1 ) AS t;
 +let $q1 =
 +UPDATE v1, t1 SET t1.f1 = 'z' WHERE v1.f2 < 2 AND t1.f2 = v1.f2;
 +eval $q1;
 +eval EXPLAIN FORMAT=JSON $q1;
 +
 +SELECT * FROM t1;
 +
 +CREATE VIEW v2 AS SELECT f2 FROM ( SELECT DISTINCT f2 FROM t1 ) AS t;
 +let $q2 =
 +SELECT * FROM v2, t1 WHERE v2.f2 < 2 AND t1.f2 = v2.f2;
 +eval $q2;
 +eval EXPLAIN FORMAT=JSON $q2;
 +
 +DROP VIEW v1,v2;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-18383: pushdown condition with the IF structure
 +--echo #             defined with Item_cond item
 +--echo #
 +
 +CREATE TABLE t1(a INT, b INT);
 +CREATE TABLE t2(c INT, d INT);
 +INSERT INTO t1 VALUES (1,2),(3,4),(5,6);
 +INSERT INTO t2 VALUES (1,3),(3,7),(5,1);
 +
 +SELECT *
 +FROM t1,
 +(
 +  SELECT MAX(d) AS max_d,c
 +  FROM t2
 +  GROUP BY c
 +) AS tab
 +WHERE t1.a=tab.c AND
 +      IF(2,t1.a=1 OR t1.b>5,1=1);
 +
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-19139: pushdown condition with Item_func_set_user_var
 +--echo #
 +
 +CREATE TABLE t1 (a INT, b INT);
 +CREATE VIEW v1 AS SELECT a, MAX(b) FROM t1 GROUP BY a;
 +
 +SELECT * FROM (SELECT 1 FROM v1 UNION (SELECT 1 FROM v1 WHERE @a := uuid())) dt;
 +EXPLAIN FORMAT=JSON
 +SELECT * FROM (SELECT 1 FROM v1 UNION (SELECT 1 FROM v1 WHERE @a := uuid())) dt;
 +
 +DROP TABLE t1;
 +DROP VIEW v1;
 +
 +--echo #
 +--echo # MDEV-21388 Wrong result of DAYNAME()=xxx in combination with condition_pushdown_for_derived=on
 +--echo #
 +
 +CREATE TABLE t1 (a INT, b DATE, c INT);
 +INSERT INTO t1 VALUES
 +  (1,'2001-01-21',345),
 +  (6,'2001-01-20',315),
 +  (6,'2001-01-20',214);
 +
 +CREATE TABLE t2 (a INT, b INT);
 +INSERT INTO t2 VALUES (2,19), (7,20);
 +CREATE VIEW v1 AS SELECT a, b, max(c) AS max_c FROM t1
 +  GROUP BY a,b HAVING max_c < 707;
 +
 +SELECT *, dayname(v1.b) FROM v1,t2 WHERE (v1.max_c>214) AND (t2.a>v1.a);
 +
 +SET optimizer_switch='condition_pushdown_for_derived=off';
 +SELECT *, dayname(v1.b) FROM v1,t2 WHERE (v1.max_c>214) AND (t2.a>v1.a) AND dayname(v1.b)='Sunday';
 +
 +SET optimizer_switch='condition_pushdown_for_derived=on';
 +SELECT *, dayname(v1.b) FROM v1,t2 WHERE (v1.max_c>214) AND (t2.a>v1.a) AND dayname(v1.b)='Sunday';
 +
 +DROP VIEW v1;
 +DROP TABLE t1, t2;
 +
 +SET optimizer_switch=DEFAULT;
 +
 +
 +
 +--echo #
 +--echo # MDEV-17177: an attempt to push down IN predicate when one of
 +--echo #             the arguments is too complex to be cloned
 +--echo #
 +
 +CREATE TABLE t1 (a VARCHAR(8));
 +INSERT INTO t1 VALUES ('abc'),('def');
 +CREATE VIEW v1 AS SELECT * FROM t1 GROUP BY a;
 +
 +SELECT * FROM v1 WHERE IF( a REGEXP 'def', 'foo', a ) IN ('abc', 'foobar');
 +
 +DROP VIEW v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-19179: pushdown into UNION of aggregation selects whose
 +--echo #             corresponding columns have different names
 +--echo #
 +
 +create table t1 (a int);
 +insert into t1 values (3), (7), (1);
 +
 +let $q=
 +select *
 +from (select min(a) as x from t1 union all select max(a) as y from t1) t
 +where x>0;
 +
 +eval $q;
 +eval explain extended $q;
 +
 +eval prepare stmt from "$q";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +create view v1(m) as
 +select min(a) as x from t1 union all select max(a) as y from t1;
 +select * from v1 where m > 0;
 +
 +drop view v1;
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-25635: pushdown into grouping view using aggregate functions
 +--echo #             with constant arguments via a mergeable derived table
 +--echo #
 +
 +create table t1 (a int);
 +insert into t1 values (3), (7), (1), (3), (7), (7), (3);
 +
 +create view v1 as select a, sum(1) as f, sum(1) as g from t1 group by a;
 +select * from v1;
 +let $q1=
 +select * from (select * from v1) as dt where a=f and a=g;
 +eval $q1;
 +eval explain extended $q1;
 +
 +create view v2 as select a, min(1) as f, min(1) as g from t1 group by a;
 +select * from v2;
 +let $q2=
 +select * from (select * from v2) as dt where a=f and a=g;
 +eval $q2;
 +eval explain extended $q2;
 +
 +drop view v1,v2;
 +drop table t1;
 +
++--echo #
++--echo # MDEV-25969: Condition pushdown into derived table doesn't work if select list uses SP
++--echo #
++create function f1(a int) returns int DETERMINISTIC return (a+1);
++
++create table t1 (
++  pk int primary key,
++  a int,
++  b int,
++  key(a)
++);
++
++create table t2(a int);
++insert into t2 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
++
++create table t3(a int);
++insert into t3 select A.a + B.a* 10 + C.a * 100 from t2 A, t2 B, t2 C;
++
++insert into t1 select a,a,a from t3;
++
++create view v1 as
++select
++  t1.a as col1,
++  f1(t1.b) as col2
++from
++  t1;
++
++create view v2 as
++select
++  t1.a as col1,
++  f1(t1.b) as col2
++from
++  t1;
++create view v3 as
++select col2, col1 from v1
++union all
++select col2, col1 from v2;
++
++explain select * from v3 where col1=123;
++
++--echo # This must use ref accesses for reading table t1, not full scans:
++explain format=json
++select * from v3 where col1=123 and col2=321;
++
++drop function f1;
++drop view v1,v2,v3;
++drop table t1, t2,t3;
++
++--echo #
++--echo # Another testcase, with pushdown through GROUP BY
++--echo #
++create table t1 (a int, b  int);
++insert into t1 values (1,1),(2,2),(3,3);
++
++create function f1(a int) returns int DETERMINISTIC return (a+1);
++
++create view v2(a, a2, s) as 
++select a, f1(a), sum(b) from t1 group by a, f1(a);
++
++--echo # Here, 
++--echo #   "(s+1) > 10" will be pushed into HAVING
++--echo #   "a > 1" will be pushed all the way to the table scan on t1
++--echo #   "a2>123" will be pushed into HAVING (as it refers to an SP call which
++--echo #                                       prevents pushing it to the WHERE)
++explain format=json
++select * from v2 where (s+1) > 10 AND a > 1 and a2>123;
++
++drop view v2;
++drop function f1;
++drop table t1;
 +--echo # End of 10.2 tests
 +
 +--echo #
 +--echo # MDEV-14579: pushdown conditions into materialized views/derived tables
 +--echo # that are defined with EXIST or/and INTERSECT
 +--echo #
 +
 +create table t1 (a int, b int, c int);
 +create table t2 (a int, b int, c int);
 +
 +insert into t1 values
 +  (1,21,345), (1,33,7), (8,33,114), (1,21,500), (1,19,117), (5,14,787),
 +  (8,33,123), (9,10,211), (5,16,207), (1,33,988), (5,27,132), (1,21,104),
 +  (6,20,309), (6,20,315), (1,21,101), (4,33,404), (9,10,800), (1,21,123);
 +
 +insert into t2 values
 +  (2,3,207), (1,16,909), (5,14,312),
 +  (5,33,207), (6,20,211), (1,19,132),
 +  (8,33,117), (3,21,231), (6,23,303);
 +
 +create view v1 as
 +  select a, b, min(c) as c from t1
 +  where t1.a<9 group by a,b having c < 300
 +  intersect
 +  select a, b, min(c) as c from t1
 +  where t1.b>10 group by a,b having c > 100;
 +
 +--echo # using intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # pushing equalities
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a=8);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE using equalities
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (t2.a=8);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # conjunctive subformulas : pushing into HAVING
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.c>200);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # conjunctive subformulas : pushing into HAVING
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>110);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # extracted or formula : pushing into WHERE
 +let $query=
 +  select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # extracted or formula : pushing into HAVING
 +let $query=
 +  select * from v1,t2 where
 +    (v1.a=t2.a) and ((v1.c>200) or (v1.c<105));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # extracted or formula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING using equalities
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,t2 where
 +    ((v1.a>3) and (t2.c>110) and (v1.c=t2.c)) or
 +    ((v1.a=1) and (v1.c<110));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using intersect in view definition
 +--echo # prepare of a query
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # conjunctive subformulas : pushing into HAVING
 +prepare stmt from "select * from v1,t2
 +                   where (v1.a=t2.a) and (v1.a<5) and (v1.c>110);";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +--echo # using intersect in derived table definition
 +--echo # extracted or formula : pushing into WHERE using equalities
 +--echo # extracted or formula : pushing into HAVING
 +--echo # pushing equalities
 +let $query=
 +  select *
 +  from t2,
 +      (select a, b, min(c) as c from t1
 +       where t1.a<9 group by a,b having c < 300
 +       intersect
 +       select a, b, min(c) as c from t1
 +       where t1.b>10 group by a,b having c > 100) as d1
 +  where
 +  (d1.b=t2.b) and
 +  (((t2.b>13) and (t2.c=909)) or
 +  ((d1.a<4) and (d1.c<200)));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +  where t1.a<9 group by a,b having c > 200
 +  except
 +  select a, b, max(c) as c from t1
 +  where t1.b>10 group by a,b having c < 300;
 +
 +--echo # using except in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a<5);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # pushing equalities
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a=6);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # conjunctive subformulas : pushing into WHERE using equalities
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (t2.a=6);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # conjunctive subformulas : pushing into HAVING
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.c>500);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # conjunctive subformulas : pushing into HAVING
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a<5) and (v1.c>500);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # extracted or formula : pushing into WHERE
 +let $query=
 +  select * from v1,t2 where (v1.a=t2.a) and ((v1.b>27) or (v1.b<19));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # extracted or formula : pushing into HAVING
 +let $query=
 +  select * from v1,t2 where
 +    (v1.a=t2.a) and ((v1.c<400) or (v1.c>800));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # extracted or formula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING using equalities
 +--echo # pushing equalities
 +let $query=
 +  select * from v1,t2 where
 +    (v1.c=t2.c) and
 +    ((v1.a>1) and (t2.c<500)) or
 +    ((v1.a=1) and (v1.c>500));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +--echo # using except in view definition
 +--echo # prepare of a query
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # conjunctive subformulas : pushing into HAVING
 +prepare stmt from "select * from v1,t2
 +                   where (v1.a=t2.a) and (v1.a<5) and (v1.c>500);";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +--echo # using except in view definition
 +--echo # extracted or formula : pushing into WHERE using equalities
 +--echo # extracted or formula : pushing into HAVING
 +--echo # pushing equalities
 +let $query=
 +  select *
 +  from t2,
 +      (select a, b, max(c) as c from t1
 +       where t1.a<9 group by a,b having c > 200
 +       except
 +       select a, b, max(c) as c from t1
 +       where t1.b>10 group by a,b having c < 300) as d1
 +  where
 +  (d1.b=t2.b) and
 +  (((t2.b>13) and (t2.c=988)) or
 +  ((d1.a>4) and (d1.c>500)));
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using union and intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, min(c) as c from t1
 +    where t1.a<9 group by a,b having c > 200
 +  union
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.a>3 group by a,b having c < 530;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using union and intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, min(c) as c from t1
 +    where t1.a<9 group by a,b having c > 200
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.a>3 group by a,b having c < 500
 +  union
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using union and except in view definition
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, min(c) as c from t1
 +    where t1.a<9 group by a,b having c > 200
 +  union
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a>3 group by a,b having c < 530;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>5) and (v1.c>200);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using union and except in view definition
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, min(c) as c from t1
 +    where t1.a<9 group by a,b having c > 200
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a>3 group by a,b having c < 500
 +  union
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<200);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using except and intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.a<7 group by a,b having c < 500
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a<9 group by a,b having c > 150;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<150);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using except and intersect in view definition
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a<9 group by a,b having c > 150
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.a<7 group by a,b having c < 500;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using except, intersect and union in view definition
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a<9 group by a,b having c > 150
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.a<7 group by a,b having c < 500
 +  union
 +  select a, b, max(c) as c from t1
 +    where t1.a<7 group by a,b having c < 120;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.c<130);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using intersect in view definition
 +--echo # using embedded view
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.a<9 group by a,b having c > 120;
 +
 +create view v2 as
 +  select a, b, max(c) as c from v1
 +    where v1.a<7 group by a,b;
 +
 +let $query= select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1,v2;
 +
 +--echo # using except in view definition
 +--echo # using embedded view
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c < 300
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a<9 group by a,b having c > 150;
 +
 +create view v2 as
 +  select a, b, max(c) as c from v1
 +    where v1.a<7 group by a,b;
 +
 +let $query= select * from v2,t2 where (v2.a=t2.a) and (v2.a>4) and (v2.c<150);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1,v2;
 +
 +--echo # using intersect in view definition
 +--echo # conditions are pushed in different parts of selects
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.a<9 group by a having c > 300
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.b<21 group by b having c > 200;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>4) and (v1.b>12) and (v1.c<450);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using except in view definition
 +--echo # conditions are pushed in different parts of selects
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.b>20 group by a having c > 300
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a<7 group by b having c > 150;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a<2) and (v1.b<30) and (v1.c>450);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using except and union in view definition
 +--echo # conditions are pushed in different parts of selects
 +--echo # conjunctive subformulas : pushing into HAVING
 +--echo # extracted or formula : pushing into WHERE
 +--echo # extracted or formula : pushing into HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.b>20 group by a having c > 300
 +  except
 +  select a, b, max(c) as c from t1
 +    where t1.a<7 group by b having c > 150;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and ((v1.a<2) or (v1.a<5)) and (v1.c>450);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using union and intersect in view definition
 +--echo # conditions are pushed in different parts of selects
 +--echo # conjunctive subformulas : pushing into WHERE and HAVING
 +create view v1 as
 +  select a, b, max(c) as c from t1
 +    where t1.a<9 group by a having c > 100
 +  intersect
 +  select a, b, max(c) as c from t1
 +    where t1.a>3 group by b having c < 800
 +  union
 +  select a, b, max(c) as c from t1
 +    where t1.b>10 group by a,b having c > 300;
 +
 +let $query= select * from v1,t2 where (v1.a=t2.a) and (v1.a>1) and (v1.b > 12) and (v1.c>400);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +create table t3 (a int, b int, c int);
 +insert into t3 values
 +  (1,21,345), (2,33,7), (8,33,114), (3,21,500), (1,19,107), (5,14,787),
 +  (4,33,123), (9,10,211), (11,16,207), (10,33,988), (5,27,132), (12,21,104),
 +  (6,20,309), (16,20,315), (16,21,101), (18,33,404), (19,10,800), (10,21,123),
 +  (17,11,708), (6,20,214);
 +
 +create index i1 on t3(a);
 +
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # pushed condition gives range access
 +create view v1 as
 +  select a, b, max(c) as max_c from t3
 +    where a>0 group by a;
 +
 +let $query= select * from v1,t2 where (v1.b=t2.b) and (v1.a<5);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using union in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # pushed condition gives range access
 +create view v1 as
 +  select a, b, max(c) as c from t3
 +    where t3.a>1 group by a
 +  union
 +  select a, b, max(c) as c from t3
 +    where t3.a>2 group by a;
 +
 +let $query= select * from v1,t2 where (v1.b=t2.b) and (v1.a<4);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +--echo # using union in view definition
 +--echo # conjunctive subformulas : pushing into WHERE
 +--echo # pushed condition gives range access in one of the selects
 +create view v1 as
 +  select a, b, max(c) as c from t3
 +    where t3.a>1 group by a
 +  union
 +  select a, b, max(c) as c from t3
 +    where t3.b<21 group by b;
 +
 +let $query= select * from v1,t2 where (v1.b=t2.b) and (v1.a<3);
 +eval $no_pushdown $query;
 +eval $query;
 +eval explain $query;
 +eval explain format=json $query;
 +
 +drop view v1;
 +
 +alter table t3 drop index i1;
 +
 +drop table t1,t2,t3;
 +
 +--echo #
 +--echo # MDEV-10855: Pushdown into derived with window functions
 +--echo #
 +
 +set @save_optimizer_switch= @@optimizer_switch;
 +set optimizer_switch='split_materialized=off';
 +
 +create table t1 (a int, c varchar(16));
 +insert into t1 values
 +(8,'aa'), (5,'cc'), (1,'bb'), (2,'aa'), (9,'cc'),
 +(7,'aa'), (2,'aa'), (7,'bb');
 +
 +create table t2 (a int, b int, c varchar(16), index idx(a,c));
 +insert into t2 values
 +  (7,10,'cc'), (1,20,'aa'), (2,23,'bb'), (7,18,'cc'), (1,30,'bb'),
 +  (4,71,'xx'), (3,15,'aa'), (7,82,'bb'), (8,12,'dd'), (4,15,'aa'),
 +  (11,33,'yy'), (10,42,'zz'), (4,53,'xx'), (10,17,'yy'), (7,12,'bb'),
 +  (8,20,'dd'), (7,32,'bb'), (1,50,'aa'), (3,40,'bb'), (3,77,'aa');
 +
 +let $q1=
 +select * from (select a, c, sum(b) over (partition by a,c) from t2) as t
 +  where t.a > 2 and t.c in ('aa','bb','cc');
 +
 +--sorted_result
 +eval $no_pushdown $q1;
 +--sorted_result
 +eval $q1;
 +eval explain $q1;
 +eval explain format=json $q1;
 +
 +let $q2=
 +select * from
 +(
 +  select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +  union all
 +  select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +
 +--sorted_result
 +eval $no_pushdown $q2;
 +--sorted_result
 +eval $q2;
 +eval explain $q2;
 +eval explain format=json $q2;
 +
 +let $q3=
 +select *
 +from (select a, c, sum(b) over (partition by a,c) as s from t2) as t, t1
 +  where t1.a=t.a and t1.c=t.c and t1.c in ('aa','bb','cc');
 +
 +eval $no_pushdown $q3;
 +eval $q3;
 +eval explain $q3;
 +eval explain format=json $q3;
 +
 +let $q4=
 +select * from
 +(
 +  select 1 as n, a, c, sum(b) over (partition by a,c) as s from t2
 +  union all
 +  select 2 as n, a, c, sum(b) over (partition by a) as s from t2
 +  union all
 +  select 3 as n, a, c, sum(b) as s from t2 group by a
 +) as t
 +where t.a > 2 and t.c in ('aa','bb','cc');
 +
 +--sorted_result
 +eval $no_pushdown $q4;
 +--sorted_result
 +eval $q4;
 +eval explain $q4;
 +eval explain format=json $q4;
 +
 +let $q5=
 +select * from (select a, c,
 +                      sum(b) over (partition by a,c) as sum_b,
 +                      avg(b) over (partition by a,c) as avg_b
 +               from t2 ) as t
 +  where t.a > 2 and t.c in ('aa','bb','cc');
 +
 +--sorted_result
 +eval $no_pushdown $q5;
 +--sorted_result
 +eval $q5;
 +eval explain $q5;
 +eval explain format=json $q5;
 +
 +let $q6=
 +select * from (select a, c,
 +                      sum(b) over (partition by a,c) as sum_b,
 +                      avg(b) over (partition by a) as avg_b
 +               from t2 ) as t
 +  where t.a > 2 and t.c in ('aa','bb','cc');
 +
 +--sorted_result
 +eval $no_pushdown $q6;
 +--sorted_result
 +eval $q6;
 +eval explain $q6;
 +eval explain format=json $q6;
 +
 +let $q7=
 +select * from (select a, c,
 +                      sum(b) over (partition by a,c) as sum_b,
 +                      avg(b) over (partition by c) as avg_b
 +               from t2 ) as t
 +  where t.a > 2 and t.c in ('aa','bb','cc');
 +
 +--sorted_result
 +eval $no_pushdown $q7;
 +--sorted_result
 +eval $q7;
 +eval explain $q7;
 +eval explain format=json $q7;
 +
 +drop table t1,t2;
 +
 +set optimizer_switch= @save_optimizer_switch;
 +
 +--echo #
 +--echo # MDEV-13369: Optimization for equi-joins of grouping derived tables
 +--echo #             (Splitting derived tables / views with GROUP BY)
 +--echo # MDEV-13389: Optimization for equi-joins of derived tables with WF
 +--echo #             (Splitting derived tables / views with window functions)
 +--echo #
 +
 +let
 +$no_splitting= set statement optimizer_switch='split_materialized=off' for;
 +
 +create table t1 (a int, b int, index idx_b(b)) engine=myisam;
 +insert into t1 values
 +(8,3), (5,7), (1,2), (2,1), (9,7), (7,5), (2,2), (7,3),
 +(9,3), (8,1), (4,5), (2,3);
 +
 +create table t2 (a int, b int, c char(127), index idx_a(a)) engine=myisam;
 +insert into t2 values
 +  (7,10,'x'), (1,20,'a'), (2,23,'b'), (7,18,'z'), (1,30,'c'),
 +  (4,71,'d'), (3,15,'x'), (7,82,'y'), (8,12,'t'), (4,15,'b'),
 +  (11,33,'a'), (10,42,'u'), (4,53,'p'), (10,17,'r'), (2,90,'x'),
 +  (17,10,'s'), (11,20,'v'), (12,23,'y'), (17,18,'a'), (11,30,'d'),
 +  (24,71,'h'), (23,15,'i'), (27,82,'k'), (28,12,'p'), (24,15,'q'),
 +  (31,33,'f'), (30,42,'h'), (40,53,'m'), (30,17,'o'), (21,90,'b'),
 +  (37,10,'e'), (31,20,'g'), (32,23,'f'), (37,18,'n'), (41,30,'l'),
 +  (54,71,'j'), (53,15,'w'), (57,82,'z'), (58,12,'k'), (54,15,'p'),
 +  (61,33,'c'), (60,42,'a'), (62,53,'x'), (67,17,'g'), (64,90,'v');
 +
 +insert into t2 select a+10, b+10, concat(c,'f') from t2;
 +
 +analyze table t1,t2;
 +
 +let $q1=
 +select t1.a,t.s,t.m
 +from t1 join
 +     (select a, sum(t2.b) as s, min(t2.c) as m from t2 group by t2.a) t
 +     on t1.a=t.a
 +where t1.b < 3;
 +
 +eval $no_splitting $q1;
 +eval $q1;
 +eval explain extended $q1;
 +eval explain format=json $q1;
 +eval prepare stmt from "$q1";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +let $q10=
 +select t1.a,t.s,t.m
 +from t1 join
 +     (select a, sum(t2.b) as s, min(t2.b) as m from t2 group by t2.a) t
 +     on t1.a=t.a
 +where t1.b <= 5;
 +
 +eval $no_splitting $q10;
 +eval $q10;
 +eval explain extended $q10;
 +eval explain format=json $q10;
 +eval prepare stmt from "$q10";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +delete from t1 where t1.b between 2 and 5;
 +
 +let $q2=
 +select t1.a,t.max,t.min
 +from t1 left join
 +     (select a, max(t2.b) max, min(t2.b) min from t2 group by t2.a) t
 +     on t1.a=t.a;
 +
 +eval $no_splitting $q2;
 +eval $q2;
 +eval explain extended $q2;
 +eval explain format=json $q2;
 +
 +create table t3 (a int, b int, c char(127), index idx_b(b)) engine=myisam;
 +insert into t3 values
 +(8,11,'aa'), (5,15,'cc'), (1,14,'bb'), (2,12,'aa'), (7,17,'cc'),
 +(7,18,'aa'), (2,11,'aa'), (7,10,'bb'), (3,11,'dd'), (4,12,'ee'),
 +(5,14,'dd'), (9,12,'ee');
 +
 +create table t4 (a int, b int, c char(127), index idx(a,c)) engine=myisam;
 +insert into t4 values
 +  (7,10,'cc'), (1,20,'aa'), (2,23,'bb'), (7,18,'cc'), (1,30,'bb'),
 +  (4,71,'xx'), (3,15,'aa'), (7,82,'aa'), (8,12,'dd'), (4,15,'aa'),
 +  (11,33,'yy'), (10,42,'zz'), (4,53,'xx'), (10,17,'yy'), (7,12,'cc'),
 +  (8,20,'dd'), (7,32,'bb'), (1,50,'aa'), (3,40,'bb'), (3,77,'aa');
 +
 +insert into t4 select a+10, b+10, concat(c,'f') from t4;
 +
 +analyze table t3,t4;
 +
 +let $q3=
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +     (select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +     on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +
 +eval $no_splitting $q3;
 +eval $q3;
 +eval explain extended $q3;
 +eval explain format=json $q3;
 +
 +let $q30=
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +     (select a, c, max(b) max, min(b) min from t4 group by a,c) t
 +     on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +
 +eval $no_splitting $q30;
 +eval $q30;
 +eval explain extended $q30;
 +eval explain format=json $q30;
 +
 +let $q4=
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +     (select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +     on t3.a=t.a and t3.c=t.c
 +where t3.b > 15;
 +
 +eval $no_splitting $q4;
 +eval $q4;
 +eval explain extended $q4;
 +eval explain format=json $q4;
 +
 +let $q40=
 +select t3.a,t3.c,t.max,t.min
 +from t3 join
 +     (select a, c, max(b) max, min(b) min from t4 group by c,a) t
 +     on t3.a=t.a and t3.c=t.c
 +where t3.b <= 15;
 +
 +eval $no_splitting $q40;
 +eval $q40;
 +eval explain extended $q40;
 +eval explain format=json $q40;
 +
 +drop index idx_a on t2;
 +create index idx on t2(c,b);
 +create index idx_a on t3(a);
 +create index idx_c on t4(c);
 +insert into t3 select a+10, b+10, concat(c,'f') from t3;
 +insert into t3 select a+100, b+100, concat(c,'g')  from t3;
 +insert into t4 select a+100, b+100, concat(c,'g') from t4;
 +insert into t4 select a+1000, b+1000, concat(c,'h') from t4;
 +
 +analyze table t2,t3,t4;
 +
 +let $q5=
 +select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +
 +--sorted_result
 +eval $no_splitting $q5;
 +--sorted_result
 +eval $q5;
 +eval explain extended $q5;
 +eval explain format=json $q5;
 +
 +let $q50=
 +select t2.a,t2.b,t2.c,t.c as t_c,t.max,t.min
 +from t2, t3, (select c, max(b) max, min(b) min from t4 group by c) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +
 +eval $no_splitting $q50;
 +eval $q50;
 +eval explain extended $q50;
 +eval explain format=json $q50;
 +
 +let $q6=
 +select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b between 80 and 85 and t2.c in ('y','z') and t2.a=t3.a and t3.c=t.c;
 +
 +--sorted_result
 +eval $no_splitting $q6;
 +--sorted_result
 +eval $q6;
 +eval explain extended $q6;
 +eval explain format=json $q6;
 +
 +let $q60=
 +select *
 +from t2, t3, (select c, b, sum(b) over (partition by c) from t4 ) t
 +where t2.b < 40 and t2.a=t3.a and t3.c=t.c;
 +
 +--sorted_result
 +eval $no_splitting $q60;
 +--sorted_result
 +eval $q60;
 +eval explain extended $q60;
 +eval explain format=json $q60;
 +
 +drop table t1,t2,t3,t4;
 +
 +--echo #
 +--echo # MDEV-13709: Optimization for semi-joins of grouping derived tables
 +--echo #             (Splitting derived tables / views with GROUP BY)
 +--echo #
 +
 +CREATE TABLE t1 (i int);
 +INSERT INTO t1 VALUES (1),(9),(3);
 +
 +CREATE TABLE t2 (a int, i int);
 +INSERT INTO t2 VALUES (1,9),(2,3),(3,7),(4,1);
 +
 +CREATE TABLE t3 (a int, c char(127), index(c));
 +INSERT INTO t3 VALUES (1,'foo'),(3,'bar'),(4,'foo'),(2,'bar');
 +INSERT INTO t3 SELECT a, concat(c,'a') FROM t3;
 +
 +CREATE TABLE t4 (a int, c char(127), index(a));
 +INSERT INTO t4 VALUES
 +  (3,'abc'),(1,'foo'),(4,'def'),(8,'xxx'),(3,'yyy'),
 +  (5,'zzz'),(9,'xyz'),(2,'yxz'),(5,'zxy'),(7,'zyx') ;
 +
 +ANALYZE TABLE t1,t2,t3,t4;
 +
 +CREATE VIEW v1 AS
 +SELECT c FROM t3
 +  WHERE a IN ( SELECT t2.a FROM t1 JOIN t2 WHERE t1.i = t2.i ) GROUP BY c ;
 +
 +let $q1=
 +SELECT * FROM t4 WHERE c IN ( SELECT c FROM v1 ) and a < 2;
 +
 +eval $no_splitting $q1;
 +eval $q1;
 +eval explain extended $q1;
 +eval explain format=json $q1;
 +
 +DROP VIEW v1;
 +DROP TABLE t1,t2,t3,t4;
 +
 +--echo #
 +--echo # MDEV-13710: Optimization for equi-joins of grouping derived tables
 +--echo #             (Splitting derived tables / views with GROUP BY) :
 +--echo #             FROM list of the derived table contains constant tables
 +--echo #
 +
 +CREATE TABLE t1 (a int, INDEX(a)) ENGINE=MyISAM;
 +INSERT INTO t1 VALUES (9),(5),(1);
 +
 +CREATE TABLE t2 (b int) ENGINE=MyISAM;
 +
 +CREATE TABLE t3 (c varchar(8), d int) ENGINE=MyISAM;
 +INSERT INTO t3 VALUES ('foo',2),('bar',6);
 +
 +CREATE VIEW v1 AS SELECT a FROM t1, t2 GROUP BY a;
 +
 +SELECT * FROM t3
 +  WHERE d IN ( SELECT * FROM v1 ) AND c LIKE 'z%' OR c IS NULL;
 +
 +DROP VIEW v1;
 +DROP TABLE t1,t2,t3;
 +
 +--echo #
 +--echo # MDEV-13734: Optimization for equi-joins of grouping derived tables
 +--echo #             (Splitting derived tables / views with GROUP BY) :
 +--echo #             derived table / view is empty
 +--echo #
 +
 +CREATE TABLE t1 (a int, b int, INDEX(a)) ENGINE=MyISAM;
 +CREATE TABLE t2 (c int) ENGINE=MyISAM;
 +
 +CREATE VIEW v1 AS SELECT a, b FROM t1 STRAIGHT_JOIN t2;
 +CREATE VIEW v2 AS SELECT a, max(b) as bmax FROM v1 GROUP BY a;
 +CREATE VIEW v3 AS SELECT v2.* FROM t1 JOIN v2 ON t1.b = v2.bmax ;
 +
 +SELECT * FROM v3 JOIN t1 ON (bmax = b);
 +
 +DROP VIEW v1,v2,v3;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-14845: Impossible where for derived with GROUP BY
 +--echo #
 +
 +CREATE TABLE t1 (pk INT PRIMARY KEY);
 +
 +INSERT INTO t1 VALUES (1),(2);
 +
 +let $q=
 +WITH cte AS ( SELECT pk FROM t1 WHERE pk IS NULL GROUP BY pk )
 +SELECT * FROM cte;
 +
 +eval $q;
 +eval EXPLAIN EXTENDED $q;
 +
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-14880: assertion failure in optimizer when splitting is applied
 +--echo #
 +
 +CREATE TABLE t1 (pk1 INT PRIMARY KEY, f INT) ENGINE=Aria;
 +INSERT INTO t1 VALUES (1,0),(2,0);
 +
 +CREATE TABLE t2 (pk2 INT PRIMARY KEY) ENGINE=Aria;
 +INSERT INTO t2 VALUES (1),(2),(3);
 +
 +CREATE VIEW v2 AS SELECT pk2, COUNT(*) AS cnt FROM t2 GROUP BY pk2;
 +
 +let $q=
 +SELECT * FROM t1 INNER JOIN v2 ON pk1 = pk2 WHERE f <> 5;
 +
 +eval $q;
 +eval EXPLAIN EXTENDED $q;
 +eval EXPLAIN FORMAT=JSON $q;
 +
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-15017: splittable table is constant table
 +--echo #
 +
 +CREATE TABLE t1 (a INT) ENGINE=MyISAM;
 +
 +CREATE TABLE t2 (pk INT, b INT, PRIMARY KEY (pk)) ENGINE=MyISAM;
 +INSERT INTO t2 VALUES (1,2),(3,4);
 +
 +CREATE VIEW v2 AS SELECT pk, MIN(b) FROM t2 GROUP BY pk;
 +
 +SELECT * FROM t1 LEFT JOIN v2 ON (a = pk);
 +
 +DROP VIEW v2;
 +DROP TABLE t1,t2;
 +
 +--echo #
 +--echo # MDEV-14994: splittable table with no rows
 +--echo #
 +
 +CREATE TABLE t1 (f INT PRIMARY KEY) ENGINE=MyISAM;
 +CREATE VIEW v1 AS SELECT a.* FROM t1 AS a STRAIGHT_JOIN t1 AS b;
 +CREATE VIEW v2 AS SELECT f FROM v1 GROUP BY f;
 +
 +SELECT * FROM v1 JOIN v2 ON v1.f = v2.f;
 +EXPLAIN EXTENDED
 +SELECT * FROM v1 JOIN v2 ON v1.f = v2.f;
 +
 +DROP VIEW v1,v2;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-15899: derived with WF without any key access
 +--echo #
 +
 +create table t1 (f1 int, f2 int, f4 int);
 +insert into t1 values
 +  (3,1,1), (3,0,9), (0,1,8), (9,0,0), (3,0,9);
 +
 +let $q=
 +with
 +cte as (select  median(f2) over (partition by f1) as k1 from t1 order by f1),
 +cte1 as (select median(f4) over (partition by f1) as k2 from t1)
 +select k1,k2 from cte1, cte;
 +
 +--sorted_result
 +eval $q;
 +eval explain $q;
 +
 +drop table t1;
 +
 +--echo #
 +--echo # MDEV-16104: embedded splittable materialized derived/views
 +--echo #
 +
 +CREATE TABLE t1 (f int PRIMARY KEY) ENGINE=MyISAM;
 +INSERT INTO t1
 +  VALUES (3), (7), (1), (4), (8), (5), (9);
 +
 +CREATE ALGORITHM=MERGE VIEW v1 AS
 +SELECT a2.*
 +FROM
 +  ( SELECT f, COUNT(*) as c FROM t1 GROUP BY f ) AS a1
 +  JOIN
 +  t1 AS a2
 +  USING (f);
 +
 +EXPLAIN EXTENDED
 +SELECT * FROM ( SELECT STRAIGHT_JOIN f, COUNT(*) as c FROM v1 GROUP BY f ) AS s;
 +SELECT * FROM ( SELECT STRAIGHT_JOIN f, COUNT(*) as c FROM v1 GROUP BY f ) AS s;
 +
 +DROP VIEW v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-16801: splittable materialized derived/views with
 +--echo #             one grouping field from table without keys
 +--echo #
 +
 +CREATE TABLE t1 (a int, b int, INDEX idx_a(a), INDEX idx_b(b)) ENGINE=MYISAM;
 +CREATE TABLE t2 (c int) ENGINE=MYISAM;
 +CREATE TABLE t3 (d int) ENGINE=MYISAM;
 +INSERT INTO t1 VALUES
 +  (77,7), (11,1), (33,3), (44,4), (8,88),
 +  (78,7), (98,9), (38,3), (28,2), (79,7),
 +  (58,5), (42,4), (71,7), (27,2), (91,9);
 +INSERT INTO t1 SELECT a+100, b+10 FROM t1;
 +INSERT INTO t2 VALUES
 +  (100), (700), (200), (100), (200);
 +INSERT INTO t3 VALUES
 +  (3), (4), (1), (8), (3);
 +
 +ANALYZE tables t1,t2,t3;
 +
 +let $q=
 +SELECT *
 +  FROM t3,
 +       (SELECT t1.b, t2.c
 +          FROM  t1, t2
 +            GROUP BY t1.b,t2.c) dt
 +WHERE t3.d = dt.b;
 +
 +eval $q;
 +eval EXPLAIN EXTENDED $q;
 +
 +DROP TABLE t1,t2,t3;
 +
 +--echo #
 +--echo # MDEV-17419: splittable materialized derived/view
 +--echo #             when join_cache_level = 4
 +--echo #
 +
 +set join_cache_level = 4;
 +
 +CREATE TABLE t1 (
 +  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
 +  username VARCHAR(50) NULL DEFAULT '0',
 +  PRIMARY KEY (id)
 +) COLLATE='utf8_general_ci';
 +
 +CREATE TABLE t2 (
 +  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
 +  userid INT UNSIGNED NOT NULL,
 +  logindate DATETIME NOT NULL,
 +  PRIMARY KEY (id)
 +) COLLATE='utf8_general_ci';
 +
 +INSERT INTO t1 (id, username) VALUES
 +  (1,"user1"), (2, "user2");
 +INSERT INTO t2 (id, userid, logindate) VALUES
 +  (1,1,"2015-06-19 12:17:02.828"),
 +  (2,1,"2016-06-19 12:17:02.828"),
 +  (3,2,"2017-06-19 12:17:02.828"),
 +  (4,2,"2018-06-19 12:17:02.828");
 +
 +let $q=
 +select * from t1 as u
 +              left join
 +              (select * from t2 as au group by au.userid) as auditlastlogin
 +              on u.id=auditlastlogin.userid;
 +
 +eval EXPLAIN $q;
 +eval $q;
 +
 +set join_cache_level=default;
 +
 +DROP TABLE t1,t2;
 +
 +
 +--echo #
 +--echo # MDEV-21614: potentially splittable materialized derived/view
 +--echo #             within materialized semi-join
 +--echo #
 +
 +create table t1 (
 +  id int not null auto_increment primary key,
 +  a int not null
 +) engine=myisam;
 +
 +create table t2 (
 +  id int not null auto_increment primary key,
 +  ro_id int not null,
 +  flag int not null, key (ro_id)
 +) engine=myisam;
 +
 +insert into t1(a) select seq+100 from seq_1_to_20;
 +insert into t2(ro_id,flag) select seq, 1 from seq_1_to_20;
 +insert into t2(ro_id,flag) select seq, 0 from seq_1_to_20;
 +
 +create view v1 as
 +select t1.* from t1 left join t2 on (t1.id = t2.ro_id AND t2.flag = 1)
 +  group by t1.id;
 +
 +let $q1=
 +select id, a from t1 where  id in (select id from v1);
 +eval $q1;
 +eval explain extended $q1;
 +
 +let $q2=
 +select id, a from t1
 +  where id in (select id
 +               from (select t1.* from t1 left join t2
 +                                      on (t1.id = t2.ro_id AND t2.flag = 1)
 +                     group by t1.id) dt);
 +eval $q2;
 +eval explain extended $q2;
 +
 +drop view v1;
 +drop table t1,t2;
 +
 +--echo #
 +--echo # MDEV-21883: potentially splittable materialized derived
 +--echo #             that uses a join of 32 tables
 +--echo #
 +
 +CREATE TABLE t (id INT NOT NULL PRIMARY KEY);
 +INSERT INTO t values (1),(2),(3);
 +
 +let $q=
 +SELECT t.id FROM t
 +LEFT JOIN (
 +    SELECT t0.id FROM t AS t0
 +    LEFT JOIN t AS t1 ON 0=1
 +    LEFT JOIN t AS t2 ON 0=1
 +    LEFT JOIN t AS t3 ON 0=1
 +    LEFT JOIN t AS t4 ON 0=1
 +    LEFT JOIN t AS t5 ON 0=1
 +    LEFT JOIN t AS t6 ON 0=1
 +    LEFT JOIN t AS t7 ON 0=1
 +    LEFT JOIN t AS t8 ON 0=1
 +    LEFT JOIN t AS t9 ON 0=1
 +    LEFT JOIN t AS t10 ON 0=1
 +    LEFT JOIN t AS t11 ON 0=1
 +    LEFT JOIN t AS t12 ON 0=1
 +    LEFT JOIN t AS t13 ON 0=1
 +    LEFT JOIN t AS t14 ON 0=1
 +    LEFT JOIN t AS t15 ON 0=1
 +    LEFT JOIN t AS t16 ON 0=1
 +    LEFT JOIN t AS t17 ON 0=1
 +    LEFT JOIN t AS t18 ON 0=1
 +    LEFT JOIN t AS t19 ON 0=1
 +    LEFT JOIN t AS t20 ON 0=1
 +    LEFT JOIN t AS t21 ON 0=1
 +    LEFT JOIN t AS t22 ON 0=1
 +    LEFT JOIN t AS t23 ON 0=1
 +    LEFT JOIN t AS t24 ON 0=1
 +    LEFT JOIN t AS t25 ON 0=1
 +    LEFT JOIN t AS t26 ON 0=1
 +    LEFT JOIN t AS t27 ON 0=1
 +    LEFT JOIN t AS t28 ON 0=1
 +    LEFT JOIN t AS t29 ON 0=1
 +    LEFT JOIN t AS t30 ON 0=1
 +    LEFT JOIN t AS t31 ON 0=1
 +    GROUP BY t0.id) AS dt ON dt.id = t.id;
 +
 +eval set statement optimizer_switch='split_materialized=off' for $q;
 +
 +eval set statement optimizer_switch='split_materialized=on' for $q;
 +
 +DROP TABLE t;
 +
 +--echo #
 +--echo # MDEV-23804: Server crashes in st_select_lex::collect_grouping_fields_for_derived
 +--echo #
 +
 +CREATE TABLE t1 (a INT);
 +INSERT INTO t1 VALUES (3),(4);
 +CREATE VIEW v1 AS SELECT a FROM t1 UNION VALUES (3),(4);
 +--source include/analyze-format.inc
 +ANALYZE FORMAT=JSON SELECT * from v1 WHERE a=3;
 +SELECT * from v1 WHERE a=3;
 +DROP VIEW v1;
 +DROP TABLE t1;
 +
 +--echo #
 +--echo # MDEV-25128: Split optimization for join with materialized semi-join
 +--echo #
 +
 +create table t1 (id int, a int, index (a), index (id, a)) engine=myisam;
 +insert into t1 values
 +(17,1),(17,3010),(17,3013),(17,3053),(21,2446),(21,2467),(21,2);
 +
 +create table t2 (a int) engine=myisam;
 +insert into t2 values (1),(2),(3);
 +
 +create  table t3 (id int) engine=myisam;
 +insert into t3 values (1),(2);
 +
 +analyze table t1,t2,t3;
 +
 +let $q=
 +select * from t1, (select a from t1 cp2 group by a) dt, t3
 +  where dt.a = t1.a and t1.a = t3.id and t1.a in (select a from t2);
 +
 +set optimizer_switch="split_materialized=off";
 +eval $q;
 +eval explain $q;
 +eval explain format=json $q;
 +
 +set optimizer_switch="split_materialized=default";
 +eval $q;
 +eval explain $q;
 +eval explain format=json $q;
 +
 +eval prepare stmt from "$q";
 +execute stmt;
 +execute stmt;
 +deallocate prepare stmt;
 +
 +drop table t1,t2,t3;
 +
 +--echo # End of 10.3 tests
diff --cc mysql-test/main/information_schema.result
index 28c1122ac03,00000000000..0559c42350d
mode 100644,000000..100644
--- a/mysql-test/main/information_schema.result
+++ b/mysql-test/main/information_schema.result
@@@ -1,2327 -1,0 +1,2329 @@@
 +set global sql_mode="";
 +set local sql_mode="";
 +DROP TABLE IF EXISTS t0,t1,t2,t3,t4,t5;
 +DROP VIEW IF EXISTS v1;
 +show variables where variable_name like "skip_show_database";
 +Variable_name	Value
 +skip_show_database	OFF
 +grant select, update, execute on test.* to mysqltest_2 at localhost;
 +grant select, update on test.* to mysqltest_1 at localhost;
 +create user mysqltest_3 at localhost;
 +create user mysqltest_3;
 +select * from information_schema.SCHEMATA where schema_name > 'm';
 +CATALOG_NAME	SCHEMA_NAME	DEFAULT_CHARACTER_SET_NAME	DEFAULT_COLLATION_NAME	SQL_PATH
 +def	mtr	latin1	latin1_swedish_ci	NULL
 +def	mysql	latin1	latin1_swedish_ci	NULL
 +def	performance_schema	utf8	utf8_general_ci	NULL
 +def	test	latin1	latin1_swedish_ci	NULL
 +select schema_name from information_schema.schemata;
 +schema_name
 +information_schema
 +mtr
 +mysql
 +performance_schema
 +test
 +show databases like 't%';
 +Database (t%)
 +test
 +show databases;
 +Database
 +information_schema
 +mtr
 +mysql
 +performance_schema
 +test
 +show databases where `database` = 't%';
 +Database
 +create database mysqltest;
 +create table mysqltest.t1(a int, b VARCHAR(30), KEY string_data (b));
 +create table test.t2(a int);
 +create table t3(a int, KEY a_data (a));
 +create table mysqltest.t4(a int);
 +create table t5 (id int auto_increment primary key);
 +insert into t5 values (10);
 +create view v1 (c) as
 +SELECT table_name FROM information_schema.TABLES
 +WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test', 'mysqltest') AND
 +table_name not like 'innodb_%' AND
 +table_name not like 'xtradb_%';
 +select * from v1;
 +c
 +ALL_PLUGINS
 +APPLICABLE_ROLES
 +CHARACTER_SETS
 +CHECK_CONSTRAINTS
 +CLIENT_STATISTICS
 +COLLATIONS
 +COLLATION_CHARACTER_SET_APPLICABILITY
 +COLUMNS
 +COLUMN_PRIVILEGES
 +ENABLED_ROLES
 +ENGINES
 +EVENTS
 +FILES
 +GEOMETRY_COLUMNS
 +GLOBAL_STATUS
 +GLOBAL_VARIABLES
 +INDEX_STATISTICS
++KEYWORDS
 +KEY_CACHES
 +KEY_COLUMN_USAGE
 +PARAMETERS
 +PARTITIONS
 +PLUGINS
 +PROCESSLIST
 +PROFILING
 +REFERENTIAL_CONSTRAINTS
 +ROUTINES
 +SCHEMATA
 +SCHEMA_PRIVILEGES
 +SESSION_STATUS
 +SESSION_VARIABLES
 +SPATIAL_REF_SYS
++SQL_FUNCTIONS
 +STATISTICS
 +SYSTEM_VARIABLES
 +TABLES
 +TABLESPACES
 +TABLE_CONSTRAINTS
 +TABLE_PRIVILEGES
 +TABLE_STATISTICS
 +TRIGGERS
 +USER_PRIVILEGES
 +USER_STATISTICS
 +VIEWS
 +column_stats
 +columns_priv
 +db
 +event
 +func
 +general_log
 +gtid_slave_pos
 +help_category
 +help_keyword
 +help_relation
 +help_topic
 +host
 +index_stats
 +plugin
 +proc
 +procs_priv
 +proxies_priv
 +roles_mapping
 +servers
 +slow_log
 +t1
 +t2
 +t3
 +t4
 +t5
 +table_stats
 +tables_priv
 +time_zone
 +time_zone_leap_second
 +time_zone_name
 +time_zone_transition
 +time_zone_transition_type
 +transaction_registry
 +user
 +v1
 +select c,table_name from v1 
 +inner join information_schema.TABLES v2 on (v1.c=v2.table_name)
 +where v1.c like "t%";
 +c	table_name
 +TABLES	TABLES
 +TABLESPACES	TABLESPACES
 +TABLE_CONSTRAINTS	TABLE_CONSTRAINTS
 +TABLE_PRIVILEGES	TABLE_PRIVILEGES
 +TABLE_STATISTICS	TABLE_STATISTICS
 +TRIGGERS	TRIGGERS
 +t1	t1
 +t2	t2
 +t3	t3
 +t4	t4
 +t5	t5
 +table_stats	table_stats
 +tables_priv	tables_priv
 +time_zone	time_zone
 +time_zone_leap_second	time_zone_leap_second
 +time_zone_name	time_zone_name
 +time_zone_transition	time_zone_transition
 +time_zone_transition_type	time_zone_transition_type
 +transaction_registry	transaction_registry
 +select c,table_name from v1 
 +left join information_schema.TABLES v2 on (v1.c=v2.table_name)
 +where v1.c like "t%";
 +c	table_name
 +TABLES	TABLES
 +TABLESPACES	TABLESPACES
 +TABLE_CONSTRAINTS	TABLE_CONSTRAINTS
 +TABLE_PRIVILEGES	TABLE_PRIVILEGES
 +TABLE_STATISTICS	TABLE_STATISTICS
 +TRIGGERS	TRIGGERS
 +t1	t1
 +t2	t2
 +t3	t3
 +t4	t4
 +t5	t5
 +table_stats	table_stats
 +tables_priv	tables_priv
 +time_zone	time_zone
 +time_zone_leap_second	time_zone_leap_second
 +time_zone_name	time_zone_name
 +time_zone_transition	time_zone_transition
 +time_zone_transition_type	time_zone_transition_type
 +transaction_registry	transaction_registry
 +select c, v2.table_name from v1
 +right join information_schema.TABLES v2 on (v1.c=v2.table_name)
 +where v1.c like "t%";
 +c	table_name
 +TABLES	TABLES
 +TABLESPACES	TABLESPACES
 +TABLE_CONSTRAINTS	TABLE_CONSTRAINTS
 +TABLE_PRIVILEGES	TABLE_PRIVILEGES
 +TABLE_STATISTICS	TABLE_STATISTICS
 +TRIGGERS	TRIGGERS
 +t1	t1
 +t2	t2
 +t3	t3
 +t4	t4
 +t5	t5
 +table_stats	table_stats
 +tables_priv	tables_priv
 +time_zone	time_zone
 +time_zone_leap_second	time_zone_leap_second
 +time_zone_name	time_zone_name
 +time_zone_transition	time_zone_transition
 +time_zone_transition_type	time_zone_transition_type
 +transaction_registry	transaction_registry
 +select table_name from information_schema.TABLES
 +where table_schema = "mysqltest" and table_name like "t%";
 +table_name
 +t1
 +t4
 +select * from information_schema.STATISTICS where TABLE_SCHEMA = "mysqltest";
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	NON_UNIQUE	INDEX_SCHEMA	INDEX_NAME	SEQ_IN_INDEX	COLUMN_NAME	COLLATION	CARDINALITY	SUB_PART	PACKED	NULLABLE	INDEX_TYPE	COMMENT	INDEX_COMMENT
 +def	mysqltest	t1	1	mysqltest	string_data	1	b	A	NULL	NULL	NULL	YES	BTREE		
 +show keys from t3 where Key_name = "a_data";
 +Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment
 +t3	1	a_data	1	a	A	NULL	NULL	NULL	YES	BTREE		
 +show tables like 't%';
 +Tables_in_test (t%)
 +t2
 +t3
 +t5
 +show table status;
 +Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment	Max_index_length	Temporary
 +t2	MyISAM	10	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL			#	N
 +t3	MyISAM	10	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL			#	N
 +t5	MyISAM	10	Fixed	1	7	7	#	2048	0	11	#	#	NULL	latin1_swedish_ci	NULL			#	N
 +v1	NULL	NULL	NULL	NULL	NULL	NULL	#	NULL	NULL	NULL	#	#	NULL	NULL	NULL	NULL	VIEW	#	NULL
 +show full columns from t3 like "a%";
 +Field	Type	Collation	Null	Key	Default	Extra	Privileges	Comment
 +a	int(11)	NULL	YES	MUL	NULL		select,insert,update,references	
 +show full columns from mysql.db like "Insert%";
 +Field	Type	Collation	Null	Key	Default	Extra	Privileges	Comment
 +Insert_priv	enum('N','Y')	utf8_general_ci	NO		N		select,insert,update,references	
 +show full columns from v1;
 +Field	Type	Collation	Null	Key	Default	Extra	Privileges	Comment
 +c	varchar(64)	utf8_general_ci	NO				select,insert,update,references	
 +select * from information_schema.COLUMNS where table_name="t1"
 +and column_name= "a";
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	COLUMN_DEFAULT	IS_NULLABLE	DATA_TYPE	CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH	NUMERIC_PRECISION	NUMERIC_SCALE	DATETIME_PRECISION	CHARACTER_SET_NAME	COLLATION_NAME	COLUMN_TYPE	COLUMN_KEY	EXTRA	PRIVILEGES	COLUMN_COMMENT	IS_GENERATED	GENERATION_EXPRESSION
 +def	mysqltest	t1	a	1	NULL	YES	int	NULL	NULL	10	0	NULL	NULL	NULL	int(11)			select,insert,update,references		NEVER	NULL
 +show columns from mysqltest.t1 where field like "%a%";
 +Field	Type	Null	Key	Default	Extra
 +a	int(11)	YES		NULL	
 +create view mysqltest.v1 (c) as select a from mysqltest.t1;
 +grant select (a) on mysqltest.t1 to mysqltest_2 at localhost;
 +grant select on mysqltest.v1 to mysqltest_3;
 +connect  user3,localhost,mysqltest_2,,;
 +connection user3;
 +select table_name, column_name, privileges from information_schema.columns
 +where table_schema = 'mysqltest' and table_name = 't1';
 +table_name	column_name	privileges
 +t1	a	select
 +show columns from mysqltest.t1;
 +Field	Type	Null	Key	Default	Extra
 +a	int(11)	YES		NULL	
 +connect  user4,localhost,mysqltest_3,,mysqltest;
 +connection user4;
 +select table_name, column_name, privileges from information_schema.columns
 +where table_schema = 'mysqltest' and table_name = 'v1';
 +table_name	column_name	privileges
 +v1	c	select
 +explain select * from v1;
 +ERROR HY000: ANALYZE/EXPLAIN/SHOW can not be issued; lacking privileges for underlying table
 +connection default;
 +disconnect user4;
 +drop view v1, mysqltest.v1;
 +drop tables mysqltest.t4, mysqltest.t1, t2, t3, t5;
 +drop database mysqltest;
 +select * from information_schema.CHARACTER_SETS
 +where CHARACTER_SET_NAME like 'latin1%';
 +CHARACTER_SET_NAME	DEFAULT_COLLATE_NAME	DESCRIPTION	MAXLEN
 +latin1	latin1_swedish_ci	cp1252 West European	1
 +SHOW CHARACTER SET LIKE 'latin1%';
 +Charset	Description	Default collation	Maxlen
 +latin1	cp1252 West European	latin1_swedish_ci	1
 +SHOW CHARACTER SET WHERE charset like 'latin1%';
 +Charset	Description	Default collation	Maxlen
 +latin1	cp1252 West European	latin1_swedish_ci	1
 +select * from information_schema.COLLATIONS
 +where COLLATION_NAME like 'latin1%';
 +COLLATION_NAME	CHARACTER_SET_NAME	ID	IS_DEFAULT	IS_COMPILED	SORTLEN
 +latin1_german1_ci	latin1	5		#	1
 +latin1_swedish_ci	latin1	8	Yes	#	1
 +latin1_danish_ci	latin1	15		#	1
 +latin1_german2_ci	latin1	31		#	2
 +latin1_bin	latin1	47		#	1
 +latin1_general_ci	latin1	48		#	1
 +latin1_general_cs	latin1	49		#	1
 +latin1_spanish_ci	latin1	94		#	1
 +latin1_swedish_nopad_ci	latin1	1032		#	1
 +latin1_nopad_bin	latin1	1071		#	1
 +SHOW COLLATION LIKE 'latin1%';
 +Collation	Charset	Id	Default	Compiled	Sortlen
 +latin1_german1_ci	latin1	5		#	1
 +latin1_swedish_ci	latin1	8	Yes	#	1
 +latin1_danish_ci	latin1	15		#	1
 +latin1_german2_ci	latin1	31		#	2
 +latin1_bin	latin1	47		#	1
 +latin1_general_ci	latin1	48		#	1
 +latin1_general_cs	latin1	49		#	1
 +latin1_spanish_ci	latin1	94		#	1
 +latin1_swedish_nopad_ci	latin1	1032		#	1
 +latin1_nopad_bin	latin1	1071		#	1
 +SHOW COLLATION WHERE collation like 'latin1%';
 +Collation	Charset	Id	Default	Compiled	Sortlen
 +latin1_german1_ci	latin1	5		#	1
 +latin1_swedish_ci	latin1	8	Yes	#	1
 +latin1_danish_ci	latin1	15		#	1
 +latin1_german2_ci	latin1	31		#	2
 +latin1_bin	latin1	47		#	1
 +latin1_general_ci	latin1	48		#	1
 +latin1_general_cs	latin1	49		#	1
 +latin1_spanish_ci	latin1	94		#	1
 +latin1_swedish_nopad_ci	latin1	1032		#	1
 +latin1_nopad_bin	latin1	1071		#	1
 +select * from information_schema.COLLATION_CHARACTER_SET_APPLICABILITY
 +where COLLATION_NAME like 'latin1%';
 +COLLATION_NAME	CHARACTER_SET_NAME
 +latin1_german1_ci	latin1
 +latin1_swedish_ci	latin1
 +latin1_danish_ci	latin1
 +latin1_german2_ci	latin1
 +latin1_bin	latin1
 +latin1_general_ci	latin1
 +latin1_general_cs	latin1
 +latin1_spanish_ci	latin1
 +latin1_swedish_nopad_ci	latin1
 +latin1_nopad_bin	latin1
 +drop procedure if exists sel2;
 +drop function if exists sub1;
 +drop function if exists sub2;
 +create function sub1(i int) returns int
 +return i+1;
 +create procedure sel2()
 +begin
 +select * from t1;
 +select * from t2;
 +end|
 +select parameter_style, sql_data_access, dtd_identifier
 +from information_schema.routines where routine_schema='test';
 +parameter_style	sql_data_access	dtd_identifier
 +SQL	CONTAINS SQL	NULL
 +SQL	CONTAINS SQL	int(11)
 +show procedure status where db='test';
 +Db	Name	Type	Definer	Modified	Created	Security_type	Comment	character_set_client	collation_connection	Database Collation
 +test	sel2	PROCEDURE	root at localhost	#	#	DEFINER		latin1	latin1_swedish_ci	latin1_swedish_ci
 +show function status where db='test';
 +Db	Name	Type	Definer	Modified	Created	Security_type	Comment	character_set_client	collation_connection	Database Collation
 +test	sub1	FUNCTION	root at localhost	#	#	DEFINER		latin1	latin1_swedish_ci	latin1_swedish_ci
 +select a.ROUTINE_NAME from information_schema.ROUTINES a,
 +information_schema.SCHEMATA b where
 +a.ROUTINE_SCHEMA = b.SCHEMA_NAME AND b.SCHEMA_NAME='test';
 +ROUTINE_NAME
 +sel2
 +sub1
 +explain select a.ROUTINE_NAME from information_schema.ROUTINES a,
 +information_schema.SCHEMATA b where
 +a.ROUTINE_SCHEMA = b.SCHEMA_NAME;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	#	ALL	NULL	NULL	NULL	NULL	NULL	
 +1	SIMPLE	#	ALL	NULL	NULL	NULL	NULL	NULL	Using where; Using join buffer (flat, BNL join)
 +select a.ROUTINE_NAME, b.name from information_schema.ROUTINES a,
 +mysql.proc b where a.ROUTINE_NAME = convert(b.name using utf8) AND a.ROUTINE_SCHEMA='test' order by 1;
 +ROUTINE_NAME	name
 +sel2	sel2
 +sub1	sub1
 +select count(*) from information_schema.ROUTINES where routine_schema='test';
 +count(*)
 +2
 +create view v1 as select routine_schema, routine_name from information_schema.routines where routine_schema='test'
 +order by routine_schema, routine_name;
 +select * from v1;
 +routine_schema	routine_name
 +test	sel2
 +test	sub1
 +drop view v1;
 +connect  user1,localhost,mysqltest_1,,;
 +connection user1;
 +select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES;
 +ROUTINE_NAME	ROUTINE_DEFINITION
 +show create function sub1;
 +ERROR 42000: FUNCTION sub1 does not exist
 +connection user3;
 +select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES;
 +ROUTINE_NAME	ROUTINE_DEFINITION
 +sel2	NULL
 +sub1	NULL
 +connection default;
 +grant all privileges on test.* to mysqltest_1 at localhost;
 +connect  user2,localhost,mysqltest_1,,;
 +connection user2;
 +select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES;
 +ROUTINE_NAME	ROUTINE_DEFINITION
 +sel2	NULL
 +sub1	NULL
 +create function sub2(i int) returns int
 +return i+1;
 +select ROUTINE_NAME, ROUTINE_DEFINITION from information_schema.ROUTINES;
 +ROUTINE_NAME	ROUTINE_DEFINITION
 +sel2	NULL
 +sub1	NULL
 +sub2	return i+1
 +show create procedure sel2;
 +Procedure	sql_mode	Create Procedure	character_set_client	collation_connection	Database Collation
 +sel2		NULL	latin1	latin1_swedish_ci	latin1_swedish_ci
 +show create function sub1;
 +Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
 +sub1		NULL	latin1	latin1_swedish_ci	latin1_swedish_ci
 +show create function sub2;
 +Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
 +sub2		CREATE DEFINER=`mysqltest_1`@`localhost` FUNCTION `sub2`(i int) RETURNS int(11)
 +return i+1	latin1	latin1_swedish_ci	latin1_swedish_ci
 +show function status like "sub2";
 +Db	Name	Type	Definer	Modified	Created	Security_type	Comment	character_set_client	collation_connection	Database Collation
 +test	sub2	FUNCTION	mysqltest_1 at localhost	#	#	DEFINER		latin1	latin1_swedish_ci	latin1_swedish_ci
 +connection default;
 +disconnect user1;
 +disconnect user3;
 +drop function sub2;
 +show create procedure sel2;
 +Procedure	sql_mode	Create Procedure	character_set_client	collation_connection	Database Collation
 +sel2		CREATE DEFINER=`root`@`localhost` PROCEDURE `sel2`()
 +begin
 +select * from t1;
 +select * from t2;
 +end	latin1	latin1_swedish_ci	latin1_swedish_ci
 +create view v0 (c) as select schema_name from information_schema.schemata;
 +select * from v0;
 +c
 +information_schema
 +mtr
 +mysql
 +performance_schema
 +test
 +explain select * from v0;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	#	ALL	NULL	NULL	NULL	NULL	NULL	
 +create view v1 (c) as select table_name from information_schema.tables
 +where table_name="v1";
 +select * from v1;
 +c
 +v1
 +create view v2 (c) as select column_name from information_schema.columns
 +where table_name="v2";
 +select * from v2;
 +c
 +c
 +create view v3 (c) as select CHARACTER_SET_NAME from information_schema.character_sets
 +where CHARACTER_SET_NAME like "latin1%";
 +select * from v3;
 +c
 +latin1
 +create view v4 (c) as select COLLATION_NAME from information_schema.collations
 +where COLLATION_NAME like "latin1%";
 +select * from v4;
 +c
 +latin1_german1_ci
 +latin1_swedish_ci
 +latin1_danish_ci
 +latin1_german2_ci
 +latin1_bin
 +latin1_general_ci
 +latin1_general_cs
 +latin1_spanish_ci
 +latin1_swedish_nopad_ci
 +latin1_nopad_bin
 +show keys from v4;
 +Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment
 +select * from information_schema.views where TABLE_NAME like "v%";
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	ALGORITHM
 +def	test	v0	select `information_schema`.`schemata`.`SCHEMA_NAME` AS `c` from `information_schema`.`schemata`	NONE	NO	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +def	test	v1	select `information_schema`.`tables`.`TABLE_NAME` AS `c` from `information_schema`.`tables` where `information_schema`.`tables`.`TABLE_NAME` = 'v1'	NONE	NO	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +def	test	v2	select `information_schema`.`columns`.`COLUMN_NAME` AS `c` from `information_schema`.`columns` where `information_schema`.`columns`.`TABLE_NAME` = 'v2'	NONE	NO	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +def	test	v3	select `information_schema`.`character_sets`.`CHARACTER_SET_NAME` AS `c` from `information_schema`.`character_sets` where `information_schema`.`character_sets`.`CHARACTER_SET_NAME` like 'latin1%'	NONE	NO	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +def	test	v4	select `information_schema`.`collations`.`COLLATION_NAME` AS `c` from `information_schema`.`collations` where `information_schema`.`collations`.`COLLATION_NAME` like 'latin1%'	NONE	NO	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +drop view v0, v1, v2, v3, v4;
 +create table t1 (a int);
 +grant select,update,insert on t1 to mysqltest_1 at localhost;
 +grant select (a), update (a),insert(a), references(a) on t1 to mysqltest_1 at localhost;
 +grant all on test.* to mysqltest_1 at localhost with grant option;
 +select * from information_schema.USER_PRIVILEGES where grantee like '%mysqltest_1%';
 +GRANTEE	TABLE_CATALOG	PRIVILEGE_TYPE	IS_GRANTABLE
 +'mysqltest_1'@'localhost'	def	USAGE	NO
 +select * from information_schema.SCHEMA_PRIVILEGES where grantee like '%mysqltest_1%';
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	PRIVILEGE_TYPE	IS_GRANTABLE
 +'mysqltest_1'@'localhost'	def	test	SELECT	YES
 +'mysqltest_1'@'localhost'	def	test	INSERT	YES
 +'mysqltest_1'@'localhost'	def	test	UPDATE	YES
 +'mysqltest_1'@'localhost'	def	test	DELETE	YES
 +'mysqltest_1'@'localhost'	def	test	CREATE	YES
 +'mysqltest_1'@'localhost'	def	test	DROP	YES
 +'mysqltest_1'@'localhost'	def	test	REFERENCES	YES
 +'mysqltest_1'@'localhost'	def	test	INDEX	YES
 +'mysqltest_1'@'localhost'	def	test	ALTER	YES
 +'mysqltest_1'@'localhost'	def	test	CREATE TEMPORARY TABLES	YES
 +'mysqltest_1'@'localhost'	def	test	LOCK TABLES	YES
 +'mysqltest_1'@'localhost'	def	test	EXECUTE	YES
 +'mysqltest_1'@'localhost'	def	test	CREATE VIEW	YES
 +'mysqltest_1'@'localhost'	def	test	SHOW VIEW	YES
 +'mysqltest_1'@'localhost'	def	test	CREATE ROUTINE	YES
 +'mysqltest_1'@'localhost'	def	test	ALTER ROUTINE	YES
 +'mysqltest_1'@'localhost'	def	test	EVENT	YES
 +'mysqltest_1'@'localhost'	def	test	TRIGGER	YES
 +'mysqltest_1'@'localhost'	def	test	DELETE HISTORY	YES
 +select * from information_schema.TABLE_PRIVILEGES where grantee like '%mysqltest_1%';
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +'mysqltest_1'@'localhost'	def	test	t1	SELECT	NO
 +'mysqltest_1'@'localhost'	def	test	t1	INSERT	NO
 +'mysqltest_1'@'localhost'	def	test	t1	UPDATE	NO
 +select * from information_schema.COLUMN_PRIVILEGES where grantee like '%mysqltest_1%';
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +'mysqltest_1'@'localhost'	def	test	t1	a	SELECT	NO
 +'mysqltest_1'@'localhost'	def	test	t1	a	INSERT	NO
 +'mysqltest_1'@'localhost'	def	test	t1	a	UPDATE	NO
 +'mysqltest_1'@'localhost'	def	test	t1	a	REFERENCES	NO
 +delete from mysql.user where user like 'mysqltest%';
 +delete from mysql.db where user like 'mysqltest%';
 +delete from mysql.tables_priv where user like 'mysqltest%';
 +delete from mysql.columns_priv where user like 'mysqltest%';
 +flush privileges;
 +drop table t1;
 +create table t1 (a int null, primary key(a));
 +alter table t1 add constraint constraint_1 unique (a);
 +alter table t1 add constraint unique key_1(a);
 +Warnings:
 +Note	1831	Duplicate index `key_1`. This is deprecated and will be disallowed in a future release
 +alter table t1 add constraint constraint_2 unique key_2(a);
 +Warnings:
 +Note	1831	Duplicate index `key_2`. This is deprecated and will be disallowed in a future release
 +show create table t1;
 +Table	Create Table
 +t1	CREATE TABLE `t1` (
 +  `a` int(11) NOT NULL,
 +  PRIMARY KEY (`a`),
 +  UNIQUE KEY `constraint_1` (`a`),
 +  UNIQUE KEY `key_1` (`a`),
 +  UNIQUE KEY `key_2` (`a`)
 +) ENGINE=MyISAM DEFAULT CHARSET=latin1
 +select * from information_schema.TABLE_CONSTRAINTS where
 +TABLE_SCHEMA= "test";
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_TYPE
 +def	test	PRIMARY	test	t1	PRIMARY KEY
 +def	test	constraint_1	test	t1	UNIQUE
 +def	test	key_1	test	t1	UNIQUE
 +def	test	key_2	test	t1	UNIQUE
 +select * from information_schema.KEY_COLUMN_USAGE where
 +TABLE_SCHEMA= "test";
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	POSITION_IN_UNIQUE_CONSTRAINT	REFERENCED_TABLE_SCHEMA	REFERENCED_TABLE_NAME	REFERENCED_COLUMN_NAME
 +def	test	PRIMARY	def	test	t1	a	1	NULL	NULL	NULL	NULL
 +def	test	constraint_1	def	test	t1	a	1	NULL	NULL	NULL	NULL
 +def	test	key_1	def	test	t1	a	1	NULL	NULL	NULL	NULL
 +def	test	key_2	def	test	t1	a	1	NULL	NULL	NULL	NULL
 +connection user2;
 +select table_name from information_schema.TABLES where table_schema like "test%";
 +table_name
 +t1
 +select table_name,column_name from information_schema.COLUMNS where table_schema like "test%";
 +table_name	column_name
 +t1	a
 +select ROUTINE_NAME from information_schema.ROUTINES;
 +ROUTINE_NAME
 +sel2
 +sub1
 +disconnect user2;
 +connection default;
 +delete from mysql.user where user='mysqltest_1';
 +drop table t1;
 +drop procedure sel2;
 +drop function sub1;
 +create table t1(a int);
 +create view v1 (c) as select a from t1 with check option;
 +create view v2 (c) as select a from t1 WITH LOCAL CHECK OPTION;
 +create view v3 (c) as select a from t1 WITH CASCADED CHECK OPTION;
 +select * from information_schema.views;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	ALGORITHM
 +def	test	v1	select `test`.`t1`.`a` AS `c` from `test`.`t1`	CASCADED	YES	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +def	test	v2	select `test`.`t1`.`a` AS `c` from `test`.`t1`	LOCAL	YES	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +def	test	v3	select `test`.`t1`.`a` AS `c` from `test`.`t1`	CASCADED	YES	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +grant select (a) on test.t1 to joe at localhost with grant option;
 +select * from INFORMATION_SCHEMA.COLUMN_PRIVILEGES;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +'joe'@'localhost'	def	test	t1	a	SELECT	YES
 +select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +drop view v1, v2, v3;
 +drop table t1;
 +delete from mysql.user where user='joe';
 +delete from mysql.db where user='joe';
 +delete from mysql.tables_priv where user='joe';
 +delete from mysql.columns_priv where user='joe';
 +flush privileges;
 +create table t1 (a int not null auto_increment,b int, primary key (a));
 +insert into t1 values (1,1),(NULL,3),(NULL,4);
 +select AUTO_INCREMENT from information_schema.tables where table_name = 't1';
 +AUTO_INCREMENT
 +4
 +drop table t1;
 +create table t1 (s1 int);
 +insert into t1 values (0),(9),(0);
 +select s1 from t1 where s1 in (select version from
 +information_schema.tables) union select version from
 +information_schema.tables;
 +s1
 +10
 +11
 +drop table t1;
 +SHOW CREATE TABLE INFORMATION_SCHEMA.character_sets;
 +Table	Create Table
 +CHARACTER_SETS	CREATE TEMPORARY TABLE `CHARACTER_SETS` (
 +  `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '',
 +  `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '',
 +  `DESCRIPTION` varchar(60) NOT NULL DEFAULT '',
 +  `MAXLEN` bigint(3) NOT NULL DEFAULT 0
 +) ENGINE=MEMORY DEFAULT CHARSET=utf8
 +set names latin2;
 +SHOW CREATE TABLE INFORMATION_SCHEMA.character_sets;
 +Table	Create Table
 +CHARACTER_SETS	CREATE TEMPORARY TABLE `CHARACTER_SETS` (
 +  `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '',
 +  `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '',
 +  `DESCRIPTION` varchar(60) NOT NULL DEFAULT '',
 +  `MAXLEN` bigint(3) NOT NULL DEFAULT 0
 +) ENGINE=MEMORY DEFAULT CHARSET=utf8
 +set names latin1;
 +create table t1 select * from information_schema.CHARACTER_SETS
 +where CHARACTER_SET_NAME like "latin1";
 +select * from t1;
 +CHARACTER_SET_NAME	DEFAULT_COLLATE_NAME	DESCRIPTION	MAXLEN
 +latin1	latin1_swedish_ci	cp1252 West European	1
 +alter table t1 default character set utf8;
 +show create table t1;
 +Table	Create Table
 +t1	CREATE TABLE `t1` (
 +  `CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '',
 +  `DEFAULT_COLLATE_NAME` varchar(32) NOT NULL DEFAULT '',
 +  `DESCRIPTION` varchar(60) NOT NULL DEFAULT '',
 +  `MAXLEN` bigint(3) NOT NULL DEFAULT 0
 +) ENGINE=MyISAM DEFAULT CHARSET=utf8
 +drop table t1;
 +create view v1 as select * from information_schema.TABLES;
 +drop view v1;
 +create table t1(a NUMERIC(5,3), b NUMERIC(5,1), c float(5,2),
 +d NUMERIC(6,4), e float, f DECIMAL(6,3), g int(11), h DOUBLE(10,3),
 +i DOUBLE);
 +select COLUMN_NAME,COLUMN_TYPE, CHARACTER_MAXIMUM_LENGTH,
 +CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
 +from information_schema.columns where table_name= 't1';
 +COLUMN_NAME	COLUMN_TYPE	CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH	NUMERIC_PRECISION	NUMERIC_SCALE
 +a	decimal(5,3)	NULL	NULL	5	3
 +b	decimal(5,1)	NULL	NULL	5	1
 +c	float(5,2)	NULL	NULL	5	2
 +d	decimal(6,4)	NULL	NULL	6	4
 +e	float	NULL	NULL	12	NULL
 +f	decimal(6,3)	NULL	NULL	6	3
 +g	int(11)	NULL	NULL	10	0
 +h	double(10,3)	NULL	NULL	10	3
 +i	double	NULL	NULL	22	NULL
 +drop table t1;
 +create table t115 as select table_name, column_name, column_type
 +from information_schema.columns where table_name = 'proc';
 +select * from t115;
 +table_name	column_name	column_type
 +proc	db	char(64)
 +proc	name	char(64)
 +proc	type	enum('FUNCTION','PROCEDURE','PACKAGE','PACKAGE BODY')
 +proc	specific_name	char(64)
 +proc	language	enum('SQL')
 +proc	sql_data_access	enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA')
 +proc	is_deterministic	enum('YES','NO')
 +proc	security_type	enum('INVOKER','DEFINER')
 +proc	param_list	blob
 +proc	returns	longblob
 +proc	body	longblob
 +proc	definer	char(141)
 +proc	created	timestamp
 +proc	modified	timestamp
 +proc	sql_mode	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','EMPTY_STRING_IS_NULL','SIMULTANEOUS_ASSIGNMENT')
 +proc	comment	text
 +proc	character_set_client	char(32)
 +proc	collation_connection	char(32)
 +proc	db_collation	char(32)
 +proc	body_utf8	longblob
 +proc	aggregate	enum('NONE','GROUP')
 +drop table t115;
 +create procedure p108 () begin declare c cursor for select data_type
 +from information_schema.columns;  open c; open c; end;//
 +call p108()//
 +ERROR 24000: Cursor is already open
 +drop procedure p108;
 +create view v1 as select A1.table_name from information_schema.TABLES A1
 +where table_name= "user";
 +select * from v1;
 +table_name
 +user
 +drop view v1;
 +create view vo as select 'a' union select 'a';
 +show index from vo;
 +Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment
 +select * from information_schema.TABLE_CONSTRAINTS where
 +TABLE_NAME= "vo";
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_TYPE
 +select * from information_schema.KEY_COLUMN_USAGE where
 +TABLE_NAME= "vo";
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	POSITION_IN_UNIQUE_CONSTRAINT	REFERENCED_TABLE_SCHEMA	REFERENCED_TABLE_NAME	REFERENCED_COLUMN_NAME
 +drop view vo;
 +select TABLE_NAME,TABLE_TYPE,ENGINE
 +from information_schema.tables
 +where table_schema='information_schema' limit 2;
 +TABLE_NAME	TABLE_TYPE	ENGINE
 +ALL_PLUGINS	SYSTEM VIEW	Aria
 +APPLICABLE_ROLES	SYSTEM VIEW	MEMORY
 +show tables from information_schema like "T%";
 +Tables_in_information_schema (T%)
 +TABLES
 +TABLESPACES
 +TABLE_CONSTRAINTS
 +TABLE_PRIVILEGES
 +TABLE_STATISTICS
 +TRIGGERS
 +create database information_schema;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +use information_schema;
 +show full tables like "T%";
 +Tables_in_information_schema (T%)	Table_type
 +TABLES	SYSTEM VIEW
 +TABLESPACES	SYSTEM VIEW
 +TABLE_CONSTRAINTS	SYSTEM VIEW
 +TABLE_PRIVILEGES	SYSTEM VIEW
 +TABLE_STATISTICS	SYSTEM VIEW
 +TRIGGERS	SYSTEM VIEW
 +create table t1(a int);
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +use test;
 +show tables;
 +Tables_in_test
 +use information_schema;
 +show tables like "T%";
 +Tables_in_information_schema (T%)
 +TABLES
 +TABLESPACES
 +TABLE_CONSTRAINTS
 +TABLE_PRIVILEGES
 +TABLE_STATISTICS
 +TRIGGERS
 +select table_name from tables where table_name='user';
 +table_name
 +user
 +select column_name, privileges from columns
 +where table_name='user' and column_name like '%o%';
 +column_name	privileges
 +Host	select,insert,update,references
 +Password	select,insert,update,references
 +Drop_priv	select,insert,update,references
 +Reload_priv	select,insert,update,references
 +Shutdown_priv	select,insert,update,references
 +Process_priv	select,insert,update,references
 +Show_db_priv	select,insert,update,references
 +Lock_tables_priv	select,insert,update,references
 +Show_view_priv	select,insert,update,references
 +Create_routine_priv	select,insert,update,references
 +Alter_routine_priv	select,insert,update,references
 +Delete_history_priv	select,insert,update,references
 +max_questions	select,insert,update,references
 +max_connections	select,insert,update,references
 +max_user_connections	select,insert,update,references
 +authentication_string	select,insert,update,references
 +password_expired	select,insert,update,references
 +is_role	select,insert,update,references
 +default_role	select,insert,update,references
 +use test;
 +create function sub1(i int) returns int
 +return i+1;
 +create table t1(f1 int);
 +create view v2 (c) as select f1 from t1;
 +create view v3 (c) as select sub1(1);
 +create table t4(f1 int, KEY f1_key (f1));
 +drop table t1;
 +drop function sub1;
 +select table_name from information_schema.views
 +where table_schema='test';
 +table_name
 +v2
 +v3
 +select table_name from information_schema.views
 +where table_schema='test';
 +table_name
 +v2
 +v3
 +select column_name from information_schema.columns
 +where table_schema='test' and table_name='t4';
 +column_name
 +f1
 +select column_name from information_schema.columns
 +where table_schema='test' and table_name='v2';
 +column_name
 +Warnings:
 +Warning	1356	View 'test.v2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
 +select column_name from information_schema.columns
 +where table_schema='test' and table_name='v3';
 +column_name
 +Warnings:
 +Warning	1356	View 'test.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
 +select index_name from information_schema.statistics where table_schema='test';
 +index_name
 +f1_key
 +select constraint_name from information_schema.table_constraints
 +where table_schema='test';
 +constraint_name
 +show create view v2;
 +View	Create View	character_set_client	collation_connection
 +v2	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `test`.`t1`.`f1` AS `c` from `t1`	latin1	latin1_swedish_ci
 +Warnings:
 +Warning	1356	View 'test.v2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
 +show create table v3;
 +View	Create View	character_set_client	collation_connection
 +v3	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `sub1`(1) AS `c`	latin1	latin1_swedish_ci
 +Warnings:
 +Warning	1356	View 'test.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
 +drop view v2;
 +drop view v3;
 +drop table t4;
 +select * from information_schema.table_names;
 +ERROR 42S02: Unknown table 'table_names' in information_schema
 +select column_type from information_schema.columns
 +where table_schema="information_schema" and table_name="COLUMNS" and
 +(column_name="character_set_name" or column_name="collation_name");
 +column_type
 +varchar(32)
 +varchar(32)
 +select TABLE_ROWS from information_schema.tables where
 +table_schema="information_schema" and table_name="COLUMNS";
 +TABLE_ROWS
 +NULL
 +select table_type from information_schema.tables
 +where table_schema="mysql" and table_name="user";
 +table_type
 +BASE TABLE
 +show open tables where `table` like "user";
 +Database	Table	In_use	Name_locked
 +mysql	user	0	0
 +show status where variable_name like "%database%";
 +Variable_name	Value
 +Acl_database_grants	2
 +Com_show_databases	3
 +show variables where variable_name like "skip_show_databas";
 +Variable_name	Value
 +show global status like "Threads_running";
 +Variable_name	Value
 +Threads_running	#
 +create table t1(f1 int);
 +create table t2(f2 int);
 +create view v1 as select * from t1, t2;
 +set @got_val= (select count(*) from information_schema.columns);
 +drop view v1;
 +drop table t1, t2;
 +use test;
 +CREATE TABLE t_crashme ( f1 BIGINT);
 +CREATE VIEW a1 (t_CRASHME) AS SELECT f1 FROM t_crashme GROUP BY f1;
 +CREATE VIEW a2 AS SELECT t_CRASHME FROM a1;
 +count(*)
 +68
 +drop view a2, a1;
 +drop table t_crashme;
 +select table_schema,table_name, column_name from
 +information_schema.columns
 +where data_type = 'longtext' and table_schema != 'performance_schema'
 +order by binary table_name, ordinal_position;
 +table_schema	table_name	column_name
 +information_schema	ALL_PLUGINS	PLUGIN_DESCRIPTION
 +information_schema	CHECK_CONSTRAINTS	CHECK_CLAUSE
 +information_schema	COLUMNS	COLUMN_DEFAULT
 +information_schema	COLUMNS	COLUMN_TYPE
 +information_schema	COLUMNS	GENERATION_EXPRESSION
 +information_schema	EVENTS	EVENT_DEFINITION
 +information_schema	PARAMETERS	DTD_IDENTIFIER
 +information_schema	PARTITIONS	PARTITION_EXPRESSION
 +information_schema	PARTITIONS	SUBPARTITION_EXPRESSION
 +information_schema	PARTITIONS	PARTITION_DESCRIPTION
 +information_schema	PLUGINS	PLUGIN_DESCRIPTION
 +information_schema	PROCESSLIST	INFO
 +information_schema	ROUTINES	DTD_IDENTIFIER
 +information_schema	ROUTINES	ROUTINE_DEFINITION
 +information_schema	ROUTINES	ROUTINE_COMMENT
 +information_schema	SYSTEM_VARIABLES	ENUM_VALUE_LIST
 +information_schema	TRIGGERS	ACTION_CONDITION
 +information_schema	TRIGGERS	ACTION_STATEMENT
 +information_schema	VIEWS	VIEW_DEFINITION
 +select table_name, column_name, data_type from information_schema.columns
 +where data_type = 'datetime' and table_name not like 'innodb_%'
 +order by binary table_name, ordinal_position;
 +table_name	column_name	data_type
 +EVENTS	EXECUTE_AT	datetime
 +EVENTS	STARTS	datetime
 +EVENTS	ENDS	datetime
 +EVENTS	CREATED	datetime
 +EVENTS	LAST_ALTERED	datetime
 +EVENTS	LAST_EXECUTED	datetime
 +FILES	CREATION_TIME	datetime
 +FILES	LAST_UPDATE_TIME	datetime
 +FILES	LAST_ACCESS_TIME	datetime
 +FILES	CREATE_TIME	datetime
 +FILES	UPDATE_TIME	datetime
 +FILES	CHECK_TIME	datetime
 +PARTITIONS	CREATE_TIME	datetime
 +PARTITIONS	UPDATE_TIME	datetime
 +PARTITIONS	CHECK_TIME	datetime
 +ROUTINES	CREATED	datetime
 +ROUTINES	LAST_ALTERED	datetime
 +TABLES	CREATE_TIME	datetime
 +TABLES	UPDATE_TIME	datetime
 +TABLES	CHECK_TIME	datetime
 +TRIGGERS	CREATED	datetime
 +event	execute_at	datetime
 +event	last_executed	datetime
 +event	starts	datetime
 +event	ends	datetime
 +SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES A
 +WHERE NOT EXISTS
 +(SELECT * FROM INFORMATION_SCHEMA.COLUMNS B
 +WHERE A.TABLE_SCHEMA = B.TABLE_SCHEMA
 +AND A.TABLE_NAME = B.TABLE_NAME);
 +COUNT(*)
 +0
 +create table t1
 +( x_bigint BIGINT,
 +x_integer INTEGER,
 +x_smallint SMALLINT,
 +x_decimal DECIMAL(5,3),
 +x_numeric NUMERIC(5,3),
 +x_real REAL,
 +x_float FLOAT,
 +x_double_precision DOUBLE PRECISION );
 +SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH
 +FROM INFORMATION_SCHEMA.COLUMNS
 +WHERE TABLE_NAME= 't1';
 +COLUMN_NAME	CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH
 +x_bigint	NULL	NULL
 +x_integer	NULL	NULL
 +x_smallint	NULL	NULL
 +x_decimal	NULL	NULL
 +x_numeric	NULL	NULL
 +x_real	NULL	NULL
 +x_float	NULL	NULL
 +x_double_precision	NULL	NULL
 +drop table t1;
 +grant select on test.* to mysqltest_4 at localhost;
 +connect  user10261,localhost,mysqltest_4,,;
 +connection user10261;
 +SELECT TABLE_NAME, COLUMN_NAME, PRIVILEGES FROM INFORMATION_SCHEMA.COLUMNS 
 +where COLUMN_NAME='TABLE_NAME' and table_name not like 'innodb%';
 +TABLE_NAME	COLUMN_NAME	PRIVILEGES
 +CHECK_CONSTRAINTS	TABLE_NAME	select
 +COLUMNS	TABLE_NAME	select
 +COLUMN_PRIVILEGES	TABLE_NAME	select
 +FILES	TABLE_NAME	select
 +INDEX_STATISTICS	TABLE_NAME	select
 +KEY_COLUMN_USAGE	TABLE_NAME	select
 +PARTITIONS	TABLE_NAME	select
 +REFERENTIAL_CONSTRAINTS	TABLE_NAME	select
 +STATISTICS	TABLE_NAME	select
 +TABLES	TABLE_NAME	select
 +TABLE_CONSTRAINTS	TABLE_NAME	select
 +TABLE_PRIVILEGES	TABLE_NAME	select
 +TABLE_STATISTICS	TABLE_NAME	select
 +VIEWS	TABLE_NAME	select
 +connection default;
 +disconnect user10261;
 +delete from mysql.user where user='mysqltest_4';
 +delete from mysql.db where user='mysqltest_4';
 +flush privileges;
 +create table t1 (i int, j int);
 +create trigger trg1 before insert on t1 for each row
 +begin
 +if new.j > 10 then
 +set new.j := 10;
 +end if;
 +end|
 +create trigger trg2 before update on t1 for each row
 +begin
 +if old.i % 2 = 0 then
 +set new.j := -1;
 +end if;
 +end|
 +create trigger trg3 after update on t1 for each row
 +begin
 +if new.j = -1 then
 +set @fired:= "Yes";
 +end if;
 +end|
 +show triggers;
 +Trigger	Event	Table	Statement	Timing	Created	sql_mode	Definer	character_set_client	collation_connection	Database Collation
 +trg1	INSERT	t1	begin
 +if new.j > 10 then
 +set new.j := 10;
 +end if;
 +end	BEFORE	#		root at localhost	latin1	latin1_swedish_ci	latin1_swedish_ci
 +trg2	UPDATE	t1	begin
 +if old.i % 2 = 0 then
 +set new.j := -1;
 +end if;
 +end	BEFORE	#		root at localhost	latin1	latin1_swedish_ci	latin1_swedish_ci
 +trg3	UPDATE	t1	begin
 +if new.j = -1 then
 +set @fired:= "Yes";
 +end if;
 +end	AFTER	#		root at localhost	latin1	latin1_swedish_ci	latin1_swedish_ci
 +select * from information_schema.triggers where trigger_schema in ('mysql', 'information_schema', 'test', 'mysqltest');
 +TRIGGER_CATALOG	TRIGGER_SCHEMA	TRIGGER_NAME	EVENT_MANIPULATION	EVENT_OBJECT_CATALOG	EVENT_OBJECT_SCHEMA	EVENT_OBJECT_TABLE	ACTION_ORDER	ACTION_CONDITION	ACTION_STATEMENT	ACTION_ORIENTATION	ACTION_TIMING	ACTION_REFERENCE_OLD_TABLE	ACTION_REFERENCE_NEW_TABLE	ACTION_REFERENCE_OLD_ROW	ACTION_REFERENCE_NEW_ROW	CREATED	SQL_MODE	DEFINER	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	DATABASE_COLLATION
 +def	test	trg1	INSERT	def	test	t1	1	NULL	begin
 +if new.j > 10 then
 +set new.j := 10;
 +end if;
 +end	ROW	BEFORE	NULL	NULL	OLD	NEW	#		root at localhost	latin1	latin1_swedish_ci	latin1_swedish_ci
 +def	test	trg2	UPDATE	def	test	t1	1	NULL	begin
 +if old.i % 2 = 0 then
 +set new.j := -1;
 +end if;
 +end	ROW	BEFORE	NULL	NULL	OLD	NEW	#		root at localhost	latin1	latin1_swedish_ci	latin1_swedish_ci
 +def	test	trg3	UPDATE	def	test	t1	1	NULL	begin
 +if new.j = -1 then
 +set @fired:= "Yes";
 +end if;
 +end	ROW	AFTER	NULL	NULL	OLD	NEW	#		root at localhost	latin1	latin1_swedish_ci	latin1_swedish_ci
 +drop trigger trg1;
 +drop trigger trg2;
 +drop trigger trg3;
 +drop table t1;
 +create database mysqltest;
 +create table mysqltest.t1 (f1 int, f2 int);
 +create table mysqltest.t2 (f1 int);
 +grant select (f1) on mysqltest.t1 to user1 at localhost;
 +grant select on mysqltest.t2 to user2 at localhost;
 +grant select on mysqltest.* to user3 at localhost;
 +grant select on *.* to user4 at localhost;
 +connect  con1,localhost,user1,,mysqltest;
 +connect  con2,localhost,user2,,mysqltest;
 +connect  con3,localhost,user3,,mysqltest;
 +connect  con4,localhost,user4,,;
 +connection con1;
 +select * from information_schema.column_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user1'@'localhost'	def	mysqltest	t1	f1	SELECT	NO
 +select * from information_schema.table_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +select * from information_schema.schema_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	PRIVILEGE_TYPE	IS_GRANTABLE
 +select * from information_schema.user_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user1'@'localhost'	def	USAGE	NO
 +show grants;
 +Grants for user1 at localhost
 +GRANT USAGE ON *.* TO `user1`@`localhost`
 +GRANT SELECT (f1) ON `mysqltest`.`t1` TO `user1`@`localhost`
 +connection con2;
 +select * from information_schema.column_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +select * from information_schema.table_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user2'@'localhost'	def	mysqltest	t2	SELECT	NO
 +select * from information_schema.schema_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	PRIVILEGE_TYPE	IS_GRANTABLE
 +select * from information_schema.user_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user2'@'localhost'	def	USAGE	NO
 +show grants;
 +Grants for user2 at localhost
 +GRANT USAGE ON *.* TO `user2`@`localhost`
 +GRANT SELECT ON `mysqltest`.`t2` TO `user2`@`localhost`
 +connection con3;
 +select * from information_schema.column_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +select * from information_schema.table_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +select * from information_schema.schema_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user3'@'localhost'	def	mysqltest	SELECT	NO
 +select * from information_schema.user_privileges order by grantee;
 +GRANTEE	TABLE_CATALOG	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user3'@'localhost'	def	USAGE	NO
 +show grants;
 +Grants for user3 at localhost
 +GRANT USAGE ON *.* TO `user3`@`localhost`
 +GRANT SELECT ON `mysqltest`.* TO `user3`@`localhost`
 +connection con4;
 +select * from information_schema.column_privileges where grantee like '\'user%'
 +order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user1'@'localhost'	def	mysqltest	t1	f1	SELECT	NO
 +select * from information_schema.table_privileges where grantee like '\'user%'
 +order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user2'@'localhost'	def	mysqltest	t2	SELECT	NO
 +select * from information_schema.schema_privileges where grantee like '\'user%'
 +order by grantee;
 +GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user3'@'localhost'	def	mysqltest	SELECT	NO
 +select * from information_schema.user_privileges where grantee like '\'user%'
 +order by grantee;
 +GRANTEE	TABLE_CATALOG	PRIVILEGE_TYPE	IS_GRANTABLE
 +'user1'@'localhost'	def	USAGE	NO
 +'user2'@'localhost'	def	USAGE	NO
 +'user3'@'localhost'	def	USAGE	NO
 +'user4'@'localhost'	def	SELECT	NO
 +show grants;
 +Grants for user4 at localhost
 +GRANT SELECT ON *.* TO `user4`@`localhost`
 +connection default;
 +disconnect con1;
 +disconnect con2;
 +disconnect con3;
 +disconnect con4;
 +drop user user1 at localhost, user2 at localhost, user3 at localhost, user4 at localhost;
 +use test;
 +drop database mysqltest;
 +drop procedure if exists p1;
 +drop procedure if exists p2;
 +create procedure p1 () modifies sql data set @a = 5;
 +create procedure p2 () set @a = 5;
 +select sql_data_access from information_schema.routines
 +where specific_name like 'p%';
 +sql_data_access
 +MODIFIES SQL DATA
 +CONTAINS SQL
 +drop procedure p1;
 +drop procedure p2;
 +show create database information_schema;
 +Database	Create Database
 +information_schema	CREATE DATABASE `information_schema` /*!40100 DEFAULT CHARACTER SET utf8 */
 +create table t1(f1 LONGBLOB, f2 LONGTEXT);
 +select column_name,data_type,CHARACTER_OCTET_LENGTH,
 +CHARACTER_MAXIMUM_LENGTH
 +from information_schema.columns
 +where table_name='t1';
 +column_name	data_type	CHARACTER_OCTET_LENGTH	CHARACTER_MAXIMUM_LENGTH
 +f1	longblob	4294967295	4294967295
 +f2	longtext	4294967295	4294967295
 +drop table t1;
 +create table t1(f1 tinyint, f2 SMALLINT, f3 mediumint, f4 int,
 +f5 BIGINT, f6 BIT, f7 bit(64));
 +select column_name, NUMERIC_PRECISION, NUMERIC_SCALE
 +from information_schema.columns
 +where table_name='t1';
 +column_name	NUMERIC_PRECISION	NUMERIC_SCALE
 +f1	3	0
 +f2	5	0
 +f3	7	0
 +f4	10	0
 +f5	19	0
 +f6	1	NULL
 +f7	64	NULL
 +drop table t1;
 +create table t1 (f1 integer);
 +create trigger tr1 after insert on t1 for each row set @test_var=42;
 +use information_schema;
 +select trigger_schema, trigger_name from triggers where
 +trigger_name='tr1';
 +trigger_schema	trigger_name
 +test	tr1
 +use test;
 +drop table t1;
 +create table t1 (a int not null, b int);
 +use information_schema;
 +select column_name, column_default from columns
 +where table_schema='test' and table_name='t1';
 +column_name	column_default
 +a	NULL
 +b	NULL
 +use test;
 +show columns from t1;
 +Field	Type	Null	Key	Default	Extra
 +a	int(11)	NO		NULL	
 +b	int(11)	YES		NULL	
 +drop table t1;
 +CREATE TABLE t1 (a int);
 +CREATE TABLE t2 (b int);
 +SHOW TABLE STATUS FROM test
 +WHERE name IN ( SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
 +WHERE TABLE_SCHEMA='test' AND TABLE_TYPE='BASE TABLE');
 +Name	Engine	Version	Row_format	Rows	Avg_row_length	Data_length	Max_data_length	Index_length	Data_free	Auto_increment	Create_time	Update_time	Check_time	Collation	Checksum	Create_options	Comment	Max_index_length	Temporary
 +t1	MyISAM	10	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL			#	N
 +t2	MyISAM	10	Fixed	0	0	0	#	1024	0	NULL	#	#	NULL	latin1_swedish_ci	NULL			#	N
 +DROP TABLE t1,t2;
 +create table t1(f1 int);
 +create view v1 (c) as select f1 from t1;
 +connect  con5,localhost,root,,*NO-ONE*;
 +select database();
 +database()
 +NULL
 +show fields from test.v1;
 +Field	Type	Null	Key	Default	Extra
 +c	int(11)	YES		NULL	
 +connection default;
 +disconnect con5;
 +drop view v1;
 +drop table t1;
 +alter database information_schema;
 +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
 +drop database information_schema;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +drop table information_schema.tables;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +alter table information_schema.tables;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +use information_schema;
 +create temporary table schemata(f1 char(10));
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +CREATE PROCEDURE p1 ()
 +BEGIN
 +SELECT 'foo' FROM DUAL;
 +END |
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +select ROUTINE_NAME from routines where ROUTINE_SCHEMA='information_schema';
 +ROUTINE_NAME
 +grant all on information_schema.* to 'user1'@'localhost';
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +grant select on information_schema.* to 'user1'@'localhost';
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +use test;
 +create table t1(id int);
 +insert into t1(id) values (1);
 +select 1 from (select 1 from test.t1) a;
 +1
 +1
 +use information_schema;
 +select 1 from (select 1 from test.t1) a;
 +1
 +1
 +use test;
 +drop table t1;
 +create table t1 (f1 int(11));
 +create view v1 as select * from t1;
 +drop table t1;
 +select table_type from information_schema.tables
 +where table_name="v1";
 +table_type
 +VIEW
 +drop view v1;
 +create temporary table t1(f1 int, index(f1));
 +show columns from t1;
 +Field	Type	Null	Key	Default	Extra
 +f1	int(11)	YES	MUL	NULL	
 +describe t1;
 +Field	Type	Null	Key	Default	Extra
 +f1	int(11)	YES	MUL	NULL	
 +show indexes from t1;
 +Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment	Index_comment
 +t1	1	f1	1	f1	A	NULL	NULL	NULL	YES	BTREE		
 +drop table t1;
 +create table t1(f1 binary(32), f2 varbinary(64));
 +select character_maximum_length, character_octet_length
 +from information_schema.columns where table_name='t1';
 +character_maximum_length	character_octet_length
 +32	32
 +64	64
 +drop table t1;
 +CREATE TABLE t1 (f1 BIGINT, f2 VARCHAR(20), f3 BIGINT);
 +INSERT INTO t1 SET f1 = 1, f2 = 'Schoenenbourg', f3 = 1;
 +CREATE FUNCTION func2() RETURNS BIGINT RETURN 1;
 +CREATE FUNCTION func1() RETURNS BIGINT
 +BEGIN
 +RETURN ( SELECT COUNT(*) FROM INFORMATION_SCHEMA.VIEWS);
 +END//
 +CREATE VIEW v1 AS SELECT 1 FROM t1
 +WHERE f3 = (SELECT func2 ());
 +SELECT func1();
 +func1()
 +1
 +DROP TABLE t1;
 +DROP VIEW v1;
 +DROP FUNCTION func1;
 +DROP FUNCTION func2;
 +select column_type, group_concat(table_schema, '.', table_name), count(*) as num
 +from information_schema.columns where
 +table_schema='information_schema' and
 +(column_type = 'varchar(7)' or column_type = 'varchar(20)'
 + or column_type = 'varchar(27)')
 +group by column_type order by num;
 +column_type	group_concat(table_schema, '.', table_name)	num
 +varchar(7)	information_schema.ROUTINES,information_schema.VIEWS	2
 +varchar(20)	information_schema.ALL_PLUGINS,information_schema.ALL_PLUGINS,information_schema.ALL_PLUGINS,information_schema.FILES,information_schema.FILES,information_schema.PLUGINS,information_schema.PLUGINS,information_schema.PLUGINS,information_schema.PROFILING	9
 +create table t1(f1 char(1) not null, f2 char(9) not null)
 +default character set utf8;
 +select CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH from
 +information_schema.columns where table_schema='test' and table_name = 't1';
 +CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH
 +1	3
 +9	27
 +drop table t1;
 +use mysql;
 +INSERT INTO `proc` VALUES ('test','','PROCEDURE','','SQL','CONTAINS_SQL',
 +'NO','DEFINER','','','BEGIN\r\n  \r\nEND','root@%','2006-03-02 18:40:03',
 +'2006-03-02 18:40:03','','','utf8','utf8_general_ci','utf8_general_ci','n/a', 'NONE');
 +select routine_name from information_schema.routines where ROUTINE_SCHEMA='test';
 +routine_name
 +
 +delete from proc where name='';
 +use test;
 +grant select on test.* to mysqltest_1 at localhost;
 +create table t1 (id int);
 +create view v1 as select * from t1;
 +create definer = mysqltest_1 at localhost
 +sql security definer view v2 as select 1;
 +connect  con16681,localhost,mysqltest_1,,test;
 +connection con16681;
 +select * from information_schema.views
 +where table_name='v1' or table_name='v2' order by table_name;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	ALGORITHM
 +def	test	v1		NONE	YES	root at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +def	test	v2	select 1 AS `1`	NONE	NO	mysqltest_1 at localhost	DEFINER	latin1	latin1_swedish_ci	UNDEFINED
 +connection default;
 +disconnect con16681;
 +drop view v1, v2;
 +drop table t1;
 +drop user mysqltest_1 at localhost;
 +set @a:= '.';
 +create table t1(f1 char(5));
 +create table t2(f1 char(5));
 +select concat(@a, table_name), @a, table_name
 +from information_schema.tables where table_schema = 'test' order by table_name;
 +concat(@a, table_name)	@a	table_name
 +.t1	.	t1
 +.t2	.	t2
 +drop table t1,t2;
 +DROP PROCEDURE IF EXISTS p1;
 +DROP FUNCTION IF EXISTS f1;
 +CREATE PROCEDURE p1() SET @a= 1;
 +CREATE FUNCTION f1() RETURNS INT RETURN @a + 1;
 +CREATE USER mysql_bug20230 at localhost;
 +GRANT EXECUTE ON PROCEDURE p1 TO mysql_bug20230 at localhost;
 +GRANT EXECUTE ON FUNCTION f1 TO mysql_bug20230 at localhost;
 +SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='test';
 +ROUTINE_NAME	ROUTINE_DEFINITION
 +f1	RETURN @a + 1
 +p1	SET @a= 1
 +SHOW CREATE PROCEDURE p1;
 +Procedure	sql_mode	Create Procedure	character_set_client	collation_connection	Database Collation
 +p1		CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
 +SET @a= 1	latin1	latin1_swedish_ci	latin1_swedish_ci
 +SHOW CREATE FUNCTION f1;
 +Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
 +f1		CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS int(11)
 +RETURN @a + 1	latin1	latin1_swedish_ci	latin1_swedish_ci
 +connect  conn1, localhost, mysql_bug20230,,;
 +SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='test';
 +ROUTINE_NAME	ROUTINE_DEFINITION
 +f1	NULL
 +p1	NULL
 +SHOW CREATE PROCEDURE p1;
 +Procedure	sql_mode	Create Procedure	character_set_client	collation_connection	Database Collation
 +p1		NULL	latin1	latin1_swedish_ci	latin1_swedish_ci
 +SHOW CREATE FUNCTION f1;
 +Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
 +f1		NULL	latin1	latin1_swedish_ci	latin1_swedish_ci
 +CALL p1();
 +SELECT f1();
 +f1()
 +2
 +disconnect conn1;
 +connection default;
 +DROP FUNCTION f1;
 +DROP PROCEDURE p1;
 +DROP USER mysql_bug20230 at localhost;
 +SELECT MAX(table_name) FROM information_schema.tables WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test') and table_name not like 'xtradb%';
 +MAX(table_name)
 +VIEWS
 +SELECT table_name from information_schema.tables
 +WHERE table_name=(SELECT MAX(table_name)
 +FROM information_schema.tables WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test') and table_name not like 'xtradb%');
 +table_name
 +VIEWS
 +DROP TABLE IF EXISTS bug23037;
 +DROP FUNCTION IF EXISTS get_value;
 +SELECT COLUMN_NAME, MD5(COLUMN_DEFAULT), LENGTH(COLUMN_DEFAULT) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='bug23037';
 +COLUMN_NAME	MD5(COLUMN_DEFAULT)	LENGTH(COLUMN_DEFAULT)
 +fld1	85ea6a55b8f0058e640b3de141a3a9d9	65534
 +SELECT MD5(get_value());
 +MD5(get_value())
 +76176d2daa20c582375b8dcfc18033cd
 +SELECT COLUMN_NAME, MD5(COLUMN_DEFAULT), LENGTH(COLUMN_DEFAULT), COLUMN_DEFAULT=get_value() FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='bug23037';
 +COLUMN_NAME	MD5(COLUMN_DEFAULT)	LENGTH(COLUMN_DEFAULT)	COLUMN_DEFAULT=get_value()
 +fld1	85ea6a55b8f0058e640b3de141a3a9d9	65534	0
 +DROP TABLE bug23037;
 +DROP FUNCTION get_value;
 +set @tmp_optimizer_switch=@@optimizer_switch;
 +set optimizer_switch='derived_merge=off,derived_with_keys=off';
 +create view v1 as
 +select table_schema as object_schema,
 +table_name   as object_name,
 +table_type   as object_type
 +from information_schema.tables
 +order by object_schema;
 +explain select * from v1;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	tables	ALL	NULL	NULL	NULL	NULL	NULL	Open_frm_only; Scanned all databases; Using filesort
 +explain select * from (select table_name from information_schema.tables) as a;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	PRIMARY	<derived2>	ALL	NULL	NULL	NULL	NULL	2	
 +2	DERIVED	tables	ALL	NULL	NULL	NULL	NULL	NULL	Skip_open_table; Scanned all databases
 +set optimizer_switch=@tmp_optimizer_switch;
 +drop view v1;
 +create table t1 (f1 int(11));
 +create table t2 (f1 int(11), f2 int(11));
 +select table_name from information_schema.tables
 +where table_schema = 'test' and table_name not in
 +(select table_name from information_schema.columns
 +where table_schema = 'test' and column_name = 'f3')
 +order by table_name;
 +table_name
 +t1
 +t2
 +drop table t1,t2;
 +create table t1(f1 int);
 +create view v1 as select f1+1 as a from t1;
 +create table t2 (f1 int, f2 int);
 +create view v2 as select f1+1 as a, f2 as b from t2;
 +select table_name, is_updatable from information_schema.views order by table_name;
 +table_name	is_updatable
 +v1	NO
 +v2	YES
 +delete from v1;
 +drop view v1,v2;
 +drop table t1,t2;
 +alter database;
 +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
 +alter database test;
 +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1
 +create database mysqltest;
 +create table mysqltest.t1(a int, b int, c int);
 +create trigger mysqltest.t1_ai after insert on mysqltest.t1
 +for each row set @a = new.a + new.b + new.c;
 +grant select(b) on mysqltest.t1 to mysqltest_1 at localhost;
 +select trigger_name from information_schema.triggers
 +where event_object_table='t1';
 +trigger_name
 +t1_ai
 +show triggers from mysqltest;
 +Trigger	Event	Table	Statement	Timing	Created	sql_mode	Definer	character_set_client	collation_connection	Database Collation
 +t1_ai	INSERT	t1	set @a = new.a + new.b + new.c	AFTER	#		root at localhost	latin1	latin1_swedish_ci	latin1_swedish_ci
 +connect  con27629,localhost,mysqltest_1,,mysqltest;
 +show columns from t1;
 +Field	Type	Null	Key	Default	Extra
 +b	int(11)	YES		NULL	
 +select column_name from information_schema.columns where table_name='t1';
 +column_name
 +b
 +show triggers;
 +Trigger	Event	Table	Statement	Timing	Created	sql_mode	Definer	character_set_client	collation_connection	Database Collation
 +select trigger_name from information_schema.triggers
 +where event_object_table='t1';
 +trigger_name
 +connection default;
 +disconnect con27629;
 +drop user mysqltest_1 at localhost;
 +drop database mysqltest;
 +create table t1 (
 +f1 varchar(50),
 +f2 varchar(50) not null,
 +f3 varchar(50) default '',
 +f4 varchar(50) default NULL,
 +f5 bigint not null,
 +f6 bigint not null default 10,
 +f7 datetime not null,
 +f8 datetime default '2006-01-01'
 +);
 +select column_default from information_schema.columns where table_name= 't1';
 +column_default
 +NULL
 +NULL
 +''
 +NULL
 +NULL
 +10
 +NULL
 +'2006-01-01 00:00:00'
 +show columns from t1;
 +Field	Type	Null	Key	Default	Extra
 +f1	varchar(50)	YES		NULL	
 +f2	varchar(50)	NO		NULL	
 +f3	varchar(50)	YES			
 +f4	varchar(50)	YES		NULL	
 +f5	bigint(20)	NO		NULL	
 +f6	bigint(20)	NO		10	
 +f7	datetime	NO		NULL	
 +f8	datetime	YES		2006-01-01 00:00:00	
 +drop table t1;
 +show fields from information_schema.table_names;
 +ERROR 42S02: Unknown table 'table_names' in information_schema
 +show keys from information_schema.table_names;
 +ERROR 42S02: Unknown table 'table_names' in information_schema
 +USE information_schema;
 +SET max_heap_table_size = 16384;
 +CREATE TABLE test.t1( a INT );
 +SELECT *
 +FROM tables ta
 +JOIN collations co ON ( co.collation_name = ta.table_catalog )
 +JOIN character_sets cs ON ( cs.character_set_name = ta.table_catalog );
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	TABLE_TYPE	ENGINE	VERSION	ROW_FORMAT	TABLE_ROWS	AVG_ROW_LENGTH	DATA_LENGTH	MAX_DATA_LENGTH	INDEX_LENGTH	DATA_FREE	AUTO_INCREMENT	CREATE_TIME	UPDATE_TIME	CHECK_TIME	TABLE_COLLATION	CHECKSUM	CREATE_OPTIONS	TABLE_COMMENT	MAX_INDEX_LENGTH	TEMPORARY	COLLATION_NAME	CHARACTER_SET_NAME	ID	IS_DEFAULT	IS_COMPILED	SORTLEN	CHARACTER_SET_NAME	DEFAULT_COLLATE_NAME	DESCRIPTION	MAXLEN
 +DROP TABLE test.t1;
 +SET max_heap_table_size = DEFAULT;
 +USE test;
 +End of 5.0 tests.
 +select * from information_schema.engines WHERE ENGINE="MyISAM";
 +ENGINE	SUPPORT	COMMENT	TRANSACTIONS	XA	SAVEPOINTS
 +MyISAM	DEFAULT	Non-transactional engine with good performance and small data footprint	NO	NO	NO
 +grant select on *.* to user3148 at localhost;
 +connect  con3148,localhost,user3148,,test;
 +connection con3148;
 +select user,db from information_schema.processlist;
 +user	db
 +user3148	test
 +connection default;
 +disconnect con3148;
 +drop user user3148 at localhost;
 +connect  pslistcon,localhost,root,,test;
 +SELECT 'other connection here' AS who;
 +who
 +other connection here
 +connection default;
 +SELECT IF(`time` > 0, 'OK', `time`) AS time_low,
 +IF(`time` < 1000, 'OK', `time`) AS time_high,
 +IF(time_ms >= 1000, 'OK', time_ms) AS time_ms_low,
 +IF(time_ms < 1000000, 'OK', time_ms) AS time_ms_high
 +FROM INFORMATION_SCHEMA.PROCESSLIST
 +WHERE ID=@tid;
 +time_low	time_high	time_ms_low	time_ms_high
 +OK	OK	OK	OK
 +disconnect pslistcon;
 +DROP TABLE IF EXISTS server_status;
 +DROP EVENT IF EXISTS event_status;
 +SET GLOBAL event_scheduler=1;
 +CREATE EVENT event_status
 +ON SCHEDULE AT NOW()
 +ON COMPLETION NOT PRESERVE
 +DO
 +BEGIN
 +CREATE TABLE server_status
 +SELECT variable_name
 +FROM information_schema.global_status
 +WHERE variable_name LIKE 'ABORTED_CONNECTS' OR
 +variable_name LIKE 'BINLOG_CACHE_DISK_USE';
 +END$$
 +SELECT variable_name FROM server_status;
 +variable_name
 +ABORTED_CONNECTS
 +BINLOG_CACHE_DISK_USE
 +DROP TABLE server_status;
 +SET GLOBAL event_scheduler=0;
 +explain select table_name from information_schema.views where
 +table_schema='test' and table_name='v1';
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	views	ALL	NULL	TABLE_SCHEMA,TABLE_NAME	NULL	NULL	NULL	Using where; Open_frm_only; Scanned 0 databases
 +explain select * from information_schema.tables;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	tables	ALL	NULL	NULL	NULL	NULL	NULL	Open_full_table; Scanned all databases
 +explain select * from information_schema.collations;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	collations	ALL	NULL	NULL	NULL	NULL	NULL	
 +explain select * from information_schema.tables where
 +table_schema='test' and table_name= 't1';
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	tables	ALL	NULL	TABLE_SCHEMA,TABLE_NAME	NULL	NULL	NULL	Using where; Open_full_table; Scanned 0 databases
 +explain select table_name, table_type from information_schema.tables
 +where table_schema='test';
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	tables	ALL	NULL	TABLE_SCHEMA	NULL	NULL	NULL	Using where; Open_frm_only; Scanned 1 database
 +explain select b.table_name
 +from information_schema.tables a, information_schema.columns b
 +where a.table_name='t1' and a.table_schema='test' and b.table_name=a.table_name;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	a	ALL	NULL	TABLE_SCHEMA,TABLE_NAME	NULL	NULL	NULL	Using where; Skip_open_table; Scanned 0 databases
 +1	SIMPLE	b	ALL	NULL	NULL	NULL	NULL	NULL	Using where; Open_frm_only; Scanned all databases; Using join buffer (flat, BNL join)
 +SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
 +WHERE SCHEMA_NAME = 'mysqltest';
 +CATALOG_NAME	SCHEMA_NAME	DEFAULT_CHARACTER_SET_NAME	DEFAULT_COLLATION_NAME	SQL_PATH
 +SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
 +WHERE SCHEMA_NAME = '';
 +CATALOG_NAME	SCHEMA_NAME	DEFAULT_CHARACTER_SET_NAME	DEFAULT_COLLATION_NAME	SQL_PATH
 +SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
 +WHERE SCHEMA_NAME = 'test';
 +CATALOG_NAME	SCHEMA_NAME	DEFAULT_CHARACTER_SET_NAME	DEFAULT_COLLATION_NAME	SQL_PATH
 +def	test	latin1	latin1_swedish_ci	NULL
 +select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysql' AND TABLE_NAME='nonexisting';
 +count(*)
 +0
 +select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysql' AND TABLE_NAME='';
 +count(*)
 +0
 +select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='' AND TABLE_NAME='';
 +count(*)
 +0
 +select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='' AND TABLE_NAME='nonexisting';
 +count(*)
 +0
 +CREATE VIEW v1
 +AS SELECT *
 +FROM information_schema.tables;
 +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS where TABLE_NAME = 'v1';
 +VIEW_DEFINITION
 +select `information_schema`.`tables`.`TABLE_CATALOG` AS `TABLE_CATALOG`,`information_schema`.`tables`.`TABLE_SCHEMA` AS `TABLE_SCHEMA`,`information_schema`.`tables`.`TABLE_NAME` AS `TABLE_NAME`,`information_schema`.`tables`.`TABLE_TYPE` AS `TABLE_TYPE`,`information_schema`.`tables`.`ENGINE` AS `ENGINE`,`information_schema`.`tables`.`VERSION` AS `VERSION`,`information_schema`.`tables`.`ROW_FORMAT` AS `ROW_FORMAT`,`information_schema`.`tables`.`TABLE_ROWS` AS `TABLE_ROWS`,`information_schema`.`tables`.`AVG_ROW_LENGTH` AS `AVG_ROW_LENGTH`,`information_schema`.`tables`.`DATA_LENGTH` AS `DATA_LENGTH`,`information_schema`.`tables`.`MAX_DATA_LENGTH` AS `MAX_DATA_LENGTH`,`information_schema`.`tables`.`INDEX_LENGTH` AS `INDEX_LENGTH`,`information_schema`.`tables`.`DATA_FREE` AS `DATA_FREE`,`information_schema`.`tables`.`AUTO_INCREMENT` AS `AUTO_INCREMENT`,`information_schema`.`tables`.`CREATE_TIME` AS `CREATE_TIME`,`information_schema`.`tables`.`UPDATE_TIME` AS `UPDATE_TIME`,`information_sc
 hema`.`tables`.`CHECK_TIME` AS `CHECK_TIME`,`information_schema`.`tables`.`TABLE_COLLATION` AS `TABLE_COLLATION`,`information_schema`.`tables`.`CHECKSUM` AS `CHECKSUM`,`information_schema`.`tables`.`CREATE_OPTIONS` AS `CREATE_OPTIONS`,`information_schema`.`tables`.`TABLE_COMMENT` AS `TABLE_COMMENT`,`information_schema`.`tables`.`MAX_INDEX_LENGTH` AS `MAX_INDEX_LENGTH`,`information_schema`.`tables`.`TEMPORARY` AS `TEMPORARY` from `information_schema`.`tables`
 +DROP VIEW v1;
 +SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
 +WHERE SCHEMA_NAME ='information_schema';
 +SCHEMA_NAME
 +information_schema
 +SELECT TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES
 +WHERE TABLE_SCHEMA='mysql' and TABLE_NAME= 'db';
 +TABLE_COLLATION
 +utf8_bin
 +select * from information_schema.columns where table_schema = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	COLUMN_DEFAULT	IS_NULLABLE	DATA_TYPE	CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH	NUMERIC_PRECISION	NUMERIC_SCALE	DATETIME_PRECISION	CHARACTER_SET_NAME	COLLATION_NAME	COLUMN_TYPE	COLUMN_KEY	EXTRA	PRIVILEGES	COLUMN_COMMENT	IS_GENERATED	GENERATION_EXPRESSION
 +select * from `information_schema`.`COLUMNS` where `TABLE_NAME` = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	COLUMN_DEFAULT	IS_NULLABLE	DATA_TYPE	CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH	NUMERIC_PRECISION	NUMERIC_SCALE	DATETIME_PRECISION	CHARACTER_SET_NAME	COLLATION_NAME	COLUMN_TYPE	COLUMN_KEY	EXTRA	PRIVILEGES	COLUMN_COMMENT	IS_GENERATED	GENERATION_EXPRESSION
 +select * from `information_schema`.`KEY_COLUMN_USAGE` where `TABLE_SCHEMA` = NULL;
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	POSITION_IN_UNIQUE_CONSTRAINT	REFERENCED_TABLE_SCHEMA	REFERENCED_TABLE_NAME	REFERENCED_COLUMN_NAME
 +select * from `information_schema`.`KEY_COLUMN_USAGE` where `TABLE_NAME` = NULL;
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	POSITION_IN_UNIQUE_CONSTRAINT	REFERENCED_TABLE_SCHEMA	REFERENCED_TABLE_NAME	REFERENCED_COLUMN_NAME
 +select * from `information_schema`.`PARTITIONS` where `TABLE_SCHEMA` = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PARTITION_NAME	SUBPARTITION_NAME	PARTITION_ORDINAL_POSITION	SUBPARTITION_ORDINAL_POSITION	PARTITION_METHOD	SUBPARTITION_METHOD	PARTITION_EXPRESSION	SUBPARTITION_EXPRESSION	PARTITION_DESCRIPTION	TABLE_ROWS	AVG_ROW_LENGTH	DATA_LENGTH	MAX_DATA_LENGTH	INDEX_LENGTH	DATA_FREE	CREATE_TIME	UPDATE_TIME	CHECK_TIME	CHECKSUM	PARTITION_COMMENT	NODEGROUP	TABLESPACE_NAME
 +select * from `information_schema`.`PARTITIONS` where `TABLE_NAME` = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	PARTITION_NAME	SUBPARTITION_NAME	PARTITION_ORDINAL_POSITION	SUBPARTITION_ORDINAL_POSITION	PARTITION_METHOD	SUBPARTITION_METHOD	PARTITION_EXPRESSION	SUBPARTITION_EXPRESSION	PARTITION_DESCRIPTION	TABLE_ROWS	AVG_ROW_LENGTH	DATA_LENGTH	MAX_DATA_LENGTH	INDEX_LENGTH	DATA_FREE	CREATE_TIME	UPDATE_TIME	CHECK_TIME	CHECKSUM	PARTITION_COMMENT	NODEGROUP	TABLESPACE_NAME
 +select * from `information_schema`.`REFERENTIAL_CONSTRAINTS` where `CONSTRAINT_SCHEMA` = NULL;
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	UNIQUE_CONSTRAINT_CATALOG	UNIQUE_CONSTRAINT_SCHEMA	UNIQUE_CONSTRAINT_NAME	MATCH_OPTION	UPDATE_RULE	DELETE_RULE	TABLE_NAME	REFERENCED_TABLE_NAME
 +select * from `information_schema`.`REFERENTIAL_CONSTRAINTS` where `TABLE_NAME` = NULL;
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	UNIQUE_CONSTRAINT_CATALOG	UNIQUE_CONSTRAINT_SCHEMA	UNIQUE_CONSTRAINT_NAME	MATCH_OPTION	UPDATE_RULE	DELETE_RULE	TABLE_NAME	REFERENCED_TABLE_NAME
 +select * from information_schema.schemata where schema_name = NULL;
 +CATALOG_NAME	SCHEMA_NAME	DEFAULT_CHARACTER_SET_NAME	DEFAULT_COLLATION_NAME	SQL_PATH
 +select * from `information_schema`.`STATISTICS` where `TABLE_SCHEMA` = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	NON_UNIQUE	INDEX_SCHEMA	INDEX_NAME	SEQ_IN_INDEX	COLUMN_NAME	COLLATION	CARDINALITY	SUB_PART	PACKED	NULLABLE	INDEX_TYPE	COMMENT	INDEX_COMMENT
 +select * from `information_schema`.`STATISTICS` where `TABLE_NAME` = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	NON_UNIQUE	INDEX_SCHEMA	INDEX_NAME	SEQ_IN_INDEX	COLUMN_NAME	COLLATION	CARDINALITY	SUB_PART	PACKED	NULLABLE	INDEX_TYPE	COMMENT	INDEX_COMMENT
 +select * from information_schema.tables where table_schema = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	TABLE_TYPE	ENGINE	VERSION	ROW_FORMAT	TABLE_ROWS	AVG_ROW_LENGTH	DATA_LENGTH	MAX_DATA_LENGTH	INDEX_LENGTH	DATA_FREE	AUTO_INCREMENT	CREATE_TIME	UPDATE_TIME	CHECK_TIME	TABLE_COLLATION	CHECKSUM	CREATE_OPTIONS	TABLE_COMMENT	MAX_INDEX_LENGTH	TEMPORARY
 +select * from information_schema.tables where table_catalog = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	TABLE_TYPE	ENGINE	VERSION	ROW_FORMAT	TABLE_ROWS	AVG_ROW_LENGTH	DATA_LENGTH	MAX_DATA_LENGTH	INDEX_LENGTH	DATA_FREE	AUTO_INCREMENT	CREATE_TIME	UPDATE_TIME	CHECK_TIME	TABLE_COLLATION	CHECKSUM	CREATE_OPTIONS	TABLE_COMMENT	MAX_INDEX_LENGTH	TEMPORARY
 +select * from information_schema.tables where table_name = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	TABLE_TYPE	ENGINE	VERSION	ROW_FORMAT	TABLE_ROWS	AVG_ROW_LENGTH	DATA_LENGTH	MAX_DATA_LENGTH	INDEX_LENGTH	DATA_FREE	AUTO_INCREMENT	CREATE_TIME	UPDATE_TIME	CHECK_TIME	TABLE_COLLATION	CHECKSUM	CREATE_OPTIONS	TABLE_COMMENT	MAX_INDEX_LENGTH	TEMPORARY
 +select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_SCHEMA` = NULL;
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_TYPE
 +select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_NAME` = NULL;
 +CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_TYPE
 +select * from `information_schema`.`TRIGGERS` where `EVENT_OBJECT_SCHEMA` = NULL;
 +TRIGGER_CATALOG	TRIGGER_SCHEMA	TRIGGER_NAME	EVENT_MANIPULATION	EVENT_OBJECT_CATALOG	EVENT_OBJECT_SCHEMA	EVENT_OBJECT_TABLE	ACTION_ORDER	ACTION_CONDITION	ACTION_STATEMENT	ACTION_ORIENTATION	ACTION_TIMING	ACTION_REFERENCE_OLD_TABLE	ACTION_REFERENCE_NEW_TABLE	ACTION_REFERENCE_OLD_ROW	ACTION_REFERENCE_NEW_ROW	CREATED	SQL_MODE	DEFINER	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	DATABASE_COLLATION
 +select * from `information_schema`.`TRIGGERS` where `EVENT_OBJECT_TABLE` = NULL;
 +TRIGGER_CATALOG	TRIGGER_SCHEMA	TRIGGER_NAME	EVENT_MANIPULATION	EVENT_OBJECT_CATALOG	EVENT_OBJECT_SCHEMA	EVENT_OBJECT_TABLE	ACTION_ORDER	ACTION_CONDITION	ACTION_STATEMENT	ACTION_ORIENTATION	ACTION_TIMING	ACTION_REFERENCE_OLD_TABLE	ACTION_REFERENCE_NEW_TABLE	ACTION_REFERENCE_OLD_ROW	ACTION_REFERENCE_NEW_ROW	CREATED	SQL_MODE	DEFINER	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	DATABASE_COLLATION
 +select * from `information_schema`.`VIEWS` where `TABLE_SCHEMA` = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	ALGORITHM
 +select * from `information_schema`.`VIEWS` where `TABLE_NAME` = NULL;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE	CHARACTER_SET_CLIENT	COLLATION_CONNECTION	ALGORITHM
 +explain extended select 1 from information_schema.tables;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	SIMPLE	tables	ALL	NULL	NULL	NULL	NULL	NULL	NULL	Skip_open_table; Scanned all databases
 +Warnings:
 +Note	1003	select 1 AS `1` from `information_schema`.`tables`
 +use information_schema;
 +show events;
 +Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator	character_set_client	collation_connection	Database Collation
 +show events from information_schema;
 +Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator	character_set_client	collation_connection	Database Collation
 +show events where Db= 'information_schema';
 +Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator	character_set_client	collation_connection	Database Collation
 +use test;
 +#
 +# Bug#34166 Server crash in SHOW OPEN TABLES and prelocking
 +#
 +drop table if exists t1;
 +drop function if exists f1;
 +create table t1 (a int);
 +create function f1() returns int
 +begin
 +insert into t1 (a) values (1);
 +return 0;
 +end|
 +show open tables where f1()=0;
 +show open tables where f1()=0;
 +drop table t1;
 +drop function f1;
 +connect  conn1, localhost, root,,;
 +connection conn1;
 +select * from information_schema.tables where 1=sleep(100000);
 +connection default;
 +connection conn1;
 +Got one of the listed errors
 +connection default;
 +disconnect conn1;
 +connect  conn1, localhost, root,,;
 +connection conn1;
 +select * from information_schema.columns where 1=sleep(100000);
 +connection default;
 +connection conn1;
 +Got one of the listed errors
 +connection default;
 +disconnect conn1;
 +explain select count(*) from information_schema.tables;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	tables	ALL	NULL	NULL	NULL	NULL	NULL	Skip_open_table; Scanned all databases
 +explain select count(*) from information_schema.columns;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	columns	ALL	NULL	NULL	NULL	NULL	NULL	Open_frm_only; Scanned all databases
 +explain select count(*) from information_schema.views;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	views	ALL	NULL	NULL	NULL	NULL	NULL	Open_frm_only; Scanned all databases
 +set global init_connect="drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;\
 +drop table if exists t1;drop table if exists t1;";
 +select * from information_schema.global_variables where variable_name='init_connect';
 +VARIABLE_NAME	VARIABLE_VALUE
 +INIT_CONNECT	drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +select * from information_schema.global_variables where variable_name like 'init%' order by variable_name;
 +VARIABLE_NAME	VARIABLE_VALUE
 +INIT_CONNECT	drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +drop table if exists t1;drop table if exists t1;
 +INIT_FILE	
 +INIT_SLAVE	
 +set global init_connect="";
 +create table t0 select * from information_schema.global_status where VARIABLE_NAME='COM_SELECT';
 +SELECT 1;
 +1
 +1
 +select a.VARIABLE_VALUE - b.VARIABLE_VALUE from t0 b, information_schema.global_status a
 +where a.VARIABLE_NAME = b.VARIABLE_NAME;
 +a.VARIABLE_VALUE - b.VARIABLE_VALUE
 +2
 +drop table t0;
 +CREATE TABLE t1(a INT) KEY_BLOCK_SIZE=1;
 +SELECT CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1';
 +CREATE_OPTIONS
 +key_block_size=1
 +DROP TABLE t1;
 +SET TIMESTAMP=@@TIMESTAMP + 10000000;
 +SELECT 'NOT_OK' AS TEST_RESULT FROM INFORMATION_SCHEMA.PROCESSLIST WHERE time < 0;
 +TEST_RESULT
 +SET TIMESTAMP=DEFAULT;
 +#
 +# Bug #50276: Security flaw in INFORMATION_SCHEMA.TABLES
 +#
 +CREATE DATABASE db1;
 +USE db1;
 +CREATE TABLE t1 (id INT);
 +CREATE USER nonpriv;
 +USE test;
 +connect  nonpriv_con, localhost, nonpriv,,;
 +connection nonpriv_con;
 +# connected as nonpriv
 +# Should return 0
 +SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1';
 +COUNT(*)
 +0
 +USE INFORMATION_SCHEMA;
 +# Should return 0
 +SELECT COUNT(*) FROM TABLES WHERE TABLE_NAME='t1';
 +COUNT(*)
 +0
 +connection default;
 +# connected as root
 +disconnect nonpriv_con;
 +DROP USER nonpriv;
 +DROP TABLE db1.t1;
 +DROP DATABASE db1;
 +
 +Bug#54422 query with = 'variables'
 +
 +CREATE TABLE variables(f1 INT);
 +SELECT COLUMN_DEFAULT, TABLE_NAME
 +FROM INFORMATION_SCHEMA.COLUMNS
 +WHERE INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = 'variables';
 +COLUMN_DEFAULT	TABLE_NAME
 +NULL	variables
 +DROP TABLE variables;
 +#
 +# Bug #53814: NUMERIC_PRECISION for unsigned bigint field is 19, 
 +# should be 20
 +#
 +CREATE TABLE ubig (a BIGINT, b BIGINT UNSIGNED);
 +SELECT TABLE_NAME, COLUMN_NAME, NUMERIC_PRECISION 
 +FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ubig';
 +TABLE_NAME	COLUMN_NAME	NUMERIC_PRECISION
 +ubig	a	19
 +ubig	b	20
 +INSERT INTO ubig VALUES (0xFFFFFFFFFFFFFFFF,0xFFFFFFFFFFFFFFFF);
 +Warnings:
 +Warning	1264	Out of range value for column 'a' at row 1
 +SELECT length(CAST(b AS CHAR)) FROM ubig;
 +length(CAST(b AS CHAR))
 +20
 +DROP TABLE ubig;
 +select 1 from information_schema.tables where table_schema=repeat('a', 2000);
 +1
 +grant usage on *.* to mysqltest_1 at localhost;
 +connect  con1, localhost, mysqltest_1,,;
 +connection con1;
 +select 1 from information_schema.tables where table_schema=repeat('a', 2000);
 +1
 +connection default;
 +disconnect con1;
 +drop user mysqltest_1 at localhost;
 +End of 5.1 tests.
 +#
 +# Additional test for WL#3726 "DDL locking for all metadata objects"
 +# To avoid possible deadlocks process of filling of I_S tables should
 +# use high-priority metadata lock requests when opening tables.
 +# Below we just test that we really use high-priority lock request
 +# since reproducing a deadlock will require much more complex test.
 +#
 +drop tables if exists t1, t2, t3;
 +create table t1 (i int);
 +create table t2 (j int primary key auto_increment);
 +connect  con3726_1,localhost,root,,test;
 +connection con3726_1;
 +lock table t2 read;
 +connect  con3726_2,localhost,root,,test;
 +connection con3726_2;
 +# RENAME below will be blocked by 'lock table t2 read' above but
 +# will add two pending requests for exclusive metadata locks.
 +rename table t2 to t3;
 +connection default;
 +# These statements should not be blocked by pending lock requests
 +select table_name, column_name, data_type from information_schema.columns
 +where table_schema = 'test' and table_name in ('t1', 't2') order by table_name, column_name;
 +table_name	column_name	data_type
 +t1	i	int
 +t2	j	int
 +select table_name, auto_increment from information_schema.tables
 +where table_schema = 'test' and table_name in ('t1', 't2') order by table_name;
 +table_name	auto_increment
 +t1	NULL
 +t2	1
 +connection con3726_1;
 +unlock tables;
 +connection con3726_2;
 +connection default;
 +disconnect con3726_1;
 +disconnect con3726_2;
 +drop tables t1, t3;
 +EXPLAIN SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	KEY_COLUMN_USAGE	ALL	NULL	NULL	NULL	NULL	NULL	Open_full_table; Scanned all databases
 +EXPLAIN SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='t1';
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	PARTITIONS	ALL	NULL	TABLE_NAME	NULL	NULL	NULL	Using where; Open_full_table; Scanned 1 database
 +EXPLAIN SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
 +WHERE CONSTRAINT_SCHEMA='test';
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	REFERENTIAL_CONSTRAINTS	ALL	NULL	CONSTRAINT_SCHEMA	NULL	NULL	NULL	Using where; Open_full_table; Scanned 1 database
 +EXPLAIN SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
 +WHERE TABLE_NAME='t1' and TABLE_SCHEMA='test';
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	TABLE_CONSTRAINTS	ALL	NULL	TABLE_SCHEMA,TABLE_NAME	NULL	NULL	NULL	Using where; Open_full_table; Scanned 0 databases
 +EXPLAIN SELECT * FROM INFORMATION_SCHEMA.TRIGGERS
 +WHERE EVENT_OBJECT_SCHEMA='test';
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 +1	SIMPLE	TRIGGERS	ALL	NULL	EVENT_OBJECT_SCHEMA	NULL	NULL	NULL	Using where; Open_frm_only; Scanned 1 database
 +create table information_schema.t1 (f1 INT);
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +drop table information_schema.t1;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +drop temporary table if exists information_schema.t1;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +create temporary table information_schema.t1 (f1 INT);
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +drop view information_schema.v1;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +create view information_schema.v1;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +create trigger mysql.trg1 after insert on information_schema.t1 for each row set @a=1;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +create table t1 select * from information_schema.t1;
 +ERROR 42S02: Unknown table 't1' in information_schema
 +CREATE TABLE t1(f1 char(100));
 +REPAIR TABLE t1, information_schema.tables;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +CHECKSUM TABLE t1, information_schema.tables;
 +Table	Checksum
 +test.t1	0
 +information_schema.tables	0
 +ANALYZE TABLE t1, information_schema.tables;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +CHECK TABLE t1, information_schema.tables;
 +Table	Op	Msg_type	Msg_text
 +test.t1	check	status	OK
 +information_schema.tables	check	note	The storage engine for the table doesn't support check
 +OPTIMIZE TABLE t1, information_schema.tables;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +RENAME TABLE v1 to v2, information_schema.tables to t2;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +DROP TABLE t1, information_schema.tables;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +LOCK TABLES t1 READ, information_schema.tables READ;
 +ERROR 42000: Access denied for user 'root'@'localhost' to database 'information_schema'
 +DROP TABLE t1;
 +SELECT *
 +FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
 +LEFT JOIN INFORMATION_SCHEMA.COLUMNS
 +USING (TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME)
 +WHERE COLUMNS.TABLE_SCHEMA = 'test'
 +AND COLUMNS.TABLE_NAME = 't1';
 +TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA	CONSTRAINT_NAME	TABLE_CATALOG	ORDINAL_POSITION	POSITION_IN_UNIQUE_CONSTRAINT	REFERENCED_TABLE_SCHEMA	REFERENCED_TABLE_NAME	REFERENCED_COLUMN_NAME	TABLE_CATALOG	ORDINAL_POSITION	COLUMN_DEFAULT	IS_NULLABLE	DATA_TYPE	CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH	NUMERIC_PRECISION	NUMERIC_SCALE	DATETIME_PRECISION	CHARACTER_SET_NAME	COLLATION_NAME	COLUMN_TYPE	COLUMN_KEY	EXTRA	PRIVILEGES	COLUMN_COMMENT	IS_GENERATED	GENERATION_EXPRESSION
 +#
 +# A test case for Bug#56540 "Exception (crash) in sql_show.cc
 +# during rqg_info_schema test on Windows"
 +# Ensure that we never access memory of a closed table,
 +# in particular, never access table->field[] array.
 +# Before the fix, the below test case, produced
 +# valgrind errors.
 +#
 +drop table if exists t1;
 +drop view if exists v1;
 +create table t1 (a int, b int);
 +create view v1 as select t1.a, t1.b from t1;
 +alter table t1 change b c int;
 +lock table t1 read;
 +connect con1, localhost, root,,;
 +connection con1;
 +flush tables;
 +connection default;
 +select * from information_schema.views;
 +TABLE_CATALOG	def
 +TABLE_SCHEMA	test
 +TABLE_NAME	v1
 +VIEW_DEFINITION	select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
 +CHECK_OPTION	NONE
 +IS_UPDATABLE	
 +DEFINER	root at localhost
 +SECURITY_TYPE	DEFINER
 +CHARACTER_SET_CLIENT	latin1
 +COLLATION_CONNECTION	latin1_swedish_ci
 +ALGORITHM	UNDEFINED
 +Warnings:
 +Level	Warning
 +Code	1356
 +Message	View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
 +unlock tables;
 +#
 +# Cleanup.
 +#
 +connection con1;
 +# Reaping 'flush tables'
 +disconnect con1;
 +connection default;
 +drop table t1;
 +drop view v1;
 +#
 +# Test for bug #12828477 - "MDL SUBSYSTEM CREATES BIG OVERHEAD FOR
 +#                           CERTAIN QUERIES TO INFORMATION_SCHEMA".
 +#
 +# Check that metadata locks which are acquired during the process
 +# of opening tables/.FRMs/.TRG files while filling I_S table are
 +# not kept to the end of statement. Keeping the locks has caused
 +# performance problems in cases when big number of tables (.FRMs
 +# or .TRG files) were scanned as cost of new lock acquisition has
 +# increased linearly.
 +drop database if exists mysqltest;
 +create database mysqltest;
 +use mysqltest;
 +create table t0 (i int);
 +create table t1 (j int);
 +create table t2 (k int);
 +#
 +# Test that we don't keep locks in case when we to fill
 +# I_S table we perform full-blown table open.
 +#
 +# Acquire lock on 't2' so upcoming RENAME is
 +# blocked.
 +lock tables t2 read;
 +connect  con12828477_1, localhost, root,,mysqltest;
 +# The below RENAME should wait on 't2' while
 +# keeping X lock on 't1'.
 +rename table t1 to t3, t2 to t1, t3 to t2;
 +connect  con12828477_2, localhost, root,,mysqltest;
 +# Wait while the above RENAME is blocked.
 +# Issue query to I_S which will open 't0' and get
 +# blocked on 't1' because of RENAME.
 +select table_name, auto_increment from information_schema.tables where table_schema='mysqltest' and table_name='t0' union select table_name, auto_increment from information_schema.tables where table_schema='mysqltest' and table_name<>'t0' order by table_name;
 +connect  con12828477_3, localhost, root,,mysqltest;
 +# Wait while the above SELECT is blocked.
 +#
 +# Check that it holds no lock on 't0' so it can be renamed.
 +rename table t0 to t4;
 +connection default;
 +#
 +# Unblock the first RENAME.
 +unlock tables;
 +connection con12828477_1;
 +# Reap the first RENAME
 +connection con12828477_2;
 +# Reap SELECT to I_S.
 +table_name	auto_increment
 +t0	NULL
 +t1	NULL
 +t2	NULL
 +connection default;
 +#
 +# Now test that we don't keep locks in case when we to fill
 +# I_S table we read .FRM or .TRG file only (this was the case
 +# for which problem existed).
 +#
 +rename table t4 to t0;
 +# Acquire lock on 't2' so upcoming RENAME is
 +# blocked.
 +lock tables t2 read;
 +connection con12828477_1;
 +# The below RENAME should wait on 't2' while
 +# keeping X lock on 't1'.
 +rename table t1 to t3, t2 to t1, t3 to t2;
 +connection con12828477_2;
 +# Wait while the above RENAME is blocked.
 +# Issue query to I_S which will open 't0' and get
 +# blocked on 't1' because of RENAME.
 +select event_object_table, trigger_name from information_schema.triggers where event_object_schema='mysqltest';
 +connection con12828477_3;
 +# Wait while the above SELECT is blocked.
 +#
 +# Check that it holds no lock on 't0' so it can be renamed.
 +rename table t0 to t4;
 +connection default;
 +#
 +# Unblock the first RENAME.
 +unlock tables;
 +connection con12828477_1;
 +# Reap the first RENAME
 +connection con12828477_2;
 +# Reap SELECT to I_S.
 +event_object_table	trigger_name
 +connection default;
 +disconnect con12828477_1;
 +disconnect con12828477_2;
 +disconnect con12828477_3;
 +#
 +# MDEV-3818: Query against view over IS tables worse than equivalent query without view
 +#
 +create view v1 as select table_schema, table_name, column_name from information_schema.columns;
 +explain extended
 +select column_name from v1
 +where (table_schema = "osm") and (table_name = "test");
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	SIMPLE	columns	ALL	NULL	TABLE_SCHEMA,TABLE_NAME	NULL	NULL	NULL	NULL	Using where; Open_frm_only; Scanned 0 databases
 +Warnings:
 +Note	1003	select `information_schema`.`columns`.`COLUMN_NAME` AS `column_name` from `information_schema`.`columns` where `information_schema`.`columns`.`TABLE_SCHEMA` = 'osm' and `information_schema`.`columns`.`TABLE_NAME` = 'test'
 +explain extended
 +select information_schema.columns.column_name as column_name
 +from information_schema.columns
 +where (information_schema.columns.table_schema = 'osm') and (information_schema.columns.table_name = 'test');
 +id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
 +1	SIMPLE	columns	ALL	NULL	TABLE_SCHEMA,TABLE_NAME	NULL	NULL	NULL	NULL	Using where; Open_frm_only; Scanned 0 databases
 +Warnings:
 +Note	1003	select `information_schema`.`columns`.`COLUMN_NAME` AS `column_name` from `information_schema`.`columns` where `information_schema`.`columns`.`TABLE_SCHEMA` = 'osm' and `information_schema`.`columns`.`TABLE_NAME` = 'test'
 +drop view v1;
 +#
 +# Clean-up.
 +drop database mysqltest;
 +#
 +# Test for bug #16869534 - "QUERYING SUBSET OF COLUMNS DOESN'T USE TABLE
 +#                           CACHE; OPENED_TABLES INCREASES"
 +#
 +SELECT * FROM INFORMATION_SCHEMA.TABLES;
 +SELECT VARIABLE_VALUE INTO @val1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE
 +VARIABLE_NAME LIKE 'Opened_tables';
 +SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES;
 +# The below SELECT query should give same output as above SELECT query.
 +SELECT VARIABLE_VALUE INTO @val2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE
 +VARIABLE_NAME LIKE 'Opened_tables';
 +# The below select should return '1'
 +SELECT @val1 = @val2;
 + at val1 = @val2
 +1
 +#
 +# End of 5.5 tests
 +#
 +# 
 +# MDEV-5723: mysqldump -uroot unusable for multi-database operations, checks all databases
 +# 
 +drop database if exists db1;
 +connect  con1,localhost,root,,;
 +connection con1;
 +create database db1;
 +use db1;
 +create table t1 (a int);
 +create table t2 (a int);
 +create table t3 (a int);
 +create database mysqltest;
 +use mysqltest;
 +create table t1 (a int);
 +create table t2 (a int);
 +create table t3 (a int);
 +flush tables;
 +flush status;
 +SELECT 
 +LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA 
 +FROM 
 +INFORMATION_SCHEMA.FILES 
 +WHERE 
 +FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND 
 +LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME 
 +FROM INFORMATION_SCHEMA.FILES 
 +WHERE 
 +FILE_TYPE = 'DATAFILE' AND 
 +TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME 
 +FROM INFORMATION_SCHEMA.PARTITIONS 
 +WHERE TABLE_SCHEMA IN ('db1')
 +)
 +) 
 +GROUP BY 
 +LOGFILE_GROUP_NAME, FILE_NAME, ENGINE 
 +ORDER BY 
 +LOGFILE_GROUP_NAME;
 +LOGFILE_GROUP_NAME	FILE_NAME	TOTAL_EXTENTS	INITIAL_SIZE	ENGINE	EXTRA
 +# This must have Opened_tables=3, not 6.
 +show status like 'Opened_tables';
 +Variable_name	Value
 +Opened_tables	3
 +drop database mysqltest;
 +drop database db1;
 +connection default;
 +disconnect con1;
 +set global sql_mode=default;
 +USE test;
 +#
 +# End of 10.0 tests
 +#
 +#
 +# Start of 10.1 tests
 +#
 +#
 +# MDEV-13242 Wrong results for queries with row constructors and information_schema
 +#
 +CREATE TABLE tt1(c1 INT);
 +CREATE TABLE tt2(c2 INT);
 +SELECT count(*) FROM information_schema.columns WHERE table_schema='test' AND (table_name, column_name) IN (('tt1', 'c1'));
 +count(*)
 +1
 +SELECT count(*) FROM information_schema.columns WHERE table_schema='test' AND (table_name, column_name) IN (('tt2', 'c2'));
 +count(*)
 +1
 +SELECT count(*) FROM information_schema.columns WHERE table_schema='test' AND (table_name, column_name) IN (('tt1','c1'),('tt2', 'c2'));
 +count(*)
 +2
 +SELECT count(*) FROM information_schema.columns WHERE table_schema='test' AND (table_name, column_name) IN (SELECT 'tt1','c1' FROM dual UNION SELECT 'tt2', 'c2' FROM dual);
 +count(*)
 +2
 +SELECT count(*) FROM information_schema.columns WHERE table_schema='test' AND (table_name='tt1' AND column_name='c1') OR (table_name='tt2' AND column_name='c2');
 +count(*)
 +2
 +SELECT column_name FROM information_schema.columns WHERE (table_name, column_name) IN (('tt1','c1'),('tt2', 'c2')) ORDER BY column_name;
 +column_name
 +c1
 +c2
 +DROP TABLE tt1, tt2;
 +#
 +# MDEV-13242 Wrong results for queries with row constructors and information_schema
 +#
 +SELECT SCHEMA_NAME from information_schema.schemata where schema_name='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
 +SCHEMA_NAME
 +SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a',193);
 +SCHEMA_NAME
 +#
 +# End of 10.1 tests
 +#
 +#
 +# MDEV-14836: Assertion `m_status == DA_ERROR' failed in
 +# Diagnostics_area::sql_errno upon query from I_S with LIMIT ROWS EXAMINED
 +#
 +SELECT * FROM INFORMATION_SCHEMA.`COLUMNS` LIMIT ROWS EXAMINED 10;
 +TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	ORDINAL_POSITION	COLUMN_DEFAULT	IS_NULLABLE	DATA_TYPE	CHARACTER_MAXIMUM_LENGTH	CHARACTER_OCTET_LENGTH	NUMERIC_PRECISION	NUMERIC_SCALE	DATETIME_PRECISION	CHARACTER_SET_NAME	COLLATION_NAME	COLUMN_TYPE	COLUMN_KEY	EXTRA	PRIVILEGES	COLUMN_COMMENT	IS_GENERATED	GENERATION_EXPRESSION
 +Warnings:
 +Warning	1931	Query execution was interrupted. The query examined at least ### rows, which exceeds LIMIT ROWS EXAMINED (10). The query result may be incomplete
 +#
 +# MDEV-24179: AAssertion `m_status == DA_ERROR || m_status == DA_OK ||
 +# m_status == DA_OK_BULK' failed in Diagnostics_area::message()
 +#
 +call mtr.add_suppression("Sort aborted.*");
 +DROP DATABASE test;
 +CREATE DATABASE test;
 +USE test;
 +CREATE VIEW v AS SELECT table_schema  AS object_schema, table_name  AS object_name, table_type AS object_type FROM information_schema.tables ORDER BY object_schema;
 +SELECT * FROM v LIMIT ROWS EXAMINED 9;
 +ERROR HY000: Sort aborted: 
 +DROP VIEW v;
 +#
 +# End of 10.2 Test
 +#
 +#
 +# MDEV-21201:No records produced in information_schema query,
 +# depending on projection
 +#
 +create table t (i int, constraint a check (i > 0));
 +select
 +tc.TABLE_SCHEMA,
 +tc.TABLE_NAME,
 +cc.CONSTRAINT_NAME,
 +cc.CHECK_CLAUSE
 +from information_schema.TABLE_CONSTRAINTS tc
 +join information_schema.CHECK_CONSTRAINTS cc
 +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME)
 +;
 +TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_NAME	CHECK_CLAUSE
 +test	t	a	`i` > 0
 +select
 +tc.TABLE_SCHEMA,
 +tc.TABLE_NAME,
 +cc.CONSTRAINT_NAME,
 +cc.CHECK_CLAUSE
 +from information_schema.CHECK_CONSTRAINTS cc
 +join information_schema.TABLE_CONSTRAINTS tc
 +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME)
 +;
 +TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_NAME	CHECK_CLAUSE
 +test	t	a	`i` > 0
 +select
 +tc.TABLE_SCHEMA,
 +tc.TABLE_NAME,
 +cc.CONSTRAINT_NAME,
 +cc.CHECK_CLAUSE
 +from information_schema.TABLE_CONSTRAINTS tc
 +NATURAL join information_schema.CHECK_CONSTRAINTS cc
 +;
 +TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_NAME	CHECK_CLAUSE
 +test	t	a	`i` > 0
 +select
 +tc.TABLE_SCHEMA,
 +tc.TABLE_NAME,
 +cc.CONSTRAINT_NAME,
 +cc.CHECK_CLAUSE
 +from information_schema.CHECK_CONSTRAINTS cc
 +NATURAL join information_schema.TABLE_CONSTRAINTS tc
 +;
 +TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_NAME	CHECK_CLAUSE
 +test	t	a	`i` > 0
 +select
 +tc.TABLE_SCHEMA,
 +tc.TABLE_NAME,
 +cc.CONSTRAINT_NAME,
 +cc.CHECK_CLAUSE,
 +tc.CONSTRAINT_CATALOG,
 +tc.CONSTRAINT_SCHEMA
 +from information_schema.TABLE_CONSTRAINTS tc
 +join information_schema.CHECK_CONSTRAINTS cc
 +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME)
 +;
 +TABLE_SCHEMA	TABLE_NAME	CONSTRAINT_NAME	CHECK_CLAUSE	CONSTRAINT_CATALOG	CONSTRAINT_SCHEMA
 +test	t	a	`i` > 0	def	test
 +drop table t;
 +#
 +# MDEV-24230 subquery on information_schema fails with error message
 +#
 +create table t1 (n int);
 +create table t2 (n int);
 +insert into t1 set n = (select table_rows from information_schema.tables where table_name='t2');
 +drop table t1, t2;
 +#
 +# MDEV-24593 Signal 11 when group by primary key of table joined to information_schema.columns
 +#
 +create table t1 (f varchar(64) primary key);
 +select f from information_schema.columns i
 +inner join t1 on f=i.column_name
 +group by f;
 +f
 +drop table t1;
 +#
 +# MDEV-24929 Server crash in thr_multi_unlock or in
 +# get_schema_tables_result upon select from I_S with joins
 +#
 +CREATE TABLE t1 (a TIMESTAMP, KEY (a));
 +INSERT INTO t1 VALUES ('2012-12-12'),('2021-11-11');
 +SELECT count(*) FROM t1 AS t1a LEFT JOIN (t1 AS t1b JOIN INFORMATION_SCHEMA.ROUTINES) ON (t1b.a IS NULL);
 +count(*)
 +2
 +SELECT count(*) FROM t1 AS t1a LEFT JOIN (t1 AS t1b JOIN INFORMATION_SCHEMA.PROFILING) ON (t1b.a IS NULL);
 +count(*)
 +2
 +DROP TABLE t1;
 +#
 +# MDEV-24868 Server crashes in optimize_schema_tables_memory_usage after select from information_schema.innodb_sys_columns
 +#
 +create table t1 ( name varchar(64) character set utf8, len int);
 +select * from t1 where (name, len) in (select  name, len from information_schema.innodb_sys_columns having len = 8);
 +name	len
 +drop table t1;
 +#
 +# End of 10.3 tests
 +#
diff --cc mysql-test/main/information_schema_all_engines.result
index 2916858b5a6,00000000000..41d6ab3b2f4
mode 100644,000000..100644
--- a/mysql-test/main/information_schema_all_engines.result
+++ b/mysql-test/main/information_schema_all_engines.result
@@@ -1,463 -1,0 +1,473 @@@
 +use INFORMATION_SCHEMA;
 +show tables;
 +Tables_in_information_schema
 +ALL_PLUGINS
 +APPLICABLE_ROLES
 +CHARACTER_SETS
 +CHECK_CONSTRAINTS
 +CLIENT_STATISTICS
 +COLLATIONS
 +COLLATION_CHARACTER_SET_APPLICABILITY
 +COLUMNS
 +COLUMN_PRIVILEGES
 +ENABLED_ROLES
 +ENGINES
 +EVENTS
 +FILES
 +GEOMETRY_COLUMNS
 +GLOBAL_STATUS
 +GLOBAL_VARIABLES
 +INDEX_STATISTICS
 +INNODB_BUFFER_PAGE
 +INNODB_BUFFER_PAGE_LRU
 +INNODB_BUFFER_POOL_STATS
 +INNODB_CMP
 +INNODB_CMPMEM
 +INNODB_CMPMEM_RESET
 +INNODB_CMP_PER_INDEX
 +INNODB_CMP_RESET
 +INNODB_LOCKS
 +INNODB_LOCK_WAITS
 +INNODB_METRICS
 +INNODB_MUTEXES
 +INNODB_SYS_COLUMNS
 +INNODB_SYS_FIELDS
 +INNODB_SYS_FOREIGN
 +INNODB_SYS_FOREIGN_COLS
 +INNODB_SYS_INDEXES
 +INNODB_SYS_TABLES
 +INNODB_SYS_TABLESTATS
 +INNODB_SYS_VIRTUAL
 +INNODB_TABLESPACES_ENCRYPTION
 +INNODB_TABLESPACES_SCRUBBING
 +INNODB_TRX
++KEYWORDS
 +KEY_CACHES
 +KEY_COLUMN_USAGE
 +PARAMETERS
 +PARTITIONS
 +PLUGINS
 +PROCESSLIST
 +PROFILING
 +REFERENTIAL_CONSTRAINTS
 +ROUTINES
 +SCHEMATA
 +SCHEMA_PRIVILEGES
 +SESSION_STATUS
 +SESSION_VARIABLES
 +SPATIAL_REF_SYS
++SQL_FUNCTIONS
 +STATISTICS
 +SYSTEM_VARIABLES
 +TABLES
 +TABLESPACES
 +TABLE_CONSTRAINTS
 +TABLE_PRIVILEGES
 +TABLE_STATISTICS
 +TRIGGERS
 +USER_PRIVILEGES
 +USER_STATISTICS
 +VIEWS
 +SELECT t.table_name, c1.column_name
 +FROM information_schema.tables t
 +INNER JOIN
 +information_schema.columns c1
 +ON t.table_schema = c1.table_schema AND
 +t.table_name = c1.table_name
 +WHERE t.table_schema = 'information_schema' AND
 +c1.ordinal_position =
 +( SELECT COALESCE(MIN(c2.ordinal_position),1)
 +FROM information_schema.columns c2
 +WHERE c2.table_schema = t.table_schema AND
 +c2.table_name = t.table_name AND
 +c2.column_name LIKE '%SCHEMA%'
 +        ) order by t.table_name;
 +table_name	column_name
 +ALL_PLUGINS	PLUGIN_NAME
 +APPLICABLE_ROLES	GRANTEE
 +CHARACTER_SETS	CHARACTER_SET_NAME
 +CHECK_CONSTRAINTS	CONSTRAINT_SCHEMA
 +CLIENT_STATISTICS	CLIENT
 +COLLATIONS	COLLATION_NAME
 +COLLATION_CHARACTER_SET_APPLICABILITY	COLLATION_NAME
 +COLUMNS	TABLE_SCHEMA
 +COLUMN_PRIVILEGES	TABLE_SCHEMA
 +ENABLED_ROLES	ROLE_NAME
 +ENGINES	ENGINE
 +EVENTS	EVENT_SCHEMA
 +FILES	TABLE_SCHEMA
 +GEOMETRY_COLUMNS	F_TABLE_SCHEMA
 +GLOBAL_STATUS	VARIABLE_NAME
 +GLOBAL_VARIABLES	VARIABLE_NAME
 +INDEX_STATISTICS	TABLE_SCHEMA
 +INNODB_BUFFER_PAGE	POOL_ID
 +INNODB_BUFFER_PAGE_LRU	POOL_ID
 +INNODB_BUFFER_POOL_STATS	POOL_ID
 +INNODB_CMP	page_size
 +INNODB_CMPMEM	page_size
 +INNODB_CMPMEM_RESET	page_size
 +INNODB_CMP_PER_INDEX	database_name
 +INNODB_CMP_RESET	page_size
 +INNODB_LOCKS	lock_id
 +INNODB_LOCK_WAITS	requesting_trx_id
 +INNODB_METRICS	NAME
 +INNODB_MUTEXES	NAME
 +INNODB_SYS_COLUMNS	TABLE_ID
 +INNODB_SYS_FIELDS	INDEX_ID
 +INNODB_SYS_FOREIGN	ID
 +INNODB_SYS_FOREIGN_COLS	ID
 +INNODB_SYS_INDEXES	INDEX_ID
 +INNODB_SYS_TABLES	TABLE_ID
 +INNODB_SYS_TABLESTATS	TABLE_ID
 +INNODB_SYS_VIRTUAL	TABLE_ID
 +INNODB_TABLESPACES_ENCRYPTION	SPACE
 +INNODB_TABLESPACES_SCRUBBING	SPACE
 +INNODB_TRX	trx_id
++KEYWORDS	WORD
 +KEY_CACHES	KEY_CACHE_NAME
 +KEY_COLUMN_USAGE	CONSTRAINT_SCHEMA
 +PARAMETERS	SPECIFIC_SCHEMA
 +PARTITIONS	TABLE_SCHEMA
 +PLUGINS	PLUGIN_NAME
 +PROCESSLIST	ID
 +PROFILING	QUERY_ID
 +REFERENTIAL_CONSTRAINTS	CONSTRAINT_SCHEMA
 +ROUTINES	ROUTINE_SCHEMA
 +SCHEMATA	SCHEMA_NAME
 +SCHEMA_PRIVILEGES	TABLE_SCHEMA
 +SESSION_STATUS	VARIABLE_NAME
 +SESSION_VARIABLES	VARIABLE_NAME
 +SPATIAL_REF_SYS	SRID
++SQL_FUNCTIONS	FUNCTION
 +STATISTICS	TABLE_SCHEMA
 +SYSTEM_VARIABLES	VARIABLE_NAME
 +TABLES	TABLE_SCHEMA
 +TABLESPACES	TABLESPACE_NAME
 +TABLE_CONSTRAINTS	CONSTRAINT_SCHEMA
 +TABLE_PRIVILEGES	TABLE_SCHEMA
 +TABLE_STATISTICS	TABLE_SCHEMA
 +TRIGGERS	TRIGGER_SCHEMA
 +USER_PRIVILEGES	GRANTEE
 +USER_STATISTICS	USER
 +VIEWS	TABLE_SCHEMA
 +SELECT t.table_name, c1.column_name
 +FROM information_schema.tables t
 +INNER JOIN
 +information_schema.columns c1
 +ON t.table_schema = c1.table_schema AND
 +t.table_name = c1.table_name
 +WHERE t.table_schema = 'information_schema' AND
 +c1.ordinal_position =
 +( SELECT COALESCE(MIN(c2.ordinal_position),1)
 +FROM information_schema.columns c2
 +WHERE c2.table_schema = 'information_schema' AND
 +c2.table_name = t.table_name AND
 +c2.column_name LIKE '%SCHEMA%'
 +        ) order by t.table_name;
 +table_name	column_name
 +ALL_PLUGINS	PLUGIN_NAME
 +APPLICABLE_ROLES	GRANTEE
 +CHARACTER_SETS	CHARACTER_SET_NAME
 +CHECK_CONSTRAINTS	CONSTRAINT_SCHEMA
 +CLIENT_STATISTICS	CLIENT
 +COLLATIONS	COLLATION_NAME
 +COLLATION_CHARACTER_SET_APPLICABILITY	COLLATION_NAME
 +COLUMNS	TABLE_SCHEMA
 +COLUMN_PRIVILEGES	TABLE_SCHEMA
 +ENABLED_ROLES	ROLE_NAME
 +ENGINES	ENGINE
 +EVENTS	EVENT_SCHEMA
 +FILES	TABLE_SCHEMA
 +GEOMETRY_COLUMNS	F_TABLE_SCHEMA
 +GLOBAL_STATUS	VARIABLE_NAME
 +GLOBAL_VARIABLES	VARIABLE_NAME
 +INDEX_STATISTICS	TABLE_SCHEMA
 +INNODB_BUFFER_PAGE	POOL_ID
 +INNODB_BUFFER_PAGE_LRU	POOL_ID
 +INNODB_BUFFER_POOL_STATS	POOL_ID
 +INNODB_CMP	page_size
 +INNODB_CMPMEM	page_size
 +INNODB_CMPMEM_RESET	page_size
 +INNODB_CMP_PER_INDEX	database_name
 +INNODB_CMP_RESET	page_size
 +INNODB_LOCKS	lock_id
 +INNODB_LOCK_WAITS	requesting_trx_id
 +INNODB_METRICS	NAME
 +INNODB_MUTEXES	NAME
 +INNODB_SYS_COLUMNS	TABLE_ID
 +INNODB_SYS_FIELDS	INDEX_ID
 +INNODB_SYS_FOREIGN	ID
 +INNODB_SYS_FOREIGN_COLS	ID
 +INNODB_SYS_INDEXES	INDEX_ID
 +INNODB_SYS_TABLES	TABLE_ID
 +INNODB_SYS_TABLESTATS	TABLE_ID
 +INNODB_SYS_VIRTUAL	TABLE_ID
 +INNODB_TABLESPACES_ENCRYPTION	SPACE
 +INNODB_TABLESPACES_SCRUBBING	SPACE
 +INNODB_TRX	trx_id
++KEYWORDS	WORD
 +KEY_CACHES	KEY_CACHE_NAME
 +KEY_COLUMN_USAGE	CONSTRAINT_SCHEMA
 +PARAMETERS	SPECIFIC_SCHEMA
 +PARTITIONS	TABLE_SCHEMA
 +PLUGINS	PLUGIN_NAME
 +PROCESSLIST	ID
 +PROFILING	QUERY_ID
 +REFERENTIAL_CONSTRAINTS	CONSTRAINT_SCHEMA
 +ROUTINES	ROUTINE_SCHEMA
 +SCHEMATA	SCHEMA_NAME
 +SCHEMA_PRIVILEGES	TABLE_SCHEMA
 +SESSION_STATUS	VARIABLE_NAME
 +SESSION_VARIABLES	VARIABLE_NAME
 +SPATIAL_REF_SYS	SRID
++SQL_FUNCTIONS	FUNCTION
 +STATISTICS	TABLE_SCHEMA
 +SYSTEM_VARIABLES	VARIABLE_NAME
 +TABLES	TABLE_SCHEMA
 +TABLESPACES	TABLESPACE_NAME
 +TABLE_CONSTRAINTS	CONSTRAINT_SCHEMA
 +TABLE_PRIVILEGES	TABLE_SCHEMA
 +TABLE_STATISTICS	TABLE_SCHEMA
 +TRIGGERS	TRIGGER_SCHEMA
 +USER_PRIVILEGES	GRANTEE
 +USER_STATISTICS	USER
 +VIEWS	TABLE_SCHEMA
 +select 1 as "must be 1" from information_schema.tables  where "ACCOUNTS"=
 +(select cast(table_name as char)  from information_schema.tables
 +order by table_name limit 1) limit 1;
 +must be 1
 +1
 +select t.table_name, group_concat(t.table_schema, '.', t.table_name),
 +count(*) as num1
 +from information_schema.tables t
 +inner join information_schema.columns c1
 +on t.table_schema = c1.table_schema AND t.table_name = c1.table_name
 +where t.table_schema = 'information_schema' and
 +c1.ordinal_position =
 +(select isnull(c2.column_type) -
 +isnull(group_concat(c2.table_schema, '.', c2.table_name)) +
 +count(*) as num
 +from information_schema.columns c2 where
 +c2.table_schema='information_schema' and
 +(c2.column_type = 'varchar(7)' or c2.column_type = 'varchar(20)')
 +group by c2.column_type order by num limit 1)
 +group by t.table_name order by num1, t.table_name;
 +table_name	group_concat(t.table_schema, '.', t.table_name)	num1
 +ALL_PLUGINS	information_schema.ALL_PLUGINS	1
 +APPLICABLE_ROLES	information_schema.APPLICABLE_ROLES	1
 +CHARACTER_SETS	information_schema.CHARACTER_SETS	1
 +CHECK_CONSTRAINTS	information_schema.CHECK_CONSTRAINTS	1
 +CLIENT_STATISTICS	information_schema.CLIENT_STATISTICS	1
 +COLLATIONS	information_schema.COLLATIONS	1
 +COLLATION_CHARACTER_SET_APPLICABILITY	information_schema.COLLATION_CHARACTER_SET_APPLICABILITY	1
 +COLUMNS	information_schema.COLUMNS	1
 +COLUMN_PRIVILEGES	information_schema.COLUMN_PRIVILEGES	1
 +ENGINES	information_schema.ENGINES	1
 +EVENTS	information_schema.EVENTS	1
 +FILES	information_schema.FILES	1
 +GEOMETRY_COLUMNS	information_schema.GEOMETRY_COLUMNS	1
 +GLOBAL_STATUS	information_schema.GLOBAL_STATUS	1
 +GLOBAL_VARIABLES	information_schema.GLOBAL_VARIABLES	1
 +INDEX_STATISTICS	information_schema.INDEX_STATISTICS	1
 +INNODB_BUFFER_PAGE	information_schema.INNODB_BUFFER_PAGE	1
 +INNODB_BUFFER_PAGE_LRU	information_schema.INNODB_BUFFER_PAGE_LRU	1
 +INNODB_BUFFER_POOL_STATS	information_schema.INNODB_BUFFER_POOL_STATS	1
 +INNODB_CMP	information_schema.INNODB_CMP	1
 +INNODB_CMPMEM	information_schema.INNODB_CMPMEM	1
 +INNODB_CMPMEM_RESET	information_schema.INNODB_CMPMEM_RESET	1
 +INNODB_CMP_PER_INDEX	information_schema.INNODB_CMP_PER_INDEX	1
 +INNODB_CMP_RESET	information_schema.INNODB_CMP_RESET	1
 +INNODB_LOCKS	information_schema.INNODB_LOCKS	1
 +INNODB_LOCK_WAITS	information_schema.INNODB_LOCK_WAITS	1
 +INNODB_METRICS	information_schema.INNODB_METRICS	1
 +INNODB_MUTEXES	information_schema.INNODB_MUTEXES	1
 +INNODB_SYS_COLUMNS	information_schema.INNODB_SYS_COLUMNS	1
 +INNODB_SYS_FIELDS	information_schema.INNODB_SYS_FIELDS	1
 +INNODB_SYS_FOREIGN	information_schema.INNODB_SYS_FOREIGN	1
 +INNODB_SYS_FOREIGN_COLS	information_schema.INNODB_SYS_FOREIGN_COLS	1
 +INNODB_SYS_INDEXES	information_schema.INNODB_SYS_INDEXES	1
 +INNODB_SYS_TABLES	information_schema.INNODB_SYS_TABLES	1
 +INNODB_SYS_TABLESTATS	information_schema.INNODB_SYS_TABLESTATS	1
 +INNODB_SYS_VIRTUAL	information_schema.INNODB_SYS_VIRTUAL	1
 +INNODB_TABLESPACES_ENCRYPTION	information_schema.INNODB_TABLESPACES_ENCRYPTION	1
 +INNODB_TABLESPACES_SCRUBBING	information_schema.INNODB_TABLESPACES_SCRUBBING	1
 +INNODB_TRX	information_schema.INNODB_TRX	1
 +KEY_CACHES	information_schema.KEY_CACHES	1
 +KEY_COLUMN_USAGE	information_schema.KEY_COLUMN_USAGE	1
 +PARAMETERS	information_schema.PARAMETERS	1
 +PARTITIONS	information_schema.PARTITIONS	1
 +PLUGINS	information_schema.PLUGINS	1
 +PROCESSLIST	information_schema.PROCESSLIST	1
 +PROFILING	information_schema.PROFILING	1
 +REFERENTIAL_CONSTRAINTS	information_schema.REFERENTIAL_CONSTRAINTS	1
 +ROUTINES	information_schema.ROUTINES	1
 +SCHEMATA	information_schema.SCHEMATA	1
 +SCHEMA_PRIVILEGES	information_schema.SCHEMA_PRIVILEGES	1
 +SESSION_STATUS	information_schema.SESSION_STATUS	1
 +SESSION_VARIABLES	information_schema.SESSION_VARIABLES	1
 +SPATIAL_REF_SYS	information_schema.SPATIAL_REF_SYS	1
 +STATISTICS	information_schema.STATISTICS	1
 +SYSTEM_VARIABLES	information_schema.SYSTEM_VARIABLES	1
 +TABLES	information_schema.TABLES	1
 +TABLESPACES	information_schema.TABLESPACES	1
 +TABLE_CONSTRAINTS	information_schema.TABLE_CONSTRAINTS	1
 +TABLE_PRIVILEGES	information_schema.TABLE_PRIVILEGES	1
 +TABLE_STATISTICS	information_schema.TABLE_STATISTICS	1
 +TRIGGERS	information_schema.TRIGGERS	1
 +USER_PRIVILEGES	information_schema.USER_PRIVILEGES	1
 +USER_STATISTICS	information_schema.USER_STATISTICS	1
 +VIEWS	information_schema.VIEWS	1
 ++---------------------------------------+
 ++---------------------------------------+
 ++---------------------------------------+
 +Database: information_schema
 +|                Tables                 |
 +| ALL_PLUGINS                           |
 +| APPLICABLE_ROLES                      |
 +| CHARACTER_SETS                        |
 +| CHECK_CONSTRAINTS                     |
 +| CLIENT_STATISTICS                     |
 +| COLLATIONS                            |
 +| COLLATION_CHARACTER_SET_APPLICABILITY |
 +| COLUMNS                               |
 +| COLUMN_PRIVILEGES                     |
 +| ENABLED_ROLES                         |
 +| ENGINES                               |
 +| EVENTS                                |
 +| FILES                                 |
 +| GEOMETRY_COLUMNS                      |
 +| GLOBAL_STATUS                         |
 +| GLOBAL_VARIABLES                      |
 +| INDEX_STATISTICS                      |
 +| INNODB_BUFFER_PAGE                    |
 +| INNODB_BUFFER_PAGE_LRU                |
 +| INNODB_BUFFER_POOL_STATS              |
 +| INNODB_CMP