in driver/utility.cc [1400:1497]
SQLLEN get_transfer_octet_length(STMT *stmt, MYSQL_FIELD *field)
{
int capint32= stmt->dbc->ds.opt_COLUMN_SIZE_S32 ? 1 : 0;
SQLLEN length;
/* cap at INT_MAX32 due to signed value */
if (field->length > INT_MAX32)
length= INT_MAX32;
else
length= field->length;
switch (field->type) {
case MYSQL_TYPE_TINY:
return 1;
case MYSQL_TYPE_SHORT:
return 2;
case MYSQL_TYPE_INT24:
return 3;
case MYSQL_TYPE_LONG:
return 4;
case MYSQL_TYPE_FLOAT:
return 4;
case MYSQL_TYPE_DOUBLE:
return 8;
case MYSQL_TYPE_NULL:
return 1;
case MYSQL_TYPE_LONGLONG:
return 20;
case MYSQL_TYPE_DATE:
return sizeof(SQL_DATE_STRUCT);
case MYSQL_TYPE_TIME:
return sizeof(SQL_TIME_STRUCT);
case MYSQL_TYPE_TIMESTAMP:
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_NEWDATE:
return sizeof(SQL_TIMESTAMP_STRUCT);
case MYSQL_TYPE_YEAR:
return 1;
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 length is (bits + 7) / 8. field->length has
the number of bits.
*/
return (field->length + 7) / 8;
case MYSQL_TYPE_STRING:
if (stmt->dbc->ds.opt_PAD_SPACE)
{
unsigned int csmaxlen = get_charset_maxlen(field->charsetnr);
if (!csmaxlen)
return SQL_NO_TOTAL;
/*
We need to find out the real length using the database length and
the current mode (ANSI or UNICODE)
*/
length= (field->max_length > field->length ? field->max_length : field->length) / csmaxlen;
return length;
}
/* FALLTHROUGH */
case MYSQL_TYPE_ENUM:
case MYSQL_TYPE_SET:
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_TINY_BLOB:
case MYSQL_TYPE_MEDIUM_BLOB:
case MYSQL_TYPE_LONG_BLOB:
case MYSQL_TYPE_BLOB:
case MYSQL_TYPE_GEOMETRY:
case MYSQL_TYPE_JSON:
{
if (capint32 && length > INT_MAX32)
length= INT_MAX32;
return length;
case MYSQL_TYPE_VECTOR:
return length;
}
}
return SQL_NO_TOTAL;
}