in driver/utility.cc [1155:1379]
SQLSMALLINT get_sql_data_type(STMT *stmt, MYSQL_FIELD *field, char *buff)
{
my_bool field_is_binary= (field->charsetnr == BINARY_CHARSET_NUMBER ? 1 : 0) &&
((field->org_table_length > 0 ? 1 : 0) ||
!stmt->dbc->ds->opt_NO_BINARY_RESULT);
switch (field->type) {
case MYSQL_TYPE_BIT:
if (buff)
(void)myodbc_stpmov(buff, "bit");
/*
MySQL's BIT type can have more than one bit, in which case we treat
it as a BINARY field.
*/
return (field->length > 1) ? SQL_BINARY : SQL_BIT;
case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_NEWDECIMAL:
if (buff)
(void)myodbc_stpmov(buff, "decimal");
return SQL_DECIMAL;
case MYSQL_TYPE_TINY:
/* MYSQL_TYPE_TINY could either be a TINYINT or a single CHAR. */
if (buff)
{
buff= myodbc_stpmov(buff, (field->flags & NUM_FLAG) ? "tinyint" : "char");
if (field->flags & UNSIGNED_FLAG)
(void)myodbc_stpmov(buff, " unsigned");
}
return (field->flags & NUM_FLAG) ? SQL_TINYINT : SQL_CHAR;
case MYSQL_TYPE_SHORT:
if (buff)
{
buff= myodbc_stpmov(buff, "smallint");
if (field->flags & UNSIGNED_FLAG)
(void)myodbc_stpmov(buff, " unsigned");
}
return SQL_SMALLINT;
case MYSQL_TYPE_INT24:
if (buff)
{
buff= myodbc_stpmov(buff, "mediumint");
if (field->flags & UNSIGNED_FLAG)
(void)myodbc_stpmov(buff, " unsigned");
}
return SQL_INTEGER;
case MYSQL_TYPE_LONG:
if (buff)
{
buff= myodbc_stpmov(buff, "integer");
if (field->flags & UNSIGNED_FLAG)
(void)myodbc_stpmov(buff, " unsigned");
}
return SQL_INTEGER;
case MYSQL_TYPE_LONGLONG:
if (buff)
{
if (stmt->dbc->ds->opt_NO_BIGINT)
buff= myodbc_stpmov(buff, "int");
else
buff= myodbc_stpmov(buff, "bigint");
if (field->flags & UNSIGNED_FLAG)
(void)myodbc_stpmov(buff, " unsigned");
}
if (stmt->dbc->ds->opt_NO_BIGINT)
return SQL_INTEGER;
return SQL_BIGINT;
case MYSQL_TYPE_FLOAT:
if (buff)
{
buff= myodbc_stpmov(buff, "float");
if (field->flags & UNSIGNED_FLAG)
(void)myodbc_stpmov(buff, " unsigned");
}
return SQL_REAL;
case MYSQL_TYPE_DOUBLE:
if (buff)
{
buff= myodbc_stpmov(buff, "double");
if (field->flags & UNSIGNED_FLAG)
(void)myodbc_stpmov(buff, " unsigned");
}
return SQL_DOUBLE;
case MYSQL_TYPE_NULL:
if (buff)
(void)myodbc_stpmov(buff, "null");
return SQL_VARCHAR;
case MYSQL_TYPE_YEAR:
if (buff)
(void)myodbc_stpmov(buff, "year");
return SQL_SMALLINT;
case MYSQL_TYPE_TIMESTAMP:
if (buff)
(void)myodbc_stpmov(buff, "timestamp");
if (stmt->dbc->env->odbc_ver == SQL_OV_ODBC3)
return SQL_TYPE_TIMESTAMP;
return SQL_TIMESTAMP;
case MYSQL_TYPE_DATETIME:
if (buff)
(void)myodbc_stpmov(buff, "datetime");
if (stmt->dbc->env->odbc_ver == SQL_OV_ODBC3)
return SQL_TYPE_TIMESTAMP;
return SQL_TIMESTAMP;
case MYSQL_TYPE_NEWDATE:
case MYSQL_TYPE_DATE:
if (buff)
(void)myodbc_stpmov(buff, "date");
if (stmt->dbc->env->odbc_ver == SQL_OV_ODBC3)
return SQL_TYPE_DATE;
return SQL_DATE;
case MYSQL_TYPE_TIME:
if (buff)
(void)myodbc_stpmov(buff, "time");
if (stmt->dbc->env->odbc_ver == SQL_OV_ODBC3)
return SQL_TYPE_TIME;
return SQL_TIME;
case MYSQL_TYPE_STRING:
if (buff)
(void)myodbc_stpmov(buff, field_is_binary ? "binary" : "char");
return field_is_binary ? SQL_BINARY :
(stmt->dbc->unicode && field->charsetnr != stmt->dbc->ansi_charset_info->number ?
SQL_WCHAR : SQL_CHAR);
/*
MYSQL_TYPE_VARCHAR is never actually sent, this just silences
a compiler warning.
*/
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_VAR_STRING:
if (buff)
(void)myodbc_stpmov(buff, field_is_binary ? "varbinary" : "varchar");
return field_is_binary ? SQL_VARBINARY :
(stmt->dbc->unicode && field->charsetnr != stmt->dbc->ansi_charset_info->number ?
SQL_WVARCHAR : SQL_VARCHAR);
case MYSQL_TYPE_TINY_BLOB:
if (buff)
(void)myodbc_stpmov(buff, field_is_binary ? "tinyblob" : "tinytext");
return field_is_binary ? SQL_LONGVARBINARY :
(stmt->dbc->unicode && field->charsetnr != stmt->dbc->ansi_charset_info->number ?
SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_BLOB:
if (buff)
{
switch(field->length)
{
case 255:
(void)myodbc_stpmov(buff, field_is_binary ? "tinyblob" : "tinytext");
break;
case 16777215:
(void)myodbc_stpmov(buff, field_is_binary ? "mediumblob" : "mediumtext");
break;
case 4294967295UL:
(void)myodbc_stpmov(buff, field_is_binary ? "longblob" : "longtext");
break;
default:
(void)myodbc_stpmov(buff, field_is_binary ? "blob" : "text");
}
}
return field_is_binary ? SQL_LONGVARBINARY :
(stmt->dbc->unicode && field->charsetnr != stmt->dbc->ansi_charset_info->number ?
SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_MEDIUM_BLOB:
if (buff)
(void)myodbc_stpmov(buff, field_is_binary ? "mediumblob" : "mediumtext");
return field_is_binary ? SQL_LONGVARBINARY :
(stmt->dbc->unicode && field->charsetnr != stmt->dbc->ansi_charset_info->number ?
SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_LONG_BLOB:
if (buff)
(void)myodbc_stpmov(buff, field_is_binary ? "longblob" : "longtext");
return field_is_binary ? SQL_LONGVARBINARY :
(stmt->dbc->unicode && field->charsetnr != stmt->dbc->ansi_charset_info->number ?
SQL_WLONGVARCHAR : SQL_LONGVARCHAR);
case MYSQL_TYPE_ENUM:
if (buff)
(void)myodbc_stpmov(buff, "enum");
return SQL_CHAR;
case MYSQL_TYPE_SET:
if (buff)
(void)myodbc_stpmov(buff, "set");
return SQL_CHAR;
case MYSQL_TYPE_GEOMETRY:
if (buff)
(void)myodbc_stpmov(buff, "geometry");
return SQL_LONGVARBINARY;
case MYSQL_TYPE_JSON:
if (buff)
(void)myodbc_stpmov(buff, "json");
return stmt->dbc->unicode ? SQL_WLONGVARCHAR : SQL_LONGVARCHAR;
}
if (buff)
*buff= '\0';
return SQL_UNKNOWN_TYPE;
}