From: Date: November 6 2007 6:24pm Subject: Connector/NET commit: r1079 - in branches/5.1: . Driver/Source Driver/Source/Types TestSuite/Source List-Archive: http://lists.mysql.com/commits/37203 X-Bug: 27959 Message-Id: <200711061724.lA6HO2F5023595@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/Field.cs branches/5.1/Driver/Source/Types/MySqlBit.cs branches/5.1/Driver/Source/Types/MySqlByte.cs branches/5.1/TestSuite/Source/DataTypeTests.cs Log: - fixed code where we were returning bit(1) as boolean but mysql treats tinyint(1) as boolean (bug #27959) Modified: branches/5.1/CHANGES =================================================================== --- branches/5.1/CHANGES 2007-11-06 16:20:12 UTC (rev 1078) +++ branches/5.1/CHANGES 2007-11-06 17:24:02 UTC (rev 1079) @@ -14,7 +14,8 @@ - Fixed problem with installer where attempting to install over a failed uninstall could leave multiple clients registered in machine.config. (Bug #31731) - Marked MySqlDbType.Datetime obsolete; replaced with DateTime (just corrected capitalization) (Bug #26344) - + - fixed code where we were returning bit(1) as boolean but mysql treats tinyint(1) as boolean + (bug #27959) Version 5.1.3 - 9/19/2007 - Fixed problem with using a stored procedure that takes a parameter as a select routine Modified: branches/5.1/Driver/Source/Field.cs =================================================================== --- branches/5.1/Driver/Source/Field.cs 2007-11-06 16:20:12 UTC (rev 1078) +++ branches/5.1/Driver/Source/Field.cs 2007-11-06 17:24:02 UTC (rev 1079) @@ -277,7 +277,14 @@ public IMySqlValue GetValueObject() { - return GetIMySqlValue(Type); + IMySqlValue v = GetIMySqlValue(Type); + if (v is MySqlByte && ColumnLength == 1) + { + MySqlByte b = (MySqlByte)v; + b.TreatAsBoolean = true; + v = b; + } + return v; } public static IMySqlValue GetIMySqlValue(MySqlDbType type) Modified: branches/5.1/Driver/Source/Types/MySqlBit.cs =================================================================== --- branches/5.1/Driver/Source/Types/MySqlBit.cs 2007-11-06 16:20:12 UTC (rev 1078) +++ branches/5.1/Driver/Source/Types/MySqlBit.cs 2007-11-06 17:24:02 UTC (rev 1079) @@ -59,8 +59,6 @@ { get { - if (mValue == 0 || mValue == 1) - return Convert.ToBoolean(mValue); return mValue; } } @@ -69,8 +67,6 @@ { get { - if (mValue == 0 || mValue == 1) - return typeof(Boolean); return typeof(UInt64); } } Modified: branches/5.1/Driver/Source/Types/MySqlByte.cs =================================================================== --- branches/5.1/Driver/Source/Types/MySqlByte.cs 2007-11-06 16:20:12 UTC (rev 1078) +++ branches/5.1/Driver/Source/Types/MySqlByte.cs 2007-11-06 17:24:02 UTC (rev 1079) @@ -29,18 +29,21 @@ { private sbyte mValue; private bool isNull; + private bool treatAsBool; public MySqlByte(bool isNull) { this.isNull = isNull; mValue = 0; + treatAsBool = false; } public MySqlByte(sbyte val) { this.isNull = false; mValue = val; - } + treatAsBool = false; + } #region IMySqlValue Members @@ -56,22 +59,38 @@ DbType IMySqlValue.DbType { - get { return DbType.SByte; } + get + { + if (TreatAsBoolean) + return DbType.Boolean; + return DbType.SByte; + } } object IMySqlValue.Value { - get { return mValue; } + get + { + if (TreatAsBoolean) + return Convert.ToBoolean(mValue); + return mValue; + } } public sbyte Value { get { return mValue; } + set { mValue = value; } } Type IMySqlValue.SystemType { - get { return typeof(sbyte); } + get + { + if (TreatAsBoolean) + return typeof(Boolean); + return typeof(sbyte); + } } string IMySqlValue.MySqlTypeName @@ -98,7 +117,9 @@ else { string s = stream.ReadString(length); - return new MySqlByte(SByte.Parse(s, NumberStyles.Any, CultureInfo.InvariantCulture)); + MySqlByte b = new MySqlByte(SByte.Parse(s, NumberStyles.Any, CultureInfo.InvariantCulture)); + b.TreatAsBoolean = TreatAsBoolean; + return b; } } @@ -109,6 +130,12 @@ #endregion + internal bool TreatAsBoolean + { + get { return treatAsBool; } + set { treatAsBool = value; } + } + internal static void SetDSInfo(DataTable dsTable) { // we use name indexing because this method will only be called Modified: branches/5.1/TestSuite/Source/DataTypeTests.cs =================================================================== --- branches/5.1/TestSuite/Source/DataTypeTests.cs 2007-11-06 16:20:12 UTC (rev 1078) +++ branches/5.1/TestSuite/Source/DataTypeTests.cs 2007-11-06 17:24:02 UTC (rev 1079) @@ -815,19 +815,27 @@ } } + /// + /// Bug #27959 Bool datatype is not returned as System.Boolean by MySqlDataAdapter + /// [Test] - public void BooleanForBit1() + public void Boolean() { if (version < new Version(5, 0)) return; execSQL("DROP TABLE IF EXISTS Test"); - execSQL("CREATE TABLE Test (id INT, `on` BIT(1))"); - execSQL("INSERT INTO Test VALUES (1,1), (2,0)"); + execSQL("CREATE TABLE Test (id INT, `on` BOOLEAN, v TINYINT(2))"); + execSQL("INSERT INTO Test VALUES (1,1,1), (2,0,0)"); MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", conn); DataTable dt = new DataTable(); da.Fill(dt); Assert.AreEqual(typeof(Boolean), dt.Columns[1].DataType); + Assert.AreEqual(typeof(SByte), dt.Columns[2].DataType); + Assert.AreEqual(true, dt.Rows[0][1]); + Assert.AreEqual(false, dt.Rows[1][1]); + Assert.AreEqual(1, dt.Rows[0][2]); + Assert.AreEqual(0, dt.Rows[1][2]); } } }