diff --git a/mysql-test/r/null.result b/mysql-test/r/null.result index 0d012e283b557875658d9128520b8f1dab44731b..fcaaeb2192f3e68ef2cf00ebc886e1fa0b425178 100644 --- a/mysql-test/r/null.result +++ b/mysql-test/r/null.result @@ -1572,5 +1572,22 @@ SELECT * FROM t1 WHERE NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(N i DROP TABLE t1; # +# MDEV-10236 Where expression with NOT function gives incorrect result +# +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1),(2),(3); +EXPLAIN EXTENDED +SELECT * FROM t1 WHERE ((c1 IS NOT NULL) >= (NOT TRUE)) IS NOT NULL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`c1` AS `c1` from `test`.`t1` where (((`test`.`t1`.`c1` is not null) >= <cache>((not(1)))) is not null) +SELECT * FROM t1 WHERE ((c1 IS NOT NULL) >= (NOT TRUE)) IS NOT NULL; +c1 +1 +2 +3 +DROP TABLE t1; +# # End of 10.1 tests # diff --git a/mysql-test/t/null.test b/mysql-test/t/null.test index a5db4442183458c4038c06b93dc3e27d6f05ff69..84b3f0696834e9b4642c748e423db31fdb008bd8 100644 --- a/mysql-test/t/null.test +++ b/mysql-test/t/null.test @@ -1007,6 +1007,17 @@ SELECT * FROM t1 WHERE NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(NULLIF(N DROP TABLE t1; +--echo # +--echo # MDEV-10236 Where expression with NOT function gives incorrect result +--echo # +CREATE TABLE t1 (c1 INT); +INSERT INTO t1 VALUES (1),(2),(3); +EXPLAIN EXTENDED +SELECT * FROM t1 WHERE ((c1 IS NOT NULL) >= (NOT TRUE)) IS NOT NULL; +SELECT * FROM t1 WHERE ((c1 IS NOT NULL) >= (NOT TRUE)) IS NOT NULL; +DROP TABLE t1; + + --echo # --echo # End of 10.1 tests --echo # diff --git a/sql/item.h b/sql/item.h index bef57c4a96767bcf792a10358ab9f5343705c234..93da3985d4cf225264d47f442bd2d0f2a9dfba78 100644 --- a/sql/item.h +++ b/sql/item.h @@ -5050,7 +5050,7 @@ class Item_cache: public Item_basic_constant bool basic_const_item() const { return MY_TEST(example && example->basic_const_item()); } virtual void clear() { null_value= TRUE; value_cached= FALSE; } - bool is_null() { return null_value; } + bool is_null() { return !has_value(); } virtual bool is_expensive() { if (value_cached)