| Bug #27759 | least() incorrectness with date args | ||
|---|---|---|---|
| Submitted: | 11 Apr 2007 15:16 | Modified: | 8 May 2007 19:11 |
| Reporter: | Peter Brawley (Basic Quality Contributor) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Stored Routines | Severity: | S3 (Non-critical) |
| Version: | 5.1.16-beta, 5.0.37 | OS: | Any |
| Assigned to: | Evgeny Potemkin | CPU Architecture: | Any |
| Tags: | qc | ||
[11 Apr 2007 15:16]
Peter Brawley
[11 Apr 2007 15:58]
Giuseppe Maxia
Verified as described.
It seems that the problem arises only within stored procedures.
See the example below:
drop table if exists t1;
Query OK, 0 rows affected (0.00 sec)
create table t1 (a date,b date);
Query OK, 0 rows affected (0.01 sec)
insert into t1 values ('2007-4-10', '2007-4-11');
Query OK, 1 row affected (0.00 sec)
select a,b, least(a,b), least(b,a) from t1;
+------------+------------+------------+------------+
| a | b | least(a,b) | least(b,a) |
+------------+------------+------------+------------+
| 2007-04-10 | 2007-04-11 | 2007-04-10 | 2007-04-10 |
+------------+------------+------------+------------+
1 row in set (0.00 sec)
# this works as expected
DROP PROCEDURE IF EXISTS p1 ;
Query OK, 0 rows affected (0.00 sec)
DELIMITER |
CREATE PROCEDURE p1()
-> deterministic
-> BEGIN
-> declare a date default '2007-4-10';
-> declare b date default '2007-4-11';
-> select
-> version() as vers, a,b,
-> least( cast(a as date),
-> cast(b as date) ) as cast_a_then_cast_b,
-> least( a,b ) as a_then_b,
-> least( b, a ) as b_then_a;
-> END;
-> |
Query OK, 0 rows affected (0.00 sec)
DELIMITER ;
call p1();
+------------+------------+------------+--------------------+------------+------------+
| vers | a | b | cast_a_then_cast_b | a_then_b | b_then_a |
+------------+------------+------------+--------------------+------------+------------+
| 5.0.37-log | 2007-04-10 | 2007-04-11 | 2007-04-10 | 2007-04-11 | 2007-04-10 |
+------------+------------+------------+--------------------+------------+------------+
1 row in set (0.00 sec)
# notice that the cast values return the expected result,
# while the bare ones don't
How to repeat:
drop table if exists t1;
create table t1 (a date,b date);
insert into t1 values ('2007-4-10', '2007-4-11');
select a,b, least(a,b), least(b,a) from t1;
DROP PROCEDURE IF EXISTS p1 ;
DELIMITER |
CREATE PROCEDURE p1()
deterministic
BEGIN
declare a date default '2007-4-10';
declare b date default '2007-4-11';
select
version() as vers, a,b,
least( cast(a as date),
cast(b as date) ) as cast_a_then_cast_b,
least( a,b ) as a_then_b,
least( b, a ) as b_then_a;
END;
|
DELIMITER ;
call p1();
[14 Apr 2007 16:26]
Valeriy Kravchuk
Bug #27760 was marked as a duplicate of this one.
[3 May 2007 19:00]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/26046 ChangeSet@1.2470, 2007-05-03 22:57:59+04:00, evgen@moonbone.local +9 -0 Bug#27759: Wrong DATE/DATETIME comparison in LEAST()/GREATEST() functions. The LEAST/GREATEST functions were comparing DATE/DATETIME values as strings which in some cases can lead to a wrong result. The new member function called cmp_datetimes() is added to the Item_func_min_max class. It compares arguments in the DATETIME context and returns index of the least/greatest argument. The Item_func_min_max::fix_length_and_dec() function now detects when arguments should be compared in hte DATETIME context and set the newly added flag compare_as_dates. It indicates that the cmp_datetimes() function should be called to get a correct result. Item_func_min_max::val_xxx() methods are corrected to call the cmp_datetimes() function when needed. Objects of the Item_splocal class now stores and reports correct original field type.
[4 May 2007 15:00]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/26111 ChangeSet@1.2470, 2007-05-04 18:57:10+04:00, evgen@moonbone.local +9 -0 Bug#27759: Wrong DATE/DATETIME comparison in LEAST()/GREATEST() functions. The LEAST/GREATEST functions compared DATE/DATETIME values as strings which in some cases could lead to a wrong result. A new member function called cmp_datetimes() is added to the Item_func_min_max class. It compares arguments in DATETIME context and returns index of the least/greatest argument. The Item_func_min_max::fix_length_and_dec() function now detects when arguments should be compared in DATETIME context and sets the newly added flag compare_as_dates. It indicates that the cmp_datetimes() function should be called to get a correct result. Item_func_min_max::val_xxx() methods are corrected to call the cmp_datetimes() function when needed. Objects of the Item_splocal class now stores and reports correct original field type.
[7 May 2007 18:15]
Bugs System
Pushed into 5.1.18-beta
[7 May 2007 20:13]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/26249 ChangeSet@1.2476, 2007-05-08 00:08:00+04:00, evgen@moonbone.local +2 -0 Additional fix for the bug#27759: Wrong DATE/DATETIME comparison in LEAST()/GREATEST() functions.
[8 May 2007 0:24]
Paul DuBois
Noted in 5.1.18 changelog. The LEAST() and GREATEST() functions compared DATE and DATETIME values as strings, which in some cases could lead to an incorrect result.
[10 May 2007 6:38]
Bugs System
Pushed into 5.1.19-beta
[10 May 2007 6:52]
Bugs System
Pushed into 5.0.42
