Commit 8149e4d0 authored by Igor Babaev's avatar Igor Babaev

MDEV-25682 Explain shows an execution plan different from actually executed

If a select query contained an ORDER BY clause that followed a LIMIT clause
or an ORDER BY clause or ORDER BY with LIMIT the EXPLAIN output for the
query showed an execution plan different from that was actually executed.

Approved by Roman Nozdrin <roman.nozdrin@mariadb.com>
parent b1b4d67b
...@@ -3460,6 +3460,31 @@ SET max_length_for_sort_data=@save_max_length_for_sort_data; ...@@ -3460,6 +3460,31 @@ SET max_length_for_sort_data=@save_max_length_for_sort_data;
SET max_sort_length= @save_max_sort_length; SET max_sort_length= @save_max_sort_length;
SET sql_select_limit= @save_sql_select_limit; SET sql_select_limit= @save_sql_select_limit;
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-25682: EXPLAIN for SELECT with ORDER BY after [ORDER BY] LIMIT
#
create table t1 (a int);
insert into t1 values (3), (7), (1);
explain (select a from t1 limit 2) order by a desc;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 3
NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL Using filesort
(select a from t1 limit 2) order by a desc;
a
7
3
create table t2 (a int, b int);
insert into t2 values (3,70), (7,10), (1,40), (4,30);
explain (select b,a from t2 order by a limit 3) order by b desc;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using filesort
NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL Using filesort
(select b,a from t2 order by a limit 3) order by b desc;
b a
70 3
40 1
30 4
drop table t1,t2;
# End of 10.2 tests # End of 10.2 tests
# #
# MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY # MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY
......
...@@ -2293,6 +2293,22 @@ SET max_sort_length= @save_max_sort_length; ...@@ -2293,6 +2293,22 @@ SET max_sort_length= @save_max_sort_length;
SET sql_select_limit= @save_sql_select_limit; SET sql_select_limit= @save_sql_select_limit;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-25682: EXPLAIN for SELECT with ORDER BY after [ORDER BY] LIMIT
--echo #
create table t1 (a int);
insert into t1 values (3), (7), (1);
explain (select a from t1 limit 2) order by a desc;
(select a from t1 limit 2) order by a desc;
create table t2 (a int, b int);
insert into t2 values (3,70), (7,10), (1,40), (4,30);
explain (select b,a from t2 order by a limit 3) order by b desc;
(select b,a from t2 order by a limit 3) order by b desc;
drop table t1,t2;
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
......
...@@ -274,6 +274,8 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref) ...@@ -274,6 +274,8 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref)
res= TRUE; res= TRUE;
goto end; goto end;
} }
if (sl == unit->first_select() && !sl->next_select())
unit->fake_select_lex= 0;
} }
} }
......
...@@ -26370,7 +26370,7 @@ bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result) ...@@ -26370,7 +26370,7 @@ bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
sl->options|= SELECT_DESCRIBE; sl->options|= SELECT_DESCRIBE;
} }
if (unit->is_unit_op()) if (unit->is_unit_op() || unit->fake_select_lex)
{ {
if (unit->union_needs_tmp_table() && unit->fake_select_lex) if (unit->union_needs_tmp_table() && unit->fake_select_lex)
{ {
......
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