Commit 7c90fa7b authored by unknown's avatar unknown
Browse files

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)
parent 44d66d26
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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;
+13 −0
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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; }