diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-11-06 09:40:39 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-11-06 09:40:39 +0200 |
commit | df563e0c037f9b2cdb22e145575f92a121b4b529 (patch) | |
tree | 31d39796cebcef916eb7e0888537c18f946170ff /mysql-test/main/derived_cond_pushdown.result | |
parent | e058a251c10350f3727ca1df022dc5786933535b (diff) | |
parent | bdfe2784d5b73a1fdcdacb3d9adcc9dc71af344b (diff) | |
download | mariadb-git-df563e0c037f9b2cdb22e145575f92a121b4b529.tar.gz |
Merge 10.2 into 10.3
main.derived_cond_pushdown: Move all 10.3 tests to the end,
trim trailing white space, and add an "End of 10.3 tests" marker.
Add --sorted_result to tests where the ordering is not deterministic.
main.win_percentile: Add --sorted_result to tests where the
ordering is no longer deterministic.
Diffstat (limited to 'mysql-test/main/derived_cond_pushdown.result')
-rw-r--r-- | mysql-test/main/derived_cond_pushdown.result | 7913 |
1 files changed, 3957 insertions, 3956 deletions
diff --git a/mysql-test/main/derived_cond_pushdown.result b/mysql-test/main/derived_cond_pushdown.result index 4d160c3d31d..4f9de9670f8 100644 --- a/mysql-test/main/derived_cond_pushdown.result +++ b/mysql-test/main/derived_cond_pushdown.result @@ -1,23 +1,23 @@ create table t1 (a int, b int, c int); create table t2 (a int, b int, c int, d decimal); -insert into t1 values +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), +(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 +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 +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); @@ -41,22 +41,22 @@ 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 +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 +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 +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 +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 @@ -65,13 +65,13 @@ 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 +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 +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 @@ -80,13 +80,13 @@ 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 +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 +# 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 @@ -161,7 +161,7 @@ EXPLAIN } 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, +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 @@ -172,7 +172,7 @@ a b max_c avg_c a b c d 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, +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 @@ -183,7 +183,7 @@ a b max_c avg_c a b c d 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, +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 @@ -191,7 +191,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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, +group by a,b having max_c < 707) v1, t2 where (v1.a=t2.a) and (v1.max_c>300); EXPLAIN { @@ -235,8 +235,8 @@ EXPLAIN } } } -# extracted or formula : pushing into HAVING -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where +# 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 @@ -250,7 +250,7 @@ a b max_c avg_c a b c d 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 +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 @@ -264,13 +264,13 @@ a b max_c avg_c a b c d 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 +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 +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 { @@ -315,7 +315,7 @@ EXPLAIN } } 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>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 @@ -323,7 +323,7 @@ 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 select * from v1,t2 where -((v1.max_c>300) and (v1.avg_c>t2.d) and (v1.b=t2.b)) or +((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 @@ -331,14 +331,14 @@ 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 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>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>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 { @@ -508,7 +508,7 @@ EXPLAIN } } # extracted or formula : pushing into WHERE -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 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 @@ -526,7 +526,7 @@ a b max_c avg_c a b c d 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 +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 @@ -544,13 +544,13 @@ a b max_c avg_c a b c d 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 +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 +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 { @@ -595,7 +595,7 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v2,t2 where +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 @@ -610,7 +610,7 @@ a b max_c avg_c a b c d 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 +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 @@ -625,13 +625,13 @@ a b max_c avg_c a b c d 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 +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 +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 { @@ -676,29 +676,29 @@ EXPLAIN } } } -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 +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 +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 +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 +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 { @@ -934,8 +934,8 @@ EXPLAIN } } # 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 +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 @@ -948,8 +948,8 @@ a b max_c avg_c a b c d 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 +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 @@ -962,15 +962,15 @@ a b max_c avg_c a b c d 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 +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 +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 { @@ -1104,8 +1104,8 @@ EXPLAIN } } } -# extracted or formulas : pushing into WHERE and HAVING -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where +# 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 @@ -1118,7 +1118,7 @@ a b max_c avg_c a b c d 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 +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 @@ -1131,13 +1131,13 @@ a b max_c avg_c a b c d 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 +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 +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 { @@ -1250,7 +1250,7 @@ EXPLAIN } } # prepare of a query containing extracted or formula -prepare stmt from "select * from v1,t2 where +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 @@ -1279,8 +1279,8 @@ a b max_c avg_c a b c d 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 +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 @@ -1652,7 +1652,7 @@ EXPLAIN } } } -# extracted and formula : pushing into WHERE +# 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 @@ -1752,23 +1752,23 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_char as v,t2_char as t where +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 +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 +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 +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 { @@ -1885,7 +1885,7 @@ EXPLAIN } } } -# extracted or formula : pushing into HAVING using equalities +# 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 @@ -2014,24 +2014,24 @@ EXPLAIN } } # conjunctive subformulas : pushing into WHERE and HAVING -# pushing equalities +# 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, +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, +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, +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 @@ -2039,7 +2039,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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, +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 { @@ -2084,22 +2084,22 @@ EXPLAIN } } } -# conjunctive subformulas : pushing into WHERE and HAVING -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where +# 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 +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 +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 +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 { @@ -2205,7 +2205,7 @@ EXPLAIN } } # conjunctive subformula : pushing into WHERE -# extracted or formula : pushing into HAVING using equalities +# 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 @@ -2366,17 +2366,17 @@ EXPLAIN } 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, +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, +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, +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 @@ -2384,7 +2384,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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, +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 { @@ -2550,7 +2550,7 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where +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 @@ -2561,7 +2561,7 @@ a b max_c avg_c a b c d 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 +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 @@ -2572,13 +2572,13 @@ a b max_c avg_c a b c d 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 +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 +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 { @@ -2716,7 +2716,7 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,t2 where +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 @@ -2725,7 +2725,7 @@ a b max_c avg_c a b c d 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 +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 @@ -2734,13 +2734,13 @@ a b max_c avg_c a b c d 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 +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 +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 { @@ -2785,21 +2785,21 @@ EXPLAIN } } # using several derived tables : nothing to push -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where +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 +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 +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 @@ -2807,7 +2807,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +explain format=json select * from v1,v2,t2 where (v1.a=v2.a) and (v1.a=t2.a) and (v2.b<50); EXPLAIN { @@ -2880,7 +2880,7 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where +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 @@ -2897,7 +2897,7 @@ 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 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 +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 @@ -2914,7 +2914,7 @@ 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 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 +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 @@ -2922,7 +2922,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 { @@ -2996,21 +2996,21 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v1,v2,t2 where +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 +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 +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 @@ -3018,7 +3018,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 { @@ -3094,22 +3094,22 @@ EXPLAIN # 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 +# 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 +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 +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 @@ -3117,7 +3117,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 { @@ -3194,13 +3194,13 @@ EXPLAIN # 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 +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 +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 +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 @@ -3208,7 +3208,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 { @@ -3373,7 +3373,7 @@ EXPLAIN # 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 +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 @@ -3381,7 +3381,7 @@ 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 +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 @@ -3389,13 +3389,13 @@ 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 +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 +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 { @@ -3442,10 +3442,10 @@ EXPLAIN } # using several derived tables : pushing in all tables # extracted or formula : pushing into WHERE -# conjunctive subformulas : pushing into HAVING +# 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)) +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 @@ -3462,8 +3462,8 @@ a b max_c avg_c a b max_c avg_c a b min_c a b c d 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)) +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 @@ -3480,8 +3480,8 @@ a b max_c avg_c a b max_c avg_c a b min_c a b c d 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)) +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 @@ -3491,8 +3491,8 @@ id select_type table type possible_keys key key_len ref rows Extra 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)) +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 { @@ -3598,7 +3598,7 @@ EXPLAIN } } # using several derived tables : pushing in all tables -# conjunctive subformulas : pushing into HAVING +# 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, @@ -3706,7 +3706,7 @@ EXPLAIN } # using several derived tables : pushing in all tables # extracted or formulas : pushing into HAVING -# conjunctive subformula : 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, @@ -3875,10 +3875,10 @@ EXPLAIN } } # extracted or formula : pushing into HAVING -# conjunctive subformula : pushing into WHERE +# 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, +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 @@ -3892,7 +3892,7 @@ a b max_c avg_c a b c d 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, +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 @@ -3906,7 +3906,7 @@ a b max_c avg_c a b c d 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, +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 @@ -3914,7 +3914,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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, +group by a,b having max_c < 707) v1, t2 where ((v1.a=1) or (v1.max_c<300)) and (v1.b>25); EXPLAIN { @@ -3960,24 +3960,24 @@ EXPLAIN } } # extracted and formula : pushing into WHERE -# conjunctive subformula : 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, +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, +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, +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 @@ -3985,7 +3985,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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, +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 { @@ -4156,11 +4156,11 @@ EXPLAIN } } # using query with union -# extracted and formula : pushing into WHERE -# extracted or formula : pushing into HAVING +# 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 +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 @@ -4175,7 +4175,7 @@ a b max_c avg_c a b c d 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 +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 @@ -4190,7 +4190,7 @@ a b max_c avg_c a b c d 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 +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 @@ -4201,7 +4201,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +union select * from v1,t2 where ((v1.max_c>400) or (v1.avg_c>270)) and (v1.a<t2.a); EXPLAIN { @@ -4299,10 +4299,10 @@ EXPLAIN } } # using query with union -# extracted or formula : pushing into HAVING +# 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 +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); @@ -4322,7 +4322,7 @@ a b max_c avg_c a b c d 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 +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); @@ -4342,7 +4342,7 @@ a b max_c avg_c a b c d 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 +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); @@ -4354,7 +4354,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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); @@ -4454,10 +4454,10 @@ EXPLAIN } } # using query with union -# extracted or formula : pushing into HAVING -# conjunctive subformulas : pushing into WHERE +# 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 +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 @@ -4472,7 +4472,7 @@ a b max_c avg_c a b c d 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 +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 @@ -4487,7 +4487,7 @@ a b max_c avg_c a b c d 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 +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 @@ -4506,7 +4506,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 @@ -4760,7 +4760,7 @@ EXPLAIN } # using derived table with union # conjunctive subformula : pushing into WHERE -# extracted or formula : pushing into HAVING +# 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 @@ -4963,27 +4963,27 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * from v_char as v,t2_char as t where +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 +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 +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 +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 { @@ -5033,19 +5033,19 @@ EXPLAIN # 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) +(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) +(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) +(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 @@ -5056,7 +5056,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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) +(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 { @@ -5161,11 +5161,11 @@ EXPLAIN } } } -# using derived table with union -# extracted or formula : pushing into WHERE +# 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 +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 @@ -5174,7 +5174,7 @@ a b c a b c d 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 +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 @@ -5183,7 +5183,7 @@ a b c a b c d 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 +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 @@ -5192,7 +5192,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 { @@ -5543,21 +5543,21 @@ EXPLAIN } # 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 +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 +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 +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 @@ -5565,7 +5565,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 { @@ -5627,7 +5627,7 @@ EXPLAIN } } } -# using derived table with union of +# 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); @@ -5716,13 +5716,13 @@ EXPLAIN } } } -# using derived table with union of +# 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 +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 @@ -5735,7 +5735,7 @@ a b c a b c d 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 +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 @@ -5748,7 +5748,7 @@ a b c a b c d 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 +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 @@ -5756,7 +5756,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 +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 { @@ -6773,7 +6773,7 @@ EXPLAIN # using several derived tables : pushing in all tables # extracted or formula : pushing into WHERE # conjunctive subformula : pushing into WHERE -# pushing equalities +# 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); @@ -6999,6 +6999,3412 @@ 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.7100000381469727", + "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; +# End of 10.2 tests +# # MDEV-14579: pushdown conditions into materialized views/derived tables # that are defined with EXIST or/and INTERSECT # @@ -10715,2833 +14121,7 @@ drop view v1; alter table t3 drop index i1; drop table t1,t2,t3; # -# 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.7100000381469727", - "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-10855: Pushdown into derived with window functions +# MDEV-10855: Pushdown into derived with window functions # set @save_optimizer_switch= @@optimizer_switch; set optimizer_switch='split_materialized=off'; @@ -13558,27 +14138,27 @@ insert into t2 values 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) -7 cc 28 -7 cc 28 3 aa 92 -7 bb 126 +3 aa 92 +3 bb 40 4 aa 15 7 bb 126 7 bb 126 -3 bb 40 -3 aa 92 +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) -7 cc 28 -7 cc 28 3 aa 92 -7 bb 126 +3 aa 92 +3 bb 40 4 aa 15 7 bb 126 7 bb 126 -3 bb 40 -3 aa 92 +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 @@ -13622,59 +14202,59 @@ EXPLAIN } } 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 7 cc 28 -1 7 cc 28 1 3 aa 92 -1 7 bb 126 +1 3 aa 92 +1 3 bb 40 1 4 aa 15 1 7 bb 126 1 7 bb 126 -1 3 bb 40 -1 3 aa 92 -2 7 cc 154 -2 7 cc 154 +1 7 bb 126 +1 7 cc 28 +1 7 cc 28 2 3 aa 132 -2 7 bb 154 +2 3 aa 132 +2 3 bb 132 2 4 aa 139 2 7 bb 154 2 7 bb 154 -2 3 bb 132 -2 3 aa 132 +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 7 cc 28 -1 7 cc 28 1 3 aa 92 -1 7 bb 126 +1 3 aa 92 +1 3 bb 40 1 4 aa 15 1 7 bb 126 1 7 bb 126 -1 3 bb 40 -1 3 aa 92 -2 7 cc 154 -2 7 cc 154 +1 7 bb 126 +1 7 cc 28 +1 7 cc 28 2 3 aa 132 -2 7 bb 154 +2 3 aa 132 +2 3 bb 132 2 4 aa 139 2 7 bb 154 2 7 bb 154 -2 3 bb 132 -2 3 aa 132 +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 @@ -13685,7 +14265,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 @@ -13759,7 +14339,7 @@ EXPLAIN } } } -set statement optimizer_switch='condition_pushdown_for_derived=off' for select * +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 @@ -13767,7 +14347,7 @@ a c s a c 7 bb 126 7 bb 7 bb 126 7 bb 7 bb 126 7 bb -select * +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 @@ -13775,14 +14355,14 @@ a c s a c 7 bb 126 7 bb 7 bb 126 7 bb 7 bb 126 7 bb -explain select * +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 * +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 @@ -13831,7 +14411,7 @@ EXPLAIN } } 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 @@ -13840,28 +14420,28 @@ 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 7 cc 28 -1 7 cc 28 1 3 aa 92 -1 7 bb 126 +1 3 aa 92 +1 3 bb 40 1 4 aa 15 1 7 bb 126 1 7 bb 126 -1 3 bb 40 -1 3 aa 92 -2 7 cc 154 -2 7 cc 154 +1 7 bb 126 +1 7 cc 28 +1 7 cc 28 2 3 aa 132 -2 7 bb 154 +2 3 aa 132 +2 3 bb 132 2 4 aa 139 2 7 bb 154 2 7 bb 154 -2 3 bb 132 -2 3 aa 132 +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 @@ -13870,28 +14450,28 @@ 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 7 cc 28 -1 7 cc 28 1 3 aa 92 -1 7 bb 126 +1 3 aa 92 +1 3 bb 40 1 4 aa 15 1 7 bb 126 1 7 bb 126 -1 3 bb 40 -1 3 aa 92 -2 7 cc 154 -2 7 cc 154 +1 7 bb 126 +1 7 cc 28 +1 7 cc 28 2 3 aa 132 -2 7 bb 154 +2 3 aa 132 +2 3 bb 132 2 4 aa 139 2 7 bb 154 2 7 bb 154 -2 3 bb 132 -2 3 aa 132 +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 @@ -13905,7 +14485,7 @@ id select_type table type possible_keys key key_len ref rows Extra 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 @@ -14007,30 +14587,30 @@ 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 -7 cc 28 14.0000 -7 cc 28 14.0000 3 aa 92 46.0000 -7 bb 126 42.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 -3 bb 40 40.0000 -3 aa 92 46.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 -7 cc 28 14.0000 -7 cc 28 14.0000 3 aa 92 46.0000 -7 bb 126 42.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 -3 bb 40 40.0000 -3 aa 92 46.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 @@ -14085,30 +14665,30 @@ 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 -7 cc 28 30.8000 -7 cc 28 30.8000 3 aa 92 44.0000 -7 bb 126 30.8000 +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 -3 bb 40 44.0000 -3 aa 92 44.0000 +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 -7 cc 28 30.8000 -7 cc 28 30.8000 3 aa 92 44.0000 -7 bb 126 30.8000 +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 -3 bb 40 44.0000 -3 aa 92 44.0000 +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 @@ -14163,30 +14743,30 @@ 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 -7 cc 28 14.0000 -7 cc 28 14.0000 3 aa 92 35.4000 -7 bb 126 36.5000 +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 -3 bb 40 36.5000 -3 aa 92 35.4000 +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 -7 cc 28 14.0000 -7 cc 28 14.0000 3 aa 92 35.4000 -7 bb 126 36.5000 +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 -3 bb 40 36.5000 -3 aa 92 35.4000 +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 @@ -14240,7 +14820,7 @@ EXPLAIN drop table t1,t2; set optimizer_switch= @save_optimizer_switch; # -# MDEV-13369: Optimization for equi-joins of grouping derived tables +# 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) @@ -14893,16 +15473,16 @@ set statement optimizer_switch='split_materialized=off' for select t2.a,t2.b,t2. 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 cc 18 10 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 cc 18 10 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; @@ -15120,36 +15700,36 @@ 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 17 cc cc 10 40 -7 82 y 7 18 aa aa 77 259 -7 82 y 7 18 aa aa 50 259 7 82 y 7 18 aa aa 15 259 -7 82 y 7 18 aa aa 82 259 7 82 y 7 18 aa aa 15 259 7 82 y 7 18 aa aa 20 259 -7 82 y 7 10 bb bb 40 125 -7 82 y 7 10 bb bb 32 125 -7 82 y 7 10 bb bb 30 125 -7 82 y 7 10 bb bb 23 125 +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 17 cc cc 10 40 -7 82 y 7 18 aa aa 77 259 -7 82 y 7 18 aa aa 50 259 7 82 y 7 18 aa aa 15 259 -7 82 y 7 18 aa aa 82 259 7 82 y 7 18 aa aa 15 259 7 82 y 7 18 aa aa 20 259 -7 82 y 7 10 bb bb 40 125 -7 82 y 7 10 bb bb 32 125 -7 82 y 7 10 bb bb 30 125 -7 82 y 7 10 bb bb 23 125 +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; @@ -15234,318 +15814,318 @@ 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) -7 10 x 7 17 cc cc 12 40 -7 10 x 7 17 cc cc 18 40 -7 10 x 7 17 cc cc 10 40 -7 10 x 7 18 aa aa 77 259 -7 10 x 7 18 aa aa 50 259 -7 10 x 7 18 aa aa 15 259 -7 10 x 7 18 aa aa 82 259 -7 10 x 7 18 aa aa 15 259 -7 10 x 7 18 aa aa 20 259 -7 10 x 7 10 bb bb 40 125 -7 10 x 7 10 bb bb 32 125 -7 10 x 7 10 bb bb 30 125 -7 10 x 7 10 bb bb 23 125 -1 20 a 1 14 bb bb 40 125 -1 20 a 1 14 bb bb 32 125 -1 20 a 1 14 bb bb 30 125 1 20 a 1 14 bb bb 23 125 -2 23 b 2 12 aa aa 77 259 -2 23 b 2 12 aa aa 50 259 -2 23 b 2 12 aa aa 15 259 -2 23 b 2 12 aa aa 82 259 -2 23 b 2 12 aa aa 15 259 -2 23 b 2 12 aa aa 20 259 -2 23 b 2 11 aa aa 77 259 -2 23 b 2 11 aa aa 50 259 -2 23 b 2 11 aa aa 15 259 -2 23 b 2 11 aa aa 82 259 -2 23 b 2 11 aa aa 15 259 -2 23 b 2 11 aa aa 20 259 -7 18 z 7 17 cc cc 12 40 -7 18 z 7 17 cc cc 18 40 -7 18 z 7 17 cc cc 10 40 -7 18 z 7 18 aa aa 77 259 -7 18 z 7 18 aa aa 50 259 -7 18 z 7 18 aa aa 15 259 -7 18 z 7 18 aa aa 82 259 -7 18 z 7 18 aa aa 15 259 -7 18 z 7 18 aa aa 20 259 -7 18 z 7 10 bb bb 40 125 -7 18 z 7 10 bb bb 32 125 -7 18 z 7 10 bb bb 30 125 -7 18 z 7 10 bb bb 23 125 -1 30 c 1 14 bb bb 40 125 -1 30 c 1 14 bb bb 32 125 -1 30 c 1 14 bb bb 30 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 -3 15 x 3 11 dd dd 20 32 -3 15 x 3 11 dd dd 12 32 -8 12 t 8 11 aa aa 77 259 -8 12 t 8 11 aa aa 50 259 -8 12 t 8 11 aa aa 15 259 -8 12 t 8 11 aa aa 82 259 -8 12 t 8 11 aa aa 15 259 -8 12 t 8 11 aa aa 20 259 -11 33 a 11 24 bbf bbf 50 165 -11 33 a 11 24 bbf bbf 42 165 -11 33 a 11 24 bbf bbf 40 165 +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 27 ccf ccf 20 70 -17 10 s 17 28 aaf aaf 87 319 -17 10 s 17 28 aaf aaf 60 319 17 10 s 17 28 aaf aaf 25 319 -17 10 s 17 28 aaf aaf 92 319 17 10 s 17 28 aaf aaf 25 319 17 10 s 17 28 aaf aaf 30 319 -17 10 s 17 20 bbf bbf 50 165 -17 10 s 17 20 bbf bbf 42 165 -17 10 s 17 20 bbf bbf 40 165 -17 10 s 17 20 bbf bbf 33 165 -11 20 v 11 24 bbf bbf 50 165 -11 20 v 11 24 bbf bbf 42 165 -11 20 v 11 24 bbf bbf 40 165 -11 20 v 11 24 bbf bbf 33 165 -12 23 y 12 22 aaf aaf 87 319 -12 23 y 12 22 aaf aaf 60 319 -12 23 y 12 22 aaf aaf 25 319 -12 23 y 12 22 aaf aaf 92 319 -12 23 y 12 22 aaf aaf 25 319 -12 23 y 12 22 aaf aaf 30 319 -12 23 y 12 21 aaf aaf 87 319 -12 23 y 12 21 aaf aaf 60 319 -12 23 y 12 21 aaf aaf 25 319 -12 23 y 12 21 aaf aaf 92 319 -12 23 y 12 21 aaf aaf 25 319 -12 23 y 12 21 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 27 ccf ccf 20 70 -17 18 a 17 28 aaf aaf 87 319 -17 18 a 17 28 aaf aaf 60 319 17 18 a 17 28 aaf aaf 25 319 -17 18 a 17 28 aaf aaf 92 319 17 18 a 17 28 aaf aaf 25 319 17 18 a 17 28 aaf aaf 30 319 -17 18 a 17 20 bbf bbf 50 165 -17 18 a 17 20 bbf bbf 42 165 -17 18 a 17 20 bbf bbf 40 165 -17 18 a 17 20 bbf bbf 33 165 -11 30 d 11 24 bbf bbf 50 165 -11 30 d 11 24 bbf bbf 42 165 -11 30 d 11 24 bbf bbf 40 165 -11 30 d 11 24 bbf bbf 33 165 +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 27 ccf ccf 20 70 -17 20 xf 17 28 aaf aaf 87 319 -17 20 xf 17 28 aaf aaf 60 319 17 20 xf 17 28 aaf aaf 25 319 -17 20 xf 17 28 aaf aaf 92 319 17 20 xf 17 28 aaf aaf 25 319 17 20 xf 17 28 aaf aaf 30 319 -17 20 xf 17 20 bbf bbf 50 165 -17 20 xf 17 20 bbf bbf 42 165 -17 20 xf 17 20 bbf bbf 40 165 -17 20 xf 17 20 bbf bbf 33 165 -11 30 af 11 24 bbf bbf 50 165 -11 30 af 11 24 bbf bbf 42 165 -11 30 af 11 24 bbf bbf 40 165 -11 30 af 11 24 bbf bbf 33 165 -12 33 bf 12 22 aaf aaf 87 319 -12 33 bf 12 22 aaf aaf 60 319 -12 33 bf 12 22 aaf aaf 25 319 -12 33 bf 12 22 aaf aaf 92 319 -12 33 bf 12 22 aaf aaf 25 319 -12 33 bf 12 22 aaf aaf 30 319 -12 33 bf 12 21 aaf aaf 87 319 -12 33 bf 12 21 aaf aaf 60 319 -12 33 bf 12 21 aaf aaf 25 319 -12 33 bf 12 21 aaf aaf 92 319 -12 33 bf 12 21 aaf aaf 25 319 -12 33 bf 12 21 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 27 ccf ccf 20 70 -17 28 zf 17 28 aaf aaf 87 319 -17 28 zf 17 28 aaf aaf 60 319 17 28 zf 17 28 aaf aaf 25 319 -17 28 zf 17 28 aaf aaf 92 319 17 28 zf 17 28 aaf aaf 25 319 17 28 zf 17 28 aaf aaf 30 319 -17 28 zf 17 20 bbf bbf 50 165 -17 28 zf 17 20 bbf bbf 42 165 -17 28 zf 17 20 bbf bbf 40 165 -17 28 zf 17 20 bbf bbf 33 165 -13 25 xf 13 21 ddf ddf 30 52 -13 25 xf 13 21 ddf ddf 22 52 -18 22 tf 18 21 aaf aaf 87 319 -18 22 tf 18 21 aaf aaf 60 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 92 319 18 22 tf 18 21 aaf aaf 25 319 18 22 tf 18 21 aaf aaf 30 319 -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) +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 17 cc cc 10 40 -7 10 x 7 18 aa aa 77 259 -7 10 x 7 18 aa aa 50 259 7 10 x 7 18 aa aa 15 259 -7 10 x 7 18 aa aa 82 259 7 10 x 7 18 aa aa 15 259 7 10 x 7 18 aa aa 20 259 -7 10 x 7 10 bb bb 40 125 -7 10 x 7 10 bb bb 32 125 -7 10 x 7 10 bb bb 30 125 -7 10 x 7 10 bb bb 23 125 -1 20 a 1 14 bb bb 40 125 -1 20 a 1 14 bb bb 32 125 -1 20 a 1 14 bb bb 30 125 -1 20 a 1 14 bb bb 23 125 -2 23 b 2 12 aa aa 77 259 -2 23 b 2 12 aa aa 50 259 -2 23 b 2 12 aa aa 15 259 -2 23 b 2 12 aa aa 82 259 -2 23 b 2 12 aa aa 15 259 -2 23 b 2 12 aa aa 20 259 -2 23 b 2 11 aa aa 77 259 -2 23 b 2 11 aa aa 50 259 -2 23 b 2 11 aa aa 15 259 -2 23 b 2 11 aa aa 82 259 -2 23 b 2 11 aa aa 15 259 -2 23 b 2 11 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 17 cc cc 10 40 -7 18 z 7 18 aa aa 77 259 -7 18 z 7 18 aa aa 50 259 7 18 z 7 18 aa aa 15 259 -7 18 z 7 18 aa aa 82 259 7 18 z 7 18 aa aa 15 259 7 18 z 7 18 aa aa 20 259 -7 18 z 7 10 bb bb 40 125 -7 18 z 7 10 bb bb 32 125 -7 18 z 7 10 bb bb 30 125 -7 18 z 7 10 bb bb 23 125 -1 30 c 1 14 bb bb 40 125 -1 30 c 1 14 bb bb 32 125 -1 30 c 1 14 bb bb 30 125 -1 30 c 1 14 bb bb 23 125 -3 15 x 3 11 dd dd 20 32 -3 15 x 3 11 dd dd 12 32 -8 12 t 8 11 aa aa 77 259 -8 12 t 8 11 aa aa 50 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 82 259 8 12 t 8 11 aa aa 15 259 8 12 t 8 11 aa aa 20 259 -11 33 a 11 24 bbf bbf 50 165 -11 33 a 11 24 bbf bbf 42 165 -11 33 a 11 24 bbf bbf 40 165 +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 27 ccf ccf 20 70 -17 10 s 17 28 aaf aaf 87 319 -17 10 s 17 28 aaf aaf 60 319 17 10 s 17 28 aaf aaf 25 319 -17 10 s 17 28 aaf aaf 92 319 17 10 s 17 28 aaf aaf 25 319 17 10 s 17 28 aaf aaf 30 319 -17 10 s 17 20 bbf bbf 50 165 -17 10 s 17 20 bbf bbf 42 165 -17 10 s 17 20 bbf bbf 40 165 -17 10 s 17 20 bbf bbf 33 165 -11 20 v 11 24 bbf bbf 50 165 -11 20 v 11 24 bbf bbf 42 165 -11 20 v 11 24 bbf bbf 40 165 -11 20 v 11 24 bbf bbf 33 165 -12 23 y 12 22 aaf aaf 87 319 -12 23 y 12 22 aaf aaf 60 319 -12 23 y 12 22 aaf aaf 25 319 -12 23 y 12 22 aaf aaf 92 319 -12 23 y 12 22 aaf aaf 25 319 -12 23 y 12 22 aaf aaf 30 319 -12 23 y 12 21 aaf aaf 87 319 -12 23 y 12 21 aaf aaf 60 319 -12 23 y 12 21 aaf aaf 25 319 -12 23 y 12 21 aaf aaf 92 319 -12 23 y 12 21 aaf aaf 25 319 -12 23 y 12 21 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 27 ccf ccf 20 70 -17 18 a 17 28 aaf aaf 87 319 -17 18 a 17 28 aaf aaf 60 319 17 18 a 17 28 aaf aaf 25 319 -17 18 a 17 28 aaf aaf 92 319 17 18 a 17 28 aaf aaf 25 319 17 18 a 17 28 aaf aaf 30 319 -17 18 a 17 20 bbf bbf 50 165 -17 18 a 17 20 bbf bbf 42 165 -17 18 a 17 20 bbf bbf 40 165 -17 18 a 17 20 bbf bbf 33 165 -11 30 d 11 24 bbf bbf 50 165 -11 30 d 11 24 bbf bbf 42 165 -11 30 d 11 24 bbf bbf 40 165 -11 30 d 11 24 bbf bbf 33 165 +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 27 ccf ccf 20 70 -17 20 xf 17 28 aaf aaf 87 319 -17 20 xf 17 28 aaf aaf 60 319 17 20 xf 17 28 aaf aaf 25 319 -17 20 xf 17 28 aaf aaf 92 319 17 20 xf 17 28 aaf aaf 25 319 17 20 xf 17 28 aaf aaf 30 319 -17 20 xf 17 20 bbf bbf 50 165 -17 20 xf 17 20 bbf bbf 42 165 -17 20 xf 17 20 bbf bbf 40 165 -17 20 xf 17 20 bbf bbf 33 165 -11 30 af 11 24 bbf bbf 50 165 -11 30 af 11 24 bbf bbf 42 165 -11 30 af 11 24 bbf bbf 40 165 -11 30 af 11 24 bbf bbf 33 165 -12 33 bf 12 22 aaf aaf 87 319 -12 33 bf 12 22 aaf aaf 60 319 -12 33 bf 12 22 aaf aaf 25 319 -12 33 bf 12 22 aaf aaf 92 319 -12 33 bf 12 22 aaf aaf 25 319 -12 33 bf 12 22 aaf aaf 30 319 -12 33 bf 12 21 aaf aaf 87 319 -12 33 bf 12 21 aaf aaf 60 319 -12 33 bf 12 21 aaf aaf 25 319 -12 33 bf 12 21 aaf aaf 92 319 -12 33 bf 12 21 aaf aaf 25 319 -12 33 bf 12 21 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 27 ccf ccf 20 70 -17 28 zf 17 28 aaf aaf 87 319 -17 28 zf 17 28 aaf aaf 60 319 17 28 zf 17 28 aaf aaf 25 319 -17 28 zf 17 28 aaf aaf 92 319 17 28 zf 17 28 aaf aaf 25 319 17 28 zf 17 28 aaf aaf 30 319 -17 28 zf 17 20 bbf bbf 50 165 -17 28 zf 17 20 bbf bbf 42 165 -17 28 zf 17 20 bbf bbf 40 165 -17 28 zf 17 20 bbf bbf 33 165 -13 25 xf 13 21 ddf ddf 30 52 -13 25 xf 13 21 ddf ddf 22 52 -18 22 tf 18 21 aaf aaf 87 319 -18 22 tf 18 21 aaf aaf 60 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 92 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; @@ -15892,31 +16472,31 @@ 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 -1.0000000000 9.0000000000 -1.0000000000 9.0000000000 -1.0000000000 8.0000000000 -1.0000000000 0.0000000000 -1.0000000000 9.0000000000 +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 8.0000000000 -0.0000000000 0.0000000000 0.0000000000 9.0000000000 0.0000000000 9.0000000000 0.0000000000 9.0000000000 -0.0000000000 8.0000000000 -0.0000000000 0.0000000000 0.0000000000 9.0000000000 0.0000000000 9.0000000000 0.0000000000 9.0000000000 -0.0000000000 8.0000000000 -0.0000000000 0.0000000000 0.0000000000 9.0000000000 0.0000000000 9.0000000000 0.0000000000 9.0000000000 -0.0000000000 8.0000000000 -0.0000000000 0.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) @@ -15961,586 +16541,6 @@ f c DROP VIEW v1; 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; -# Start of 10.3 tests -# # MDEV-16801: splittable materialized derived/views with # one grouping field from table without keys # @@ -16634,3 +16634,4 @@ id username id userid logindate 2 user2 3 2 2017-06-19 12:17:02 set join_cache_level=default; DROP TABLE t1,t2; +# End of 10.3 tests |