| Bug #39294 | Reading negative time value greater than -01:00:00 return positive value | ||
|---|---|---|---|
| Submitted: | 7 Sep 2008 12:59 | Modified: | 15 Sep 2008 15:00 | 
| Reporter: | Michal Minárik | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / NET | Severity: | S2 (Serious) | 
| Version: | 5.2.3 | OS: | Windows (Vista 32-bit) | 
| Assigned to: | CPU Architecture: | Any | |
| Tags: | time negative select | ||
   [8 Sep 2008 6:22]
   Tonci Grgin        
  Hi Michal and thanks for your report. Truly there is a bug and it can be seen just by looking into code. I suppose fix for Bug#25912 was incomplete.
   [8 Sep 2008 18:33]
   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/53539
   [8 Sep 2008 18:33]
   Reggie Burnett        
  fixed in 5.2.4
   [15 Sep 2008 14:59]
   Tony Bedford        
  Added an entry to the 5.2.4 changelog: Reading a negative time value greater than -01:00:00 returned the absolute value of the original time value.


Description: Reading negative time value greater than -01:00:00 return positive value (absolute value of the original time value). How to repeat: -- SQL DROP TABLE IF EXISTS test; CREATE TABLE `test` ( `id` int(11) NOT NULL auto_increment, `time` time NOT NULL default '00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; INSERT INTO `my_db`.`test` (`time`) VALUES ('-00:10:00'); -- C# MySqlCommand command = new MySqlCommand(); command.Connection = conn; command.CommandType = CommandType.Text; command.CommandText = "SELECT time FROM test"; using (MySqlDataReader reader = command.ExecuteReader()) { reader.Read(); TimeSpan time = reader.GetTimeSpan(reader.GetOrdinal("time")); // time is 00:10:00 } Suggested fix: The definition of MySqlTime.ParseMySql(...) could be: private void ParseMySql(string s, bool is41) { string[] parts = s.Split(':'); int hours = Int32.Parse(parts[0]); int mins = Int32.Parse(parts[1]); int secs = Int32.Parse(parts[2]); if (hours < 0 || parts[0].StartsWith("-")) { mins *= -1; secs *= -1; } int days = hours / 24; hours = hours - (days * 24); mValue = new TimeSpan(days, hours, mins, secs, 0); isNull = false; }