From: Date: March 20 2007 5:57pm Subject: Connector/NET commit: r640 - in branches/5.0: . Driver/Source TestSuite List-Archive: http://lists.mysql.com/commits/22389 X-Bug: 27221 Message-Id: <200703201657.l2KGvI9W028706@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/Connection.cs branches/5.0/Driver/Source/Field.cs branches/5.0/Driver/Source/NativeDriver.cs branches/5.0/Driver/Source/command.cs branches/5.0/TestSuite/Syntax.cs Log: Bug #27221 describe SQL command returns all byte array on MySQL versions older than 4.1.15 Still dealing with this nasty binary/non-binary crap. With 4.1 servers, describe and show table status return columns as binary data so we have no choice but to manually check for those SQL queries and create the metadata appropriately. Modified: branches/5.0/CHANGES =================================================================== --- branches/5.0/CHANGES 2007-03-20 13:41:21 UTC (rev 639) +++ branches/5.0/CHANGES 2007-03-20 16:57:17 UTC (rev 640) @@ -6,6 +6,7 @@ Bug #27253 Installer : Company info is different Bug #27187 cmd.Parameters.RemoveAt("Id") will cause an error if the last item is requested Bug #27093 Exception when using large values in IN UInt64 parameters + Bug #27221 describe SQL command returns all byte array on MySQL versions older than 4.1.15 Version 5.0.5 3/5/2007 Modified: branches/5.0/Driver/Source/Connection.cs =================================================================== --- branches/5.0/Driver/Source/Connection.cs 2007-03-20 13:41:21 UTC (rev 639) +++ branches/5.0/Driver/Source/Connection.cs 2007-03-20 16:57:17 UTC (rev 640) @@ -48,6 +48,7 @@ private ProcedureCache procedureCache; private PerformanceMonitor perfMonitor; private MySqlPromotableTransaction currentTransaction; + private bool isExecutingBuggyQuery; /// public event MySqlInfoMessageEventHandler InfoMessage; @@ -114,8 +115,14 @@ get { return perfMonitor; } } - #endregion + internal bool IsExecutingBuggyQuery + { + get { return isExecutingBuggyQuery; } + set { isExecutingBuggyQuery = value; } + } + #endregion + #region Properties #if !PocketPC Modified: branches/5.0/Driver/Source/Field.cs =================================================================== --- branches/5.0/Driver/Source/Field.cs 2007-03-20 13:41:21 UTC (rev 639) +++ branches/5.0/Driver/Source/Field.cs 2007-03-20 16:57:17 UTC (rev 640) @@ -69,13 +69,15 @@ protected byte scale; protected MySqlDbType mySqlDbType; protected DBVersion connVersion; + protected MySqlConnection connection; protected bool binaryOk; #endregion - public MySqlField(DBVersion connVersion) + public MySqlField(MySqlConnection connection) { - this.connVersion = connVersion; + this.connection = connection; + connVersion = connection.driver.Version; maxLength = 1; binaryOk = true; } @@ -170,7 +172,6 @@ Type == MySqlDbType.Blob || Type == MySqlDbType.LongBlob) && !IsBinary); } - } #endregion @@ -203,7 +204,7 @@ // now determine if we really should be binary if (CharacterSetIndex == 63 && (colFlags & ColumnFlags.BINARY) != 0) - CheckForFunction(); + CheckForExceptions(); if (IsBinary) { @@ -226,11 +227,13 @@ } } - private void CheckForFunction() + private void CheckForExceptions() { string colName = OriginalColumnName.ToLower(CultureInfo.InvariantCulture); if (colName.StartsWith("char(")) binaryOk = false; + else if (connection.IsExecutingBuggyQuery) + binaryOk = false; } public IMySqlValue GetValueObject() Modified: branches/5.0/Driver/Source/NativeDriver.cs =================================================================== --- branches/5.0/Driver/Source/NativeDriver.cs 2007-03-20 13:41:21 UTC (rev 639) +++ branches/5.0/Driver/Source/NativeDriver.cs 2007-03-20 16:57:17 UTC (rev 640) @@ -656,7 +656,7 @@ else { stream.OpenPacket(); - field = new MySqlField(this.Version); + field = new MySqlField(this.connection); field.Encoding = encoding; field.TableName = stream.ReadLenString(); @@ -681,7 +681,7 @@ private MySqlField GetFieldMetaData41() { - MySqlField field = new MySqlField(this.Version); + MySqlField field = new MySqlField(this.connection); stream.OpenPacket(); field.Encoding = encoding; @@ -700,10 +700,12 @@ colFlags = (ColumnFlags)stream.ReadInteger(2); else colFlags = (ColumnFlags)stream.ReadByte(); - field.SetTypeAndFlags(type, colFlags); + field.SetTypeAndFlags(type, colFlags); + field.Scale = (byte)stream.ReadByte(); + if (stream.HasMoreData) { int reserved = stream.ReadInteger(2); // reserved Modified: branches/5.0/Driver/Source/command.cs =================================================================== --- branches/5.0/Driver/Source/command.cs 2007-03-20 13:41:21 UTC (rev 639) +++ branches/5.0/Driver/Source/command.cs 2007-03-20 16:57:17 UTC (rev 640) @@ -28,6 +28,7 @@ using System.ComponentModel; using System.Threading; using System.Diagnostics; +using System.Globalization; namespace MySql.Data.MySqlClient { @@ -348,6 +349,21 @@ string sql = TrimSemicolons(cmdText); + // now we check to see if we are executing a query that is buggy + // in 4.1 + connection.IsExecutingBuggyQuery = false; + if (!connection.driver.Version.isAtLeast(5, 0, 0) && + connection.driver.Version.isAtLeast(4, 1, 0)) + { + string snippet = sql; + if (snippet.Length > 17) + snippet = sql.Substring(0, 17); + snippet = snippet.ToLower(CultureInfo.InvariantCulture); + connection.IsExecutingBuggyQuery = + snippet.StartsWith("describe") || + snippet.StartsWith("show table status"); + } + if (statement == null || !statement.IsPrepared) { if (CommandType == CommandType.StoredProcedure) Modified: branches/5.0/TestSuite/Syntax.cs =================================================================== --- branches/5.0/TestSuite/Syntax.cs 2007-03-20 13:41:21 UTC (rev 639) +++ branches/5.0/TestSuite/Syntax.cs 2007-03-20 16:57:17 UTC (rev 640) @@ -433,5 +433,35 @@ Assert.IsFalse(s.StartsWith("#")); } } - } + + /// + /// Bug #27221 describe SQL command returns all byte array on MySQL versions older than 4.1.15 + /// + [Test] + public void Describe() + { + MySqlDataAdapter da = new MySqlDataAdapter("DESCRIBE test", conn); + DataTable dt = new DataTable(); + da.Fill(dt); + + Assert.IsTrue(dt.Rows[0][0].GetType() == typeof(string)); + Assert.IsTrue(dt.Rows[0][1].GetType() == typeof(string)); + Assert.IsTrue(dt.Rows[0][2].GetType() == typeof(string)); + Assert.IsTrue(dt.Rows[0][3].GetType() == typeof(string)); + Assert.IsTrue(dt.Rows[0][4].GetType() == typeof(string)); + Assert.IsTrue(dt.Rows[0][5].GetType() == typeof(string)); + } + + [Test] + public void ShowTableStatus() + { + MySqlDataAdapter da = new MySqlDataAdapter( + String.Format("SHOW TABLE STATUS FROM {0} LIKE 'test'", + databases[0]), conn); + DataTable dt = new DataTable(); + da.Fill(dt); + + Assert.IsTrue(dt.Rows[0][0].GetType() == typeof(string)); + } + } }