List:Commits« Previous MessageNext Message »
From:bdegtyariov Date:December 7 2007 7:02pm
Subject:Connector/ODBC 3.51 commit: r940 - in branches/guffert: . driver test
View as plain text  
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 testbdegtyariov7 Dec