Commit ac68e9b9 authored by Sergey Petrunya's avatar Sergey Petrunya

Merge 5.5 -> 10.0-serg

parents eeb3870d 2c496e5f
...@@ -180,6 +180,32 @@ SET optimizer_switch=@tmp_optimizer_switch; ...@@ -180,6 +180,32 @@ SET optimizer_switch=@tmp_optimizer_switch;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2,t3; 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 # MDEV-567: Wrong result from a query with correlated subquery if ICP is allowed
# #
CREATE TABLE t1 (a int, b int, INDEX idx(a)); CREATE TABLE t1 (a int, b int, INDEX idx(a));
...@@ -197,5 +223,76 @@ a b ...@@ -197,5 +223,76 @@ a b
1 0 1 0
1 1 1 1
1 3 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; set optimizer_switch=@subselect2_test_tmp;
...@@ -203,6 +203,32 @@ SET optimizer_switch=@tmp_optimizer_switch; ...@@ -203,6 +203,32 @@ SET optimizer_switch=@tmp_optimizer_switch;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2,t3; 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 #
--echo # MDEV-567: Wrong result from a query with correlated subquery if ICP is allowed --echo # MDEV-567: Wrong result from a query with correlated subquery if ICP is allowed
--echo # --echo #
...@@ -220,7 +246,75 @@ SELECT * FROM t3 ...@@ -220,7 +246,75 @@ SELECT * FROM t3
WHERE t1.a = t2.a AND t2.a BETWEEN 7 AND 9 WHERE t1.a = t2.a AND t2.a BETWEEN 7 AND 9
AND t3.b = t1.b AND t3.b = t1.b
GROUP BY 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; set optimizer_switch=@subselect2_test_tmp;
...@@ -206,7 +206,7 @@ my_context_spawn(struct my_context *c, void (*f)(void *), void *d) ...@@ -206,7 +206,7 @@ my_context_spawn(struct my_context *c, void (*f)(void *), void *d)
( (
"movq %%rsp, (%[save])\n\t" "movq %%rsp, (%[save])\n\t"
"movq %[stack], %%rsp\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 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 undefined. This indicates that this is the top of the stack frame, and
......
...@@ -10959,6 +10959,13 @@ int QUICK_RANGE_SELECT::reset() ...@@ -10959,6 +10959,13 @@ int QUICK_RANGE_SELECT::reset()
last_range= NULL; last_range= NULL;
cur_range= (QUICK_RANGE**) ranges.buffer; cur_range= (QUICK_RANGE**) ranges.buffer;
RANGE_SEQ_IF seq_funcs= {NULL, quick_range_seq_init, quick_range_seq_next, 0, 0}; 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) if (in_ror_merged_scan)
head->column_bitmaps_set_no_signal(&column_bitmap, &column_bitmap); head->column_bitmaps_set_no_signal(&column_bitmap, &column_bitmap);
......
...@@ -19065,6 +19065,20 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, ...@@ -19065,6 +19065,20 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order,
save_pre_sort_join_tab= join->pre_sort_join_tab; save_pre_sort_join_tab= join->pre_sort_join_tab;
join->pre_sort_join_tab= NULL; 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. */ /* Currently ORDER BY ... LIMIT is not supported in subqueries. */
DBUG_ASSERT(join->group_list || !join->is_in_subquery()); DBUG_ASSERT(join->group_list || !join->is_in_subquery());
...@@ -19155,17 +19169,6 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, ...@@ -19155,17 +19169,6 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order,
*(join->pre_sort_join_tab)= *tab; *(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. */ /*TODO: here, close the index scan, cancel index-only read. */
#if 0 #if 0
/* MariaDB doesn't need the following: */ /* MariaDB doesn't need the following: */
...@@ -19211,8 +19214,6 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order, ...@@ -19211,8 +19214,6 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order,
#endif #endif
tab->select=NULL; tab->select=NULL;
tab->set_select_cond(NULL, __LINE__); tab->set_select_cond(NULL, __LINE__);
// tab->last_inner= 0;
// tab->first_unmatched= 0;
tab->type=JT_ALL; // Read with normal read_record tab->type=JT_ALL; // Read with normal read_record
tab->read_first_record= join_init_read_record; tab->read_first_record= join_init_read_record;
tab->table->file->ha_index_or_rnd_end(); tab->table->file->ha_index_or_rnd_end();
......
...@@ -895,6 +895,7 @@ class JOIN :public Sql_alloc ...@@ -895,6 +895,7 @@ class JOIN :public Sql_alloc
public: public:
JOIN_TAB *join_tab, **best_ref; JOIN_TAB *join_tab, **best_ref;
/* /*
For "Using temporary+Using filesort" queries, JOIN::join_tab can point to For "Using temporary+Using filesort" queries, JOIN::join_tab can point to
either: either:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment