List:Commits« Previous MessageNext Message »
From:rburnett Date:March 20 2007 5:57pm
Subject:Connector/NET commit: r640 - in branches/5.0: . Driver/Source TestSuite
View as plain text  
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;
 
 		/// <include file='docs/MySqlConnection.xml' path='docs/InfoMessage/*'/>
 		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("#"));
             }
         }
-	}
+
+        /// <summary>
+        /// Bug #27221 describe SQL command returns all byte array on MySQL versions
older than 4.1.15 
+        /// </summary>
+        [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));
+        }
+    }
 }

Thread
Connector/NET commit: r640 - in branches/5.0: . Driver/Source TestSuiterburnett20 Mar