From: Date: September 5 2008 6:43pm Subject: Connector/NET commit: r1405 - in branches/5.2: . MySql.Data/Provider/Source/Types MySql.Data/Tests/Source List-Archive: http://lists.mysql.com/commits/53383 X-Bug: 39275 Message-Id: <200809051643.m85GhRXf003658@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/5.2/CHANGES branches/5.2/MySql.Data/Provider/Source/Types/MySqlTime.cs branches/5.2/MySql.Data/Tests/Source/PreparedStatements.cs Log: - fixed time data type so that negative values are handled properly (bug #39275) Modified: branches/5.2/CHANGES =================================================================== --- branches/5.2/CHANGES 2008-09-05 15:34:43 UTC (rev 1404) +++ branches/5.2/CHANGES 2008-09-05 16:43:27 UTC (rev 1405) @@ -4,6 +4,7 @@ - backported fix for lingering problem related to bug #37239. If two columns had the same name but different case then an exception would be thrown. - fixed stored procedure parameter parsing when used inside server explorer. (bug #39252) +- fixed time data type so that negative values are handled properly (bug #39275) Version 5.2.3 - 8/14/08 - Increased the speed of MySqlDataReader.GetOrdinal dramatically by using a couple Modified: branches/5.2/MySql.Data/Provider/Source/Types/MySqlTime.cs =================================================================== --- branches/5.2/MySql.Data/Provider/Source/Types/MySqlTime.cs 2008-09-05 15:34:43 UTC (rev 1404) +++ branches/5.2/MySql.Data/Provider/Source/Types/MySqlTime.cs 2008-09-05 16:43:27 UTC (rev 1405) @@ -88,6 +88,7 @@ { stream.WriteByte(8); stream.WriteByte((byte)(ts.TotalSeconds < 0 ? 1 : 0)); + ts = ts.Duration(); stream.WriteInteger(ts.Days, 4); stream.WriteByte((byte)ts.Hours); stream.WriteByte((byte)ts.Minutes); @@ -95,8 +96,13 @@ } else { - stream.WriteStringNoNull(String.Format("'{0} {1:00}:{2:00}:{3:00}.{4}'", - ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds)); + string s = String.Format("'{0} {1:00}:{2:00}:{3:00}.{4}'", + ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds); + if (ts.Days == 0) + s = String.Format("'{0:00}:{1:00}:{2:00}.{3}'", + ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds); + + stream.WriteStringNoNull(s); } } Modified: branches/5.2/MySql.Data/Tests/Source/PreparedStatements.cs =================================================================== --- branches/5.2/MySql.Data/Tests/Source/PreparedStatements.cs 2008-09-05 15:34:43 UTC (rev 1404) +++ branches/5.2/MySql.Data/Tests/Source/PreparedStatements.cs 2008-09-05 16:43:27 UTC (rev 1405) @@ -818,6 +818,60 @@ Assert.AreEqual(2, dt.Rows[0][2]); Assert.AreEqual(3, dt.Rows[0][3]); } + + /// + /// Bug #39275 Inserting negative time value through the use of MySqlParameter throws exception + /// + [Test] + public void NegativeTimePrepared() + { + NegativeTime(true); + } + + /// + /// Bug #39275 Inserting negative time value through the use of MySqlParameter throws exception + /// + [Test] + public void NegativeTimeNonPrepared() + { + NegativeTime(false); + } + + [Test] + public void NegativeTime(bool prepared) + { + execSQL("DROP TABLE IF EXISTS Test"); + execSQL(@"CREATE TABLE Test(id int, t time)"); + + MySqlCommand cmd = new MySqlCommand(@"INSERT INTO Test VALUES (1, @t)", conn); + cmd.Parameters.Add("@t", MySqlDbType.Time); + TimeSpan t1 = new TimeSpan(-10, 0, 0); + TimeSpan t2 = new TimeSpan(2, -5, 10, 20); + TimeSpan t3 = new TimeSpan(20, -10, 10); + if (prepared) + cmd.Prepare(); + cmd.Parameters[0].Value = t1; + cmd.ExecuteNonQuery(); + cmd.Parameters[0].Value = t2; + cmd.ExecuteNonQuery(); + cmd.Parameters[0].Value = t3; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Parameters.Clear(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + TimeSpan t = reader.GetTimeSpan(1); + Assert.AreEqual(t1, t); + reader.Read(); + t = reader.GetTimeSpan(1); + Assert.AreEqual(t2, t); + reader.Read(); + t = reader.GetTimeSpan(1); + Assert.AreEqual(t3, t); + } + } } #region Configs