Modified:
branches/1.0/CHANGES
branches/1.0/TestSuite/CharacterSetTests.cs
branches/1.0/TestSuite/DataReaderTests.cs
branches/1.0/mysqlclient/Field.cs
branches/1.0/mysqlclient/datareader.cs
Log:
Bug #14592 Wrong column length returned for VARCHAR UTF8 columns
Fixed this by using the max byte count from the encoding when calculating max length for text fields.
Modified: branches/1.0/CHANGES
===================================================================
--- branches/1.0/CHANGES 2006-09-26 15:02:01 UTC (rev 356)
+++ branches/1.0/CHANGES 2006-09-26 16:14:50 UTC (rev 357)
@@ -29,6 +29,8 @@
Bug #21521 # Symbols not allowed in column/table names.
Bug #16884 Invalid DateTime Values from DataReader
Bug #7248 There is already an open DataReader associated with this Connection which must
+ Bug #11991 ExecuteScalar
+ Bug #14592 Wrong column length returned for VARCHAR UTF8 columns
x-xx-05 - Version 1.0.7
Modified: branches/1.0/TestSuite/CharacterSetTests.cs
===================================================================
--- branches/1.0/TestSuite/CharacterSetTests.cs 2006-09-26 15:02:01 UTC (rev 356)
+++ branches/1.0/TestSuite/CharacterSetTests.cs 2006-09-26 16:14:50 UTC (rev 357)
@@ -123,5 +123,37 @@
Assert.AreEqual("€ŤŽš", name);
c.Close();
}
+
+ /// <summary>
+ /// Bug #14592 Wrong column length returned for VARCHAR UTF8 columns
+ /// </summary>
+ [Test]
+ public void GetSchemaOnUTF8()
+ {
+ execSQL("DROP TABLE IF EXISTS test");
+ execSQL("CREATE TABLE test(name VARCHAR(40) NOT NULL, name2 VARCHAR(20)) " +
+ "CHARACTER SET utf8");
+ execSQL("INSERT INTO test VALUES('Test', 'Test')");
+
+ MySqlDataReader reader = null;
+
+ try
+ {
+ MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", conn);
+ reader = cmd.ExecuteReader();
+ DataTable dt = reader.GetSchemaTable();
+ Assert.AreEqual(40, dt.Rows[0]["ColumnSize"]);
+ Assert.AreEqual(20, dt.Rows[1]["ColumnSize"]);
+ }
+ catch (Exception ex)
+ {
+ Assert.Fail(ex.Message);
+ }
+ finally
+ {
+ if (reader != null) reader.Close();
+ }
+ }
+
}
}
Modified: branches/1.0/TestSuite/DataReaderTests.cs
===================================================================
--- branches/1.0/TestSuite/DataReaderTests.cs 2006-09-26 15:02:01 UTC (rev 356)
+++ branches/1.0/TestSuite/DataReaderTests.cs 2006-09-26 16:14:50 UTC (rev 357)
@@ -201,41 +201,42 @@
reader.Close();
}
- [Test]
- public void GetSchema()
- {
- string sql = "CREATE TABLE test2( " +
- "id INT UNSIGNED AUTO_INCREMENT NOT NULL, " +
- "name VARCHAR(255) NOT NULL, " +
- "PRIMARY KEY( id ))";
+ [Test]
+ public void GetSchema()
+ {
+ string sql = "CREATE TABLE test2(id INT UNSIGNED AUTO_INCREMENT " +
+ "NOT NULL, name VARCHAR(255) NOT NULL, name2 VARCHAR(40), fl FLOAT, " +
+ "dt DATETIME, PRIMARY KEY(id))";
- execSQL("DROP TABLE IF EXISTS test2");
- execSQL(sql);
- execSQL("INSERT INTO test2 VALUES(1,'Test')");
+ execSQL("DROP TABLE IF EXISTS test2");
+ execSQL(sql);
+ execSQL("INSERT INTO test2 VALUES(1,'Test', 'Test', 1.0, now())");
- MySqlDataReader reader = null;
+ MySqlDataReader reader = null;
- try
- {
- MySqlCommand cmd = new MySqlCommand("SELECT * FROM test2", conn);
- reader = cmd.ExecuteReader();
- DataTable dt = reader.GetSchemaTable();
- Assert.AreEqual( true, dt.Rows[0]["IsAutoIncrement"], "Checking auto increment" );
- Assert.AreEqual( true, dt.Rows[0]["IsUnique"], "Checking IsUnique" );
- Assert.AreEqual( false, dt.Rows[0]["AllowDBNull"], "Checking AllowDBNull" );
- Assert.AreEqual( false, dt.Rows[1]["AllowDBNull"], "Checking AllowDBNull" );
- }
- catch (Exception ex)
- {
- Assert.Fail(ex.Message);
- }
- finally
- {
- if (reader != null) reader.Close();
- }
+ try
+ {
+ MySqlCommand cmd = new MySqlCommand("SELECT * FROM test2", conn);
+ reader = cmd.ExecuteReader();
+ DataTable dt = reader.GetSchemaTable();
+ Assert.AreEqual(true, dt.Rows[0]["IsAutoIncrement"], "Checking auto increment");
+ Assert.AreEqual(true, dt.Rows[0]["IsUnique"], "Checking IsUnique");
+ Assert.AreEqual(false, dt.Rows[0]["AllowDBNull"], "Checking AllowDBNull");
+ Assert.AreEqual(false, dt.Rows[1]["AllowDBNull"], "Checking AllowDBNull");
+ Assert.AreEqual(255, dt.Rows[1]["ColumnSize"]);
+ Assert.AreEqual(40, dt.Rows[2]["ColumnSize"]);
+ }
+ catch (Exception ex)
+ {
+ Assert.Fail(ex.Message);
+ }
+ finally
+ {
+ if (reader != null) reader.Close();
+ }
- execSQL("DROP TABLE IF EXISTS test2");
- }
+ execSQL("DROP TABLE IF EXISTS test2");
+ }
[Test]
public void CloseConnectionBehavior()
Modified: branches/1.0/mysqlclient/Field.cs
===================================================================
--- branches/1.0/mysqlclient/Field.cs 2006-09-26 15:02:01 UTC (rev 356)
+++ branches/1.0/mysqlclient/Field.cs 2006-09-26 16:14:50 UTC (rev 357)
@@ -149,6 +149,18 @@
get { return (colFlags & ColumnFlags.UNSIGNED) > 0; }
}
+ public bool IsTextField
+ {
+ get
+ {
+ return Type == MySqlDbType.VarString || Type == MySqlDbType.VarChar ||
+ ((Type == MySqlDbType.TinyBlob || Type == MySqlDbType.MediumBlob ||
+ Type == MySqlDbType.Blob || Type == MySqlDbType.LongBlob) &&
+ !IsBinary);
+ }
+
+ }
+
#endregion
public MySqlDbType ProviderType()
Modified: branches/1.0/mysqlclient/datareader.cs
===================================================================
--- branches/1.0/mysqlclient/datareader.cs 2006-09-26 15:02:01 UTC (rev 356)
+++ branches/1.0/mysqlclient/datareader.cs 2006-09-26 16:14:50 UTC (rev 357)
@@ -504,7 +504,8 @@
DataRow r = dataTableSchema.NewRow();
r["ColumnName"] = f.ColumnName;
r["ColumnOrdinal"] = ord++;
- r["ColumnSize"] = f.ColumnLength;
+ int maxByteCount = f.Encoding.GetMaxByteCount(1) >> 1;
+ r["ColumnSize"] = f.IsTextField ? f.ColumnLength / maxByteCount : f.ColumnLength;
int prec = f.Precision;
int pscale = f.Scale;
if (prec != -1)
| Thread |
|---|
| • Connector/NET commit: r357 - in branches/1.0: . TestSuite mysqlclient | rburnett | 26 Sep |