SQLLEN get_display_size()

in driver/utility.cc [1509:1601]


SQLLEN get_display_size(STMT *stmt __attribute__((unused)),MYSQL_FIELD *field)
{
  int capint32 = stmt->dbc->ds.opt_COLUMN_SIZE_S32 ? 1 : 0;
  unsigned int mbmaxlen = get_charset_maxlen(field->charsetnr);

  switch (field->type) {
  case MYSQL_TYPE_TINY:
    return 3 + (field->flags & UNSIGNED_FLAG ? 1 : 0);

  case MYSQL_TYPE_SHORT:
    return 5 + (field->flags & UNSIGNED_FLAG ? 1 : 0);

  case MYSQL_TYPE_INT24:
    return 8 + (field->flags & UNSIGNED_FLAG ? 1 : 0);

  case MYSQL_TYPE_LONG:
    return 10 + (field->flags & UNSIGNED_FLAG ? 1 : 0);

  case MYSQL_TYPE_FLOAT:
    return 14;

  case MYSQL_TYPE_DOUBLE:
    return 24;

  case MYSQL_TYPE_NULL:
    return 1;

  case MYSQL_TYPE_LONGLONG:
    return 20;

  case MYSQL_TYPE_DATE:
    return 10;

  case MYSQL_TYPE_TIME:
    return 8;

  case MYSQL_TYPE_TIMESTAMP:
  case MYSQL_TYPE_DATETIME:
  case MYSQL_TYPE_NEWDATE:
    return 19;

  case MYSQL_TYPE_YEAR:
    return 4;

  case MYSQL_TYPE_DECIMAL:
  case MYSQL_TYPE_NEWDECIMAL:
    return field->length;

  case MYSQL_TYPE_BIT:
    /*
      We treat a BIT(n) as a SQL_BIT if n == 1, otherwise we treat it
      as a SQL_BINARY, so display length is (bits + 7) / 8 * 2.
      field->length has the number of bits.
    */
    if (field->length == 1)
      return 1;
    return (field->length + 7) / 8 * 2;

  case MYSQL_TYPE_TINY_BLOB:
  case MYSQL_TYPE_MEDIUM_BLOB:
  case MYSQL_TYPE_LONG_BLOB:
  case MYSQL_TYPE_BLOB:
    // For these types the storage is in bytes and it is fixed,
    // not specified by the user.
    // The driver must give the maximum possible display size.
    mbmaxlen = 1;
    // Fall through

  case MYSQL_TYPE_ENUM:
  case MYSQL_TYPE_SET:
  case MYSQL_TYPE_VARCHAR:
  case MYSQL_TYPE_VAR_STRING:
  case MYSQL_TYPE_STRING:
  case MYSQL_TYPE_GEOMETRY:
    {
      unsigned long length;
      if (field->charsetnr == BINARY_CHARSET_NUMBER)
        length= field->length * 2;
      else
        length= field->length / mbmaxlen;

      if (capint32 && length > INT_MAX32)
        length= INT_MAX32;
      return length;
    }
  case MYSQL_TYPE_JSON:
    return UINT_MAX32 / 4; // 4 is the character size in UTF8MB4
  case MYSQL_TYPE_VECTOR:
    return 15 * (field->length / 4) + 1;
  }

  return SQL_NO_TOTAL;
}