Commit 25870f48 authored by Igor Babaev's avatar Igor Babaev

MDEV-18668 Server crash or ASAN use-after-poison in Item_equal_iterator /

           st_select_lex::pushdown_from_having_into_where upon query
           with impossible WHERE condition

Do not push from HAVING into impossible WHERE
parent 31deef09
...@@ -1906,3 +1906,15 @@ EXPLAIN ...@@ -1906,3 +1906,15 @@ EXPLAIN
DROP TABLE t1,t2; DROP TABLE t1,t2;
DROP VIEW v1; DROP VIEW v1;
DROP FUNCTION f1; DROP FUNCTION f1;
#
# MDEV-18668: pushdown from HAVING into impossible WHERE
#
CREATE TABLE t1 (a INT, b INT);
INSERT INTO t1 VALUES (1,1),(2,2);
SELECT a FROM t1 WHERE b = 1 AND b = 2 GROUP BY a HAVING a <= 3;
a
EXPLAIN
SELECT a FROM t1 WHERE b = 1 AND b = 2 GROUP BY a HAVING a <= 3;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
DROP TABLE t1;
...@@ -473,3 +473,16 @@ eval $no_pushdown explain format=json $query; ...@@ -473,3 +473,16 @@ eval $no_pushdown explain format=json $query;
DROP TABLE t1,t2; DROP TABLE t1,t2;
DROP VIEW v1; DROP VIEW v1;
DROP FUNCTION f1; DROP FUNCTION f1;
--echo #
--echo # MDEV-18668: pushdown from HAVING into impossible WHERE
--echo #
CREATE TABLE t1 (a INT, b INT);
INSERT INTO t1 VALUES (1,1),(2,2);
SELECT a FROM t1 WHERE b = 1 AND b = 2 GROUP BY a HAVING a <= 3;
EXPLAIN
SELECT a FROM t1 WHERE b = 1 AND b = 2 GROUP BY a HAVING a <= 3;
DROP TABLE t1;
...@@ -1929,8 +1929,11 @@ JOIN::optimize_inner() ...@@ -1929,8 +1929,11 @@ JOIN::optimize_inner()
DBUG_RETURN(1); DBUG_RETURN(1);
} }
/* Do not push into WHERE from HAVING if cond_value == Item::COND_FALSE */
if (thd->lex->sql_command == SQLCOM_SELECT && if (thd->lex->sql_command == SQLCOM_SELECT &&
optimizer_flag(thd, OPTIMIZER_SWITCH_COND_PUSHDOWN_FROM_HAVING)) optimizer_flag(thd, OPTIMIZER_SWITCH_COND_PUSHDOWN_FROM_HAVING) &&
cond_value != Item::COND_FALSE)
{ {
having= having=
select_lex->pushdown_from_having_into_where(thd, having); select_lex->pushdown_from_having_into_where(thd, having);
...@@ -15380,6 +15383,7 @@ Item *eliminate_item_equal(THD *thd, COND *cond, COND_EQUAL *upper_levels, ...@@ -15380,6 +15383,7 @@ Item *eliminate_item_equal(THD *thd, COND *cond, COND_EQUAL *upper_levels,
@param cond condition to process @param cond condition to process
@param cond_equal multiple equalities to take into consideration @param cond_equal multiple equalities to take into consideration
@param table_join_idx index to tables determining field preference @param table_join_idx index to tables determining field preference
@param do_substitution if false: do not do any field substitution
@note @note
At the first glance full sort of fields in multiple equality At the first glance full sort of fields in multiple equality
......
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