Modified:
branches/5.0/CHANGES
branches/5.0/Driver/Source/Types/MySqlDateTime.cs
branches/5.0/TestSuite/Source/CommandBuilderTests.cs
Log:
Fixed problem where date columns that appear in keys caused updates to fail (bug #30077)
Modified: branches/5.0/CHANGES
===================================================================
--- branches/5.0/CHANGES 2007-07-30 18:27:22 UTC (rev 831)
+++ branches/5.0/CHANGES 2007-07-30 22:45:03 UTC (rev 832)
@@ -37,6 +37,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.0/Driver/Source/Types/MySqlDateTime.cs
===================================================================
--- branches/5.0/Driver/Source/Types/MySqlDateTime.cs 2007-07-30 18:27:22 UTC (rev 831)
+++ branches/5.0/Driver/Source/Types/MySqlDateTime.cs 2007-07-30 22:45:03 UTC (rev 832)
@@ -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.0/TestSuite/Source/CommandBuilderTests.cs
===================================================================
--- branches/5.0/TestSuite/Source/CommandBuilderTests.cs 2007-07-30 18:27:22 UTC (rev 831)
+++ branches/5.0/TestSuite/Source/CommandBuilderTests.cs 2007-07-30 22:45:03 UTC (rev 832)
@@ -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();
+ }
protected override void Setup()
{
@@ -47,9 +48,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);
@@ -77,164 +78,164 @@
{
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"]);
+ }
- /// <summary>
- /// Bug #8574 - MySqlCommandBuilder unable to support sub-queries
- /// Bug #11947 - MySQLCommandBuilder mishandling CONCAT() aliased column
- /// </summary>
- [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')");
+ /// <summary>
+ /// Bug #8574 - MySqlCommandBuilder unable to support sub-queries
+ /// Bug #11947 - MySQLCommandBuilder mishandling CONCAT() aliased column
+ /// </summary>
+ [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();
+ }
- /// <summary>
- /// Bug #8382 Commandbuilder does not handle queries to other databases than the
default one-
- /// </summary>
- [Test]
- [Category("4.1")]
- public void DifferentDatabase()
- {
- 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')");
+ /// <summary>
+ /// Bug #8382 Commandbuilder does not handle queries to other databases than
the default one-
+ /// </summary>
+ [Test]
+ [Category("4.1")]
+ public void DifferentDatabase()
+ {
+ 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')");
- 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();
- /// <summary>
- /// Bug #13036 Returns error when field names contain any of the following chars
%<>()/ etc
- /// </summary>
- [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);
- }
+ /// <summary>
+ /// Bug #13036 Returns error when field names contain any of the following
chars %<>()/ etc
+ /// </summary>
+ [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)");
- /// <summary>
- /// Bug #14631 "#42000Query was empty"
- /// </summary>
- [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);
+ }
+ /// <summary>
+ /// Bug #14631 "#42000Query was empty"
+ /// </summary>
+ [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();
@@ -256,7 +257,7 @@
{
Assert.Fail(ex.Message);
}
- }
+ }
/// <summary>
/// Bug #23862 Problem with CommandBuilder 'GetInsertCommand' method
@@ -302,7 +303,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);
@@ -350,5 +351,40 @@
Assert.AreEqual(MySqlDbType.UByte, cmd.Parameters[0].MySqlDbType);
Assert.AreEqual(DbType.Byte, cmd.Parameters[0].DbType);
}
- }
+
+ /// <summary>
+ /// Bug #30077 MySqlDataAdapter.Update() exception due to date field format
+ /// </summary>
+ [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);
+ }
+ }
+ }
}
| Thread |
|---|
| • Connector/NET commit: r832 - in branches/5.0: . Driver/Source/Types TestSuite/Source | rburnett | 31 Jul |