Index: driver/utility.c =================================================================== --- driver/utility.c (revision 1110) +++ driver/utility.c (working copy) @@ -372,6 +372,7 @@ SQLSMALLINT get_sql_data_type(STMT *stmt, MYSQL_FIELD *field, char *buff) { my_bool field_is_binary= test(field->charsetnr == 63); + my_bool has_org_table= test(field->org_table_length > 0); switch (field->type) { case MYSQL_TYPE_BIT: @@ -498,9 +499,10 @@ case MYSQL_TYPE_STRING: if (buff) - (void)strmov(buff, field_is_binary ? "binary" : "char"); + (void)strmov(buff, (field_is_binary && has_org_table) ? + "binary" : "char"); - return field_is_binary ? SQL_BINARY : SQL_CHAR; + return (field_is_binary && has_org_table) ? SQL_BINARY : SQL_CHAR; /* MYSQL_TYPE_VARCHAR is never actually sent, this just silences @@ -509,33 +511,42 @@ case MYSQL_TYPE_VARCHAR: case MYSQL_TYPE_VAR_STRING: if (buff) - (void)strmov(buff, field_is_binary ? "varbinary" : "varchar"); + (void)strmov(buff, (field_is_binary && has_org_table) ? + "varbinary" : "varchar"); - return field_is_binary ? SQL_VARBINARY : SQL_VARCHAR; + return (field_is_binary && has_org_table) ? SQL_VARBINARY : SQL_VARCHAR; case MYSQL_TYPE_TINY_BLOB: if (buff) - (void)strmov(buff, field_is_binary ? "tinyblob" : "tinytext"); + (void)strmov(buff, (field_is_binary && has_org_table) ? + "tinyblob" : "tinytext"); - return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR; + return (field_is_binary && has_org_table) ? + SQL_LONGVARBINARY : SQL_LONGVARCHAR; case MYSQL_TYPE_BLOB: if (buff) - (void)strmov(buff, field_is_binary ? "blob" : "text"); + (void)strmov(buff, (field_is_binary && has_org_table) ? + "blob" : "text"); - return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR; + return (field_is_binary && has_org_table) ? + SQL_LONGVARBINARY : SQL_LONGVARCHAR; case MYSQL_TYPE_MEDIUM_BLOB: if (buff) - (void)strmov(buff, field_is_binary ? "mediumblob" : "mediumtext"); + (void)strmov(buff, (field_is_binary && has_org_table) ? + "mediumblob" : "mediumtext"); - return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR; + return (field_is_binary && has_org_table) ? + SQL_LONGVARBINARY : SQL_LONGVARCHAR; case MYSQL_TYPE_LONG_BLOB: if (buff) - (void)strmov(buff, field_is_binary ? "longblob" : "longtext"); + (void)strmov(buff, (field_is_binary && has_org_table) ? + "longblob" : "longtext"); - return field_is_binary ? SQL_LONGVARBINARY : SQL_LONGVARCHAR; + return (field_is_binary && has_org_table) ? + SQL_LONGVARBINARY : SQL_LONGVARCHAR; case MYSQL_TYPE_ENUM: if (buff) Index: test/my_catalog.c =================================================================== --- test/my_catalog.c (revision 1110) +++ test/my_catalog.c (working copy) @@ -1269,6 +1269,26 @@ } +/** + Bug #29402: field type charset 63 problem +*/ +DECLARE_TEST(t_bug29402) +{ + SQLSMALLINT name_length, data_type, decimal_digits, nullable; + SQLCHAR column_name[SQL_MAX_COLUMN_NAME_LEN]; + SQLULEN column_size; + + ok_sql(hstmt, "SELECT CONCAT('ABCDEFG', 20) concated"); + + ok_stmt(hstmt, SQLDescribeCol(hstmt, 1, column_name, sizeof(column_name), + &name_length, &data_type, &column_size, + &decimal_digits, &nullable)); + + is_num(data_type, SQL_VARCHAR); + return OK; +} + + BEGIN_TESTS ADD_TEST(my_columns_null) ADD_TEST(my_drop_table) @@ -1295,6 +1315,7 @@ ADD_TEST(t_bug32989) ADD_TEST(t_bug33298) ADD_TEST(t_bug12805) + ADD_TEST(t_bug29402) END_TESTS