=== modified file 'driver/catalog.c' --- driver/catalog.c 2010-03-26 18:28:00 +0000 +++ driver/catalog.c 2010-04-07 10:30:52 +0000 @@ -261,11 +261,14 @@ MYSQL_FIELD SQLTABLES_fields[]= { - MYODBC_FIELD_STRING("TABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_NAME", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_TYPE", NAME_LEN, 0), - MYODBC_FIELD_STRING("REMARKS", NAME_LEN, 0), + MYODBC_FIELD_NAME("TABLE_CAT", 0), + MYODBC_FIELD_NAME("TABLE_SCHEM", 0), + MYODBC_FIELD_NAME("TABLE_NAME", 0), + MYODBC_FIELD_NAME("TABLE_TYPE", 0), +/* + Table remark length is 80 characters +*/ + MYODBC_FIELD_STRING("REMARKS", 80, 0), }; const uint SQLTABLES_FIELDS= array_elements(SQLTABLES_values); @@ -485,10 +488,10 @@ MYSQL_FIELD SQLCOLUMNS_fields[]= { - MYODBC_FIELD_STRING("TABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("COLUMN_NAME", NAME_LEN, NOT_NULL_FLAG), + MYODBC_FIELD_NAME("TABLE_CAT", 0), + MYODBC_FIELD_NAME("TABLE_SCHEM", 0), + MYODBC_FIELD_NAME("TABLE_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("COLUMN_NAME", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("DATA_TYPE", NOT_NULL_FLAG), MYODBC_FIELD_STRING("TYPE_NAME", 20, NOT_NULL_FLAG), MYODBC_FIELD_LONG("COLUMN_SIZE", 0), @@ -496,8 +499,8 @@ MYODBC_FIELD_SHORT("DECIMAL_DIGITS", 0), MYODBC_FIELD_SHORT("NUM_PREC_RADIX", 0), MYODBC_FIELD_SHORT("NULLABLE", NOT_NULL_FLAG), - MYODBC_FIELD_STRING("REMARKS", NAME_LEN, 0), - MYODBC_FIELD_STRING("COLUMN_DEF", NAME_LEN, 0), + MYODBC_FIELD_NAME("REMARKS", 0), + MYODBC_FIELD_NAME("COLUMN_DEF", 0), MYODBC_FIELD_SHORT("SQL_DATA_TYPE", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("SQL_DATETIME_SUB", 0), MYODBC_FIELD_LONG("CHAR_OCTET_LENGTH", 0), @@ -860,15 +863,15 @@ MYSQL_FIELD SQLSTAT_fields[]= { - MYODBC_FIELD_STRING("TABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_NAME", NAME_LEN, NOT_NULL_FLAG), + MYODBC_FIELD_NAME("TABLE_CAT", 0), + MYODBC_FIELD_NAME("TABLE_SCHEM", 0), + MYODBC_FIELD_NAME("TABLE_NAME", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("NON_UNIQUE", 0), - MYODBC_FIELD_STRING("INDEX_QUALIFIER", NAME_LEN, 0), - MYODBC_FIELD_STRING("INDEX_NAME", NAME_LEN, 0), + MYODBC_FIELD_NAME("INDEX_QUALIFIER", 0), + MYODBC_FIELD_NAME("INDEX_NAME", 0), MYODBC_FIELD_SHORT("TYPE", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("ORDINAL_POSITION", 0), - MYODBC_FIELD_STRING("COLUMN_NAME", NAME_LEN, 0), + MYODBC_FIELD_NAME("COLUMN_NAME", 0), MYODBC_FIELD_STRING("ASC_OR_DESC", 1, 0), MYODBC_FIELD_SHORT("CARDINALITY", 0), MYODBC_FIELD_SHORT("PAGES", 0), @@ -1076,13 +1079,13 @@ MYSQL_FIELD SQLTABLES_priv_fields[]= { - MYODBC_FIELD_STRING("TABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("GRANTOR", NAME_LEN, 0), - MYODBC_FIELD_STRING("GRANTEE", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("PRIVILEGE", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("IS_GRANTABLE", NAME_LEN, 0), + MYODBC_FIELD_NAME("TABLE_CAT", 0), + MYODBC_FIELD_NAME("TABLE_SCHEM", 0), + MYODBC_FIELD_NAME("TABLE_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("GRANTOR", 0), + MYODBC_FIELD_NAME("GRANTEE", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("PRIVILEGE", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("IS_GRANTABLE", 0), }; const uint SQLTABLES_PRIV_FIELDS= array_elements(SQLTABLES_priv_values); @@ -1218,14 +1221,14 @@ MYSQL_FIELD SQLCOLUMNS_priv_fields[]= { - MYODBC_FIELD_STRING("TABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("COLUMN_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("GRANTOR", NAME_LEN, 0), - MYODBC_FIELD_STRING("GRANTEE", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("PRIVILEGE", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("IS_GRANTABLE", NAME_LEN, 0), + MYODBC_FIELD_NAME("TABLE_CAT", 0), + MYODBC_FIELD_NAME("TABLE_SCHEM", 0), + MYODBC_FIELD_NAME("TABLE_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("COLUMN_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("GRANTOR", 0), + MYODBC_FIELD_NAME("GRANTEE", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("PRIVILEGE", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("IS_GRANTABLE", 0), }; @@ -1324,7 +1327,7 @@ MYSQL_FIELD SQLSPECIALCOLUMNS_fields[]= { MYODBC_FIELD_SHORT("SCOPE", 0), - MYODBC_FIELD_STRING("COLUMN_NAME", NAME_LEN, NOT_NULL_FLAG), + MYODBC_FIELD_NAME("COLUMN_NAME", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("DATA_TYPE", NOT_NULL_FLAG), MYODBC_FIELD_STRING("TYPE_NAME", 20, NOT_NULL_FLAG), MYODBC_FIELD_LONG("COLUMN_SIZE", 0), @@ -1532,10 +1535,10 @@ MYSQL_FIELD SQLPRIM_KEYS_fields[]= { - MYODBC_FIELD_STRING("TABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("TABLE_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("COLUMN_NAME", NAME_LEN, NOT_NULL_FLAG), + MYODBC_FIELD_NAME("TABLE_CAT", 0), + MYODBC_FIELD_NAME("TABLE_SCHEM", 0), + MYODBC_FIELD_NAME("TABLE_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("COLUMN_NAME", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("KEY_SEQ", NOT_NULL_FLAG), MYODBC_FIELD_STRING("PK_NAME", 128, 0), }; @@ -1623,19 +1626,19 @@ */ MYSQL_FIELD SQLFORE_KEYS_fields[]= { - MYODBC_FIELD_STRING("PKTABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("PKTABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("PKTABLE_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("PKCOLUMN_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("FKTABLE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("FKTABLE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("FKTABLE_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("FKCOLUMN_NAME", NAME_LEN, NOT_NULL_FLAG), + MYODBC_FIELD_NAME("PKTABLE_CAT", 0), + MYODBC_FIELD_NAME("PKTABLE_SCHEM", 0), + MYODBC_FIELD_NAME("PKTABLE_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("PKCOLUMN_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("FKTABLE_CAT", 0), + MYODBC_FIELD_NAME("FKTABLE_SCHEM", 0), + MYODBC_FIELD_NAME("FKTABLE_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("FKCOLUMN_NAME", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("KEY_SEQ", NOT_NULL_FLAG), MYODBC_FIELD_SHORT("UPDATE_RULE", 0), MYODBC_FIELD_SHORT("DELETE_RULE", 0), - MYODBC_FIELD_STRING("FK_NAME", NAME_LEN, 0), - MYODBC_FIELD_STRING("PK_NAME", NAME_LEN, 0), + MYODBC_FIELD_NAME("FK_NAME", 0), + MYODBC_FIELD_NAME("PK_NAME", 0), MYODBC_FIELD_SHORT("DEFERRABILITY", 0), }; @@ -2145,10 +2148,10 @@ MYSQL_FIELD SQLPROCEDURECOLUMNS_fields[]= { - MYODBC_FIELD_STRING("PROCEDURE_CAT", NAME_LEN, 0), - MYODBC_FIELD_STRING("PROCEDURE_SCHEM", NAME_LEN, 0), - MYODBC_FIELD_STRING("PROCEDURE_NAME", NAME_LEN, NOT_NULL_FLAG), - MYODBC_FIELD_STRING("COLUMN_NAME", NAME_LEN, NOT_NULL_FLAG), + MYODBC_FIELD_NAME("PROCEDURE_CAT", 0), + MYODBC_FIELD_NAME("PROCEDURE_SCHEM", 0), + MYODBC_FIELD_NAME("PROCEDURE_NAME", NOT_NULL_FLAG), + MYODBC_FIELD_NAME("COLUMN_NAME", NOT_NULL_FLAG), MYODBC_FIELD_SHORT ("COLUMN_TYPE", NOT_NULL_FLAG), MYODBC_FIELD_SHORT ("DATA_TYPE", NOT_NULL_FLAG), MYODBC_FIELD_STRING("TYPE_NAME", 20, NOT_NULL_FLAG), @@ -2157,8 +2160,8 @@ MYODBC_FIELD_SHORT ("DECIMAL_DIGITS", 0), MYODBC_FIELD_SHORT ("NUM_PREC_RADIX", 0), MYODBC_FIELD_SHORT ("NULLABLE", NOT_NULL_FLAG), - MYODBC_FIELD_STRING("REMARKS", NAME_LEN, 0), - MYODBC_FIELD_STRING("COLUMN_DEF", NAME_LEN, 0), + MYODBC_FIELD_NAME("REMARKS", 0), + MYODBC_FIELD_NAME("COLUMN_DEF", 0), MYODBC_FIELD_SHORT ("SQL_DATA_TYPE", NOT_NULL_FLAG), MYODBC_FIELD_SHORT ("SQL_DATETIME_SUB", 0), MYODBC_FIELD_LONG ("CHAR_OCTET_LENGTH", 0), === modified file 'driver/myutil.h' --- driver/myutil.h 2010-03-13 18:38:29 +0000 +++ driver/myutil.h 2010-04-07 13:59:08 +0000 @@ -84,8 +84,12 @@ #endif #if MYSQL_VERSION_ID >= 50100 +/* Same us MYODBC_FIELD_STRING(name, NAME_LEN, flags) */ +# define MYODBC_FIELD_NAME(name, flags) \ + {(name), (name), NullS, NullS, NullS, NullS, NullS, NAME_LEN, 0, 0, 0, 0, 0, 0, \ + 0, 0, (flags), 0, UTF8_CHARSET_NUMBER, MYSQL_TYPE_VAR_STRING, NULL} # define MYODBC_FIELD_STRING(name, len, flags) \ - {(name), (name), NullS, NullS, NullS, NullS, NullS, (len), 0, 0, 0, 0, 0, 0, \ + {(name), (name), NullS, NullS, NullS, NullS, NullS, (len*SYSTEM_CHARSET_MBMAXLEN), 0, 0, 0, 0, 0, 0, \ 0, 0, (flags), 0, UTF8_CHARSET_NUMBER, MYSQL_TYPE_VAR_STRING, NULL} # define MYODBC_FIELD_SHORT(name, flags) \ {(name), (name), NullS, NullS, NullS, NullS, NullS, 5, 5, 0, 0, 0, 0, 0, 0, \ @@ -94,6 +98,9 @@ {(name), (name), NullS, NullS, NullS, NullS, NullS, 11, 11, 0, 0, 0, 0, 0, \ 0, 0, (flags), 0, 0, MYSQL_TYPE_LONG, NULL} #elif MYSQL_VERSION_ID >= 40100 +# define MYODBC_FIELD_NAME(name, flags) \ +{(name), (name), NullS, NullS, NullS, NullS, NullS, NAME_LEN*3, 0, 0, 0, 0, 0, 0, \ + 0, 0, (flags), 0, UTF8_CHARSET_NUMBER, MYSQL_TYPE_VAR_STRING, NULL} /* we use 3 here as SYSTEM_CHARSET_MBMAXLEN is not defined in v5.0 mysql_com.h */ # define MYODBC_FIELD_STRING(name, len, flags) \ {(name), (name), NullS, NullS, NullS, NullS, NullS, (len) * 3, 0, 0, 0, 0, \ @@ -104,14 +111,6 @@ # define MYODBC_FIELD_LONG(name, flags) \ {(name), (name), NullS, NullS, NullS, NullS, NullS, 11, 11, 0, 0, 0, 0, 0, \ 0, 0, (flags), 0, 0, MYSQL_TYPE_LONG} -#else -# define MYODBC_FIELD_STRING(name, len, flags) \ - {(name), NullS, NullS, NullS, NullS, (len), 0, (flags), 0, \ - MYSQL_TYPE_VAR_STRING} -# define MYODBC_FIELD_SHORT(name, flags) \ - {(name), NullS, NullS, NullS, NullS, 5, 5, (flags), 0, MYSQL_TYPE_SHORT} -# define MYODBC_FIELD_LONG(name, flags) \ - {(name), NullS, NullS, NullS, NullS, 11, 11, (flags), 0, MYSQL_TYPE_LONG} #endif /* === modified file 'test/my_catalog.c' --- test/my_catalog.c 2010-01-31 00:29:06 +0000 +++ test/my_catalog.c 2010-04-06 18:07:37 +0000 @@ -1443,6 +1443,40 @@ } +/* + Bug #37621 - SQLDescribeCol returns incorrect values of SQLTables data +*/ +DECLARE_TEST(t_bug37621) +{ + SQLCHAR buf[50], szColName[128]; + SQLSMALLINT iName, iType, iScale, iNullable; + SQLUINTEGER uiDef; + + ok_sql(hstmt, "drop table if exists t_bug37621"); + ok_sql(hstmt, "create table t_bug37621 (x int)"); + ok_stmt(hstmt, SQLTables(hstmt, NULL, 0, NULL, 0, + (SQLCHAR *)"t_bug37621", SQL_NTS, NULL, 0)); +/* + Check column properties for the REMARKS column +*/ + ok_stmt(hstmt, SQLDescribeCol(hstmt, 5, szColName, sizeof(szColName), + &iName, &iType, &uiDef, &iScale, &iNullable)); + + is_str(szColName, "REMARKS", 7); + is_num(iName, 7); + if (iType != SQL_VARCHAR && iType != SQL_WVARCHAR) + return FAIL; + is_num(uiDef, 80); + is_num(iScale, 0); + is_num(iNullable, 1); + + ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE)); + ok_sql(hstmt, "drop table if exists t_bug37621"); + + return OK; +} + + BEGIN_TESTS ADD_TEST(my_columns_null) ADD_TEST(my_drop_table) @@ -1473,6 +1507,7 @@ ADD_TEST(t_bug30770) ADD_TEST(t_bug36275) ADD_TEST(t_bug39957) + ADD_TEST(t_bug37621) END_TESTS