diff options
author | Igor Babaev <igor@askmonty.org> | 2019-04-17 21:37:29 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2019-04-17 21:37:29 -0700 |
commit | 59ed5f3aa4bc5a02a65f93b1d054ccc0fb2cd248 (patch) | |
tree | fb923464b33c0127e627d7e20b4ccc83f01648f1 /mysql-test/main/having_cond_pushdown.test | |
parent | e7029e864f4b2c8fa88362677ee8150cc479f07f (diff) | |
download | mariadb-git-59ed5f3aa4bc5a02a65f93b1d054ccc0fb2cd248.tar.gz |
MDEV-19164 Assertion `fixed' failed in Item_func_inet_aton::val_int
When pushing a condition from HAVING into WHERE the function
st_select_lex::pushdown_from_having_into_where() transforms column
references in the pushed condition then performs cleanup of
items of the condition and finally calls fix_fields() for the condition
items. The cleanup is performed by a call of the method walk() with
cleanup_processor as the first parameter. Unfortunately this sequence
of calls does not work if the condition contains cached items, because
fix_fields() cannot go through Item_cache items and this leaves
underlying items unfixed.
The solution of this problem used in this patch is just does not allow
to process Item_cache objects when performing cleanup of the pushed
condition. In order to let the traversal procedure walk() not to process
Item_cache objects the third parameter of the used call of walk()
is set to a fictitious pointer (void *) 1. And Item_cache::walk() is
changed to prevent any action when it gets such value as the third
parameter.
Diffstat (limited to 'mysql-test/main/having_cond_pushdown.test')
-rw-r--r-- | mysql-test/main/having_cond_pushdown.test | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/mysql-test/main/having_cond_pushdown.test b/mysql-test/main/having_cond_pushdown.test index 257e5cb4875..5088dad734d 100644 --- a/mysql-test/main/having_cond_pushdown.test +++ b/mysql-test/main/having_cond_pushdown.test @@ -1340,3 +1340,33 @@ HAVING (v1.pk = 1); DROP TABLE t1,t2,tmp1; DROP VIEW v1; + +--echo # +--echo # MDEV-19164: pushdown of condition with cached items +--echo # + +create table t1 (d1 date); +insert into t1 values (null),('1971-03-06'),('1993-06-05'),('1998-07-08'); + +let $q1= +select d1 from t1 + group by d1 + having d1 between (inet_aton('1978-04-27')) and '2018-08-26'; + +eval $q1; +eval explain extended $q1; +eval explain format=json $q1; + +delete from t1; +insert into t1 values ('2018-01-15'),('2018-02-20'); + +let $q2= +select d1 from t1 + group by d1 + having d1 not between 0 AND exp(0); + +eval $q2; +eval explain extended $q2; +eval explain format=json $q2; + +drop table t1; |