Index: driver/utility.c =================================================================== --- driver/utility.c (revision 876) +++ driver/utility.c (working copy) @@ -933,7 +933,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 : + (((CHARSET_INFO*)get_charset(field->charsetnr, MYF(0)))->mbmaxlen > 1 ? + SQL_WCHAR : SQL_CHAR); /* MYSQL_TYPE_VARCHAR is never actually sent, this just silences @@ -943,32 +945,42 @@ case MYSQL_TYPE_VAR_STRING: if (buff) (void)strmov(buff, field_is_binary ? "varbinary" : "varchar"); + + return field_is_binary ? SQL_VARBINARY : + (((CHARSET_INFO*)get_charset(field->charsetnr, MYF(0)))->mbmaxlen > 1 ? + SQL_WVARCHAR : SQL_VARCHAR); - return field_is_binary ? SQL_VARBINARY : 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 : + (((CHARSET_INFO*)get_charset(field->charsetnr, MYF(0)))->mbmaxlen > 1 ? + 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 : + (((CHARSET_INFO*)get_charset(field->charsetnr, MYF(0)))->mbmaxlen > 1 ? + 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 : + (((CHARSET_INFO*)get_charset(field->charsetnr, MYF(0)))->mbmaxlen > 1 ? + 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 : + (((CHARSET_INFO*)get_charset(field->charsetnr, MYF(0)))->mbmaxlen > 1 ? + SQL_WLONGVARCHAR : SQL_LONGVARCHAR); case MYSQL_TYPE_ENUM: if (buff) Index: test/my_unicode.c =================================================================== --- test/my_unicode.c (revision 876) +++ 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"\"\u03A8\u0391\u03A1\u039F 1\"," + L"\"\u03A8\u0391\u03A1\u039F 2\"," + L"\"\u03A8\u0391\u03A1\u039F 3\"," + L"\"\u03A8\u0391\u03A1\u039F 4\"," + L"\"\u03A8\u0391\u03A1\u039F 5\"," + L"\"\u03A8\u0391\u03A1\u039F 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"\u03A8\u0391\u03A1\u039F 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"\u03A8\u0391\u03A1\u039F 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"\u03A8\u0391\u03A1\u039F 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"\u03A8\u0391\u03A1\u039F 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"\u03A8\u0391\u03A1\u039F 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"\u03A8\u0391\u03A1\u039F 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