diff options
author | Sergey Petrunya <psergey@askmonty.org> | 2012-11-04 19:32:32 +0400 |
---|---|---|
committer | Sergey Petrunya <psergey@askmonty.org> | 2012-11-04 19:32:32 +0400 |
commit | 5e68c5ce7db95610c2084f9d9c6d01473ae243db (patch) | |
tree | c553dcf91d5ed7d9677daa44328491454683e3d3 | |
parent | be0be7af47fcc75b798fcf7aa98dda9c7d31cc15 (diff) | |
parent | 39e7072d64f5ff36d61bf81970ec398f8d937cfd (diff) | |
download | mariadb-git-5e68c5ce7db95610c2084f9d9c6d01473ae243db.tar.gz |
Merge 5.5 -> 10.0-serg
-rw-r--r-- | mysql-test/r/subselect2.result | 99 | ||||
-rw-r--r-- | mysql-test/t/subselect2.test | 96 | ||||
-rw-r--r-- | mysys/my_context.c | 2 | ||||
-rw-r--r-- | sql/opt_range.cc | 7 | ||||
-rw-r--r-- | sql/sql_select.cc | 27 | ||||
-rw-r--r-- | sql/sql_select.h | 1 |
6 files changed, 216 insertions, 16 deletions
diff --git a/mysql-test/r/subselect2.result b/mysql-test/r/subselect2.result index 7eff7f949a8..4fd303dfd44 100644 --- a/mysql-test/r/subselect2.result +++ b/mysql-test/r/subselect2.result @@ -180,6 +180,32 @@ SET optimizer_switch=@tmp_optimizer_switch; DROP VIEW v1; DROP TABLE t1,t2,t3; # +# MDEV-536: LP:1050806 - different result for a query using subquery +# +DROP TABLE IF EXISTS `t1`; +Warnings: +Note 1051 Unknown table 't1' +CREATE TABLE `t1` ( +`node_uid` bigint(20) unsigned DEFAULT NULL, +`date` datetime DEFAULT NULL, +`mirror_date` datetime DEFAULT NULL, +KEY `date` (`date`) +) ENGINE=MyISAM; +INSERT INTO `t1` VALUES (2085,'2012-01-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2084,'2012-02-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2088,'2012-03-01 00:00:00','2013-01-01 00:00:00'); +SELECT * FROM ( +SELECT node_uid, date, mirror_date, @result := 0 AS result +FROM t1 +WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) +ORDER BY mirror_date ASC +) AS calculated_result; +node_uid date mirror_date result +2085 2012-01-01 00:00:00 2013-01-01 00:00:00 0 +2084 2012-02-01 00:00:00 2013-01-01 00:00:00 0 +DROP TABLE t1; +# # MDEV-567: Wrong result from a query with correlated subquery if ICP is allowed # CREATE TABLE t1 (a int, b int, INDEX idx(a)); @@ -197,5 +223,76 @@ a b 1 0 1 1 1 3 -DROP TABLE t1, t2, t3; +set @tmp_mdev567=@@optimizer_switch; +set optimizer_switch='mrr=off'; +SELECT * FROM t3 +WHERE a = (SELECT COUNT(DISTINCT t2.b) FROM t1, t2 +WHERE t1.a = t2.a AND t2.a BETWEEN 7 AND 9 +AND t3.b = t1.b +GROUP BY t1.b); +a b +1 0 +1 1 +1 3 +DROP TABLE t1,t2,t3; +set optimizer_switch=@tmp_mdev567; +# +# MDEV-614, also MDEV-536, also LP:1050806: +# different result for a query using subquery between 5.5.25 and 5.5.27 +# +CREATE TABLE `t1` ( +`node_uid` bigint(20) unsigned DEFAULT NULL, +`date` datetime DEFAULT NULL, +`mirror_date` datetime DEFAULT NULL, +KEY `date` (`date`) +) ENGINE=MyISAM; +INSERT INTO `t1` VALUES (2085,'2012-01-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2084,'2012-02-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2088,'2012-03-01 00:00:00','2013-01-01 00:00:00'); +explain +SELECT * FROM ( +SELECT node_uid, date, mirror_date, @result := 0 AS result +FROM t1 +WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) +ORDER BY mirror_date ASC +) AS calculated_result; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE <derived2> ALL NULL NULL NULL NULL 2 +2 DERIVED t1 range date date 9 NULL 2 Using index condition; Using where; Rowid-ordered scan; Using filesort +SELECT * FROM ( +SELECT node_uid, date, mirror_date, @result := 0 AS result +FROM t1 +WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) +ORDER BY mirror_date ASC +) AS calculated_result; +node_uid date mirror_date result +2085 2012-01-01 00:00:00 2013-01-01 00:00:00 0 +2084 2012-02-01 00:00:00 2013-01-01 00:00:00 0 +set @tmp_mdev614=@@optimizer_switch; +set optimizer_switch='mrr=off'; +explain +SELECT * FROM ( +SELECT node_uid, date, mirror_date, @result := 0 AS result +FROM t1 +WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) +ORDER BY mirror_date ASC +) AS calculated_result; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE <derived2> ALL NULL NULL NULL NULL 2 +2 DERIVED t1 range date date 9 NULL 2 Using index condition; Using where; Using filesort +SELECT * FROM ( +SELECT node_uid, date, mirror_date, @result := 0 AS result +FROM t1 +WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) +ORDER BY mirror_date ASC +) AS calculated_result; +node_uid date mirror_date result +2085 2012-01-01 00:00:00 2013-01-01 00:00:00 0 +2084 2012-02-01 00:00:00 2013-01-01 00:00:00 0 +set optimizer_switch=@tmp_mdev614; +DROP TABLE t1; set optimizer_switch=@subselect2_test_tmp; diff --git a/mysql-test/t/subselect2.test b/mysql-test/t/subselect2.test index 75cf842fbdb..68894ad18cb 100644 --- a/mysql-test/t/subselect2.test +++ b/mysql-test/t/subselect2.test @@ -204,6 +204,32 @@ DROP VIEW v1; DROP TABLE t1,t2,t3; --echo # +--echo # MDEV-536: LP:1050806 - different result for a query using subquery +--echo # +DROP TABLE IF EXISTS `t1`; + +CREATE TABLE `t1` ( + `node_uid` bigint(20) unsigned DEFAULT NULL, + `date` datetime DEFAULT NULL, + `mirror_date` datetime DEFAULT NULL, + KEY `date` (`date`) +) ENGINE=MyISAM; + +INSERT INTO `t1` VALUES (2085,'2012-01-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2084,'2012-02-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2088,'2012-03-01 00:00:00','2013-01-01 00:00:00'); + +SELECT * FROM ( + SELECT node_uid, date, mirror_date, @result := 0 AS result + FROM t1 + WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) + ORDER BY mirror_date ASC +) AS calculated_result; + +DROP TABLE t1; + +--echo # --echo # MDEV-567: Wrong result from a query with correlated subquery if ICP is allowed --echo # CREATE TABLE t1 (a int, b int, INDEX idx(a)); @@ -220,7 +246,75 @@ SELECT * FROM t3 WHERE t1.a = t2.a AND t2.a BETWEEN 7 AND 9 AND t3.b = t1.b GROUP BY t1.b); -DROP TABLE t1, t2, t3; + + +set @tmp_mdev567=@@optimizer_switch; +set optimizer_switch='mrr=off'; +SELECT * FROM t3 + WHERE a = (SELECT COUNT(DISTINCT t2.b) FROM t1, t2 + WHERE t1.a = t2.a AND t2.a BETWEEN 7 AND 9 + AND t3.b = t1.b + GROUP BY t1.b); + +DROP TABLE t1,t2,t3; +set optimizer_switch=@tmp_mdev567; + +--echo # +--echo # MDEV-614, also MDEV-536, also LP:1050806: +--echo # different result for a query using subquery between 5.5.25 and 5.5.27 +--echo # + +CREATE TABLE `t1` ( + `node_uid` bigint(20) unsigned DEFAULT NULL, + `date` datetime DEFAULT NULL, + `mirror_date` datetime DEFAULT NULL, + KEY `date` (`date`) +) ENGINE=MyISAM; + +INSERT INTO `t1` VALUES (2085,'2012-01-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2084,'2012-02-01 00:00:00','2013-01-01 00:00:00'); +INSERT INTO `t1` VALUES (2088,'2012-03-01 00:00:00','2013-01-01 00:00:00'); + +explain +SELECT * FROM ( + SELECT node_uid, date, mirror_date, @result := 0 AS result + FROM t1 + WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) + ORDER BY mirror_date ASC +) AS calculated_result; + +SELECT * FROM ( + SELECT node_uid, date, mirror_date, @result := 0 AS result + FROM t1 + WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) + ORDER BY mirror_date ASC +) AS calculated_result; + +set @tmp_mdev614=@@optimizer_switch; +set optimizer_switch='mrr=off'; +explain +SELECT * FROM ( + SELECT node_uid, date, mirror_date, @result := 0 AS result + FROM t1 + WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) + ORDER BY mirror_date ASC +) AS calculated_result; + +SELECT * FROM ( + SELECT node_uid, date, mirror_date, @result := 0 AS result + FROM t1 + WHERE date < '2012-12-12 12:12:12' + AND node_uid in (2085, 2084) + ORDER BY mirror_date ASC +) AS calculated_result; + +set optimizer_switch=@tmp_mdev614; + +DROP TABLE t1; + set optimizer_switch=@subselect2_test_tmp; diff --git a/mysys/my_context.c b/mysys/my_context.c index 6b8761e554d..10382163331 100644 --- a/mysys/my_context.c +++ b/mysys/my_context.c @@ -206,7 +206,7 @@ my_context_spawn(struct my_context *c, void (*f)(void *), void *d) ( "movq %%rsp, (%[save])\n\t" "movq %[stack], %%rsp\n\t" -#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 +#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 && !defined(__INTEL_COMPILER) /* This emits a DWARF DW_CFA_undefined directive to make the return address undefined. This indicates that this is the top of the stack frame, and diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 183e4dbe90d..67bc1639f2d 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -10959,6 +10959,13 @@ int QUICK_RANGE_SELECT::reset() last_range= NULL; cur_range= (QUICK_RANGE**) ranges.buffer; RANGE_SEQ_IF seq_funcs= {NULL, quick_range_seq_init, quick_range_seq_next, 0, 0}; + + if (file->inited == handler::RND) + { + /* Handler could be left in this state by MRR */ + if ((error= file->ha_rnd_end())) + DBUG_RETURN(error); + } if (in_ror_merged_scan) head->column_bitmaps_set_no_signal(&column_bitmap, &column_bitmap); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 89d6e993b1d..92bf3b47ca1 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -19065,6 +19065,20 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, save_pre_sort_join_tab= join->pre_sort_join_tab; join->pre_sort_join_tab= NULL; } + else + { + /* + Save index #, save index condition. Do it right now, because MRR may + */ + if (table->file->inited == handler::INDEX) + { + join->pre_sort_index= table->file->active_index; + join->pre_sort_idx_pushed_cond= table->file->pushed_idx_cond; + // no need to save key_read + } + else + join->pre_sort_index= MAX_KEY; + } /* Currently ORDER BY ... LIMIT is not supported in subqueries. */ DBUG_ASSERT(join->group_list || !join->is_in_subquery()); @@ -19155,17 +19169,6 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, *(join->pre_sort_join_tab)= *tab; - if (table->file->inited == handler::INDEX) - { - // Save index #, save index condition - join->pre_sort_index= table->file->active_index; - join->pre_sort_idx_pushed_cond= table->file->pushed_idx_cond; - // no need to save key_read? - err= table->file->ha_index_end(); - } - else - join->pre_sort_index= MAX_KEY; - /*TODO: here, close the index scan, cancel index-only read. */ #if 0 /* MariaDB doesn't need the following: */ @@ -19211,8 +19214,6 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, #endif tab->select=NULL; tab->set_select_cond(NULL, __LINE__); -// tab->last_inner= 0; -// tab->first_unmatched= 0; tab->type=JT_ALL; // Read with normal read_record tab->read_first_record= join_init_read_record; tab->table->file->ha_index_or_rnd_end(); diff --git a/sql/sql_select.h b/sql/sql_select.h index 586019cae23..f789dce9cc8 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -895,6 +895,7 @@ protected: public: JOIN_TAB *join_tab, **best_ref; + /* For "Using temporary+Using filesort" queries, JOIN::join_tab can point to either: |