From 7c90fa7b2cb8131bfcf314c1e25538bd1062fa5d Mon Sep 17 00:00:00 2001
From: unknown <sergefp@mysql.com>
Date: Fri, 11 Mar 2005 02:17:03 +0300
Subject: [PATCH] Fix for BUG#8711: "<=>" may have true value for NULL
 arguments, so make Item_func_equal::not_null_tables() always return 0.

mysql-test/r/join_outer.result:
  Testcase for BUG#8711
mysql-test/t/join_outer.test:
  Testcase for BUG#8711
sql/item_cmpfunc.h:
  Fix for BUG#8711: "<=>" may have true value for NULL arguments, i.e. it can accept NULL-complemented
  table rows. This differs from assumptions made in Item_func::not_null_tables(), so add
  Item_func_equal::not_null_tables().
  Item_func_equal::not_null_tables_cache value doesn't make sense now, but we still let it be
  calculated (and ignore it)
---
 mysql-test/r/join_outer.result | 20 ++++++++++++++++++++
 mysql-test/t/join_outer.test   | 13 +++++++++++++
 sql/item_cmpfunc.h             |  1 +
 3 files changed, 34 insertions(+)

diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result
index 5778b2f9b72..d6ce93e632b 100644
--- a/mysql-test/r/join_outer.result
+++ b/mysql-test/r/join_outer.result
@@ -684,3 +684,23 @@ t1	ALL	NULL	NULL	NULL	NULL	3
 t2	ALL	NULL	NULL	NULL	NULL	2	
 t3	ALL	NULL	NULL	NULL	NULL	2	
 drop table t1, t2, t3;
+create table t1 (
+a int(11),
+b char(10),
+key (a)
+);
+insert into t1 (a) values (1),(2),(3),(4);
+create table t2 (a int);
+select * from t1 left join t2 on t1.a=t2.a where not (t2.a <=> t1.a);
+a	b	a
+1	NULL	NULL
+2	NULL	NULL
+3	NULL	NULL
+4	NULL	NULL
+select * from t1 left join t2 on t1.a=t2.a having not (t2.a <=> t1.a);
+a	b	a
+1	NULL	NULL
+2	NULL	NULL
+3	NULL	NULL
+4	NULL	NULL
+drop table t1,t2;
diff --git a/mysql-test/t/join_outer.test b/mysql-test/t/join_outer.test
index bed4d4b033b..f32cc9d56ac 100644
--- a/mysql-test/t/join_outer.test
+++ b/mysql-test/t/join_outer.test
@@ -450,3 +450,16 @@ select * from t1 left join t2  on  b1 = a1 left join t3  on  c1 = a1  and  b1 is
 explain select * from t1 left join t2  on  b1 = a1 left join t3  on  c1 = a1  and  b1 is null;
 
 drop table t1, t2, t3;
+
+# Test for BUG#8711 '<=>' was considered to be a NULL-rejecting predicate.
+create table t1 (
+  a int(11),
+  b char(10),
+  key (a)
+);
+insert into t1 (a) values (1),(2),(3),(4);
+create table t2 (a int);
+
+select * from t1 left join t2 on t1.a=t2.a where not (t2.a <=> t1.a);
+select * from t1 left join t2 on t1.a=t2.a having not (t2.a <=> t1.a);
+drop table t1,t2;
diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h
index 8f1aa525190..a1977e76f67 100644
--- a/sql/item_cmpfunc.h
+++ b/sql/item_cmpfunc.h
@@ -78,6 +78,7 @@ class Item_func_equal :public Item_bool_func2
   Item_func_equal(Item *a,Item *b) :Item_bool_func2(a,b) { };
   longlong val_int();
   void fix_length_and_dec();
+  table_map not_null_tables() const { return 0; }
   enum Functype functype() const { return EQUAL_FUNC; }
   enum Functype rev_functype() const { return EQUAL_FUNC; }
   cond_result eq_cmp_result() const { return COND_TRUE; }
-- 
2.30.9