You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2070 lines
62 KiB

15 years ago
Back-ported the patch of the mysql-5.6 code line that fixed several defects in the greedy optimization: 1) The greedy optimizer calculated the 'compare-cost' (CPU-cost) for iterating over the partial plan result at each level in the query plan as 'record_count / (double) TIME_FOR_COMPARE' This cost was only used locally for 'best' calculation at each level, and *not* accumulated into the total cost for the query plan. This fix added the 'CPU-cost' of processing 'current_record_count' records at each level to 'current_read_time' *before* it is used as 'accumulated cost' argument to recursive best_extension_by_limited_search() calls. This ensured that the cost of a huge join-fanout early in the QEP was correctly reflected in the cost of the final QEP. To get identical cost for a 'best' optimized query and a straight_join with the same join order, the same change was also applied to optimize_straight_join() and get_partial_join_cost() 2) Furthermore to get equal cost for 'best' optimized query and a straight_join the new code substrcated the same '0.001' in optimize_straight_join() as it had been already done in best_extension_by_limited_search() 3) When best_extension_by_limited_search() aggregated the 'best' plan a plan was 'best' by the check : 'if ((search_depth == 1) || (current_read_time < join->best_read))' The term '(search_depth == 1' incorrectly caused a new best plan to be collected whenever the specified 'search_depth' was reached - even if this partial query plan was more expensive than what we had already found.
14 years ago
Back-ported the patch of the mysql-5.6 code line that fixed several defects in the greedy optimization: 1) The greedy optimizer calculated the 'compare-cost' (CPU-cost) for iterating over the partial plan result at each level in the query plan as 'record_count / (double) TIME_FOR_COMPARE' This cost was only used locally for 'best' calculation at each level, and *not* accumulated into the total cost for the query plan. This fix added the 'CPU-cost' of processing 'current_record_count' records at each level to 'current_read_time' *before* it is used as 'accumulated cost' argument to recursive best_extension_by_limited_search() calls. This ensured that the cost of a huge join-fanout early in the QEP was correctly reflected in the cost of the final QEP. To get identical cost for a 'best' optimized query and a straight_join with the same join order, the same change was also applied to optimize_straight_join() and get_partial_join_cost() 2) Furthermore to get equal cost for 'best' optimized query and a straight_join the new code substrcated the same '0.001' in optimize_straight_join() as it had been already done in best_extension_by_limited_search() 3) When best_extension_by_limited_search() aggregated the 'best' plan a plan was 'best' by the check : 'if ((search_depth == 1) || (current_read_time < join->best_read))' The term '(search_depth == 1' incorrectly caused a new best plan to be collected whenever the specified 'search_depth' was reached - even if this partial query plan was more expensive than what we had already found.
14 years ago
Back-ported the patch of the mysql-5.6 code line that fixed several defects in the greedy optimization: 1) The greedy optimizer calculated the 'compare-cost' (CPU-cost) for iterating over the partial plan result at each level in the query plan as 'record_count / (double) TIME_FOR_COMPARE' This cost was only used locally for 'best' calculation at each level, and *not* accumulated into the total cost for the query plan. This fix added the 'CPU-cost' of processing 'current_record_count' records at each level to 'current_read_time' *before* it is used as 'accumulated cost' argument to recursive best_extension_by_limited_search() calls. This ensured that the cost of a huge join-fanout early in the QEP was correctly reflected in the cost of the final QEP. To get identical cost for a 'best' optimized query and a straight_join with the same join order, the same change was also applied to optimize_straight_join() and get_partial_join_cost() 2) Furthermore to get equal cost for 'best' optimized query and a straight_join the new code substrcated the same '0.001' in optimize_straight_join() as it had been already done in best_extension_by_limited_search() 3) When best_extension_by_limited_search() aggregated the 'best' plan a plan was 'best' by the check : 'if ((search_depth == 1) || (current_read_time < join->best_read))' The term '(search_depth == 1' incorrectly caused a new best plan to be collected whenever the specified 'search_depth' was reached - even if this partial query plan was more expensive than what we had already found.
14 years ago
Fix LP BUG#718593 Analysis: Build_equal_items_for_cond() rewrites the WHERE clause in such a way, that it may merge the list join->cond_equal->current_level with the list of child Items in an AND condition of the WHERE clause. The place where this is done is: static COND *build_equal_items_for_cond(THD *thd, COND *cond, COND_EQUAL *inherited) { ... if (and_level) { args->concat(&eq_list); args->concat((List<Item> *)&cond_equal.current_level); } ... } As a result, later transformations on the WHERE clause may change the structure of the list join->cond_equal->current_level without knowing this. Specifically in this bug, Item_in_subselect::inject_in_to_exists_cond creates a new AND of the old WHERE clause and the IN->EXISTS conditions. It then calls fix_fields() for the new AND. Among other things, fix_fields flattens all nested ANDs into one by merging the AND argument lists. When there is a cond_equal for the JOIN, its list of Item_equal objects is attached to the end of the original AND. When a lower-level AND is merged into the top-level one, the argument list of the lower-level AND is concatenated to the list of multiple equalities in the upper-level AND. As a result, when substitute_for_best_equal_field processes the multiple equalities, it turns out that the multiple equality list contains the Items from the lower-level AND which were concatenated to the end of the join->cond_equal->current_level list. This results in a crash because this list must not contain any other Items except for the previously found Item_equal ones. Solution: When performing IN->EXIST predicate injection, and the where clause is an AND, detach the list of Item_equal objects before calling fix_fields on the injected where clause. After fix_fields is done, reattach back the multiple equalities list to the end of the argument list of the new AND.
15 years ago
Fixed lp:879939 "assertion in ha_maria::enable_indexes with derived_with_keys=on" Honor unique/not unique when creating keys for internal tempory tables. Added new variables to be used to limit how keys are created for internal temporary tables. include/maria.h: Added maria_max_key_length() and maria_max_key_segments() include/myisam.h: Added myisam_max_key_length() and myisam_max_key_segments() mysql-test/r/mysql.result: Drop all used tables mysql-test/r/subselect4.result: Added test case for lp:879939 mysql-test/t/mysql.test: Drop all used tables mysql-test/t/subselect4.test: Added test case for lp:879939 sql/mysql_priv.h: Added internal_tmp_table_max_key_length and internal_tmp_table_max_key_segments to be used to limit how keys for derived tables are created. sql/mysqld.cc: Added internal_tmp_table_max_key_length and internal_tmp_table_max_key_segments to be used to limit how keys for derived tables are created. sql/share/errmsg.txt: Added new error message for internal errors sql/sql_select.cc: Give error if we try to create a wrong key (this error should never happen) Honor unique/not unique when creating keys for internal tempory tables. storage/maria/ha_maria.cc: Added change_table_ptr() to ensure that external_ref points always to the correct table. (Not having this caused an assert in the included test) storage/maria/ha_maria.h: Added change_table_ptr() to ensure that external_ref points always to the correct table. storage/maria/ma_check.c: Fixed bug in Duplicate key error printing (now row position is printed correctly) storage/maria/ma_create.c: maria_max_key_length() -> _ma_max_key_length() storage/maria/ma_info.c: Added extern function maria_max_key_length() to calculate the max key length based on current block size. storage/maria/ma_open.c: maria_max_key_length() -> _ma_max_key_length() storage/maria/maria_def.h: maria_max_key_length() -> _ma_max_key_length() storage/myisam/ha_myisam.cc: Added change_table_ptr() to ensure that external_ref points always to the correct table. (Not having this caused an assert in the included test) storage/myisam/ha_myisam.h: Added change_table_ptr() to ensure that external_ref points always to the correct table.
14 years ago
13 years ago
Fixed lp:879939 "assertion in ha_maria::enable_indexes with derived_with_keys=on" Honor unique/not unique when creating keys for internal tempory tables. Added new variables to be used to limit how keys are created for internal temporary tables. include/maria.h: Added maria_max_key_length() and maria_max_key_segments() include/myisam.h: Added myisam_max_key_length() and myisam_max_key_segments() mysql-test/r/mysql.result: Drop all used tables mysql-test/r/subselect4.result: Added test case for lp:879939 mysql-test/t/mysql.test: Drop all used tables mysql-test/t/subselect4.test: Added test case for lp:879939 sql/mysql_priv.h: Added internal_tmp_table_max_key_length and internal_tmp_table_max_key_segments to be used to limit how keys for derived tables are created. sql/mysqld.cc: Added internal_tmp_table_max_key_length and internal_tmp_table_max_key_segments to be used to limit how keys for derived tables are created. sql/share/errmsg.txt: Added new error message for internal errors sql/sql_select.cc: Give error if we try to create a wrong key (this error should never happen) Honor unique/not unique when creating keys for internal tempory tables. storage/maria/ha_maria.cc: Added change_table_ptr() to ensure that external_ref points always to the correct table. (Not having this caused an assert in the included test) storage/maria/ha_maria.h: Added change_table_ptr() to ensure that external_ref points always to the correct table. storage/maria/ma_check.c: Fixed bug in Duplicate key error printing (now row position is printed correctly) storage/maria/ma_create.c: maria_max_key_length() -> _ma_max_key_length() storage/maria/ma_info.c: Added extern function maria_max_key_length() to calculate the max key length based on current block size. storage/maria/ma_open.c: maria_max_key_length() -> _ma_max_key_length() storage/maria/maria_def.h: maria_max_key_length() -> _ma_max_key_length() storage/myisam/ha_myisam.cc: Added change_table_ptr() to ensure that external_ref points always to the correct table. (Not having this caused an assert in the included test) storage/myisam/ha_myisam.h: Added change_table_ptr() to ensure that external_ref points always to the correct table.
14 years ago
  1. # General purpose bug fix tests go here : subselect.test too large
  2. --disable_warnings
  3. drop table if exists t0,t1,t2,t3,t4,t5,t6;
  4. drop view if exists v1, v2;
  5. --enable_warnings
  6. set @subselect4_tmp= @@optimizer_switch;
  7. set optimizer_switch='semijoin=on,firstmatch=on,loosescan=on';
  8. set optimizer_switch='semijoin_with_cache=on';
  9. set optimizer_switch='mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
  10. --echo #
  11. --echo # Bug #46791: Assertion failed:(table->key_read==0),function unknown
  12. --echo # function,file sql_base.cc
  13. --echo #
  14. CREATE TABLE t1 (a INT, b INT, KEY(a));
  15. INSERT INTO t1 VALUES (1,1),(2,2);
  16. CREATE TABLE t2 LIKE t1;
  17. INSERT INTO t2 VALUES (1,1),(2,2);
  18. CREATE TABLE t3 LIKE t1;
  19. --echo # should have 1 impossible where and 2 dependent subqueries
  20. EXPLAIN
  21. SELECT 1 FROM t1
  22. WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
  23. ORDER BY count(*);
  24. --echo # should not crash the next statement
  25. SELECT 1 FROM t1
  26. WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
  27. ORDER BY count(*);
  28. --echo # should not crash: the crash is caused by the previous statement
  29. SELECT 1;
  30. DROP TABLE t1,t2,t3;
  31. --echo #
  32. --echo # Bug #47106: Crash / segfault on adding EXPLAIN to a non-crashing
  33. --echo # query
  34. --echo #
  35. CREATE TABLE t1 (
  36. a INT,
  37. b INT,
  38. PRIMARY KEY (a),
  39. KEY b (b)
  40. );
  41. INSERT INTO t1 VALUES (1, 1), (2, 1);
  42. CREATE TABLE t2 LIKE t1;
  43. INSERT INTO t2 SELECT * FROM t1;
  44. CREATE TABLE t3 LIKE t1;
  45. INSERT INTO t3 SELECT * FROM t1;
  46. --echo # Should not crash.
  47. --echo # Should have 1 impossible where and 2 dependent subqs.
  48. EXPLAIN
  49. SELECT
  50. (SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
  51. FROM t3 WHERE 1 = 0 GROUP BY 1;
  52. --echo # should return 0 rows
  53. SELECT
  54. (SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
  55. FROM t3 WHERE 1 = 0 GROUP BY 1;
  56. DROP TABLE t1,t2,t3;
  57. --echo End of 5.0 tests.
  58. #
  59. # Fix for LP#612894
  60. # Some aggregate functions (such as MIN MAX) work incorrectly in subqueries
  61. # after getting NULL value
  62. #
  63. CREATE TABLE t1 (col_int_nokey int(11) NOT NULL, col_varchar_nokey varchar(1) NOT NULL) engine=myisam;
  64. INSERT INTO t1 VALUES (2,'s'),(0,'v'),(2,'s');
  65. CREATE TABLE t2 (
  66. pk int(11) NOT NULL AUTO_INCREMENT,
  67. `col_int_key` int(11) NOT NULL,
  68. col_varchar_key varchar(1) NOT NULL,
  69. PRIMARY KEY (pk),
  70. KEY `col_int_key` (`col_int_key`),
  71. KEY `col_varchar_key` (`col_varchar_key`)
  72. ) ENGINE=MyISAM;
  73. INSERT INTO t2 VALUES (4,10,'g'), (5,20,'v');
  74. SELECT t1.col_int_nokey,(SELECT MIN( t2_a.col_int_key ) FROM t2 t2_a, t2 t2_b, t1 t1_a WHERE t1_a.col_varchar_nokey = t2_b.col_varchar_key and t1.col_int_nokey ) as sub FROM t1;
  75. SELECT t1.col_int_nokey,(SELECT MIN( t2_a.col_int_key ) +1 FROM t2 t2_a, t2 t2_b, t1 t1_a WHERE t1_a.col_varchar_nokey = t2_b.col_varchar_key and t1.col_int_nokey ) as sub FROM t1;
  76. DROP TABLE t1,t2;
  77. --echo #
  78. --echo # Bug#54568: create view cause Assertion failed: 0,
  79. --echo # file .\item_subselect.cc, line 836
  80. --echo #
  81. EXPLAIN SELECT 1 LIKE ( 1 IN ( SELECT 1 ) );
  82. DESCRIBE SELECT 1 LIKE ( 1 IN ( SELECT 1 ) );
  83. --echo # None of the below should crash
  84. CREATE VIEW v1 AS SELECT 1 LIKE ( 1 IN ( SELECT 1 ) );
  85. CREATE VIEW v2 AS SELECT 1 LIKE '%' ESCAPE ( 1 IN ( SELECT 1 ) );
  86. DROP VIEW v1, v2;
  87. --echo #
  88. --echo # Bug#51070: Query with a NOT IN subquery predicate returns a wrong
  89. --echo # result set
  90. --echo #
  91. CREATE TABLE t1 ( a INT, b INT );
  92. INSERT INTO t1 VALUES ( 1, NULL ), ( 2, NULL );
  93. CREATE TABLE t2 ( c INT, d INT );
  94. INSERT INTO t2 VALUES ( NULL, 3 ), ( NULL, 4 );
  95. CREATE TABLE t3 ( e INT, f INT );
  96. INSERT INTO t3 VALUES ( NULL, NULL ), ( NULL, NULL );
  97. CREATE TABLE t4 ( a INT );
  98. INSERT INTO t4 VALUES (1), (2), (3);
  99. CREATE TABLE t5 ( a INT );
  100. INSERT INTO t5 VALUES (NULL), (2);
  101. SET @old_optimizer_switch = @@session.optimizer_switch;
  102. SET SESSION optimizer_switch = 'materialization=off,in_to_exists=on,semijoin=off';
  103. --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x
  104. EXPLAIN
  105. SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 );
  106. SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 );
  107. EXPLAIN
  108. SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ) IS NULL;
  109. SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ) IS NULL;
  110. SELECT * FROM t1 WHERE ( a, b ) IN ( SELECT c, d FROM t2 ) IS NULL;
  111. SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT c, d FROM t2 ) IS UNKNOWN;
  112. SELECT * FROM t1 WHERE (( a, b ) NOT IN ( SELECT c, d FROM t2 )) IS UNKNOWN;
  113. SELECT * FROM t1 WHERE 1 = 1 AND ( a, b ) NOT IN ( SELECT c, d FROM t2 );
  114. --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x
  115. EXPLAIN
  116. SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT e, f FROM t3 );
  117. SELECT * FROM t1 WHERE ( a, b ) NOT IN ( SELECT e, f FROM t3 );
  118. --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x
  119. EXPLAIN
  120. SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT a, b FROM t1 );
  121. SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT a, b FROM t1 );
  122. --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x
  123. EXPLAIN
  124. SELECT * FROM t3 WHERE ( e, f ) NOT IN ( SELECT c, d FROM t2 );
  125. SELECT * FROM t3 WHERE ( e, f ) NOT IN ( SELECT c, d FROM t2 );
  126. --replace_column 1 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x
  127. EXPLAIN
  128. SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT e, f FROM t3 );
  129. SELECT * FROM t2 WHERE ( c, d ) NOT IN ( SELECT e, f FROM t3 );
  130. SELECT * FROM t1 WHERE ( a, b ) NOT IN
  131. ( SELECT c, d FROM t2 WHERE c = 1 AND c <> 1 );
  132. SELECT * FROM t1 WHERE b NOT IN ( SELECT c FROM t2 WHERE c = 1 );
  133. SELECT * FROM t1 WHERE NULL NOT IN ( SELECT c FROM t2 WHERE c = 1 AND c <> 1 );
  134. SET SESSION optimizer_switch = @old_optimizer_switch;
  135. DROP TABLE t1, t2, t3, t4, t5;
  136. --echo #
  137. --echo # Bug#58207: invalid memory reads when using default column value and
  138. --echo # tmptable needed
  139. --echo #
  140. CREATE TABLE t(a VARCHAR(245) DEFAULT
  141. 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
  142. INSERT INTO t VALUES (''),(''),(''),(''),(''),(''),(''),(''),(''),(''),('');
  143. SELECT * FROM (SELECT default(a) FROM t GROUP BY a) d;
  144. DROP TABLE t;
  145. --echo #
  146. --echo # LP BUG#1009187, MDEV-373, MYSQL bug#58628
  147. --echo # Wrong result for a query with [NOT] IN subquery predicate if
  148. --echo # the left part of the predicate is explicit NULL
  149. --echo #
  150. CREATE TABLE t1 (pk INT NOT NULL, i INT NOT NULL);
  151. INSERT INTO t1 VALUES (0,10), (1,20), (2,30), (3,40);
  152. CREATE TABLE t2a (pk INT NOT NULL, i INT NOT NULL, PRIMARY KEY(i,pk));
  153. INSERT INTO t2a VALUES (0,0), (1,1), (2,2), (3,3);
  154. CREATE TABLE t2b (pk INT, i INT);
  155. INSERT INTO t2b VALUES (0,0), (1,1), (2,2), (3,3);
  156. CREATE TABLE t2c (pk INT NOT NULL, i INT NOT NULL);
  157. INSERT INTO t2c VALUES (0,0), (1,1), (2,2), (3,3);
  158. create index it2c on t2c (i,pk);
  159. CREATE TABLE t2d (pk INT NOT NULL, i INT NOT NULL, PRIMARY KEY(i));
  160. INSERT INTO t2d VALUES (0,0), (1,1), (2,2), (3,3);
  161. EXPLAIN
  162. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2a.i FROM t2a WHERE t2a.pk = t1.pk);
  163. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2a.i FROM t2a WHERE t2a.pk = t1.pk);
  164. SELECT * FROM t1 WHERE 1+NULL NOT IN (SELECT t2a.i FROM t2a WHERE t2a.pk = t1.pk);
  165. SELECT * FROM t1 WHERE NULL IN (SELECT t2a.i FROM t2a WHERE t2a.pk = t1.pk) IS UNKNOWN;
  166. SELECT t1.pk, NULL NOT IN (SELECT t2a.i FROM t2a WHERE t2a.pk = t1.pk) FROM t1;
  167. EXPLAIN
  168. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2b.i FROM t2b WHERE t2b.pk = t1.pk);
  169. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2b.i FROM t2b WHERE t2b.pk = t1.pk);
  170. SELECT * FROM t1 WHERE NULL IN (SELECT t2b.i FROM t2b WHERE t2b.pk = t1.pk) IS UNKNOWN;
  171. SELECT t1.pk, NULL NOT IN (SELECT t2b.i FROM t2b WHERE t2b.pk = t1.pk) FROM t1;
  172. EXPLAIN
  173. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2c.i FROM t2c WHERE t2c.pk = t1.pk);
  174. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2c.i FROM t2c WHERE t2c.pk = t1.pk);
  175. SELECT * FROM t1 WHERE NULL IN (SELECT t2c.i FROM t2c WHERE t2c.pk = t1.pk) IS UNKNOWN;
  176. SELECT t1.pk, NULL NOT IN (SELECT t2c.i FROM t2c WHERE t2c.pk = t1.pk) FROM t1;
  177. EXPLAIN
  178. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2d.i FROM t2d WHERE t2d.pk = t1.pk);
  179. SELECT * FROM t1 WHERE NULL NOT IN (SELECT t2d.i FROM t2d WHERE t2d.pk = t1.pk);
  180. SELECT * FROM t1 WHERE NULL IN (SELECT t2d.i FROM t2d WHERE t2d.pk = t1.pk) IS UNKNOWN;
  181. SELECT t1.pk, NULL NOT IN (SELECT t2d.i FROM t2d WHERE t2d.pk = t1.pk) FROM t1;
  182. EXPLAIN
  183. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2a.i, t2a.pk FROM t2a WHERE t2a.pk = t1.pk);
  184. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2a.i, t2a.pk FROM t2a WHERE t2a.pk = t1.pk);
  185. SELECT (NULL, 1) NOT IN (SELECT t2a.i, t2a.pk FROM t2a WHERE t2a.pk = t1.pk) from t1;
  186. EXPLAIN
  187. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2b.i, t2b.pk FROM t2b WHERE t2b.pk = t1.pk);
  188. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2b.i, t2b.pk FROM t2b WHERE t2b.pk = t1.pk);
  189. SELECT (NULL, 1) NOT IN (SELECT t2b.i, t2b.pk FROM t2b WHERE t2b.pk = t1.pk) from t1;
  190. EXPLAIN
  191. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2c.i, t2c.pk FROM t2c WHERE t2c.pk = t1.pk);
  192. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2c.i, t2c.pk FROM t2c WHERE t2c.pk = t1.pk);
  193. SELECT (NULL, 1) NOT IN (SELECT t2c.i, t2c.pk FROM t2c WHERE t2c.pk = t1.pk) from t1;
  194. EXPLAIN
  195. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2d.i, t2d.pk FROM t2d WHERE t2d.pk = t1.pk);
  196. SELECT * FROM t1 WHERE (NULL, 1) NOT IN (SELECT t2d.i, t2d.pk FROM t2d WHERE t2d.pk = t1.pk);
  197. SELECT (NULL, 1) NOT IN (SELECT t2d.i, t2d.pk FROM t2d WHERE t2d.pk = t1.pk) from t1;
  198. drop table t1, t2a, t2b, t2c, t2d;
  199. --echo #
  200. --echo # End of 5.1 tests.
  201. --echo #
  202. --echo #
  203. --echo # BUG#46743 "Azalea processing correlated, aggregate SELECT
  204. --echo # subqueries incorrectly"
  205. --echo #
  206. CREATE TABLE t1 (c int);
  207. INSERT INTO t1 VALUES (NULL);
  208. CREATE TABLE t2 (d int , KEY (d)); # index is needed for bug
  209. INSERT INTO t2 VALUES (NULL),(NULL); # two rows needed for bug
  210. # we see that subquery returns 0 rows
  211. --echo 0 rows in subquery
  212. SELECT 1 AS RESULT FROM t2,t1 WHERE d = c;
  213. # so here it ends up as NULL
  214. --echo base query
  215. SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 ;
  216. EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 ;
  217. --echo first equivalent variant
  218. SELECT (SELECT 1 FROM t2 WHERE d = IFNULL(c,NULL)) AS RESULT FROM t1 GROUP BY c ;
  219. EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = IFNULL(c,NULL)) AS RESULT FROM t1 GROUP BY c;
  220. --echo second equivalent variant
  221. # used to fail with 1242: Subquery returns more than 1 row
  222. SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 GROUP BY c ;
  223. EXPLAIN EXTENDED SELECT (SELECT 1 FROM t2 WHERE d = c) AS RESULT FROM t1 GROUP BY c ;
  224. DROP TABLE t1,t2;
  225. --echo #
  226. --echo # BUG#45928 "Differing query results depending on MRR and
  227. --echo # engine_condition_pushdown settings"
  228. --echo #
  229. CREATE TABLE `t1` (
  230. `pk` int(11) NOT NULL AUTO_INCREMENT,
  231. `time_nokey` time NOT NULL,
  232. `varchar_key` varchar(1) NOT NULL,
  233. `varchar_nokey` varchar(1) NOT NULL,
  234. PRIMARY KEY (`pk`),
  235. KEY `varchar_key` (`varchar_key`)
  236. ) AUTO_INCREMENT=12 DEFAULT CHARSET=latin1;
  237. INSERT INTO `t1` VALUES (10,'00:00:00','i','i'),(11,'00:00:00','','');
  238. set @old_optimizer_switch = @@session.optimizer_switch,
  239. @old_engine_condition_pushdown = @@session.engine_condition_pushdown;
  240. SET SESSION OPTIMIZER_SWITCH = 'materialization=off,semijoin=off,loosescan=off,firstmatch=off,mrr=on';
  241. SET SESSION engine_condition_pushdown = 1;
  242. SELECT `time_nokey` G1 FROM t1 WHERE ( `varchar_nokey` , `varchar_key` ) IN (
  243. SELECT `varchar_nokey` , `varchar_nokey` ) AND `varchar_key` >= 'c' HAVING G1 ORDER
  244. BY `pk` ;
  245. set @@session.optimizer_switch = @old_optimizer_switch,
  246. @@session.engine_condition_pushdown = @old_engine_condition_pushdown;
  247. DROP TABLE t1;
  248. --echo #
  249. --echo # During work with BUG#45863 I had problems with a query that was
  250. --echo # optimized differently in regular and prepared mode.
  251. --echo # Because there was a bug in one of the selected strategies, I became
  252. --echo # aware of the problem. Adding an EXPLAIN query to catch this.
  253. --disable_warnings
  254. DROP TABLE IF EXISTS t1, t2, t3;
  255. --enable_warnings
  256. CREATE TABLE t1
  257. (EMPNUM CHAR(3) NOT NULL,
  258. EMPNAME CHAR(20),
  259. GRADE DECIMAL(4),
  260. CITY CHAR(15));
  261. CREATE TABLE t2
  262. (PNUM CHAR(3) NOT NULL,
  263. PNAME CHAR(20),
  264. PTYPE CHAR(6),
  265. BUDGET DECIMAL(9),
  266. CITY CHAR(15));
  267. CREATE TABLE t3
  268. (EMPNUM CHAR(3) NOT NULL,
  269. PNUM CHAR(3) NOT NULL,
  270. HOURS DECIMAL(5));
  271. INSERT INTO t1 VALUES ('E1','Alice',12,'Deale');
  272. INSERT INTO t1 VALUES ('E2','Betty',10,'Vienna');
  273. INSERT INTO t1 VALUES ('E3','Carmen',13,'Vienna');
  274. INSERT INTO t1 VALUES ('E4','Don',12,'Deale');
  275. INSERT INTO t1 VALUES ('E5','Ed',13,'Akron');
  276. INSERT INTO t2 VALUES ('P1','MXSS','Design',10000,'Deale');
  277. INSERT INTO t2 VALUES ('P2','CALM','Code',30000,'Vienna');
  278. INSERT INTO t2 VALUES ('P3','SDP','Test',30000,'Tampa');
  279. INSERT INTO t2 VALUES ('P4','SDP','Design',20000,'Deale');
  280. INSERT INTO t2 VALUES ('P5','IRM','Test',10000,'Vienna');
  281. INSERT INTO t2 VALUES ('P6','PAYR','Design',50000,'Deale');
  282. INSERT INTO t3 VALUES ('E1','P1',40);
  283. INSERT INTO t3 VALUES ('E1','P2',20);
  284. INSERT INTO t3 VALUES ('E1','P3',80);
  285. INSERT INTO t3 VALUES ('E1','P4',20);
  286. INSERT INTO t3 VALUES ('E1','P5',12);
  287. INSERT INTO t3 VALUES ('E1','P6',12);
  288. INSERT INTO t3 VALUES ('E2','P1',40);
  289. INSERT INTO t3 VALUES ('E2','P2',80);
  290. INSERT INTO t3 VALUES ('E3','P2',20);
  291. INSERT INTO t3 VALUES ('E4','P2',20);
  292. INSERT INTO t3 VALUES ('E4','P4',40);
  293. INSERT INTO t3 VALUES ('E4','P5',80);
  294. SET @old_optimizer_switch = @@session.optimizer_switch;
  295. SET @old_join_cache_level = @@session.join_cache_level;
  296. SET SESSION optimizer_switch = 'firstmatch=on,loosescan=on,materialization=on,in_to_exists=off,semijoin=on';
  297. SET SESSION join_cache_level = 1;
  298. CREATE UNIQUE INDEX t1_IDX ON t1(EMPNUM);
  299. EXPLAIN SELECT EMPNAME
  300. FROM t1
  301. WHERE EMPNUM IN
  302. (SELECT EMPNUM
  303. FROM t3
  304. WHERE PNUM IN
  305. (SELECT PNUM
  306. FROM t2
  307. WHERE PTYPE = 'Design'));
  308. PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
  309. FROM t1
  310. WHERE EMPNUM IN
  311. (SELECT EMPNUM
  312. FROM t3
  313. WHERE PNUM IN
  314. (SELECT PNUM
  315. FROM t2
  316. WHERE PTYPE = 'Design'))";
  317. EXECUTE stmt;
  318. EXECUTE stmt;
  319. DEALLOCATE PREPARE stmt;
  320. DROP INDEX t1_IDX ON t1;
  321. CREATE INDEX t1_IDX ON t1(EMPNUM);
  322. EXPLAIN SELECT EMPNAME
  323. FROM t1
  324. WHERE EMPNUM IN
  325. (SELECT EMPNUM
  326. FROM t3
  327. WHERE PNUM IN
  328. (SELECT PNUM
  329. FROM t2
  330. WHERE PTYPE = 'Design'));
  331. PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
  332. FROM t1
  333. WHERE EMPNUM IN
  334. (SELECT EMPNUM
  335. FROM t3
  336. WHERE PNUM IN
  337. (SELECT PNUM
  338. FROM t2
  339. WHERE PTYPE = 'Design'))";
  340. EXECUTE stmt;
  341. EXECUTE stmt;
  342. DEALLOCATE PREPARE stmt;
  343. DROP INDEX t1_IDX ON t1;
  344. EXPLAIN SELECT EMPNAME
  345. FROM t1
  346. WHERE EMPNUM IN
  347. (SELECT EMPNUM
  348. FROM t3
  349. WHERE PNUM IN
  350. (SELECT PNUM
  351. FROM t2
  352. WHERE PTYPE = 'Design'));
  353. PREPARE stmt FROM "EXPLAIN SELECT EMPNAME
  354. FROM t1
  355. WHERE EMPNUM IN
  356. (SELECT EMPNUM
  357. FROM t3
  358. WHERE PNUM IN
  359. (SELECT PNUM
  360. FROM t2
  361. WHERE PTYPE = 'Design'))";
  362. EXECUTE stmt;
  363. EXECUTE stmt;
  364. DEALLOCATE PREPARE stmt;
  365. SET SESSION optimizer_switch = @old_optimizer_switch;
  366. SET SESSION join_cache_level = @old_join_cache_level;
  367. DROP TABLE t1, t2, t3;
  368. --echo #
  369. --echo # BUG#45221 Query SELECT pk FROM C WHERE pk IN (SELECT int_key) failing
  370. --echo #
  371. CREATE TABLE t1 (
  372. i1_key INT,
  373. i2 INT,
  374. i3 INT,
  375. KEY i1_index (i1_key)
  376. );
  377. INSERT INTO t1 VALUES (9,1,2), (9,2,1);
  378. CREATE TABLE t2 (
  379. pk INT NOT NULL,
  380. i1 INT,
  381. PRIMARY KEY (pk)
  382. );
  383. INSERT INTO t2 VALUES (9,1);
  384. --echo # Enable Index condition pushdown
  385. --replace_column 1 #
  386. SELECT @old_icp:=@@engine_condition_pushdown;
  387. SET SESSION engine_condition_pushdown = 'ON';
  388. --echo
  389. SELECT pk
  390. FROM t2
  391. WHERE
  392. pk IN (
  393. SELECT i1_key
  394. FROM t1
  395. WHERE t1.i2 < t1.i3 XOR t2.i1 > 1
  396. ORDER BY t1.i2 desc);
  397. --echo # Restore old value for Index condition pushdown
  398. SET SESSION engine_condition_pushdown=@old_icp;
  399. DROP TABLE t1,t2;
  400. --echo #
  401. --echo # End of 5.3 tests.
  402. --echo #
  403. --echo #
  404. --echo # Bug#53236 Segfault in DTCollation::set(DTCollation&)
  405. --echo #
  406. CREATE TABLE t1 (
  407. pk INTEGER AUTO_INCREMENT,
  408. col_varchar VARCHAR(1),
  409. PRIMARY KEY (pk)
  410. )
  411. ;
  412. INSERT INTO t1 (col_varchar)
  413. VALUES
  414. ('w'),
  415. ('m')
  416. ;
  417. SELECT table1.pk
  418. FROM ( t1 AS table1 JOIN t1 AS table2 ON (table1.col_varchar =
  419. table2.col_varchar) )
  420. WHERE ( 1, 2 ) IN ( SELECT SUBQUERY1_t1.pk AS SUBQUERY1_field1,
  421. SUBQUERY1_t1.pk AS SUBQUERY1_field2
  422. FROM ( t1 AS SUBQUERY1_t1 JOIN t1 AS SUBQUERY1_t2
  423. ON (SUBQUERY1_t2.col_varchar =
  424. SUBQUERY1_t1.col_varchar) ) )
  425. ;
  426. drop table t1;
  427. --echo #
  428. --echo # BUG#716293: "Range checked for each record" is not used if condition refers to outside of subquery
  429. --echo #
  430. create table t1 (a int);
  431. insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
  432. create table t2 (a int, b int, `filler` char(200), key(a), key (b));
  433. insert into t2
  434. select A.a + 10*B.a + 100 * C.a, A.a + 10*B.a + 100 * C.a, 'filler' from t1 A, t1 B, t1 C;
  435. --echo # The following must use "Range checked for each record" for table B
  436. explain
  437. select a,
  438. (select sum(X.a+B.b) from t1 X, t2 B where B.a=A.a or B.b=A.a)
  439. from t1 A;
  440. drop table t1, t2;
  441. --echo #
  442. --echo # BUG#723822: Crash in get_constant_key_infix with EXISTS ( SELECT .. DISTINCT )
  443. --echo #
  444. CREATE TABLE t1 ( f1 int(11), f3 varchar(1)) ;
  445. INSERT INTO t1 VALUES ('8','c'),('5','f');
  446. ALTER TABLE t1 ADD KEY (f3,f1);
  447. CREATE TABLE t2 ( f4 varchar(1)) ;
  448. INSERT INTO t2 VALUES ('f'),('d');
  449. SELECT * FROM t2
  450. WHERE EXISTS (
  451. SELECT DISTINCT f3
  452. FROM t1
  453. WHERE f3 <= t2.f4
  454. );
  455. drop table t1,t2;
  456. --echo #
  457. --echo # LP BUG#718763 Second crash in select_describe() and materialization
  458. --echo #
  459. CREATE TABLE t1 ( f1 int(11), f3 int(11), f10 varchar(1), KEY (f3)) ;
  460. INSERT INTO t1 VALUES ('28','6','m'),('29','4','c');
  461. CREATE TABLE t2 (f11 varchar(1)) ;
  462. INSERT INTO t2 VALUES ('f'),('d');
  463. SET @old_optimizer_switch = @@session.optimizer_switch;
  464. SET SESSION optimizer_switch = 'materialization=on,in_to_exists=off';
  465. EXPLAIN
  466. SELECT * FROM t1
  467. WHERE f3 = (
  468. SELECT t1.f3 FROM t1
  469. WHERE ( t1.f10 ) IN ( SELECT f11 FROM t2 GROUP BY f11 ));
  470. SELECT * FROM t1
  471. WHERE f3 = (
  472. SELECT t1.f3 FROM t1
  473. WHERE ( t1.f10 ) IN ( SELECT f11 FROM t2 GROUP BY f11 ));
  474. EXPLAIN
  475. SELECT * FROM t1
  476. WHERE f3 = (
  477. SELECT f3 FROM t1
  478. WHERE ( f10, f10 ) IN ( SELECT f11, f11 FROM t2 GROUP BY f11 ));
  479. SELECT * FROM t1
  480. WHERE f3 = (
  481. SELECT f3 FROM t1
  482. WHERE ( f10, f10 ) IN ( SELECT f11, f11 FROM t2 GROUP BY f11 ));
  483. SET @@optimizer_switch = 'materialization=on,in_to_exists=off,semijoin=off';
  484. EXPLAIN
  485. SELECT * FROM t1
  486. WHERE f3 = (
  487. SELECT t1.f3 FROM t1
  488. WHERE ( t1.f10 ) IN ( SELECT max(f11) FROM t2 GROUP BY f11 ));
  489. SELECT * FROM t1
  490. WHERE f3 = (
  491. SELECT t1.f3 FROM t1
  492. WHERE ( t1.f10 ) IN ( SELECT max(f11) FROM t2 GROUP BY f11 ));
  493. EXPLAIN
  494. SELECT * FROM t1
  495. WHERE f3 = (
  496. SELECT f3 FROM t1
  497. WHERE ( f10, f10 ) IN ( SELECT max(f11), f11 FROM t2 GROUP BY f11 ));
  498. SELECT * FROM t1
  499. WHERE f3 = (
  500. SELECT f3 FROM t1
  501. WHERE ( f10, f10 ) IN ( SELECT max(f11), f11 FROM t2 GROUP BY f11 ));
  502. SET SESSION optimizer_switch = @old_optimizer_switch;
  503. drop table t1,t2;
  504. --echo #
  505. --echo # LP BUG#715738: Wrong result with implicit grouping and empty result set
  506. --echo #
  507. CREATE TABLE t1 (f1 int, f2 int);
  508. CREATE TABLE t2 (f3 int, f4 int not null, PRIMARY KEY (f3));
  509. set @save_optimizer_switch=@@optimizer_switch;
  510. SET @@optimizer_switch = 'materialization=on,in_to_exists=off,semijoin=off';
  511. EXPLAIN
  512. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2);
  513. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2);
  514. EXPLAIN
  515. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2);
  516. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2);
  517. EXPLAIN
  518. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2);
  519. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2);
  520. EXPLAIN
  521. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in;
  522. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in;
  523. EXPLAIN
  524. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2);
  525. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2);
  526. EXPLAIN
  527. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2);
  528. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2);
  529. EXPLAIN
  530. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in;
  531. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in;
  532. EXPLAIN
  533. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in;
  534. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in;
  535. EXPLAIN
  536. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in;
  537. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in;
  538. EXPLAIN
  539. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in;
  540. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in;
  541. EXPLAIN
  542. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in;
  543. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in;
  544. EXPLAIN
  545. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2);
  546. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2);
  547. SET @@optimizer_switch = 'materialization=off,in_to_exists=on,semijoin=off';
  548. EXPLAIN
  549. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2);
  550. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2);
  551. EXPLAIN
  552. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2);
  553. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2);
  554. EXPLAIN
  555. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2);
  556. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2);
  557. EXPLAIN
  558. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in;
  559. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2) as not_in;
  560. EXPLAIN
  561. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2);
  562. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2);
  563. EXPLAIN
  564. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2);
  565. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2);
  566. EXPLAIN
  567. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in;
  568. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2) as not_in;
  569. EXPLAIN
  570. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in;
  571. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) > 7) as not_in;
  572. EXPLAIN
  573. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in;
  574. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 HAVING max(f4) is null) as not_in;
  575. EXPLAIN
  576. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in;
  577. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2) as not_in;
  578. EXPLAIN
  579. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in;
  580. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2) as not_in;
  581. EXPLAIN
  582. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2);
  583. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2);
  584. INSERT INTO t1 VALUES (1, 2);
  585. INSERT INTO t1 VALUES (3, 4);
  586. INSERT INTO t2 VALUES (5, 6);
  587. INSERT INTO t2 VALUES (7, 8);
  588. SET @@optimizer_switch = 'materialization=on,in_to_exists=off,semijoin=off';
  589. EXPLAIN
  590. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10);
  591. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10);
  592. EXPLAIN
  593. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10);
  594. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10);
  595. EXPLAIN
  596. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10);
  597. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10);
  598. EXPLAIN
  599. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in;
  600. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in;
  601. EXPLAIN
  602. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10);
  603. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10);
  604. EXPLAIN
  605. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10);
  606. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10);
  607. EXPLAIN
  608. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in;
  609. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in;
  610. EXPLAIN
  611. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in;
  612. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in;
  613. EXPLAIN
  614. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in;
  615. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in;
  616. EXPLAIN
  617. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in;
  618. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in;
  619. EXPLAIN
  620. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in;
  621. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in;
  622. EXPLAIN
  623. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
  624. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
  625. SET @@optimizer_switch = 'materialization=off,in_to_exists=on,semijoin=off';
  626. EXPLAIN
  627. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10);
  628. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10);
  629. EXPLAIN
  630. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10);
  631. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3+f4, min(f4) FROM t2 WHERE f3 > 10);
  632. EXPLAIN
  633. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10);
  634. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, min(f4)+max(f4) FROM t2 WHERE f3 > 10);
  635. EXPLAIN
  636. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in;
  637. SELECT (2, 0) NOT IN (SELECT f3, min(f4) FROM t2 WHERE f3 > 10) as not_in;
  638. EXPLAIN
  639. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10);
  640. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10);
  641. EXPLAIN
  642. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10);
  643. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT f3, f3 + count(f4) FROM t2 WHERE f3 > 10);
  644. EXPLAIN
  645. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in;
  646. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10) as not_in;
  647. EXPLAIN
  648. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in;
  649. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) > 7) as not_in;
  650. EXPLAIN
  651. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in;
  652. SELECT (2, 0) NOT IN (SELECT f3, count(f4) FROM t2 WHERE f3 > 10 HAVING max(f4) is null) as not_in;
  653. EXPLAIN
  654. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in;
  655. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4) FROM t2 WHERE f3 > 10) as not_in;
  656. EXPLAIN
  657. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in;
  658. SELECT (2, 0) NOT IN (SELECT max(f3+f3), count(f4)+f3 FROM t2 WHERE f3 > 10) as not_in;
  659. EXPLAIN
  660. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
  661. SELECT * FROM t1 WHERE (2, 0) NOT IN (SELECT min(f3)+f3, min(f4)+f3+max(f4) FROM t2 WHERE f3 > 10);
  662. set @@optimizer_switch=@save_optimizer_switch;
  663. drop table t1,t2;
  664. --echo #
  665. --echo # LP BUG#613029 Wrong result with materialization and semijoin, and
  666. --echo # valgrind warnings in Protocol::net_store_data with materialization
  667. --echo # for implicit grouping
  668. --echo #
  669. CREATE TABLE t1 (
  670. pk int(11) NOT NULL AUTO_INCREMENT,
  671. f2 int(11) NOT NULL,
  672. f3 varchar(1) NOT NULL,
  673. PRIMARY KEY (pk),
  674. KEY f2 (f2));
  675. INSERT INTO t1 VALUES (1,9,'x');
  676. INSERT INTO t1 VALUES (2,5,'g');
  677. CREATE TABLE t2 (
  678. pk int(11) NOT NULL AUTO_INCREMENT,
  679. f2 int(11) NOT NULL,
  680. f3 varchar(1) NOT NULL,
  681. PRIMARY KEY (pk),
  682. KEY f2 (f2));
  683. INSERT INTO t2 VALUES (1,7,'p');
  684. set @save_optimizer_switch=@@optimizer_switch;
  685. set @@optimizer_switch='materialization=off,in_to_exists=on,semijoin=off';
  686. EXPLAIN
  687. SELECT t1.f3, MAX(t1.f2)
  688. FROM t1, t2
  689. WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1);
  690. SELECT t1.f3, MAX(t1.f2)
  691. FROM t1, t2
  692. WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1);
  693. set @@optimizer_switch='materialization=on,in_to_exists=off,semijoin=off';
  694. EXPLAIN
  695. SELECT t1.f3, MAX(t1.f2)
  696. FROM t1, t2
  697. WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1);
  698. SELECT t1.f3, MAX(t1.f2)
  699. FROM t1, t2
  700. WHERE (t2.pk = t1.pk) AND t2.pk IN (SELECT f2 FROM t1);
  701. -- echo TODO: add a test case for semijoin when the wrong result is fixed
  702. -- echo set @@optimizer_switch='materialization=off,semijoin=on';
  703. set @@optimizer_switch=@save_optimizer_switch;
  704. drop table t1, t2;
  705. --echo #
  706. --echo # LP BUG#777691 Wrong result with subqery in select list and subquery cache=off in maria-5.3
  707. --echo #
  708. CREATE TABLE t1 ( f1 varchar(32)) ;
  709. INSERT INTO t1 VALUES ('b'),('x'),('c'),('x');
  710. CREATE TABLE t2 ( f2 int, f3 varchar(32)) ;
  711. INSERT INTO t2 VALUES (1,'x');
  712. set @save_optimizer_switch=@@optimizer_switch;
  713. set @@optimizer_switch='materialization=off,in_to_exists=on,subquery_cache=off';
  714. EXPLAIN
  715. SELECT t1.f1, ( SELECT MAX( f2 ) FROM t2 WHERE t2.f3 = t1.f1 ) as max_f2 FROM t1;
  716. SELECT t1.f1, ( SELECT MAX( f2 ) FROM t2 WHERE t2.f3 = t1.f1 ) as max_f2 FROM t1;
  717. set @@optimizer_switch='materialization=on,in_to_exists=off,subquery_cache=off';
  718. EXPLAIN
  719. SELECT t1.f1, ( SELECT MAX( f2 ) FROM t2 WHERE t2.f3 = t1.f1 ) as max_f2 FROM t1;
  720. SELECT t1.f1, ( SELECT MAX( f2 ) FROM t2 WHERE t2.f3 = t1.f1 ) as max_f2 FROM t1;
  721. set @@optimizer_switch='materialization=off,in_to_exists=on,subquery_cache=off';
  722. --echo Even when t2 is not constant table, the result must be the same.
  723. INSERT INTO t2 VALUES (2,'y');
  724. EXPLAIN
  725. SELECT t1.f1, ( SELECT MAX( f2 ) FROM t2 WHERE t2.f3 = t1.f1 ) as max_f2 FROM t1;
  726. SELECT t1.f1, ( SELECT MAX( f2 ) FROM t2 WHERE t2.f3 = t1.f1 ) as max_f2 FROM t1;
  727. set @@optimizer_switch=@save_optimizer_switch;
  728. drop table t1, t2;
  729. --echo #
  730. --echo # LP BUG#641203 Query returns rows where no result is expected (impossible WHERE)
  731. --echo #
  732. CREATE TABLE t1 (c1 varchar(1) DEFAULT NULL);
  733. CREATE TABLE t2 (c1 varchar(1) DEFAULT NULL);
  734. INSERT INTO t2 VALUES ('k'), ('d');
  735. CREATE TABLE t3 (c1 varchar(1) DEFAULT NULL);
  736. INSERT INTO t3 VALUES ('a'), ('b'), ('c');
  737. CREATE TABLE t4 (c1 varchar(1) primary key);
  738. INSERT INTO t4 VALUES ('k'), ('d');
  739. SET @save_optimizer_switch=@@optimizer_switch;
  740. SET optimizer_switch='outer_join_with_cache=off';
  741. SET optimizer_switch='semijoin_with_cache=off';
  742. SET optimizer_switch='materialization=off';
  743. EXPLAIN
  744. SELECT * FROM t1 RIGHT JOIN t2 ON t1.c1 WHERE 's' IN (SELECT c1 FROM t2);
  745. SELECT * FROM t1 RIGHT JOIN t2 ON t1.c1 WHERE 's' IN (SELECT c1 FROM t2);
  746. EXPLAIN
  747. SELECT * FROM t2 LEFT JOIN t1 ON t1.c1 WHERE 's' IN (SELECT c1 FROM t2);
  748. SELECT * FROM t2 LEFT JOIN t1 ON t1.c1 WHERE 's' IN (SELECT c1 FROM t2);
  749. SET optimizer_switch='materialization=on';
  750. EXPLAIN
  751. SELECT * FROM (t2 LEFT JOIN t1 ON t1.c1) LEFT JOIN t3 on t3.c1 WHERE 's' IN (SELECT c1 FROM t2);
  752. SELECT * FROM (t2 LEFT JOIN t1 ON t1.c1) LEFT JOIN t3 on t3.c1 WHERE 's' IN (SELECT c1 FROM t2);
  753. EXPLAIN
  754. SELECT * FROM t4 LEFT JOIN t2 ON t4.c1 WHERE 's' IN (SELECT c1 FROM t2);
  755. SELECT * FROM t4 LEFT JOIN t2 ON t4.c1 WHERE 's' IN (SELECT c1 FROM t2);
  756. SET optimizer_switch=@save_optimizer_switch;
  757. drop table t1, t2, t3, t4;
  758. --echo #
  759. --echo # LP BUG#675981 Assertion `cache != __null' failed in sub_select_cache()
  760. --echo # on EXPLAIN
  761. --echo #
  762. CREATE TABLE t1 (f1 int,f2 int) ;
  763. INSERT IGNORE INTO t1 VALUES ('2','5'),('2',NULL);
  764. CREATE TABLE t2 (f1 int, f5 int) ;
  765. INSERT IGNORE INTO t2 VALUES (1,0);
  766. CREATE TABLE t3 (f4 int) ;
  767. INSERT IGNORE INTO t3 VALUES (0),(0);
  768. set @@optimizer_switch='in_to_exists=on,materialization=off,semijoin=off';
  769. EXPLAIN
  770. SELECT * FROM t2
  771. WHERE f1 IN (SELECT t1.f2 FROM t1 JOIN t3 ON t3.f4);
  772. drop table t1, t2, t3;
  773. --echo #
  774. --echo # LP BUG#680005 Second assertion `cache != __null' failed in
  775. --echo # sub_select_cache() on EXPLAIN
  776. --echo #
  777. CREATE TABLE t1 (f1 int,f2 int,f4 int,f6 int,KEY (f4)) ;
  778. INSERT IGNORE INTO t1 VALUES
  779. ('1','5','1','0'),('2','1','1','0'),('2','2','2','0'),('0',NULL,'0','0'),
  780. ('2','1','2','0'),('2','0','0','0'),('2','2','2','0'),('2','8','2','0'),
  781. ('2','7','2','0'),('2','5','2','0'),('2',NULL,'1','0');
  782. CREATE TABLE t2 (f3 int) ;
  783. INSERT IGNORE INTO t2 VALUES ('7');
  784. CREATE TABLE t3 (f3 int) ;
  785. INSERT IGNORE INTO t3 VALUES ('2');
  786. EXPLAIN
  787. SELECT t1.f4
  788. FROM t2 JOIN t1 ON t1.f6
  789. WHERE
  790. ( t1.f2 ) IN (SELECT SUBQUERY2_t1.f3
  791. FROM t3 AS SUBQUERY2_t1
  792. JOIN
  793. (t1 AS SUBQUERY2_t2
  794. JOIN
  795. t1 AS SUBQUERY2_t3 ON SUBQUERY2_t3.f1)
  796. ON SUBQUERY2_t3.f2)
  797. GROUP BY t1.f4 ORDER BY t1.f1 LIMIT 10;
  798. drop table t1, t2, t3;
  799. --echo #
  800. --echo # LP BUG#680038 bool close_thread_table(THD*, TABLE**):
  801. --echo # Assertion `table->key_read == 0' failed in EXPLAIN
  802. --echo #
  803. CREATE TABLE t1 (f1 int,f3 int,f4 int) ;
  804. INSERT IGNORE INTO t1 VALUES (NULL,1,0);
  805. CREATE TABLE t2 (f2 int,f4 int,f5 int) ;
  806. INSERT IGNORE INTO t2 VALUES (8,0,0),(5,0,0);
  807. CREATE TABLE t3 (f4 int,KEY (f4)) ;
  808. INSERT IGNORE INTO t3 VALUES (0),(0);
  809. set @@optimizer_switch='semijoin=off';
  810. EXPLAIN
  811. SELECT * FROM t1 WHERE
  812. (SELECT f2 FROM t2
  813. WHERE f4 <= ALL
  814. (SELECT max(SQ1_t1.f4)
  815. FROM t3 AS SQ1_t1 JOIN t3 AS SQ1_t3 ON SQ1_t3.f4
  816. GROUP BY SQ1_t1.f4));
  817. --error ER_SUBQUERY_NO_1_ROW
  818. SELECT * FROM t1 WHERE
  819. (SELECT f2 FROM t2
  820. WHERE f4 <= ALL
  821. (SELECT max(SQ1_t1.f4)
  822. FROM t3 AS SQ1_t1 JOIN t3 AS SQ1_t3 ON SQ1_t3.f4
  823. GROUP BY SQ1_t1.f4));
  824. drop table t1, t2, t3;
  825. --echo #
  826. --echo # BUG#52317: Assertion failing in Field_varstring::store()
  827. --echo # at field.cc:6833
  828. --echo #
  829. CREATE TABLE t1 (i INTEGER);
  830. INSERT INTO t1 VALUES (1);
  831. CREATE TABLE t2 (i INTEGER, KEY k(i));
  832. INSERT INTO t2 VALUES (1), (2);
  833. EXPLAIN
  834. SELECT i FROM t1 WHERE (1) NOT IN (SELECT i FROM t2);
  835. DROP TABLE t2;
  836. DROP TABLE t1;
  837. --echo #
  838. --echo # LP BUG#680846: Crash in clear_tables() with subqueries
  839. --echo #
  840. CREATE TABLE t1 (f3 int) ;
  841. INSERT IGNORE INTO t1 VALUES (0),(0);
  842. CREATE TABLE t2 (f1 int,f3 int,f4 varchar(32)) ;
  843. INSERT IGNORE INTO t2 VALUES (1,0,'f');
  844. EXPLAIN
  845. SELECT COUNT(t2.f3),
  846. (SELECT COUNT(f3) FROM t1 WHERE t2.f1) AS f9
  847. FROM t2 JOIN t1 ON t1.f3
  848. WHERE ('v') IN (SELECT f4 FROM t2)
  849. GROUP BY f9;
  850. SELECT COUNT(t2.f3),
  851. (SELECT COUNT(f3) FROM t1 WHERE t2.f1) AS f9
  852. FROM t2 JOIN t1 ON t1.f3
  853. WHERE ('v') IN (SELECT f4 FROM t2)
  854. GROUP BY f9;
  855. EXPLAIN
  856. SELECT COUNT(t2.f3),
  857. (SELECT COUNT(f3) FROM t1 WHERE t2.f1) AS f9
  858. FROM t2 JOIN t1 ON t1.f3
  859. WHERE ('v') IN (SELECT f4 FROM t2)
  860. ORDER BY f9;
  861. SELECT COUNT(t2.f3),
  862. (SELECT COUNT(f3) FROM t1 WHERE t2.f1) AS f9
  863. FROM t2 JOIN t1 ON t1.f3
  864. WHERE ('v') IN (SELECT f4 FROM t2)
  865. ORDER BY f9;
  866. # these queries are like the ones above, but without the ON clause,
  867. # resulting in a different crash (failed assert)
  868. EXPLAIN
  869. SELECT COUNT(t2.f3),
  870. (SELECT t2.f1 FROM t1 limit 1) AS f9
  871. FROM t2 JOIN t1
  872. WHERE ('v') IN (SELECT f4 FROM t2)
  873. GROUP BY f9;
  874. SELECT COUNT(t2.f3),
  875. (SELECT t2.f1 FROM t1 limit 1) AS f9
  876. FROM t2 JOIN t1
  877. WHERE ('v') IN (SELECT f4 FROM t2)
  878. GROUP BY f9;
  879. EXPLAIN
  880. SELECT COUNT(t2.f3),
  881. (SELECT t2.f1 FROM t1 limit 1) AS f9
  882. FROM t2 JOIN t1
  883. WHERE ('v') IN (SELECT f4 FROM t2)
  884. ORDER BY f9;
  885. SELECT COUNT(t2.f3),
  886. (SELECT t2.f1 FROM t1 limit 1) AS f9
  887. FROM t2 JOIN t1
  888. WHERE ('v') IN (SELECT f4 FROM t2)
  889. ORDER BY f9;
  890. drop table t1,t2;
  891. --echo #
  892. --echo # LP BUG#682683 Crash in create_tmp_table called from
  893. --echo # JOIN::init_execution
  894. --echo #
  895. CREATE TABLE t2 (f1 int) ;
  896. INSERT INTO t2 VALUES (1),(2);
  897. CREATE TABLE t1 (f1 int) ;
  898. EXPLAIN
  899. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 GROUP BY field1;
  900. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 GROUP BY field1;
  901. EXPLAIN
  902. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 ORDER BY field1;
  903. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 ORDER BY field1;
  904. INSERT INTO t1 VALUES (1),(2);
  905. EXPLAIN
  906. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 GROUP BY field1;
  907. --error ER_SUBQUERY_NO_1_ROW
  908. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 GROUP BY field1;
  909. EXPLAIN
  910. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 ORDER BY field1;
  911. --error ER_SUBQUERY_NO_1_ROW
  912. SELECT (SELECT f1 FROM t1) AS field1 FROM t2 ORDER BY field1;
  913. drop table t1,t2;
  914. --echo #
  915. --echo # LP BUG#680943 Assertion `!table || (!table->read_set ||
  916. --echo # bitmap_is_set(table->read_set, field_index))' failed with subquery
  917. --echo #
  918. CREATE TABLE t1 (f1 int,f3 int) ;
  919. INSERT IGNORE INTO t1 VALUES ('6','0'),('4','0');
  920. CREATE TABLE t2 (f1 int,f2 int,f3 int) ;
  921. INSERT IGNORE INTO t2 VALUES ('6','0','0'),('2','0','0');
  922. SELECT f2
  923. FROM (SELECT * FROM t2) AS alias1
  924. WHERE (SELECT SQ2_t2.f1
  925. FROM t1 JOIN t1 AS SQ2_t2 ON SQ2_t2.f3
  926. WHERE SQ2_t2.f3 AND alias1.f1)
  927. ORDER BY f3 ;
  928. drop table t1,t2;
  929. --echo #
  930. --echo # LP BUG#715062: Wrong result with VIEW + UNION + subquery in maria-5.3-mwl89
  931. --echo #
  932. create table t1 (f1 int);
  933. create table t2 (f2 int);
  934. create table t3 (f3 int);
  935. insert into t1 values (2);
  936. insert into t2 values (2);
  937. insert into t3 values (7);
  938. CREATE VIEW v1 AS SELECT 2 UNION SELECT 2 ;
  939. CREATE VIEW v2 AS SELECT * from t1 UNION SELECT * from t2 ;
  940. set @save_optimizer_switch=@@optimizer_switch;
  941. SET @@optimizer_switch = 'in_to_exists=off,semijoin=off,materialization=on';
  942. EXPLAIN
  943. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN ( SELECT * FROM v1 );
  944. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN ( SELECT * FROM v1 );
  945. EXPLAIN
  946. SELECT ( 5 ) IN ( SELECT * FROM v1 );
  947. SELECT ( 5 ) IN ( SELECT * FROM v1 );
  948. EXPLAIN
  949. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN (SELECT * FROM v2);
  950. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN (SELECT * FROM v2);
  951. EXPLAIN
  952. SELECT 'bug' FROM t3 WHERE ( 5 ) IN (SELECT * FROM v2);
  953. SELECT 'bug' FROM t3 WHERE ( 5 ) IN (SELECT * FROM v2);
  954. EXPLAIN
  955. SELECT ( 5 ) IN ( SELECT * FROM v2 );
  956. SELECT ( 5 ) IN ( SELECT * FROM v2 );
  957. SET @@optimizer_switch = 'in_to_exists=on,semijoin=off,materialization=off';
  958. EXPLAIN
  959. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN ( SELECT * FROM v1 );
  960. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN ( SELECT * FROM v1 );
  961. EXPLAIN
  962. SELECT ( 5 ) IN ( SELECT * FROM v1 );
  963. SELECT ( 5 ) IN ( SELECT * FROM v1 );
  964. EXPLAIN
  965. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN (SELECT * FROM v2);
  966. SELECT 'bug' FROM DUAL WHERE ( 5 ) IN (SELECT * FROM v2);
  967. EXPLAIN
  968. SELECT 'bug' FROM t3 WHERE ( 5 ) IN (SELECT * FROM v2);
  969. SELECT 'bug' FROM t3 WHERE ( 5 ) IN (SELECT * FROM v2);
  970. EXPLAIN
  971. SELECT ( 5 ) IN ( SELECT * FROM v2 );
  972. SELECT ( 5 ) IN ( SELECT * FROM v2 );
  973. set @@optimizer_switch=@save_optimizer_switch;
  974. drop table t1,t2,t3;
  975. drop view v1,v2;
  976. --echo #
  977. --echo # LP BUG#715069 Wrong result with GROUP BY inside subquery and materialization=off
  978. --echo #
  979. CREATE TABLE t0 ( f1 int(11), f2 int(11), f10 varchar(1), PRIMARY KEY (f1)) ;
  980. INSERT INTO t0 VALUES (8,8,'u'),(10,5,'o');
  981. CREATE TABLE t1 (f1a int, f2a int not null, f3a varchar(3) not null, PRIMARY KEY (f1a)) ;
  982. INSERT INTO t1 VALUES
  983. (8,8,'a1a'),
  984. (10,5,'b1b');
  985. CREATE TABLE t2 (f1b int, f2b int not null, f3b varchar(3) not null, PRIMARY KEY (f1b)) ;
  986. INSERT INTO t2 VALUES
  987. (10,5,'d1d');
  988. set @save_optimizer_switch=@@optimizer_switch;
  989. SET optimizer_switch='outer_join_with_cache=off';
  990. set @@optimizer_switch = 'in_to_exists=on,materialization=off,semijoin=off';
  991. EXPLAIN
  992. SELECT alias2.f1 , alias2.f2
  993. FROM t0 AS alias1
  994. RIGHT JOIN t0 AS alias2 ON alias2.f10
  995. WHERE ( alias2.f1 , alias2.f2 ) IN ( SELECT max(f2) , f1 FROM t0 GROUP BY f2 , f1 );
  996. SELECT alias2.f1 , alias2.f2
  997. FROM t0 AS alias1
  998. RIGHT JOIN t0 AS alias2 ON alias2.f10
  999. WHERE ( alias2.f1 , alias2.f2 ) IN ( SELECT max(f2) , f1 FROM t0 GROUP BY f2 , f1 );
  1000. EXPLAIN
  1001. SELECT * FROM t2 WHERE (f1b, f2b) IN (SELECT max(f1a), f2a FROM t1 GROUP BY f1a, f2a);
  1002. SELECT * FROM t2 WHERE (f1b, f2b) IN (SELECT max(f1a), f2a FROM t1 GROUP BY f1a, f2a);
  1003. EXPLAIN
  1004. SELECT * FROM t2 WHERE (f1b) IN (SELECT max(f1a) FROM t1 GROUP BY f1a, f2a);
  1005. SELECT * FROM t2 WHERE (f1b) IN (SELECT max(f1a) FROM t1 GROUP BY f1a, f2a);
  1006. set @@optimizer_switch = 'in_to_exists=off,materialization=on,semijoin=off';
  1007. EXPLAIN
  1008. SELECT alias2.f1 , alias2.f2
  1009. FROM t0 AS alias1
  1010. RIGHT JOIN t0 AS alias2 ON alias2.f10
  1011. WHERE ( alias2.f1 , alias2.f2 ) IN ( SELECT max(f2) , f1 FROM t0 GROUP BY f2 , f1 );
  1012. SELECT alias2.f1 , alias2.f2
  1013. FROM t0 AS alias1
  1014. RIGHT JOIN t0 AS alias2 ON alias2.f10
  1015. WHERE ( alias2.f1 , alias2.f2 ) IN ( SELECT max(f2) , f1 FROM t0 GROUP BY f2 , f1 );
  1016. EXPLAIN
  1017. SELECT * FROM t2 WHERE (f1b, f2b) IN (SELECT max(f1a), f2a FROM t1 GROUP BY f1a, f2a);
  1018. SELECT * FROM t2 WHERE (f1b, f2b) IN (SELECT max(f1a), f2a FROM t1 GROUP BY f1a, f2a);
  1019. EXPLAIN
  1020. SELECT * FROM t2 WHERE (f1b) IN (SELECT max(f1a) FROM t1 GROUP BY f1a, f2a);
  1021. SELECT * FROM t2 WHERE (f1b) IN (SELECT max(f1a) FROM t1 GROUP BY f1a, f2a);
  1022. set @@optimizer_switch=@save_optimizer_switch;
  1023. drop table t0,t1,t2;
  1024. --echo #
  1025. --echo # LP BUG#715759 Wrong result with in_to_exists=on in maria-5.3-mwl89
  1026. --echo #
  1027. set @save_optimizer_switch=@@optimizer_switch;
  1028. CREATE TABLE t1 (a1 int, a2 int) ;
  1029. INSERT INTO t1 VALUES (1, 2);
  1030. INSERT INTO t1 VALUES (3, 4);
  1031. CREATE TABLE t2 (b1 int, b2 int) ;
  1032. INSERT INTO t2 VALUES (1, 2);
  1033. SET @@optimizer_switch = 'in_to_exists=on,materialization=off,semijoin=off';
  1034. EXPLAIN SELECT * FROM t1 WHERE a1 IN (SELECT b1 FROM t2 WHERE b1 = b2);
  1035. SELECT * FROM t1 WHERE a1 IN (SELECT b1 FROM t2 WHERE b1 = b2);
  1036. set @@optimizer_switch=@save_optimizer_switch;
  1037. drop table t1, t2;
  1038. --echo #
  1039. --echo # LP BUG#772309 join_tab_cmp_straight(): Assertion `!jt2->emb_sj_nest' failed in maria-5.3-mwl89 with semijoin
  1040. --echo #
  1041. CREATE TABLE t1 ( f2 int) ;
  1042. INSERT INTO t1 VALUES (0),(0);
  1043. CREATE TABLE t2 ( f1 int NOT NULL ) ;
  1044. INSERT INTO t2 VALUES (0),(0);
  1045. CREATE TABLE t3 ( f1 int NOT NULL , f2 int) ;
  1046. INSERT INTO t3 VALUES (0,0), (0,0);
  1047. EXPLAIN SELECT STRAIGHT_JOIN (
  1048. SELECT f2 FROM t1 WHERE ( f2 ) IN ( SELECT t3.f2 FROM t3 JOIN t2 ON t2.f1 = 1 )
  1049. );
  1050. SELECT STRAIGHT_JOIN (
  1051. SELECT f2 FROM t1 WHERE ( f2 ) IN ( SELECT t3.f2 FROM t3 JOIN t2 ON t2.f1 = 1 )
  1052. );
  1053. drop table t1, t2, t3;
  1054. --echo #
  1055. --echo # LP BUG#777597 Wrong result with multipart keys, in_to_exists=on, NOT IN in MWL#89
  1056. --echo #
  1057. CREATE TABLE t1 ( f4 int);
  1058. INSERT IGNORE INTO t1 VALUES (2),(2);
  1059. CREATE TABLE t2 ( f3 int, f10 int, KEY (f10,f3) );
  1060. INSERT IGNORE INTO t2 VALUES (6, 1), (6, 1);
  1061. CREATE TABLE t3 ( f10 int );
  1062. INSERT IGNORE INTO t3 VALUES (1);
  1063. SET SESSION optimizer_switch='in_to_exists=on,materialization=off';
  1064. EXPLAIN
  1065. SELECT * FROM t1 WHERE ( 6 ) NOT IN ( SELECT t2.f3 FROM t2 JOIN t3 ON t3.f10 = t2.f10);
  1066. SELECT * FROM t1 WHERE ( 6 ) NOT IN ( SELECT t2.f3 FROM t2 JOIN t3 ON t3.f10 = t2.f10);
  1067. drop table t1,t2,t3;
  1068. --echo #
  1069. --echo # LP BUG#778413 Third crash in select_describe() in maria-5.3-mwl89
  1070. --echo #
  1071. CREATE TABLE t1 ( f11 int) ;
  1072. INSERT INTO t1 VALUES (1),(1);
  1073. CREATE TABLE t2 ( f1 int NOT NULL) ;
  1074. INSERT INTO t2 VALUES (20);
  1075. CREATE TABLE t3 (f3 int) ;
  1076. INSERT INTO t3 VALUES (2),(2);
  1077. EXPLAIN SELECT * FROM t2
  1078. WHERE t2.f1 = (
  1079. SELECT MAX( f3 ) FROM t3
  1080. WHERE EXISTS (
  1081. SELECT DISTINCT f11
  1082. FROM t1));
  1083. drop table t1, t2, t3;
  1084. --echo #
  1085. --echo # LP BUG#802979 Assertion `table->key_read == 0' in close_thread_table
  1086. --echo #
  1087. CREATE TABLE t1 ( f1 int, f2 int , KEY (f1)) ;
  1088. INSERT IGNORE INTO t1 VALUES (1,0),(5,0);
  1089. CREATE TABLE t2 ( f1 int, f2 int , KEY (f1)) ;
  1090. INSERT IGNORE INTO t2 VALUES (1,0),(5,0);
  1091. CREATE TABLE t3 ( f1 int, f2 int , KEY (f1)) ;
  1092. INSERT IGNORE INTO t3 VALUES (1,0),(5,0);
  1093. CREATE TABLE t4 ( f1 int, f2 int , KEY (f1)) ;
  1094. INSERT IGNORE INTO t4 VALUES (1,0),(5,0);
  1095. EXPLAIN
  1096. SELECT *
  1097. FROM t1, t2
  1098. WHERE t2.f2 = (SELECT f2 FROM t3
  1099. WHERE EXISTS (SELECT DISTINCT f1 FROM t4))
  1100. AND t2.f2 = t1.f1;
  1101. -- error ER_SUBQUERY_NO_1_ROW
  1102. SELECT *
  1103. FROM t1, t2
  1104. WHERE t2.f2 = (SELECT f2 FROM t3
  1105. WHERE EXISTS (SELECT DISTINCT f1 FROM t4))
  1106. AND t2.f2 = t1.f1;
  1107. EXPLAIN
  1108. SELECT *
  1109. FROM t1, t2
  1110. WHERE t2.f2 = (SELECT f2 FROM t3
  1111. WHERE EXISTS (SELECT DISTINCT f1 FROM t4) LIMIT 1)
  1112. AND t2.f2 = t1.f1;
  1113. SELECT *
  1114. FROM t1, t2
  1115. WHERE t2.f2 = (SELECT f2 FROM t3
  1116. WHERE EXISTS (SELECT DISTINCT f1 FROM t4) LIMIT 1)
  1117. AND t2.f2 = t1.f1;
  1118. drop table t1,t2,t3,t4;
  1119. --echo #
  1120. --echo # LP BUG#611690 Crash in select_describe() with nested subqueries
  1121. --echo #
  1122. CREATE TABLE t1 (
  1123. col_int_key int(11) DEFAULT NULL,
  1124. col_varchar_key varchar(1) DEFAULT NULL,
  1125. col_varchar_nokey varchar(1) DEFAULT NULL,
  1126. KEY col_int_key (col_int_key),
  1127. KEY col_varchar_key (col_varchar_key,col_int_key)
  1128. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  1129. INSERT INTO t1 VALUES (8,'v','v');
  1130. INSERT INTO t1 VALUES (9,'r','r');
  1131. CREATE TABLE t2 (
  1132. col_int_key int(11) DEFAULT NULL,
  1133. col_varchar_key varchar(1) DEFAULT NULL,
  1134. col_varchar_nokey varchar(1) DEFAULT NULL,
  1135. KEY col_int_key (col_int_key),
  1136. KEY col_varchar_key (col_varchar_key,col_int_key)
  1137. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  1138. INSERT INTO t2 VALUES (2,'w','w');
  1139. INSERT INTO t2 VALUES (9,'m','m');
  1140. set @old_optimizer_switch = @@optimizer_switch;
  1141. set @@optimizer_switch='subquery_cache=off,materialization=on,in_to_exists=off,semijoin=off';
  1142. EXPLAIN
  1143. SELECT col_int_key
  1144. FROM t2
  1145. WHERE (SELECT SUBQUERY2_t1.col_int_key
  1146. FROM t1 SUBQUERY2_t1 STRAIGHT_JOIN t1 SUBQUERY2_t2
  1147. ON SUBQUERY2_t2.col_varchar_key
  1148. WHERE SUBQUERY2_t2.col_varchar_nokey IN
  1149. (SELECT col_varchar_nokey FROM t1 GROUP BY col_varchar_nokey));
  1150. SELECT col_int_key
  1151. FROM t2
  1152. WHERE (SELECT SUBQUERY2_t1.col_int_key
  1153. FROM t1 SUBQUERY2_t1 STRAIGHT_JOIN t1 SUBQUERY2_t2
  1154. ON SUBQUERY2_t2.col_varchar_key
  1155. WHERE SUBQUERY2_t2.col_varchar_nokey IN
  1156. (SELECT col_varchar_nokey FROM t1 GROUP BY col_varchar_nokey));
  1157. set @@optimizer_switch='subquery_cache=off,materialization=off,in_to_exists=on,semijoin=off';
  1158. EXPLAIN
  1159. SELECT col_int_key
  1160. FROM t2
  1161. WHERE (SELECT SUBQUERY2_t1.col_int_key
  1162. FROM t1 SUBQUERY2_t1 STRAIGHT_JOIN t1 SUBQUERY2_t2
  1163. ON SUBQUERY2_t2.col_varchar_key
  1164. WHERE SUBQUERY2_t2.col_varchar_nokey IN
  1165. (SELECT col_varchar_nokey FROM t1 GROUP BY col_varchar_nokey));
  1166. SELECT col_int_key
  1167. FROM t2
  1168. WHERE (SELECT SUBQUERY2_t1.col_int_key
  1169. FROM t1 SUBQUERY2_t1 STRAIGHT_JOIN t1 SUBQUERY2_t2
  1170. ON SUBQUERY2_t2.col_varchar_key
  1171. WHERE SUBQUERY2_t2.col_varchar_nokey IN
  1172. (SELECT col_varchar_nokey FROM t1 GROUP BY col_varchar_nokey));
  1173. drop table t1, t2;
  1174. set @@optimizer_switch = @old_optimizer_switch;
  1175. --echo #
  1176. --echo # LP BUG#612543 Crash in Item_field::used_tables() with view + subquery + prepared statements
  1177. --echo #
  1178. CREATE TABLE t1 ( f1 int(11), f2 varchar(1));
  1179. CREATE TABLE t2 ( f3 varchar(1));
  1180. insert into t1 values (2,'x'), (5,'y');
  1181. insert into t2 values ('x'), ('z');
  1182. CREATE VIEW v2 AS SELECT * FROM t2;
  1183. set @old_optimizer_switch = @@optimizer_switch;
  1184. set @@optimizer_switch='materialization=on,in_to_exists=off,semijoin=off,subquery_cache=off';
  1185. EXPLAIN SELECT * FROM t1 JOIN v2 ON t1.f2 > 'a' WHERE v2.f3 IN ( SELECT f2 FROM t1 );
  1186. PREPARE st1 FROM "SELECT * FROM t1 JOIN v2 ON t1.f2 > 'a' WHERE v2.f3 IN ( SELECT f2 FROM t1 )";
  1187. EXECUTE st1;
  1188. EXECUTE st1;
  1189. set @@optimizer_switch='materialization=off,in_to_exists=on,semijoin=off,subquery_cache=off';
  1190. EXPLAIN SELECT * FROM t1 JOIN v2 ON t1.f2 > 'a' WHERE v2.f3 IN ( SELECT f2 FROM t1 );
  1191. PREPARE st2 FROM "SELECT * FROM t1 JOIN v2 ON t1.f2 > 'a' WHERE v2.f3 IN ( SELECT f2 FROM t1 )";
  1192. EXECUTE st2;
  1193. EXECUTE st2;
  1194. set @@optimizer_switch='materialization=on,in_to_exists=on,semijoin=off,subquery_cache=off';
  1195. EXPLAIN SELECT * FROM t1 JOIN v2 ON t1.f2 > 'a' WHERE v2.f3 IN ( SELECT f2 FROM t1 );
  1196. PREPARE st3 FROM "SELECT * FROM t1 JOIN v2 ON t1.f2 > 'a' WHERE v2.f3 IN ( SELECT f2 FROM t1 )";
  1197. EXECUTE st3;
  1198. EXECUTE st3;
  1199. set @@optimizer_switch = @old_optimizer_switch;
  1200. drop table t1, t2;
  1201. drop view v2;
  1202. --echo #
  1203. --echo # LP BUG#611396 RQG: crash in Item_field::register_field_in_read_map with semijoin=off
  1204. --echo # and prepared statements and materialization
  1205. CREATE TABLE t1 ( f1 int(11), f2 int(11)) ;
  1206. CREATE TABLE t2 ( f1 int(11), f4 varchar(1), PRIMARY KEY (f1)) ;
  1207. INSERT INTO t2 VALUES ('23','j'),('24','e');
  1208. CREATE TABLE t3 ( f1 int(11), f4 varchar(1)) ;
  1209. INSERT INTO t3 VALUES ('8','j');
  1210. set @old_optimizer_switch = @@optimizer_switch;
  1211. set @@optimizer_switch='materialization=on,in_to_exists=off,semijoin=off';
  1212. EXPLAIN
  1213. SELECT t2.f1, (SELECT f2 FROM t1 WHERE (7) IN (SELECT f1 FROM t1))
  1214. FROM t2 JOIN t3 ON t3.f4 = t2.f4
  1215. WHERE t3.f1 = 8
  1216. GROUP BY 1, 2;
  1217. PREPARE st1 FROM "
  1218. SELECT t2.f1, (SELECT f2 FROM t1 WHERE (7) IN (SELECT f1 FROM t1))
  1219. FROM t2 JOIN t3 ON t3.f4 = t2.f4
  1220. WHERE t3.f1 = 8
  1221. GROUP BY 1, 2";
  1222. EXECUTE st1;
  1223. EXECUTE st1;
  1224. set @@optimizer_switch = @old_optimizer_switch;
  1225. drop table t1, t2, t3;
  1226. --echo #
  1227. --echo # LP BUG#611382 RQG: Query returns extra rows when executed with materialization=on
  1228. --echo #
  1229. CREATE TABLE t1 ( f4 varchar(1)) ENGINE=MyISAM;
  1230. INSERT INTO t1 VALUES (NULL);
  1231. CREATE TABLE t2 ( f2 date, f3 varchar(1), f4 varchar(1)) ;
  1232. INSERT INTO t2 VALUES ('2005-05-03','c','c'),('1900-01-01','d','d');
  1233. CREATE TABLE t3 ( f3 varchar(1)) ;
  1234. INSERT INTO t3 VALUES ('c');
  1235. set @old_optimizer_switch = @@optimizer_switch;
  1236. set @@optimizer_switch = 'materialization=on,in_to_exists=off,semijoin=off';
  1237. EXPLAIN SELECT t1.f4
  1238. FROM t1 JOIN ( t2 JOIN t3 ON t3.f3 = t2.f4 ) ON t3.f3 = t2.f3
  1239. WHERE t1.f4 IN ( SELECT f4 FROM t2 ) ;
  1240. SELECT t1.f4
  1241. FROM t1 JOIN ( t2 JOIN t3 ON t3.f3 = t2.f4 ) ON t3.f3 = t2.f3
  1242. WHERE t1.f4 IN ( SELECT f4 FROM t2 ) ;
  1243. set @@optimizer_switch = 'materialization=off,in_to_exists=on,semijoin=off';
  1244. EXPLAIN SELECT t1.f4
  1245. FROM t1 JOIN ( t2 JOIN t3 ON t3.f3 = t2.f4 ) ON t3.f3 = t2.f3
  1246. WHERE t1.f4 IN ( SELECT f4 FROM t2 ) ;
  1247. SELECT t1.f4
  1248. FROM t1 JOIN ( t2 JOIN t3 ON t3.f3 = t2.f4 ) ON t3.f3 = t2.f3
  1249. WHERE t1.f4 IN ( SELECT f4 FROM t2 ) ;
  1250. set @@optimizer_switch = @old_optimizer_switch;
  1251. drop table t1, t2, t3;
  1252. --echo #
  1253. --echo # LP BUG#782305: Wrong result/valgrind warning in Item_sum_hybrid::any_value()
  1254. --echo #
  1255. CREATE TABLE t1 ( f1 int) ;
  1256. INSERT INTO t1 VALUES (2),(3);
  1257. CREATE TABLE t2 (f2 int) ;
  1258. INSERT INTO t2 VALUES (2),(3);
  1259. PREPARE st1 FROM '
  1260. SELECT * FROM t2
  1261. WHERE f2 <= SOME ( SELECT f1 FROM t1 );
  1262. ';
  1263. EXECUTE st1;
  1264. EXECUTE st1;
  1265. PREPARE st2 FROM '
  1266. SELECT * FROM t2
  1267. WHERE f2 <= SOME (SELECT f1-2 FROM t1 UNION SELECT f1-1 FROM t1);
  1268. ';
  1269. EXECUTE st2;
  1270. EXECUTE st2;
  1271. drop table t1, t2;
  1272. --echo #
  1273. --echo # LP BUG#825018: Crash in check_and_do_in_subquery_rewrites() with corrlated subquery in select list
  1274. --echo #
  1275. CREATE TABLE t1 (a int, b int);
  1276. INSERT INTO t1 VALUES (10,1),(11,7);
  1277. CREATE TABLE t2 (a int);
  1278. INSERT INTO t2 VALUES (2),(3);
  1279. CREATE TABLE t3 (a int, b int);
  1280. INSERT INTO t3 VALUES (1,1);
  1281. CREATE PROCEDURE sp1 () LANGUAGE SQL
  1282. SELECT (SELECT t1.a
  1283. FROM t1
  1284. WHERE t1.b = t3.b
  1285. AND t1.b IN ( SELECT a FROM t2 )) sq
  1286. FROM t3
  1287. GROUP BY 1;
  1288. CALL sp1();
  1289. CALL sp1();
  1290. drop procedure sp1;
  1291. prepare st1 from "
  1292. SELECT (SELECT t1.a
  1293. FROM t1
  1294. WHERE t1.b = t3.b
  1295. AND t1.b IN ( SELECT a FROM t2 )) sq
  1296. FROM t3
  1297. GROUP BY 1";
  1298. execute st1;
  1299. execute st1;
  1300. deallocate prepare st1;
  1301. drop table t1, t2, t3;
  1302. set optimizer_switch=@subselect4_tmp;
  1303. --echo #
  1304. --echo # LP BUG#833702 Wrong result with nested IN and singlerow subqueries and equality propagation
  1305. --echo #
  1306. CREATE TABLE t2 (c int , a int, b int);
  1307. INSERT INTO t2 VALUES (10,7,0);
  1308. CREATE TABLE t3 (a int, b int) ;
  1309. INSERT INTO t3 VALUES (5,0),(7,0);
  1310. CREATE TABLE t4 (a int);
  1311. INSERT INTO t4 VALUES (2),(8);
  1312. set @@optimizer_switch='semijoin=off,in_to_exists=on,materialization=off,subquery_cache=off';
  1313. SELECT * FROM t2
  1314. WHERE t2.b IN (SELECT b FROM t3 WHERE t3.a = t2.a AND a < SOME (SELECT * FROM t4))
  1315. OR ( t2.c > 242 );
  1316. EXPLAIN SELECT * FROM t2
  1317. WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.a < ANY (SELECT t4.a FROM t4) and t3.a = 7);
  1318. SELECT * FROM t2
  1319. WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.a < ANY (SELECT t4.a FROM t4) and t3.a = 7);
  1320. drop table t2, t3, t4;
  1321. --echo #
  1322. --echo # BUG#934597: Assertion `! is_set()' failed in Diagnostics_area::set_ok_status(THD...
  1323. --echo #
  1324. CREATE TABLE t1 ( a VARCHAR(1) );
  1325. INSERT INTO t1 VALUES ('u'),('k');
  1326. --error ER_SUBQUERY_NO_1_ROW
  1327. CREATE TABLE t2 AS
  1328. SELECT a AS field1 FROM t1
  1329. WHERE ( SELECT alias1.a
  1330. FROM t1 AS alias1
  1331. ) IS NOT NULL;
  1332. --error ER_BAD_TABLE_ERROR
  1333. DROP TABLE t2;
  1334. DROP TABLE t1;
  1335. --echo #
  1336. --echo # LP BUG#1000649 EXPLAIN shows incorrectly a non-correlated constant IN subquery is correlated
  1337. --echo #
  1338. create table ten (a int);
  1339. insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
  1340. create table t1 (a int, b int, c int);
  1341. insert into t1 select a,a,a from ten;
  1342. create table five (a int, b int, c int);
  1343. insert into five select a,a,a from ten limit 5;
  1344. set @@optimizer_switch='semijoin=on,in_to_exists=on,materialization=off';
  1345. explain select * from t1 where 33 in (select b from five) or c > 11;
  1346. drop table ten, t1, five;
  1347. --echo #
  1348. --echo # LP BUG#1008773 Wrong result (NULL instead of a value) with no matching rows, subquery in FROM and HAVING
  1349. --echo #
  1350. CREATE TABLE t1 (a INT) ENGINE=MyISAM;
  1351. CREATE TABLE t2 (b INT) ENGINE=MyISAM;
  1352. INSERT INTO t2 VALUES (1);
  1353. EXPLAIN
  1354. SELECT MAX(a), ( SELECT 1 FROM t2 ) AS bb FROM t1;
  1355. SELECT MAX(a), ( SELECT 1 FROM t2 ) AS bb FROM t1;
  1356. EXPLAIN
  1357. SELECT MAX(a), 1 in ( SELECT b FROM t2 ) AS bb FROM t1;
  1358. SELECT MAX(a), 1 in ( SELECT b FROM t2 ) AS bb FROM t1;
  1359. EXPLAIN
  1360. SELECT MAX(a), 1 >= ALL ( SELECT b FROM t2 ) AS bb FROM t1;
  1361. SELECT MAX(a), 1 >= ALL ( SELECT b FROM t2 ) AS bb FROM t1;
  1362. EXPLAIN
  1363. SELECT MAX(a), ( SELECT 1 FROM t2 where b = a) AS bb FROM t1;
  1364. SELECT MAX(a), ( SELECT 1 FROM t2 where b = a) AS bb FROM t1;
  1365. EXPLAIN
  1366. SELECT MAX(a), a in ( SELECT b FROM t2 ) AS bb FROM t1;
  1367. SELECT MAX(a), a in ( SELECT b FROM t2 ) AS bb FROM t1;
  1368. EXPLAIN
  1369. SELECT MAX(a), a >= ALL ( SELECT b FROM t2 ) AS bb FROM t1;
  1370. SELECT MAX(a), a >= ALL ( SELECT b FROM t2 ) AS bb FROM t1;
  1371. drop table t1, t2;
  1372. set optimizer_switch=@subselect4_tmp;
  1373. --echo #
  1374. --echo # MDEV-3928 Assertion `example' failed in Item_cache::is_expensive_processor with a 2-level IN subquery
  1375. --echo #
  1376. CREATE TABLE t1 (a1 INT, b1 TIME) ENGINE=MyISAM;
  1377. INSERT INTO t1 VALUES (4,'21:22:34'),(6,'10:50:38');
  1378. CREATE TABLE t2 (a2 INT, b2 TIME) ENGINE=MyISAM;
  1379. INSERT INTO t2 VALUES (8, '06:17:39');
  1380. CREATE TABLE t3 (a3 INT, b3 TIME) ENGINE=MyISAM;
  1381. INSERT INTO t3 VALUES (1,'00:00:01'),(7,'00:00:02');
  1382. EXPLAIN
  1383. SELECT * FROM t1 WHERE a1 IN (
  1384. SELECT a2 FROM t2 WHERE a2 IN (
  1385. SELECT a3 FROM t3 WHERE b2 = b1 AND b2 <= b1 ORDER BY b3
  1386. )
  1387. );
  1388. SELECT * FROM t1 WHERE a1 IN (
  1389. SELECT a2 FROM t2 WHERE a2 IN (
  1390. SELECT a3 FROM t3 WHERE b2 = b1 AND b2 <= b1 ORDER BY b3
  1391. )
  1392. );
  1393. drop table t1, t2, t3;
  1394. --echo #
  1395. --echo # MDEV-4056:Server crashes in Item_func_trig_cond::val_int
  1396. --echo # with FROM and NOT IN subqueries, LEFT JOIN, derived_merge+in_to_exists
  1397. --echo #
  1398. set @optimizer_switch_MDEV4056 = @@optimizer_switch;
  1399. SET optimizer_switch = 'derived_merge=on,in_to_exists=on';
  1400. CREATE TABLE t1 (a VARCHAR(1)) ENGINE=MyISAM;
  1401. INSERT INTO t1 VALUES ('x'),('d');
  1402. CREATE TABLE t2 (pk INT PRIMARY KEY, b INT, c VARCHAR(1)) ENGINE=MyISAM;
  1403. INSERT INTO t2 VALUES (1,2,'v'),(2,150,'v');
  1404. SELECT * FROM t1 LEFT JOIN (
  1405. SELECT * FROM t2 WHERE ( pk, pk ) NOT IN (
  1406. SELECT MIN(b), SUM(pk) FROM t1
  1407. )
  1408. ) AS alias1 ON (a = c)
  1409. WHERE b IS NULL OR a < 'u';
  1410. drop table t1,t2;
  1411. set @@optimizer_switch = @optimizer_switch_MDEV4056;
  1412. --echo #
  1413. --echo # MDEV-5103: server crashed on singular Item_equal
  1414. --echo #
  1415. CREATE TABLE t1 (
  1416. a enum('p','r') NOT NULL DEFAULT 'r',
  1417. b int NOT NULL DEFAULT '0',
  1418. c char(32) NOT NULL,
  1419. d varchar(255) NOT NULL,
  1420. PRIMARY KEY (a, b), UNIQUE KEY idx(a, c)
  1421. );
  1422. INSERT INTO t1 VALUES ('r', 1, 'ad18832202b199728921807033a8a515', '001_cbr643');
  1423. CREATE TABLE t2 (
  1424. a enum('p','r') NOT NULL DEFAULT 'r',
  1425. b int NOT NULL DEFAULT '0',
  1426. e datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  1427. PRIMARY KEY (a, b, e)
  1428. );
  1429. INSERT INTO t2 VALUES ('r', 1, '2013-10-05 14:25:30');
  1430. SELECT * FROM t1 AS t
  1431. WHERE a='r' AND (c,b) NOT IN (SELECT c,b FROM t2 WHERE (c,b)=(t.c,t.b));
  1432. DROP TABLE t1, t2;
  1433. --echo #
  1434. --echo # MDEV-5468: assertion failure with a simplified condition in subselect
  1435. --echo #
  1436. CREATE TABLE t1 (a int, b int) ENGINE=MyISAM;
  1437. INSERT INTO t1 VALUES (1,1);
  1438. CREATE TABLE t2 ( pk int PRIMARY KEY, c INT) ENGINE=MyISAM;
  1439. INSERT INTO t2 VALUES (1,4), (2,6);
  1440. SELECT ( SELECT MAX(b) FROM t1, t2 WHERE pk = a AND b < from_sq.c ) AS select_sq,
  1441. COUNT( DISTINCT from_sq.c )
  1442. FROM ( SELECT DISTINCT t2_1.* FROM t2 AS t2_1, t2 AS t2_2 ) AS from_sq
  1443. GROUP BY select_sq ;
  1444. DROP TABLE t1,t2;
  1445. CREATE TABLE t1 (id int, a2 char(2), a3 char(3)) ENGINE=MyISAM;
  1446. INSERT INTO t1 VALUES (1,'BE','BEL');
  1447. CREATE TABLE t2 (id int, a2 char(2), a3 char(3)) ENGINE=MyISAM;
  1448. INSERT INTO t2 VALUES (1,'BE','BEL'), (2,'MX','MEX');
  1449. CREATE VIEW v2 AS SELECT DISTINCT * FROM t2;
  1450. SELECT * FROM t1 AS outer_t1, v2
  1451. WHERE v2.a3 = outer_t1.a3
  1452. AND EXISTS ( SELECT * FROM t1 WHERE a2 < v2.a2 AND id = outer_t1.id )
  1453. AND outer_t1.a3 < 'J'
  1454. ORDER BY v2.id;
  1455. DROP VIEW v2;
  1456. DROP TABLE t1,t2;
  1457. --echo #
  1458. --echo # MDEV-5686: degenerate disjunct in NOT IN subquery
  1459. --echo #
  1460. CREATE TABLE t1 (a int, b int, c varchar(3)) ENGINE=MyISAM;
  1461. INSERT INTO t1 VALUES (1,1,'CAN'),(2,2,'AUS');
  1462. CREATE TABLE t2 (f int) ENGINE=MyISAM;
  1463. INSERT INTO t2 VALUES (3);
  1464. EXPLAIN EXTENDED
  1465. SELECT * FROM t2
  1466. WHERE f NOT IN (SELECT b FROM t1
  1467. WHERE 0 OR (c IN ('USA') OR c NOT IN ('USA')) AND a = b);
  1468. SELECT * FROM t2
  1469. WHERE f NOT IN (SELECT b FROM t1
  1470. WHERE 0 OR (c IN ('USA') OR c NOT IN ('USA')) AND a = b);
  1471. DROP TABLE t1,t2;
  1472. --echo #
  1473. --echo # MDEV-3899 Valgrind warnings (blocks are definitely lost) in filesort on IN subquery with SUM and DISTINCT
  1474. --echo #
  1475. CREATE TABLE t1 (a INT) ENGINE=MyISAM;
  1476. INSERT INTO t1 VALUES (1),(9);
  1477. CREATE TABLE t2 (b INT) ENGINE=MyISAM;
  1478. INSERT INTO t2 VALUES (8);
  1479. SELECT * FROM t1
  1480. WHERE (1, 1) IN (SELECT a, SUM(DISTINCT a) FROM t1, t2 GROUP BY a);
  1481. drop table t1, t2;
  1482. --echo #
  1483. --echo # MDEV-3902 Assertion `record_length == m_record_length' failed at Filesort_buffer::alloc_sort_buffer
  1484. --echo #
  1485. CREATE TABLE t1 (a INT) ENGINE=MyISAM;
  1486. INSERT INTO t1 VALUES (1),(2);
  1487. CREATE TABLE t2 (pk INT PRIMARY KEY, b INT) ENGINE=MyISAM;
  1488. INSERT INTO t2 VALUES (1,1),(2,7);
  1489. CREATE TABLE t3 (c INT) ENGINE=MyISAM;
  1490. INSERT INTO t3 VALUES (8);
  1491. SELECT * FROM t1
  1492. WHERE (1, 5) IN (SELECT b, SUM(DISTINCT b) FROM t2, t3 GROUP BY b);
  1493. SELECT * FROM t2 AS alias1, t2 AS alias2
  1494. WHERE EXISTS ( SELECT 1 ) AND (alias2.pk = alias1.b )
  1495. ORDER BY alias1.b;
  1496. drop table t1, t2, t3;
  1497. --echo #
  1498. --echo # MDEV-4144 simple subquery causes full scan instead of range scan
  1499. --echo #
  1500. CREATE TABLE t1 (id int not null auto_increment, x int not null, primary key(id));
  1501. INSERT INTO t1 (x) VALUES (0),(0),(0);
  1502. EXPLAIN
  1503. SELECT x FROM t1 WHERE id > (SELECT MAX(id) - 1000 FROM t1) ORDER BY x LIMIT 1;
  1504. SELECT x FROM t1 WHERE id > (SELECT MAX(id) - 1000 FROM t1) ORDER BY x LIMIT 1;
  1505. drop table t1;
  1506. --echo #
  1507. --echo # MDEV-7691: Assertion `outer_context || !*from_field || *from_field == not_found_field' ...
  1508. --echo #
  1509. set optimizer_switch=default;
  1510. CREATE TABLE t1 (a INT) ENGINE=MyISAM;
  1511. INSERT INTO t1 VALUES (4),(6);
  1512. CREATE TABLE t2 (b INT) ENGINE=MyISAM;
  1513. INSERT INTO t2 VALUES (1),(8);
  1514. PREPARE stmt FROM "
  1515. SELECT * FROM t2
  1516. HAVING 0 IN (
  1517. SELECT a FROM t1
  1518. WHERE a IN (
  1519. SELECT a FROM t1
  1520. WHERE b = a
  1521. )
  1522. )
  1523. ";
  1524. EXECUTE stmt;
  1525. EXECUTE stmt;
  1526. --echo # Alternative test case, without HAVING
  1527. CREATE TABLE t3 (i INT) ENGINE=MyISAM;
  1528. INSERT INTO t3 VALUES (4),(6);
  1529. PREPARE stmt FROM "
  1530. SELECT * FROM t3 AS t10
  1531. WHERE EXISTS (
  1532. SELECT * FROM t3 AS t20 WHERE t10.i IN (
  1533. SELECT i FROM t3
  1534. )
  1535. )";
  1536. EXECUTE stmt;
  1537. EXECUTE stmt;
  1538. drop table t1, t2, t3;
  1539. --echo #
  1540. --echo # MDEV-11078: NULL NOT IN (non-empty subquery) should never return results
  1541. --echo #
  1542. create table t1(a int,b int);
  1543. create table t2(a int,b int);
  1544. insert into t1 value (1,2);
  1545. select (NULL) in (select 1 from t1);
  1546. select (null) in (select 1 from t2);
  1547. select 1 in (select 1 from t1);
  1548. select 1 in (select 1 from t2);
  1549. select 1 from dual where null in (select 1 from t1);
  1550. select 1 from dual where null in (select 1 from t2);
  1551. select (null,null) in (select * from t1);
  1552. select (null,null) in (select * from t2);
  1553. select 1 from dual where null not in (select 1 from t1);
  1554. select 1 from dual where null not in (select 1 from t2);
  1555. drop table t1,t2;
  1556. --echo #
  1557. --echo # MDEV-6486: Assertion `!table || (!table->read_set || bitmap_is_set(table->read_set, field_index))'
  1558. --echo # failed with SELECT SQ, TEXT field
  1559. --echo #
  1560. CREATE TABLE t1 (a VARCHAR(8), KEY(a)) ENGINE=MyISAM;
  1561. INSERT INTO t1 VALUES ('foo'),( 'bar');
  1562. CREATE TABLE t2 (b VARCHAR(8), c TINYTEXT, KEY(b)) ENGINE=MyISAM;
  1563. INSERT INTO t2 VALUES ('baz','baz'),('qux', 'qux');
  1564. SELECT ( SELECT COUNT(*) FROM t1 WHERE a = c ) AS field, COUNT(DISTINCT c)
  1565. FROM t2 WHERE b <= 'quux' GROUP BY field;
  1566. drop table t1,t2;
  1567. --echo #
  1568. --echo # MDEV-15555: select from DUAL where false yielding wrong result when in a IN
  1569. --echo #
  1570. explain
  1571. SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1);
  1572. SELECT 2 IN (SELECT 2 from DUAL WHERE 1 != 1);
  1573. SET optimizer_switch= @@global.optimizer_switch;
  1574. set @@tmp_table_size= @@global.tmp_table_size;
  1575. --echo #
  1576. --echo # mfrv-14515: Wrong results for tableless query with subquery in WHERE
  1577. --echo # and implicit aggregation
  1578. --echo #
  1579. create table t1 (i1 int, i2 int);
  1580. insert into t1 values (1314, 1084),(1330, 1084),(1401, 1084),(580, 1084);
  1581. create table t2 (cd int);
  1582. insert into t2 values
  1583. (1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330),
  1584. (1330), (1330), (1330), (1330), (1330), (1330), (1330), (1330);
  1585. select max(10) from dual
  1586. where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345);
  1587. insert into t2 select * from t2;
  1588. select max(10) from dual
  1589. where exists (select 1 from t2 join t1 on t1.i1 = t2.cd and t1.i2 = 345);
  1590. DROP TABLE t1,t2;