Loading mysql-test/r/select.result +20 −0 Original line number Diff line number Diff line Loading @@ -3359,3 +3359,23 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range PRIMARY,b b 5 NULL 3 Using where 1 SIMPLE t2 ref c c 5 test.t1.a 2 Using where DROP TABLE t1, t2; create table t1 ( a int unsigned not null auto_increment primary key, b bit not null, c bit not null ); create table t2 ( a int unsigned not null auto_increment primary key, b bit not null, c int unsigned not null, d varchar(50) ); insert into t1 (b,c) values (0,1), (0,1); insert into t2 (b,c) values (0,1); select t1.a, t1.b + 0, t1.c + 0, t2.a, t2.b + 0, t2.c, t2.d from t1 left outer join t2 on t1.a = t2.c and t2.b <> 1 where t1.b <> 1 order by t1.a; a t1.b + 0 t1.c + 0 a t2.b + 0 c d 1 0 1 1 0 1 NULL 2 0 1 NULL NULL NULL NULL drop table t1,t2; mysql-test/t/select.test +26 −0 Original line number Diff line number Diff line Loading @@ -2840,3 +2840,29 @@ EXPLAIN SELECT a, c, d, f FROM t1,t2 WHERE a=c AND b BETWEEN 4 AND 6 AND a > 0; DROP TABLE t1, t2; # # Bug #18895: BIT values cause joins to fail # create table t1 ( a int unsigned not null auto_increment primary key, b bit not null, c bit not null ); create table t2 ( a int unsigned not null auto_increment primary key, b bit not null, c int unsigned not null, d varchar(50) ); insert into t1 (b,c) values (0,1), (0,1); insert into t2 (b,c) values (0,1); -- Row 1 should succeed. Row 2 should fail. Both fail. select t1.a, t1.b + 0, t1.c + 0, t2.a, t2.b + 0, t2.c, t2.d from t1 left outer join t2 on t1.a = t2.c and t2.b <> 1 where t1.b <> 1 order by t1.a; drop table t1,t2; sql/field.h +8 −1 Original line number Diff line number Diff line Loading @@ -124,7 +124,7 @@ class Field static bool type_can_have_key_part(enum_field_types); static enum_field_types field_type_merge(enum_field_types, enum_field_types); static Item_result result_merge_type(enum_field_types); bool eq(Field *field) virtual bool eq(Field *field) { return (ptr == field->ptr && null_ptr == field->null_ptr && null_bit == field->null_bit); Loading Loading @@ -1358,6 +1358,13 @@ class Field_bit :public Field { bit_ptr= bit_ptr_arg; bit_ofs= bit_ofs_arg; } bool eq(Field *field) { return (Field::eq(field) && field->type() == type() && bit_ptr == ((Field_bit *)field)->bit_ptr && bit_ofs == ((Field_bit *)field)->bit_ofs); } }; Loading Loading
mysql-test/r/select.result +20 −0 Original line number Diff line number Diff line Loading @@ -3359,3 +3359,23 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range PRIMARY,b b 5 NULL 3 Using where 1 SIMPLE t2 ref c c 5 test.t1.a 2 Using where DROP TABLE t1, t2; create table t1 ( a int unsigned not null auto_increment primary key, b bit not null, c bit not null ); create table t2 ( a int unsigned not null auto_increment primary key, b bit not null, c int unsigned not null, d varchar(50) ); insert into t1 (b,c) values (0,1), (0,1); insert into t2 (b,c) values (0,1); select t1.a, t1.b + 0, t1.c + 0, t2.a, t2.b + 0, t2.c, t2.d from t1 left outer join t2 on t1.a = t2.c and t2.b <> 1 where t1.b <> 1 order by t1.a; a t1.b + 0 t1.c + 0 a t2.b + 0 c d 1 0 1 1 0 1 NULL 2 0 1 NULL NULL NULL NULL drop table t1,t2;
mysql-test/t/select.test +26 −0 Original line number Diff line number Diff line Loading @@ -2840,3 +2840,29 @@ EXPLAIN SELECT a, c, d, f FROM t1,t2 WHERE a=c AND b BETWEEN 4 AND 6 AND a > 0; DROP TABLE t1, t2; # # Bug #18895: BIT values cause joins to fail # create table t1 ( a int unsigned not null auto_increment primary key, b bit not null, c bit not null ); create table t2 ( a int unsigned not null auto_increment primary key, b bit not null, c int unsigned not null, d varchar(50) ); insert into t1 (b,c) values (0,1), (0,1); insert into t2 (b,c) values (0,1); -- Row 1 should succeed. Row 2 should fail. Both fail. select t1.a, t1.b + 0, t1.c + 0, t2.a, t2.b + 0, t2.c, t2.d from t1 left outer join t2 on t1.a = t2.c and t2.b <> 1 where t1.b <> 1 order by t1.a; drop table t1,t2;
sql/field.h +8 −1 Original line number Diff line number Diff line Loading @@ -124,7 +124,7 @@ class Field static bool type_can_have_key_part(enum_field_types); static enum_field_types field_type_merge(enum_field_types, enum_field_types); static Item_result result_merge_type(enum_field_types); bool eq(Field *field) virtual bool eq(Field *field) { return (ptr == field->ptr && null_ptr == field->null_ptr && null_bit == field->null_bit); Loading Loading @@ -1358,6 +1358,13 @@ class Field_bit :public Field { bit_ptr= bit_ptr_arg; bit_ofs= bit_ofs_arg; } bool eq(Field *field) { return (Field::eq(field) && field->type() == type() && bit_ptr == ((Field_bit *)field)->bit_ptr && bit_ofs == ((Field_bit *)field)->bit_ofs); } }; Loading