SQLSMALLINT get_sql_data_type()

in driver/utility.cc [929:1159]


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 the wide type only if driver is unicode and field charset
    // is multibyte.
    return field_is_binary ? SQL_BINARY :
      (stmt->dbc->unicode ? 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 && get_charset_maxlen(field->charsetnr) > 1 ?
       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 && get_charset_maxlen(field->charsetnr) > 1 ?
       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 && get_charset_maxlen(field->charsetnr) > 1 ?
       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 && get_charset_maxlen(field->charsetnr) > 1 ?
       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 && get_charset_maxlen(field->charsetnr) > 1 ?
       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;

  case MYSQL_TYPE_VECTOR:
    if (buff)
      (void)myodbc_stpmov(buff, "vector");
    return SQL_VARBINARY;
  }

  if (buff)
    *buff= '\0';
  return SQL_UNKNOWN_TYPE;
}