mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for BUG#7425.
The reported problems were due to two completely unrelated omissions. 1) The file sort procedure didn't correctly create the sort key in make_sortkey when the sortkey was an unsigned integer. 2) The name resolution procedure for column references inside a HAVING clause did not propagate the unsigned_flag of the resolved references. This patch corrects both problems. mysql-test/r/select.result: Added test result for BUG#7425. mysql-test/t/select.test: Added test for BUG#7425. sql/filesort.cc: Take into account whether 'item' represents a signed or an unsigned integer. sql/item.cc: Once an Item_ref is resolved, propagate the unsigned_flag to the resolved item.
This commit is contained in:
@ -2422,3 +2422,26 @@ SELECT * FROM t1 WHERE city LIKE '%london%' AND city='London';
|
|||||||
city
|
city
|
||||||
London
|
London
|
||||||
DROP TABLE t1;
|
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;
|
||||||
|
@ -1964,3 +1964,14 @@ SELECT * FROM t1 WHERE city LIKE '%london%' AND city='London';
|
|||||||
|
|
||||||
DROP TABLE t1;
|
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;
|
||||||
|
@ -656,12 +656,18 @@ static void make_sortkey(register SORTPARAM *param,
|
|||||||
to[3]= (uchar) (value >> 32);
|
to[3]= (uchar) (value >> 32);
|
||||||
to[2]= (uchar) (value >> 40);
|
to[2]= (uchar) (value >> 40);
|
||||||
to[1]= (uchar) (value >> 48);
|
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
|
#else
|
||||||
to[3]= (uchar) value;
|
to[3]= (uchar) value;
|
||||||
to[2]= (uchar) (value >> 8);
|
to[2]= (uchar) (value >> 8);
|
||||||
to[1]= (uchar) (value >> 16);
|
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
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2281,6 +2281,7 @@ void Item_ref::set_properties()
|
|||||||
decimals= (*ref)->decimals;
|
decimals= (*ref)->decimals;
|
||||||
collation.set((*ref)->collation);
|
collation.set((*ref)->collation);
|
||||||
with_sum_func= (*ref)->with_sum_func;
|
with_sum_func= (*ref)->with_sum_func;
|
||||||
|
unsigned_flag= (*ref)->unsigned_flag;
|
||||||
fixed= 1;
|
fixed= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user