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);
+ }
+ }
+ }
}