From: Date: July 31 2007 12:48am Subject: Connector/NET commit: r833 - in branches/5.1: . Driver/Source/Types TestSuite/Source List-Archive: http://lists.mysql.com/commits/31859 X-Bug: 30077 Message-Id: <200707302248.l6UMmfJr026688@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/5.1/CHANGES branches/5.1/Driver/Source/Types/MySqlDateTime.cs branches/5.1/TestSuite/Source/CommandBuilderTests.cs Log: Fixed problem where date columns that appear in keys caused updates to fail (bug #30077) [merge from 5.0] Modified: branches/5.1/CHANGES =================================================================== --- branches/5.1/CHANGES 2007-07-30 22:45:03 UTC (rev 832) +++ branches/5.1/CHANGES 2007-07-30 22:48:40 UTC (rev 833) @@ -95,6 +95,8 @@ as exceptions about thread ownership. The issue was that not all queries cancel the same. Some produce resultsets while others don't. ExecuteReader had to be changed to check for this. + - Fixed problem where date columns that appear in keys caused updates to + fail (bug #30077) Version 5.0.7 5/16/2007 Modified: branches/5.1/Driver/Source/Types/MySqlDateTime.cs =================================================================== --- branches/5.1/Driver/Source/Types/MySqlDateTime.cs 2007-07-30 22:45:03 UTC (rev 832) +++ branches/5.1/Driver/Source/Types/MySqlDateTime.cs 2007-07-30 22:48:40 UTC (rev 833) @@ -225,8 +225,11 @@ value.Year, value.Month, value.Day, value.Hour, value.Minute, value.Second); else { - val = String.Format("{0:0000}-{1:00}-{2:00} {3:00}:{4:00}:{5:00}", value.Year, value.Month, - value.Day, value.Hour, value.Minute, value.Second); + val = String.Format("{0:0000}-{1:00}-{2:00}", + value.Year, value.Month, value.Day); + if (type != MySqlDbType.Date) + val = String.Format("{0} {1:00}:{2:00}:{3:00}", val, + value.Hour, value.Minute, value.Second); } stream.WriteStringNoNull("'" + val + "'"); } Modified: branches/5.1/TestSuite/Source/CommandBuilderTests.cs =================================================================== --- branches/5.1/TestSuite/Source/CommandBuilderTests.cs 2007-07-30 22:45:03 UTC (rev 832) +++ branches/5.1/TestSuite/Source/CommandBuilderTests.cs 2007-07-30 22:48:40 UTC (rev 833) @@ -24,20 +24,21 @@ namespace MySql.Data.MySqlClient.Tests { - [TestFixture] - public class CommandBuilderTests : BaseTest - { - [TestFixtureSetUp] - public void FixtureSetup() - { - Open(); - } + [TestFixture] + public class CommandBuilderTests : BaseTest + { + [TestFixtureSetUp] + public void FixtureSetup() + { + csAdditions += ";logging=true;"; + Open(); + } - [TestFixtureTearDown] - public void TestFixtureTearDown() - { - Close(); - } + [TestFixtureTearDown] + public void TestFixtureTearDown() + { + Close(); + } [SetUp] protected override void Setup() @@ -48,9 +49,9 @@ execSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); } - [Test] - public void MultiWord() - { + [Test] + public void MultiWord() + { try { MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", conn); @@ -78,102 +79,102 @@ { Assert.Fail(ex.Message); } - } + } - [Test] - public void LastOneWins() - { - execSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); + [Test] + public void LastOneWins() + { + execSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); - MySqlCommandBuilder cb = new MySqlCommandBuilder( + MySqlCommandBuilder cb = new MySqlCommandBuilder( new MySqlDataAdapter("SELECT * FROM Test", conn)); MySqlDataAdapter da = cb.DataAdapter; cb.ConflictOption = ConflictOption.OverwriteChanges; - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.AreEqual(1, dt.Rows.Count); + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.AreEqual(1, dt.Rows.Count); - execSQL("UPDATE Test SET name='Test2' WHERE id=1"); + execSQL("UPDATE Test SET name='Test2' WHERE id=1"); - dt.Rows[0]["name"] = "Test3"; - Assert.AreEqual(1, da.Update(dt)); + dt.Rows[0]["name"] = "Test3"; + Assert.AreEqual(1, da.Update(dt)); - dt.Rows.Clear(); - da.Fill(dt); - Assert.AreEqual(1, dt.Rows.Count); - Assert.AreEqual("Test3", dt.Rows[0]["name"]); - } + dt.Rows.Clear(); + da.Fill(dt); + Assert.AreEqual(1, dt.Rows.Count); + Assert.AreEqual("Test3", dt.Rows[0]["name"]); + } - [Test] - public void NotLastOneWins() - { - execSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); + [Test] + public void NotLastOneWins() + { + execSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", conn); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", conn); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); cb.ConflictOption = ConflictOption.CompareAllSearchableValues; DataTable dt = new DataTable(); - da.Fill(dt); - Assert.AreEqual(1, dt.Rows.Count); + da.Fill(dt); + Assert.AreEqual(1, dt.Rows.Count); - execSQL("UPDATE Test SET name='Test2' WHERE id=1"); + execSQL("UPDATE Test SET name='Test2' WHERE id=1"); - try - { - dt.Rows[0]["name"] = "Test3"; - da.Update(dt); - Assert.Fail("This should not work"); - } - catch (DBConcurrencyException) - { - } + try + { + dt.Rows[0]["name"] = "Test3"; + da.Update(dt); + Assert.Fail("This should not work"); + } + catch (DBConcurrencyException) + { + } - dt.Rows.Clear(); - da.Fill(dt); - Assert.AreEqual(1, dt.Rows.Count); - Assert.AreEqual("Test2", dt.Rows[0]["name"]); - } + dt.Rows.Clear(); + da.Fill(dt); + Assert.AreEqual(1, dt.Rows.Count); + Assert.AreEqual("Test2", dt.Rows[0]["name"]); + } - /// - /// Bug #8574 - MySqlCommandBuilder unable to support sub-queries - /// Bug #11947 - MySQLCommandBuilder mishandling CONCAT() aliased column - /// - [Test] - public void UsingFunctions() - { - execSQL("INSERT INTO test (id, name) VALUES (1,'test1')"); - execSQL("INSERT INTO test (id, name) VALUES (2,'test2')"); - execSQL("INSERT INTO test (id, name) VALUES (3,'test3')"); + /// + /// Bug #8574 - MySqlCommandBuilder unable to support sub-queries + /// Bug #11947 - MySQLCommandBuilder mishandling CONCAT() aliased column + /// + [Test] + public void UsingFunctions() + { + execSQL("INSERT INTO test (id, name) VALUES (1,'test1')"); + execSQL("INSERT INTO test (id, name) VALUES (2,'test2')"); + execSQL("INSERT INTO test (id, name) VALUES (3,'test3')"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name, now() as ServerTime FROM test", conn); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name, now() as ServerTime FROM test", conn); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); - dt.Rows[0]["id"] = 4; - da.Update(dt); - - da.SelectCommand.CommandText = "SELECT id, name, CONCAT(name, ' boo') as newname from test where id=4"; - dt.Clear(); - da.Fill(dt); - Assert.AreEqual(1, dt.Rows.Count); - Assert.AreEqual("test1", dt.Rows[0]["name"]); - Assert.AreEqual("test1 boo", dt.Rows[0]["newname"]); + dt.Rows[0]["id"] = 4; + da.Update(dt); - dt.Rows[0]["id"] = 5; - da.Update(dt); + da.SelectCommand.CommandText = "SELECT id, name, CONCAT(name, ' boo') as newname from test where id=4"; + dt.Clear(); + da.Fill(dt); + Assert.AreEqual(1, dt.Rows.Count); + Assert.AreEqual("test1", dt.Rows[0]["name"]); + Assert.AreEqual("test1 boo", dt.Rows[0]["newname"]); - dt.Clear(); - da.SelectCommand.CommandText = "SELECT * FROM test WHERE id=5"; - da.Fill(dt); - Assert.AreEqual(1, dt.Rows.Count); - Assert.AreEqual("test1", dt.Rows[0]["name"]); + dt.Rows[0]["id"] = 5; + da.Update(dt); - da.SelectCommand.CommandText = "SELECT *, now() as stime FROM test WHERE id<4"; - cb = new MySqlCommandBuilder(da); + dt.Clear(); + da.SelectCommand.CommandText = "SELECT * FROM test WHERE id=5"; + da.Fill(dt); + Assert.AreEqual(1, dt.Rows.Count); + Assert.AreEqual("test1", dt.Rows[0]["name"]); + + da.SelectCommand.CommandText = "SELECT *, now() as stime FROM test WHERE id<4"; + cb = new MySqlCommandBuilder(da); cb.ConflictOption = ConflictOption.OverwriteChanges; - da.InsertCommand = cb.GetInsertCommand(); - } + da.InsertCommand = cb.GetInsertCommand(); + } /// /// Bug #8382 Commandbuilder does not handle queries to other databases than the default one- @@ -187,56 +188,56 @@ execSQL("INSERT INTO test (id, name) VALUES (2,'test2')"); execSQL("INSERT INTO test (id, name) VALUES (3,'test3')"); - conn.ChangeDatabase(databases[1]); + conn.ChangeDatabase(databases[1]); - MySqlDataAdapter da = new MySqlDataAdapter( + MySqlDataAdapter da = new MySqlDataAdapter( String.Format("SELECT id, name FROM {0}.test", databases[0]), conn); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataSet ds = new DataSet(); - da.Fill(ds); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataSet ds = new DataSet(); + da.Fill(ds); - ds.Tables[0].Rows[0]["id"] = 4; - DataSet changes = ds.GetChanges(); - da.Update(changes); - ds.Merge(changes); - ds.AcceptChanges(); - - conn.ChangeDatabase(databases[0]); - } + ds.Tables[0].Rows[0]["id"] = 4; + DataSet changes = ds.GetChanges(); + da.Update(changes); + ds.Merge(changes); + ds.AcceptChanges(); - /// - /// Bug #13036 Returns error when field names contain any of the following chars %<>()/ etc - /// - [Test] - public void SpecialCharactersInFieldNames() - { - execSQL("DROP TABLE IF EXISTS test"); - execSQL("CREATE TABLE test (`col%1` int PRIMARY KEY, `col()2` int, `col<>3` int, `col/4` int)"); + conn.ChangeDatabase(databases[0]); + } - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM test", conn); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ToString(); // keep the compiler happy - DataTable dt = new DataTable(); - da.Fill(dt); - DataRow row = dt.NewRow(); - row[0] = 1; - row[1] = 2; - row[2] = 3; - row[3] = 4; - dt.Rows.Add(row); - da.Update(dt); - } + /// + /// Bug #13036 Returns error when field names contain any of the following chars %<>()/ etc + /// + [Test] + public void SpecialCharactersInFieldNames() + { + execSQL("DROP TABLE IF EXISTS test"); + execSQL("CREATE TABLE test (`col%1` int PRIMARY KEY, `col()2` int, `col<>3` int, `col/4` int)"); - /// - /// Bug #14631 "#42000Query was empty" - /// - [Test] - public void SemicolonAtEndOfSQL() - { - execSQL("DROP TABLE IF EXISTS test"); - execSQL("CREATE TABLE test (id INT NOT NULL, name VARCHAR(100), PRIMARY KEY(id))"); - execSQL("INSERT INTO test VALUES(1, 'Data')"); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM test", conn); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ToString(); // keep the compiler happy + DataTable dt = new DataTable(); + da.Fill(dt); + DataRow row = dt.NewRow(); + row[0] = 1; + row[1] = 2; + row[2] = 3; + row[3] = 4; + dt.Rows.Add(row); + da.Update(dt); + } + /// + /// Bug #14631 "#42000Query was empty" + /// + [Test] + public void SemicolonAtEndOfSQL() + { + execSQL("DROP TABLE IF EXISTS test"); + execSQL("CREATE TABLE test (id INT NOT NULL, name VARCHAR(100), PRIMARY KEY(id))"); + execSQL("INSERT INTO test VALUES(1, 'Data')"); + try { DataSet ds = new DataSet(); @@ -258,7 +259,7 @@ { Assert.Fail(ex.Message); } - } + } /// /// Bug #23862 Problem with CommandBuilder 'GetInsertCommand' method @@ -304,7 +305,7 @@ public void AutoIncrementColumnsOnInsert2() { execSQL("DROP TABLE IF EXISTS test"); - execSQL("CREATE TABLE test (id INT UNSIGNED NOT NULL " + + execSQL("CREATE TABLE test (id INT UNSIGNED NOT NULL " + "AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))"); MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM test", conn); MySqlCommandBuilder cb = new MySqlCommandBuilder(da); @@ -393,4 +394,40 @@ } } } + + /// + /// Bug #30077 MySqlDataAdapter.Update() exception due to date field format + /// + [Test] + public void UpdatingWithDateInKey() + { + execSQL("DROP TABLE IF EXISTS test"); + execSQL("CREATE TABLE test (cod INT, dt DATE, PRIMARY KEY(cod, dt))"); + + execSQL("INSERT INTO test (cod, dt) VALUES (1, '2006-1-1')"); + execSQL("INSERT INTO test (cod, dt) VALUES (2, '2006-1-2')"); + execSQL("INSERT INTO test (cod, dt) VALUES (3, '2006-1-3')"); + execSQL("INSERT INTO test (cod, dt) VALUES (4, '2006-1-4')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM test ORDER BY cod", conn); + MySqlCommandBuilder bld = new MySqlCommandBuilder(da); + bld.ConflictOption = ConflictOption.OverwriteChanges; + DataTable dt = new DataTable(); + da.Fill(dt); + dt.Rows[0]["cod"] = 6; + try + { + da.Update(dt); + + dt.Clear(); + da.SelectCommand.CommandText = "SELECT * FROM test WHERE cod=6"; + da.Fill(dt); + Assert.AreEqual(6, dt.Rows[0]["cod"]); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + } + } }