← Back to team overview

maria-developers team mailing list archive

Re: Please review MDEV-10236 Where expression with NOT function gives incorrect result

 

Hi Sergei,

On 06/26/2016 11:24 PM, Sergei Golubchik wrote:
Hi, Alexander!

On Jun 22, Alexander Barkov wrote:
Hi Serg.

Please review a patch for MDEV-10236.

Thanks.

commit bb3afc8aea61bc090a1119be0a1dad32d9dc8feb
Author: Alexander Barkov <bar@xxxxxxxxxxx>
Date:   Wed Jun 22 16:30:15 2016 +0400

     MDEV-10236 Where expression with NOT function gives incorrect result

Could you be more verbose in the comment please?
I don't understand what was causing the bug or what you have fixed.

Sure. This is a version with a better comment.


diff --git a/sql/item.h b/sql/item.h
index bef57c4..93da398 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)

Regards,
Sergei
Chief Architect MariaDB
and security@xxxxxxxxxxx

commit 1509b44ed12320cc037520cc6eeeca2a0a17fc65
Author: Alexander Barkov <bar@xxxxxxxxxxx>
Date:   Mon Jun 27 11:45:40 2016 +0400

    MDEV-10236 Where expression with NOT function gives incorrect result
    Item_cache::is_null() erroneously returned null_value in
    non-cached state. Now Item_cache::is_null() uses has_value(),
    which caches the value if necessarily, similar to what other value methods do
    (e.g. val_int, val_real, etc).

diff --git a/mysql-test/r/null.result b/mysql-test/r/null.result
index 0d012e2..fcaaeb2 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 a5db444..84b3f06 100644
--- a/mysql-test/t/null.test
+++ b/mysql-test/t/null.test
@@ -1008,5 +1008,16 @@ 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 bef57c4..93da398 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)

Follow ups

References