From: Date: January 17 2007 11:16pm Subject: Connector/NET commit: r559 - in branches/5.0: . Driver/Source TestSuite List-Archive: http://lists.mysql.com/commits/18297 X-Bug: 25651 Message-Id: <200701172216.l0HMGQmh023877@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/5.0/CHANGES branches/5.0/Driver/Source/Field.cs branches/5.0/TestSuite/LanguageTests.cs Log: Bug #25651 SELECT does not work properly when WHERE contains UTF-8 characters Fixed a problem where VarString parameters were not being treated as strings. Modified: branches/5.0/CHANGES =================================================================== --- branches/5.0/CHANGES 2007-01-17 20:38:42 UTC (rev 558) +++ branches/5.0/CHANGES 2007-01-17 22:16:25 UTC (rev 559) @@ -7,6 +7,7 @@ Bug #25614 After connection is closed, and opened again UTF-8 characters are not read well Bug #25625 Crashes when calling with CommandType set to StoredProcedure Bug #25458 Opening connection hangs + Bug #25651 SELECT does not work properly when WHERE contains UTF-8 characters Other changes ------------- Modified: branches/5.0/Driver/Source/Field.cs =================================================================== --- branches/5.0/Driver/Source/Field.cs 2007-01-17 20:38:42 UTC (rev 558) +++ branches/5.0/Driver/Source/Field.cs 2007-01-17 22:16:25 UTC (rev 559) @@ -225,6 +225,7 @@ case MySqlDbType.Set: case MySqlDbType.Enum: case MySqlDbType.String: + case MySqlDbType.VarString: case MySqlDbType.VarChar: return new MySqlString(type, true); case MySqlDbType.Blob: case MySqlDbType.MediumBlob: Modified: branches/5.0/TestSuite/LanguageTests.cs =================================================================== --- branches/5.0/TestSuite/LanguageTests.cs 2007-01-17 20:38:42 UTC (rev 558) +++ branches/5.0/TestSuite/LanguageTests.cs 2007-01-17 22:16:25 UTC (rev 559) @@ -27,325 +27,326 @@ namespace MySql.Data.MySqlClient.Tests { - [TestFixture] - public class LanguageTests : BaseTest - { - [TestFixtureSetUp] - public void FixtureSetup() - { - Open(); - } + [TestFixture] + public class LanguageTests : BaseTest + { + [TestFixtureSetUp] + public void FixtureSetup() + { + csAdditions += ";logging=true;"; + Open(); + } - [TestFixtureTearDown] - public void FixtureTeardown() - { - Close(); - } + [TestFixtureTearDown] + public void FixtureTeardown() + { + Close(); + } - [Test] - [Category("4.1")] - public void Unicode() - { - execSQL( "DROP TABLE IF EXISTS Test" ); - execSQL( "CREATE TABLE Test (u2 varchar(255) CHARACTER SET ucs2)"); + [Test] + [Category("4.1")] + public void Unicode() + { + execSQL("DROP TABLE IF EXISTS Test"); + execSQL("CREATE TABLE Test (u2 varchar(255) CHARACTER SET ucs2)"); - MySqlConnection c = new MySqlConnection( conn.ConnectionString + ";charset=utf8" ); - c.Open(); - - MySqlCommand cmd = new MySqlCommand( "INSERT INTO Test VALUES ( CONVERT('困巫忘否役' using ucs2))", c); - cmd.ExecuteNonQuery(); + MySqlConnection c = new MySqlConnection(conn.ConnectionString + ";charset=utf8"); + c.Open(); - cmd.CommandText = "SELECT * FROM Test"; - MySqlDataReader reader = null; - - try - { - reader = cmd.ExecuteReader(); - reader.Read(); - string s1 = reader.GetString(0); - Assert.AreEqual( "困巫忘否役", s1 ); - } - catch (Exception ex) - { - Assert.Fail( ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - c.Close(); - } - } + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES ( CONVERT('困巫忘否役' using ucs2))", c); + cmd.ExecuteNonQuery(); - /// - /// Bug #13806 Does not support Code Page 932 - /// - [Test] - public void CP932() - { - MySqlConnection c = new MySqlConnection(GetConnectionString(true) + ";charset=cp932"); - c.Open(); + cmd.CommandText = "SELECT * FROM Test"; + MySqlDataReader reader = null; - try - { - MySqlCommand cmd = new MySqlCommand("SELECT '涯割晦叶角'", c); - string s = (string)cmd.ExecuteScalar(); - Assert.AreEqual("涯割晦叶角", s); - } - catch (Exception ex) - { - Assert.Fail(ex.Message); - } - finally - { - if (c != null) - c.Close(); - } - } + try + { + reader = cmd.ExecuteReader(); + reader.Read(); + string s1 = reader.GetString(0); + Assert.AreEqual("困巫忘否役", s1); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (reader != null) reader.Close(); + c.Close(); + } + } - [Test] - [Category("4.1")] - public void UTF8() - { - execSQL("DROP TABLE IF EXISTS Test"); - execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET utf8)"); + /// + /// Bug #13806 Does not support Code Page 932 + /// + [Test] + public void CP932() + { + MySqlConnection c = new MySqlConnection(GetConnectionString(true) + ";charset=cp932"); + c.Open(); - MySqlConnection c = new MySqlConnection( conn.ConnectionString + ";charset=utf8" ); - c.Open(); - - MySqlCommand cmd = new MySqlCommand( "INSERT INTO Test VALUES(1, 'ЁЄЉҖҚ')", c); //russian - cmd.ExecuteNonQuery(); + try + { + MySqlCommand cmd = new MySqlCommand("SELECT '涯割晦叶角'", c); + string s = (string)cmd.ExecuteScalar(); + Assert.AreEqual("涯割晦叶角", s); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (c != null) + c.Close(); + } + } - cmd.CommandText = "INSERT INTO Test VALUES(2, '兣冘凥凷冋')"; // simplified Chinese - cmd.ExecuteNonQuery(); + [Test] + [Category("4.1")] + public void UTF8() + { + execSQL("DROP TABLE IF EXISTS Test"); + execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET utf8)"); - cmd.CommandText = "INSERT INTO Test VALUES(3, '困巫忘否役')"; // traditional Chinese - cmd.ExecuteNonQuery(); + MySqlConnection c = new MySqlConnection(conn.ConnectionString + ";charset=utf8"); + c.Open(); - cmd.CommandText = "INSERT INTO Test VALUES(4, '涯割晦叶角')"; // Japanese - cmd.ExecuteNonQuery(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'ЁЄЉҖҚ')", c); //russian + cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO Test VALUES(5, 'ברחפע')"; // Hebrew - cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO Test VALUES(2, '兣冘凥凷冋')"; // simplified Chinese + cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO Test VALUES(6, 'ψόβΩΞ')"; // Greek - cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO Test VALUES(3, '困巫忘否役')"; // traditional Chinese + cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO Test VALUES(7, 'þðüçöÝÞÐÜÇÖ')"; // Turkish - cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO Test VALUES(4, '涯割晦叶角')"; // Japanese + cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO Test VALUES(8, 'ฅๆษ')"; // Thai - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Read(); - Assert.AreEqual( "ЁЄЉҖҚ", reader.GetString(1) ); - reader.Read(); - Assert.AreEqual( "兣冘凥凷冋", reader.GetString(1) ); - reader.Read(); - Assert.AreEqual( "困巫忘否役", reader.GetString(1) ); - reader.Read(); - Assert.AreEqual( "涯割晦叶角", reader.GetString(1) ); - reader.Read(); - Assert.AreEqual( "ברחפע", reader.GetString(1) ); - reader.Read(); - Assert.AreEqual( "ψόβΩΞ", reader.GetString(1) ); - reader.Read(); - Assert.AreEqual( "þðüçöÝÞÐÜÇÖ", reader.GetString(1) ); - reader.Read(); - Assert.AreEqual( "ฅๆษ", reader.GetString(1) ); - } - catch (Exception ex) - { - Assert.Fail( ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - c.Close(); - } - } + cmd.CommandText = "INSERT INTO Test VALUES(5, 'ברחפע')"; // Hebrew + cmd.ExecuteNonQuery(); - [Test] - [Category("4.1")] - public void UTF8PreparedAndUsingParameters() - { - execSQL("DROP TABLE IF EXISTS Test"); - execSQL("CREATE TABLE Test (name VARCHAR(200) CHAR SET utf8)"); + cmd.CommandText = "INSERT INTO Test VALUES(6, 'ψόβΩΞ')"; // Greek + cmd.ExecuteNonQuery(); - MySqlConnection c = new MySqlConnection( conn.ConnectionString + ";charset=utf8" ); - c.Open(); - - MySqlCommand cmd = new MySqlCommand( "INSERT INTO Test VALUES(?val)", c); - cmd.Parameters.Add("?val", MySqlDbType.VarChar); - cmd.Prepare(); + cmd.CommandText = "INSERT INTO Test VALUES(7, 'þðüçöÝÞÐÜÇÖ')"; // Turkish + cmd.ExecuteNonQuery(); - cmd.Parameters[0].Value = "ЁЄЉҖҚ"; // Russian - cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO Test VALUES(8, 'ฅๆษ')"; // Thai + cmd.ExecuteNonQuery(); - cmd.Parameters[0].Value = "兣冘凥凷冋"; // simplified Chinese - cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT * FROM Test"; + MySqlDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.AreEqual("ЁЄЉҖҚ", reader.GetString(1)); + reader.Read(); + Assert.AreEqual("兣冘凥凷冋", reader.GetString(1)); + reader.Read(); + Assert.AreEqual("困巫忘否役", reader.GetString(1)); + reader.Read(); + Assert.AreEqual("涯割晦叶角", reader.GetString(1)); + reader.Read(); + Assert.AreEqual("ברחפע", reader.GetString(1)); + reader.Read(); + Assert.AreEqual("ψόβΩΞ", reader.GetString(1)); + reader.Read(); + Assert.AreEqual("þðüçöÝÞÐÜÇÖ", reader.GetString(1)); + reader.Read(); + Assert.AreEqual("ฅๆษ", reader.GetString(1)); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (reader != null) reader.Close(); + c.Close(); + } + } - cmd.Parameters[0].Value = "困巫忘否役"; // traditional Chinese - cmd.ExecuteNonQuery(); + [Test] + [Category("4.1")] + public void UTF8PreparedAndUsingParameters() + { + execSQL("DROP TABLE IF EXISTS Test"); + execSQL("CREATE TABLE Test (name VARCHAR(200) CHAR SET utf8)"); - cmd.Parameters[0].Value = "涯割晦叶角"; // Japanese - cmd.ExecuteNonQuery(); + MySqlConnection c = new MySqlConnection(conn.ConnectionString + ";charset=utf8"); + c.Open(); - cmd.Parameters[0].Value = "ברחפע"; // Hebrew - cmd.ExecuteNonQuery(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(?val)", c); + cmd.Parameters.Add("?val", MySqlDbType.VarChar); + cmd.Prepare(); - cmd.Parameters[0].Value = "ψόβΩΞ"; // Greek - cmd.ExecuteNonQuery(); + cmd.Parameters[0].Value = "ЁЄЉҖҚ"; // Russian + cmd.ExecuteNonQuery(); - cmd.Parameters[0].Value = "þðüçöÝÞÐÜÇÖ"; // Turkish - cmd.ExecuteNonQuery(); + cmd.Parameters[0].Value = "兣冘凥凷冋"; // simplified Chinese + cmd.ExecuteNonQuery(); - cmd.Parameters[0].Value = "ฅๆษ"; // Thai - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Read(); - Assert.AreEqual("ЁЄЉҖҚ", reader.GetString(0)); - reader.Read(); - Assert.AreEqual("兣冘凥凷冋", reader.GetString(0)); - reader.Read(); - Assert.AreEqual("困巫忘否役", reader.GetString(0)); - reader.Read(); - Assert.AreEqual("涯割晦叶角", reader.GetString(0)); - reader.Read(); - Assert.AreEqual("ברחפע", reader.GetString(0)); - reader.Read(); - Assert.AreEqual("ψόβΩΞ", reader.GetString(0)); - reader.Read(); - Assert.AreEqual("þðüçöÝÞÐÜÇÖ", reader.GetString(0)); - reader.Read(); - Assert.AreEqual("ฅๆษ", reader.GetString(0)); - } - catch (Exception ex) - { - Assert.Fail( ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - c.Close(); - } - } + cmd.Parameters[0].Value = "困巫忘否役"; // traditional Chinese + cmd.ExecuteNonQuery(); - [Test] - [Category("4.1")] - public void Chinese() - { - MySqlConnection c = new MySqlConnection( conn.ConnectionString + ";charset=utf8" ); - c.Open(); + cmd.Parameters[0].Value = "涯割晦叶角"; // Japanese + cmd.ExecuteNonQuery(); - execSQL("DROP TABLE IF EXISTS Test"); - execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET big5, name2 VARCHAR(200) CHAR SET gb2312)"); + cmd.Parameters[0].Value = "ברחפע"; // Hebrew + cmd.ExecuteNonQuery(); - MySqlCommand cmd = new MySqlCommand( "INSERT INTO Test VALUES(1, '困巫忘否役', '涝搞谷侪魍' )", c); - cmd.ExecuteNonQuery(); + cmd.Parameters[0].Value = "ψόβΩΞ"; // Greek + cmd.ExecuteNonQuery(); - cmd.CommandText = "SELECT * FROM Test"; - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Read(); - Assert.AreEqual( "困巫忘否役", reader.GetString(1) ); - Assert.AreEqual( "涝搞谷侪魍", reader.GetString(2) ); - } - catch (Exception ex) - { - Assert.Fail( ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - c.Close(); - } - } + cmd.Parameters[0].Value = "þðüçöÝÞÐÜÇÖ"; // Turkish + cmd.ExecuteNonQuery(); - [Test] - [Category("4.1")] - public void Turkish() - { - execSQL("DROP TABLE IF EXISTS Test"); - execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET latin5 )"); + cmd.Parameters[0].Value = "ฅๆษ"; // Thai + cmd.ExecuteNonQuery(); - MySqlConnection c = new MySqlConnection( conn.ConnectionString + ";charset=utf8" ); - c.Open(); - - - MySqlCommand cmd = new MySqlCommand( "INSERT INTO Test VALUES(1, 'ĞËÇÄŞ')", c); - cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT * FROM Test"; + MySqlDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.AreEqual("ЁЄЉҖҚ", reader.GetString(0)); + reader.Read(); + Assert.AreEqual("兣冘凥凷冋", reader.GetString(0)); + reader.Read(); + Assert.AreEqual("困巫忘否役", reader.GetString(0)); + reader.Read(); + Assert.AreEqual("涯割晦叶角", reader.GetString(0)); + reader.Read(); + Assert.AreEqual("ברחפע", reader.GetString(0)); + reader.Read(); + Assert.AreEqual("ψόβΩΞ", reader.GetString(0)); + reader.Read(); + Assert.AreEqual("þðüçöÝÞÐÜÇÖ", reader.GetString(0)); + reader.Read(); + Assert.AreEqual("ฅๆษ", reader.GetString(0)); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (reader != null) reader.Close(); + c.Close(); + } + } - cmd.CommandText = "SELECT * FROM Test"; - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Read(); - Assert.AreEqual( "ĞËÇÄŞ", reader.GetString(1) ); - } - catch (Exception ex) - { - Assert.Fail( ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - c.Close(); - } - } + [Test] + [Category("4.1")] + public void Chinese() + { + MySqlConnection c = new MySqlConnection(conn.ConnectionString + ";charset=utf8"); + c.Open(); - [Test] - [Category("4.1")] - public void Russian() - { - execSQL("DROP TABLE IF EXISTS Test"); - execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET cp1251)"); - - MySqlConnection c = new MySqlConnection( conn.ConnectionString + ";charset=utf8" ); - c.Open(); - - MySqlCommand cmd = new MySqlCommand( "INSERT INTO Test VALUES(1, 'щьеи')", c); - cmd.ExecuteNonQuery(); + execSQL("DROP TABLE IF EXISTS Test"); + execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET big5, name2 VARCHAR(200) CHAR SET gb2312)"); - cmd.CommandText = "SELECT * FROM Test"; - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Read(); - Assert.AreEqual( "щьеи", reader.GetString(1) ); - } - catch (Exception ex) - { - Assert.Fail( ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - c.Close(); - } - } + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, '困巫忘否役', '涝搞谷侪魍' )", c); + cmd.ExecuteNonQuery(); - [Test] - [Category("4.1")] - public void VariousCollations() - { - execSQL("CREATE TABLE `test_tbl` ( `test` VARCHAR( 255 ) NOT NULL) CHARACTER SET utf8 COLLATE utf8_swedish_ci TYPE = MYISAM"); - execSQL("INSERT INTO test_tbl VALUES ('myval')"); + cmd.CommandText = "SELECT * FROM Test"; + MySqlDataReader reader = null; try { + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.AreEqual("困巫忘否役", reader.GetString(1)); + Assert.AreEqual("涝搞谷侪魍", reader.GetString(2)); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (reader != null) reader.Close(); + c.Close(); + } + } + + [Test] + [Category("4.1")] + public void Turkish() + { + execSQL("DROP TABLE IF EXISTS Test"); + execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET latin5 )"); + + MySqlConnection c = new MySqlConnection(conn.ConnectionString + ";charset=utf8"); + c.Open(); + + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'ĞËÇÄŞ')", c); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + MySqlDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.AreEqual("ĞËÇÄŞ", reader.GetString(1)); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (reader != null) reader.Close(); + c.Close(); + } + } + + [Test] + [Category("4.1")] + public void Russian() + { + execSQL("DROP TABLE IF EXISTS Test"); + execSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET cp1251)"); + + MySqlConnection c = new MySqlConnection(conn.ConnectionString + ";charset=utf8"); + c.Open(); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'щьеи')", c); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + MySqlDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.AreEqual("щьеи", reader.GetString(1)); + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + finally + { + if (reader != null) reader.Close(); + c.Close(); + } + } + + [Test] + [Category("4.1")] + public void VariousCollations() + { + execSQL("CREATE TABLE `test_tbl` ( `test` VARCHAR( 255 ) NOT NULL) CHARACTER SET utf8 COLLATE utf8_swedish_ci TYPE = MYISAM"); + execSQL("INSERT INTO test_tbl VALUES ('myval')"); + try + { MySqlCommand cmd = new MySqlCommand("SELECT test FROM test_tbl", conn); cmd.ExecuteScalar(); } @@ -357,6 +358,40 @@ { execSQL("DROP TABLE test_tbl"); } - } - } + } + + /// + /// Bug #25651 SELECT does not work properly when WHERE contains UTF-8 characters + /// + [Test] + public void UTF8Parameters() + { + execSQL("DROP TABLE IF EXISTS test"); + execSQL("CREATE TABLE test (id int(11) NOT NULL, " + + "value varchar(100) NOT NULL, PRIMARY KEY (id)) " + + "ENGINE=MyISAM DEFAULT CHARSET=utf8"); + execSQL("INSERT INTO test VALUES (1, 'šđč枊ĐČĆŽ')"); + + string conString = GetConnectionString(true) + ";charset=utf8"; + try + { + using (MySqlConnection con = new MySqlConnection(conString)) + { + con.Open(); + + MySqlCommand command = new MySqlCommand( + "SELECT id FROM test WHERE value = ?parameter", con); + command.Parameters.Add("?parameter", MySqlDbType.VarString); + command.Parameters[0].Value = "šđč枊ĐČĆŽ"; + command.CommandTimeout = 0; + object o = command.ExecuteScalar(); + Assert.AreEqual(1, o); + } + } + catch (Exception ex) + { + Assert.Fail(ex.Message); + } + } + } }