Loading mysql-test/r/select.result +23 −0 Original line number Diff line number Diff line Loading @@ -2423,3 +2423,26 @@ SELECT * FROM t1 WHERE city LIKE '%london%' AND city='London'; city London DROP TABLE t1; create table t1 (a int(11) unsigned, b int(11) unsigned); insert into t1 values (1,0), (1,1), (1,2); select a-b from t1 order by 1; a-b 0 1 18446744073709551615 select a-b , (a-b < 0) from t1 order by 1; a-b (a-b < 0) 0 0 1 0 18446744073709551615 0 select a-b as d, (a-b >= 0), b from t1 group by b having d >= 0; d (a-b >= 0) b 1 1 0 0 1 1 18446744073709551615 1 2 select cast((a - b) as unsigned) from t1 order by 1; cast((a - b) as unsigned) 0 1 18446744073709551615 drop table t1; mysql-test/t/select.test +11 −0 Original line number Diff line number Diff line Loading @@ -2004,3 +2004,14 @@ SELECT * FROM t1 WHERE city LIKE '%london%' AND city='London'; DROP TABLE t1; # # Bug#7425 inconsistent sort order on unsigned columns result of substraction # create table t1 (a int(11) unsigned, b int(11) unsigned); insert into t1 values (1,0), (1,1), (1,2); select a-b from t1 order by 1; select a-b , (a-b < 0) from t1 order by 1; select a-b as d, (a-b >= 0), b from t1 group by b having d >= 0; select cast((a - b) as unsigned) from t1 order by 1; drop table t1; sql/filesort.cc +8 −2 Original line number Diff line number Diff line Loading @@ -694,12 +694,18 @@ static void make_sortkey(register SORTPARAM *param, to[3]= (uchar) (value >> 32); to[2]= (uchar) (value >> 40); to[1]= (uchar) (value >> 48); to[0]= (uchar) (value >> 56) ^ 128; // Fix sign if (item->unsigned_flag) /* Fix sign */ to[0]= (uchar) (value >> 56); else to[0]= (uchar) (value >> 56) ^ 128; /* Reverse signbit */ #else to[3]= (uchar) value; to[2]= (uchar) (value >> 8); to[1]= (uchar) (value >> 16); to[0]= (uchar) (value >> 24) ^ 128; // Fix sign if (item->unsigned_flag) /* Fix sign */ to[0]= (uchar) (value >> 24); else to[0]= (uchar) (value >> 24) ^ 128; /* Reverse signbit */ #endif break; } Loading sql/item.cc +1 −0 Original line number Diff line number Diff line Loading @@ -3717,6 +3717,7 @@ void Item_ref::set_properties() split_sum_func() doesn't try to change the reference. */ with_sum_func= (*ref)->with_sum_func; unsigned_flag= (*ref)->unsigned_flag; if ((*ref)->type() == FIELD_ITEM) alias_name_used= ((Item_ident *) (*ref))->alias_name_used; else Loading Loading
mysql-test/r/select.result +23 −0 Original line number Diff line number Diff line Loading @@ -2423,3 +2423,26 @@ SELECT * FROM t1 WHERE city LIKE '%london%' AND city='London'; city London DROP TABLE t1; create table t1 (a int(11) unsigned, b int(11) unsigned); insert into t1 values (1,0), (1,1), (1,2); select a-b from t1 order by 1; a-b 0 1 18446744073709551615 select a-b , (a-b < 0) from t1 order by 1; a-b (a-b < 0) 0 0 1 0 18446744073709551615 0 select a-b as d, (a-b >= 0), b from t1 group by b having d >= 0; d (a-b >= 0) b 1 1 0 0 1 1 18446744073709551615 1 2 select cast((a - b) as unsigned) from t1 order by 1; cast((a - b) as unsigned) 0 1 18446744073709551615 drop table t1;
mysql-test/t/select.test +11 −0 Original line number Diff line number Diff line Loading @@ -2004,3 +2004,14 @@ SELECT * FROM t1 WHERE city LIKE '%london%' AND city='London'; DROP TABLE t1; # # Bug#7425 inconsistent sort order on unsigned columns result of substraction # create table t1 (a int(11) unsigned, b int(11) unsigned); insert into t1 values (1,0), (1,1), (1,2); select a-b from t1 order by 1; select a-b , (a-b < 0) from t1 order by 1; select a-b as d, (a-b >= 0), b from t1 group by b having d >= 0; select cast((a - b) as unsigned) from t1 order by 1; drop table t1;
sql/filesort.cc +8 −2 Original line number Diff line number Diff line Loading @@ -694,12 +694,18 @@ static void make_sortkey(register SORTPARAM *param, to[3]= (uchar) (value >> 32); to[2]= (uchar) (value >> 40); to[1]= (uchar) (value >> 48); to[0]= (uchar) (value >> 56) ^ 128; // Fix sign if (item->unsigned_flag) /* Fix sign */ to[0]= (uchar) (value >> 56); else to[0]= (uchar) (value >> 56) ^ 128; /* Reverse signbit */ #else to[3]= (uchar) value; to[2]= (uchar) (value >> 8); to[1]= (uchar) (value >> 16); to[0]= (uchar) (value >> 24) ^ 128; // Fix sign if (item->unsigned_flag) /* Fix sign */ to[0]= (uchar) (value >> 24); else to[0]= (uchar) (value >> 24) ^ 128; /* Reverse signbit */ #endif break; } Loading
sql/item.cc +1 −0 Original line number Diff line number Diff line Loading @@ -3717,6 +3717,7 @@ void Item_ref::set_properties() split_sum_func() doesn't try to change the reference. */ with_sum_func= (*ref)->with_sum_func; unsigned_flag= (*ref)->unsigned_flag; if ((*ref)->type() == FIELD_ITEM) alias_name_used= ((Item_ident *) (*ref))->alias_name_used; else Loading