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));
+ }
+ }
}