#At file:///D:/bzr-connector-net/trunk/ based on revid:reggie.burnett@stripped
790 Reggie Burnett 2009-10-23 [merge]
- fixed guid type so that multi-byte character sets will not effect how it works. A column would be
considered a guid if it has a *character* length of 36, not a *byte* length of 36 (bug #47985)
modified:
CHANGES
MySql.Data/Provider/Source/Driver.cs
MySql.Data/Provider/Source/Field.cs
MySql.Data/Provider/Source/NativeDriver.cs
MySql.Data/Tests/Source/DataTypeTests.cs
=== modified file 'CHANGES'
=== modified file 'CHANGES'
--- a/CHANGES 2009-10-23 15:51:10 +0000
+++ b/CHANGES 2009-10-23 19:02:53 +0000
@@ -1,6 +1,8 @@
Version 6.2.1
- implemented support for client SSL certificates
- fixed indexes schema collection so that it still works with bad table names such as b``a`d (bug #48101)
+- fixed guid type so that multi-byte character sets will not effect how it works. A column would be
+ considered a guid if it has a *character* length of 36, not a *byte* length of 36 (bug #47985)
Version 6.2.0
- we now cleanup idle connections in the pool, if they were not used for too long
=== modified file 'MySql.Data/Provider/Source/Driver.cs'
--- a/MySql.Data/Provider/Source/Driver.cs 2009-10-22 15:27:25 +0000
+++ b/MySql.Data/Provider/Source/Driver.cs 2009-10-23 19:02:53 +0000
@@ -151,6 +151,11 @@
get { return serverCharSetIndex; }
}
+ internal Hashtable CharacterSets
+ {
+ get { return charSets; }
+ }
+
public bool SupportsOutputParameters
{
get { return Version.isAtLeast(6,0,8); }
@@ -386,30 +391,12 @@
NextResult(0);
}
- private void SetFieldEncoding(MySqlField f)
- {
- if (charSets == null || f.CharacterSetIndex == -1) return;
- if (charSets[f.CharacterSetIndex] == null) return;
-
- CharacterSet cs = CharSetMap.GetCharacterSet(Version, (string) charSets[f.CharacterSetIndex]);
- // starting with 6.0.4 utf8 has a maxlen of 4 instead of 3. The old
- // 3 byte utf8 is utf8mb3
- if (cs.name.ToLower(System.Globalization.CultureInfo.InvariantCulture) == "utf-8" &&
- Version.Major >= 6)
- f.MaxLength = 4;
- else
- f.MaxLength = cs.byteCount;
- f.Encoding = CharSetMap.GetEncoding(Version, (string) charSets[f.CharacterSetIndex]);
- }
-
public MySqlField[] GetColumns(int count)
{
MySqlField[] fields = new MySqlField[count];
for (int i = 0; i < count; i++)
fields[i] = new MySqlField(connection);
handler.GetColumnsData(fields);
- for (int i = 0; i < count; i++)
- SetFieldEncoding(fields[i]);
return fields;
}
=== modified file 'MySql.Data/Provider/Source/Field.cs'
--- a/MySql.Data/Provider/Source/Field.cs 2009-10-22 15:27:25 +0000
+++ b/MySql.Data/Provider/Source/Field.cs 2009-10-23 19:02:53 +0000
@@ -24,6 +24,7 @@
using System.Globalization;
using System.Text.RegularExpressions;
using System;
+using System.Collections;
namespace MySql.Data.MySqlClient
{
@@ -87,7 +88,7 @@
public int CharacterSetIndex
{
get { return charSetIndex; }
- set { charSetIndex = value; }
+ set { charSetIndex = value; SetFieldEncoding(); }
}
public MySqlDbType Type
@@ -177,6 +178,11 @@
}
}
+ public int CharacterLength
+ {
+ get { return ColumnLength / MaxLength; }
+ }
+
#endregion
public void SetTypeAndFlags(MySqlDbType type, ColumnFlags flags)
@@ -261,7 +267,7 @@
if (connection.Settings.RespectBinaryFlags)
CheckForExceptions();
- if (Type == MySqlDbType.String && ColumnLength == 36 && !connection.Settings.OldGuids)
+ if (Type == MySqlDbType.String && CharacterLength == 36 && !connection.Settings.OldGuids)
mySqlDbType = MySqlDbType.Guid;
if (!IsBinary) return;
@@ -373,5 +379,24 @@
throw new MySqlException("Unknown data type");
}
}
+
+ private void SetFieldEncoding()
+ {
+ Hashtable charSets = connection.driver.CharacterSets;
+ DBVersion version = connection.driver.Version;
+
+ if (charSets == null || CharacterSetIndex == -1) return;
+ if (charSets[CharacterSetIndex] == null) return;
+
+ CharacterSet cs = CharSetMap.GetCharacterSet(version, (string)charSets[CharacterSetIndex]);
+ // starting with 6.0.4 utf8 has a maxlen of 4 instead of 3. The old
+ // 3 byte utf8 is utf8mb3
+ if (cs.name.ToLower(System.Globalization.CultureInfo.InvariantCulture) == "utf-8" &&
+ version.Major >= 6)
+ MaxLength = 4;
+ else
+ MaxLength = cs.byteCount;
+ Encoding = CharSetMap.GetEncoding(version, (string)charSets[CharacterSetIndex]);
+ }
}
}
=== modified file 'MySql.Data/Provider/Source/NativeDriver.cs'
--- a/MySql.Data/Provider/Source/NativeDriver.cs 2009-10-23 11:31:00 +0000
+++ b/MySql.Data/Provider/Source/NativeDriver.cs 2009-10-23 19:02:53 +0000
@@ -676,13 +676,12 @@
colFlags = (ColumnFlags)packet.ReadInteger(2);
else
colFlags = (ColumnFlags)packet.ReadByte();
- field.SetTypeAndFlags(type, colFlags);
field.Scale = (byte)packet.ReadByte();
-
if (packet.HasMoreData)
{
packet.ReadInteger(2); // reserved
}
+ field.SetTypeAndFlags(type, colFlags);
}
private void ExecutePacket(MySqlPacket packetToExecute)
=== modified file 'MySql.Data/Tests/Source/DataTypeTests.cs'
--- a/MySql.Data/Tests/Source/DataTypeTests.cs 2009-10-16 14:49:08 +0000
+++ b/MySql.Data/Tests/Source/DataTypeTests.cs 2009-10-23 19:02:53 +0000
@@ -979,5 +979,30 @@
}
}
}
+
+ /// <summary>
+ /// Bug #47985 UTF-8 String Length Issue (guids etc)
+ /// </summary>
+ [Test]
+ public void UTF8Char12AsGuid()
+ {
+ execSQL("DROP TABLE IF EXISTS Test");
+ execSQL("CREATE TABLE Test (id INT, name CHAR(12) CHARSET utf8)");
+ execSQL("INSERT INTO Test VALUES (1, 'Name')");
+
+ string connStr = GetConnectionString(true) + ";charset=utf8";
+ using (MySqlConnection c = new MySqlConnection(connStr))
+ {
+ c.Open();
+
+ MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c);
+ using (MySqlDataReader reader = cmd.ExecuteReader())
+ {
+ reader.Read();
+ string s = reader.GetString(1);
+ Assert.AreEqual("Name", s);
+ }
+ }
+ }
}
}
Attachment: [text/bzr-bundle] bzr/reggie.burnett@sun.com-20091023190403-rzzr0aeljqbs8oa5.bundle
| Thread |
|---|
| • bzr commit into connector-net-trunk branch (reggie.burnett:790)Bug#47985 | Reggie Burnett | 23 Oct |