Index: driver/utility.c =================================================================== --- driver/utility.c (revision 937) +++ driver/utility.c (working copy) @@ -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) Index: test/my_unicode.c =================================================================== --- test/my_unicode.c (revision 937) +++ test/my_unicode.c (working copy) @@ -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