mirror of
https://github.com/MariaDB/server.git
synced 2026-04-29 03:35:34 +02:00
Fixed bug mdev-10884.
If a materialized derived table / view is specified by a unit with SELECTs containing ORDER BY ... LIMIT then condition pushdown cannot be done for these SELECTs. If a materialized derived table / view is specified by a unit containing global ORDER BY ... LIMIT then condition pushdown cannot be done for this unit.
This commit is contained in:
parent
09cbb772eb
commit
1f1990a161
4 changed files with 95 additions and 12 deletions
|
|
@ -7032,3 +7032,54 @@ i
|
|||
DROP FUNCTION f;
|
||||
DROP VIEW v2,v1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-10884: condition pushdown into derived specified by
|
||||
# 1. unit with SELECT containing ORDER BY ... LIMIT
|
||||
# 2. unit containing global ORDER BY ... LIMIT
|
||||
#
|
||||
create table t1(a int);
|
||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
select a from t1 order by a limit 5;
|
||||
a
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=off' for
|
||||
select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
|
||||
a
|
||||
0
|
||||
4
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=on' for
|
||||
select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
|
||||
a
|
||||
0
|
||||
4
|
||||
select a from t1 where a < 4 union select a from t1 where a > 5
|
||||
order by a limit 5;
|
||||
a
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
6
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=off' for
|
||||
select * from
|
||||
(select a from t1 where a < 4 union select a from t1 where a > 5
|
||||
order by a limit 5) t where t.a not in (2,9);
|
||||
a
|
||||
0
|
||||
1
|
||||
3
|
||||
6
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=on' for
|
||||
select * from
|
||||
(select a from t1 where a < 4 union select a from t1 where a > 5
|
||||
order by a limit 5) t where t.a not in (2,9);
|
||||
a
|
||||
0
|
||||
1
|
||||
3
|
||||
6
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -923,3 +923,31 @@ EXECUTE stmt;
|
|||
DROP FUNCTION f;
|
||||
DROP VIEW v2,v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-10884: condition pushdown into derived specified by
|
||||
--echo # 1. unit with SELECT containing ORDER BY ... LIMIT
|
||||
--echo # 2. unit containing global ORDER BY ... LIMIT
|
||||
--echo #
|
||||
|
||||
create table t1(a int);
|
||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||
select a from t1 order by a limit 5;
|
||||
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=off' for
|
||||
select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=on' for
|
||||
select * from (select a from t1 order by a limit 5) t where t.a not in (1,2,3);
|
||||
|
||||
select a from t1 where a < 4 union select a from t1 where a > 5
|
||||
order by a limit 5;
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=off' for
|
||||
select * from
|
||||
(select a from t1 where a < 4 union select a from t1 where a > 5
|
||||
order by a limit 5) t where t.a not in (2,9);
|
||||
set statement optimizer_switch='condition_pushdown_for_derived=on' for
|
||||
select * from
|
||||
(select a from t1 where a < 4 union select a from t1 where a > 5
|
||||
order by a limit 5) t where t.a not in (2,9);
|
||||
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -1131,19 +1131,6 @@ bool pushdown_cond_for_derived(THD *thd, Item *cond, TABLE_LIST *derived)
|
|||
st_select_lex_unit *unit= derived->get_unit();
|
||||
st_select_lex *sl= unit->first_select();
|
||||
|
||||
/* Check whether any select of 'unit' allows condition pushdown */
|
||||
bool any_select_allows_cond_pushdown= false;
|
||||
for (; sl; sl= sl->next_select())
|
||||
{
|
||||
if (sl->cond_pushdown_is_allowed())
|
||||
{
|
||||
any_select_allows_cond_pushdown= true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!any_select_allows_cond_pushdown)
|
||||
return false;
|
||||
|
||||
/* Do not push conditions into constant derived */
|
||||
if (unit->executed)
|
||||
return false;
|
||||
|
|
@ -1152,6 +1139,23 @@ bool pushdown_cond_for_derived(THD *thd, Item *cond, TABLE_LIST *derived)
|
|||
if (derived->is_recursive_with_table())
|
||||
return false;
|
||||
|
||||
/* Do not push conditions into unit with global ORDER BY ... LIMIT */
|
||||
if (unit->fake_select_lex && unit->fake_select_lex->explicit_limit)
|
||||
return false;
|
||||
|
||||
/* Check whether any select of 'unit' allows condition pushdown */
|
||||
bool some_select_allows_cond_pushdown= false;
|
||||
for (; sl; sl= sl->next_select())
|
||||
{
|
||||
if (sl->cond_pushdown_is_allowed())
|
||||
{
|
||||
some_select_allows_cond_pushdown= true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!some_select_allows_cond_pushdown)
|
||||
return false;
|
||||
|
||||
/*
|
||||
Build the most restrictive condition extractable from 'cond'
|
||||
that can be pushed into the derived table 'derived'.
|
||||
|
|
|
|||
|
|
@ -1160,7 +1160,7 @@ public:
|
|||
bool have_window_funcs() const { return (window_funcs.elements !=0); }
|
||||
|
||||
bool cond_pushdown_is_allowed() const
|
||||
{ return !have_window_funcs() && !olap; }
|
||||
{ return !have_window_funcs() && !olap && !explicit_limit; }
|
||||
|
||||
private:
|
||||
bool m_non_agg_field_used;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue