Modified:
branches/guffert/ChangeLog
branches/guffert/driver/utility.c
branches/guffert/test/my_unicode.c
Log:
SQLDescribeColW returned UTF-8 column as SQL_VARCHAR instead of SQL_WVARCHAR. (Bug #32161)
Modified: branches/guffert/ChangeLog
===================================================================
--- branches/guffert/ChangeLog 2007-12-07 17:59:56 UTC (rev 939)
+++ branches/guffert/ChangeLog 2007-12-07 19:02:30 UTC (rev 940)
@@ -33,7 +33,9 @@
* ADO was unable to open record set using dynamic cursor. (Bug #32014)
* SQLSetConnectAttr() did not clear previous errors, possibly confusing
SQLError().
-
+ * SQLDescribeColW returned UTF-8 column as SQL_VARCHAR instead of
+ SQL_WVARCHAR. (Bug #32161)
+
Includes changes from Connector/ODBC 3.51.21 and 3.51.22.
----
Modified: branches/guffert/driver/utility.c
===================================================================
--- branches/guffert/driver/utility.c 2007-12-07 17:59:56 UTC (rev 939)
+++ branches/guffert/driver/utility.c 2007-12-07 19:02:30 UTC (rev 940)
@@ -1047,7 +1047,9 @@
if (buff)
(void)strmov(buff, field_is_binary ? "binary" : "char");
- return field_is_binary ? SQL_BINARY : SQL_CHAR;
+ return field_is_binary ? SQL_BINARY :
+ (field->charsetnr != stmt->dbc->ansi_charset_info->number ?
+ SQL_WCHAR : SQL_CHAR);
/*
MYSQL_TYPE_VARCHAR is never actually sent, this just silences
@@ -1058,31 +1060,41 @@
if (buff)
(void)strmov(buff, field_is_binary ? "varbinary" : "varchar");
- return field_is_binary ? SQL_VARBINARY : SQL_VARCHAR;
+ return field_is_binary ? SQL_VARBINARY :
+ (field->charsetnr != stmt->dbc->ansi_charset_info->number ?
+ SQL_WVARCHAR : SQL_VARCHAR);
case MYSQL_TYPE_TINY_BLOB:
if (buff)
(void)strmov(buff, field_is_binary ? "tinyblob" : "tinytext");
- return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR;
+ return field_is_binary ? SQL_LONGVARBINARY :
+ (field->charsetnr != stmt->dbc->ansi_charset_info->number ?
+ SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_BLOB:
if (buff)
(void)strmov(buff, field_is_binary ? "blob" : "text");
- return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR;
+ return field_is_binary ? SQL_LONGVARBINARY :
+ (field->charsetnr != stmt->dbc->ansi_charset_info->number ?
+ SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_MEDIUM_BLOB:
if (buff)
(void)strmov(buff, field_is_binary ? "mediumblob" : "mediumtext");
- return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR;
+ return field_is_binary ? SQL_LONGVARBINARY :
+ (field->charsetnr != stmt->dbc->ansi_charset_info->number ?
+ SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_LONG_BLOB:
if (buff)
(void)strmov(buff, field_is_binary ? "longblob" : "longtext");
- return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR;
+ return field_is_binary ? SQL_LONGVARBINARY :
+ (field->charsetnr != stmt->dbc->ansi_charset_info->number ?
+ SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_ENUM:
if (buff)
Modified: branches/guffert/test/my_unicode.c
===================================================================
--- branches/guffert/test/my_unicode.c 2007-12-07 17:59:56 UTC (rev 939)
+++ branches/guffert/test/my_unicode.c 2007-12-07 19:02:30 UTC (rev 940)
@@ -943,6 +943,79 @@
}
+DECLARE_TEST(t_bug32161)
+{
+ HDBC hdbc1;
+ HSTMT hstmt1;
+ SQLWCHAR wbuff[MAX_ROW_DATA_LEN+1];
+ SQLSMALLINT nlen;
+ SQLSMALLINT ctype;
+ SQLLEN csize;
+
+ ok_sql(hstmt, "DROP TABLE IF EXISTS t_bug32161");
+ ok_sql(hstmt, "CREATE TABLE t_bug32161 ("
+ "col1 varchar(32),"
+ "col2 char(32),"
+ "col3 tinytext,"
+ "col4 mediumtext,"
+ "col5 text,"
+ "col6 longtext"
+ ")Engine=InnoDB DEFAULT CHARSET=utf8");
+
+ /* Greek word PSARO - FISH */
+ ok_stmt(hstmt,
+ SQLExecDirectW(hstmt,
+ W(L"INSERT INTO t_bug32161 VALUES ("
+ L"\"\x03A8\x0391\x03A1\x039F 1\","
+ L"\"\x03A8\x0391\x03A1\x039F 2\","
+ L"\"\x03A8\x0391\x03A1\x039F 3\","
+ L"\"\x03A8\x0391\x03A1\x039F 4\","
+ L"\"\x03A8\x0391\x03A1\x039F 5\","
+ L"\"\x03A8\x0391\x03A1\x039F 6\")"),
+ SQL_NTS));
+
+ ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
+ ok_sql(hstmt, "SELECT * FROM t_bug32161");
+ ok_stmt(hstmt, SQLFetch(hstmt));
+
+ is_wstr(my_fetch_wstr(hstmt, wbuff, 1), L"\x03A8\x0391\x03A1\x039F 1", 4);
+ ok_stmt(hstmt, SQLDescribeColW(hstmt, 1, wbuff, MAX_ROW_DATA_LEN, &nlen,
+ &ctype, NULL, NULL, NULL));
+ is_num(ctype, SQL_WVARCHAR);
+
+ is_wstr(my_fetch_wstr(hstmt, wbuff, 2), L"\x03A8\x0391\x03A1\x039F 2", 4);
+ ok_stmt(hstmt, SQLDescribeColW(hstmt, 2, wbuff, MAX_ROW_DATA_LEN, &nlen,
+ &ctype, NULL, NULL, NULL));
+ is_num(ctype, SQL_WCHAR);
+
+ /* All further calls of SQLDescribeColW should return SQL_WLONGVARCHAR */
+ is_wstr(my_fetch_wstr(hstmt, wbuff, 3), L"\x03A8\x0391\x03A1\x039F 3", 4);
+ ok_stmt(hstmt, SQLDescribeColW(hstmt, 3, wbuff, MAX_ROW_DATA_LEN, &nlen,
+ &ctype, NULL, NULL, NULL));
+ is_num(ctype, SQL_WLONGVARCHAR);
+
+ is_wstr(my_fetch_wstr(hstmt, wbuff, 4), L"\x03A8\x0391\x03A1\x039F 4", 4);
+ ok_stmt(hstmt, SQLDescribeColW(hstmt, 4, wbuff, MAX_ROW_DATA_LEN, &nlen,
+ &ctype, NULL, NULL, NULL));
+ is_num(ctype, SQL_WLONGVARCHAR);
+
+ is_wstr(my_fetch_wstr(hstmt, wbuff, 5), L"\x03A8\x0391\x03A1\x039F 5", 4);
+ ok_stmt(hstmt, SQLDescribeColW(hstmt, 5, wbuff, MAX_ROW_DATA_LEN, &nlen,
+ &ctype, NULL, NULL, NULL));
+ is_num(ctype, SQL_WLONGVARCHAR);
+
+ is_wstr(my_fetch_wstr(hstmt, wbuff, 6), L"\x03A8\x0391\x03A1\x039F 6", 4);
+ ok_stmt(hstmt, SQLDescribeColW(hstmt, 6, wbuff, MAX_ROW_DATA_LEN, &nlen,
+ &ctype, NULL, NULL, NULL));
+ is_num(ctype, SQL_WLONGVARCHAR);
+
+ ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
+ ok_sql(hstmt, "DROP TABLE IF EXISTS t_bug32161");
+
+ return OK;
+}
+
+
BEGIN_TESTS
ADD_TEST(sqlconnect)
ADD_TEST(sqlprepare)
@@ -963,6 +1036,7 @@
ADD_TEST(sqlforeignkeys)
ADD_TEST(sqlprimarykeys)
ADD_TEST(sqlstatistics)
+ ADD_TEST(t_bug32161)
END_TESTS
| Thread |
|---|
| • Connector/ODBC 3.51 commit: r940 - in branches/guffert: . driver test | bdegtyariov | 7 Dec |