Skip to content

Commit b0e0d7c

Browse files
committed
[ODBC-73]Fix and testcase. The connector relied on the field's BINARY_FLAG flag to establish the fact whether the field it binary or not.
But that flag would be set if any binary collation is selected for any char field. And that is not right. The patch changing that to check only if field's charset is binary charset(63)
1 parent 168ea7b commit b0e0d7c

File tree

3 files changed

+37
-14
lines changed

3 files changed

+37
-14
lines changed

ma_helper.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <ma_odbc.h>
2020
#include <stdint.h>
2121

22+
#define MADB_FIELD_IS_BINARY(_field) ((_field).charsetnr == BINARY_CHARSETNR)
2223

2324
void CloseMultiStatements(MADB_Stmt *Stmt)
2425
{
@@ -363,23 +364,23 @@ char *MADB_GetTypeName(MYSQL_FIELD Field)
363364
return "date";
364365
case MYSQL_TYPE_VARCHAR:
365366
case MYSQL_TYPE_VAR_STRING:
366-
return (Field.flags & BINARY_FLAG) ? "varbinary" : "varchar";
367+
return MADB_FIELD_IS_BINARY(Field) ? "varbinary" : "varchar";
367368
case MYSQL_TYPE_BIT:
368369
return "bit";
369370
case MYSQL_TYPE_ENUM:
370371
return "enum";
371372
case MYSQL_TYPE_SET:
372373
return "set";
373374
case MYSQL_TYPE_TINY_BLOB:
374-
return (Field.flags & BINARY_FLAG) ? "tinyblob" : "tinytext";
375+
return MADB_FIELD_IS_BINARY(Field) ? "tinyblob" : "tinytext";
375376
case MYSQL_TYPE_MEDIUM_BLOB:
376-
return (Field.flags & BINARY_FLAG) ? "mediumblob" : "mediumtext";
377+
return MADB_FIELD_IS_BINARY(Field) ? "mediumblob" : "mediumtext";
377378
case MYSQL_TYPE_LONG_BLOB:
378-
return (Field.flags & BINARY_FLAG) ? "longblob" : "longtext";
379+
return MADB_FIELD_IS_BINARY(Field) ? "longblob" : "longtext";
379380
case MYSQL_TYPE_BLOB:
380-
return (Field.flags & BINARY_FLAG) ? "blob" : "text";
381+
return MADB_FIELD_IS_BINARY(Field) ? "blob" : "text";
381382
case MYSQL_TYPE_STRING:
382-
return (Field.flags & BINARY_FLAG) ? "binary" : "char";
383+
return MADB_FIELD_IS_BINARY(Field) ? "binary" : "char";
383384
case MYSQL_TYPE_GEOMETRY:
384385
return "geometry";
385386
default:
@@ -467,8 +468,7 @@ size_t MADB_GetDataSize(MADB_DescRecord *Record, MYSQL_FIELD Field, CHARSET_INFO
467468
return Field.length;
468469
default:
469470
{
470-
if (Field.flags & BINARY_FLAG || Field.charsetnr == BINARY_CHARSETNR
471-
|| charset == NULL || charset->char_maxlen < 2/*i.e.0||1*/)
471+
if (MADB_FIELD_IS_BINARY(Field) || charset == NULL || charset->char_maxlen < 2/*i.e.0||1*/)
472472
{
473473
return Field.length;
474474
}
@@ -526,7 +526,7 @@ size_t MADB_GetDisplaySize(MYSQL_FIELD Field, CHARSET_INFO *charset)
526526
case MYSQL_TYPE_VARCHAR:
527527
case MYSQL_TYPE_VAR_STRING:
528528
{
529-
if (Field.flags & BINARY_FLAG || Field.charsetnr == BINARY_CHARSETNR)
529+
if (MADB_FIELD_IS_BINARY(Field))
530530
{
531531
return Field.length*2; /* ODBC specs says we should give 2 characters per byte to display binaray data in hex form */
532532
}
@@ -688,13 +688,13 @@ SQLSMALLINT MADB_GetODBCType(MYSQL_FIELD *field)
688688
case MYSQL_TYPE_BLOB:
689689
case MYSQL_TYPE_MEDIUM_BLOB:
690690
case MYSQL_TYPE_LONG_BLOB:
691-
return field->flags & BINARY_FLAG ? SQL_LONGVARBINARY : SQL_LONGVARCHAR;
691+
return MADB_FIELD_IS_BINARY(*field) ? SQL_LONGVARBINARY : SQL_LONGVARCHAR;
692692
case MYSQL_TYPE_LONGLONG:
693693
return SQL_BIGINT;
694-
case MYSQL_TYPE_STRING:
695-
return field->flags & BINARY_FLAG ? SQL_BINARY : SQL_CHAR;
694+
case MYSQL_TYPE_STRING:
695+
return MADB_FIELD_IS_BINARY(*field) ? SQL_BINARY : SQL_CHAR;
696696
case MYSQL_TYPE_VAR_STRING:
697-
return field->flags & BINARY_FLAG ? SQL_VARBINARY : SQL_VARCHAR;
697+
return MADB_FIELD_IS_BINARY(*field) ? SQL_VARBINARY : SQL_VARCHAR;
698698
case MYSQL_TYPE_SET:
699699
case MYSQL_TYPE_ENUM:
700700
return SQL_CHAR;

test/info.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ MA_ODBC_TESTS my_tests[]=
584584
{ t_bug30626, "t_bug30626", NORMAL },
585585
{ t_bug43855, "t_bug43855", NORMAL },
586586
{ t_bug46910, "t_bug46910", NORMAL },
587-
{ t_bug11749093, "t_bug11749093", TO_FIX },
587+
{ t_bug11749093, "t_bug11749093", NORMAL },
588588
{ bug_odbc15, "odbc15", NORMAL },
589589
{ test_need_long_data_len, "test_need_long_data_len", NORMAL },
590590
{ t_odbc61, "odbc61_SQL_FILE_USAGE", NORMAL },

test/result2.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,28 @@ ODBC_TEST(t_odbc78)
11041104
}
11051105

11061106

1107+
ODBC_TEST(t_odbc73)
1108+
{
1109+
SQLSMALLINT data_type;
1110+
1111+
OK_SIMPLE_STMT(Stmt, "DROP table if exists t_odbc73");
1112+
1113+
OK_SIMPLE_STMT(Stmt, "CREATE TABLE t_odbc73 (binvc VARCHAR(64) COLLATE utf8_bin)");
1114+
1115+
OK_SIMPLE_STMT(Stmt, "SELECT binvc FROM t_odbc73");
1116+
1117+
CHECK_STMT_RC(Stmt, SQLDescribeCol(Stmt, 1, NULL, 0, NULL, &data_type, NULL, NULL, NULL));
1118+
1119+
FAIL_IF(data_type == SQL_VARBINARY || data_type == SQL_BINARY || data_type == SQL_LONGVARBINARY,
1120+
"The field shouldn't be described as binary");
1121+
1122+
CHECK_STMT_RC(Stmt, SQLFreeStmt(Stmt, SQL_CLOSE));
1123+
1124+
OK_SIMPLE_STMT(Stmt, "DROP table if exists t_odbc73");
1125+
1126+
return OK;
1127+
}
1128+
11071129
MA_ODBC_TESTS my_tests[]=
11081130
{
11091131
{t_bug32420, "t_bug32420"},
@@ -1127,6 +1149,7 @@ MA_ODBC_TESTS my_tests[]=
11271149
{t_odbc58, "t_odbc-58-numeric_after_blob"},
11281150
{t_odbc77, "t_odbc-77-analyze_table"},
11291151
{t_odbc78, "t_odbc-78-sql_no_data"},
1152+
{t_odbc73, "t_odbc-73-bin_collation"},
11301153
{NULL, NULL}
11311154
};
11321155

0 commit comments

Comments
 (0)