in driver/my_prepared_stmt.cc [1411:1524]
T ssps_get_int64(STMT *stmt, ulong column_number, char *value, ulong length)
{
MYSQL_BIND *col_rbind= &stmt->result_bind[column_number];
switch (col_rbind->buffer_type)
{
case MYSQL_TYPE_FLOAT:
case MYSQL_TYPE_DOUBLE:
return (T)ssps_get_double(stmt, column_number, value, length);
case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_NEWDECIMAL:
case MYSQL_TYPE_TIMESTAMP:
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_DATE:
case MYSQL_TYPE_TIME:
case MYSQL_TYPE_STRING:
case MYSQL_TYPE_BLOB:
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_VAR_STRING:
{
char buf[30];
return strtoll(ssps_get_string(stmt, column_number, value, &length, buf),
NULL, 10);
}
case MYSQL_TYPE_BIT:
{
/* This length is in bytes, on the contrary to what can be seen in mysql_resultset.cpp where the Meta is used */
return binary2numeric<T>((char*)col_rbind->buffer, (uint64)(*col_rbind->length));
}
case MYSQL_TYPE_YEAR: // fetched as a SMALLINT
case MYSQL_TYPE_TINY:
case MYSQL_TYPE_SHORT:
case MYSQL_TYPE_INT24:
case MYSQL_TYPE_LONG:
case MYSQL_TYPE_LONGLONG:
{
// MYSQL_TYPE_YEAR is fetched as a SMALLINT, thus should not be in the switch
T ret;
BOOL is_it_null = *col_rbind->is_null != 0;
BOOL is_it_unsigned = col_rbind->is_unsigned != 0;
switch (col_rbind->buffer_length)
{
case 1:
if (is_it_unsigned)
{
ret = !is_it_null? ((char *)col_rbind->buffer)[0]:0;
}
else
{
ret = !is_it_null? *(char *)(col_rbind->buffer):0;
}
break;
case 2:
if (is_it_unsigned)
{
ret = !is_it_null? *(unsigned short *)(col_rbind->buffer):0;
}
else
{
ret = !is_it_null? *(short *)(col_rbind->buffer):0;
}
break;
case 4:
if (is_it_unsigned)
{
ret = !is_it_null? *(unsigned int *)(col_rbind->buffer):0;
}
else
{
ret = !is_it_null? *(int *)(col_rbind->buffer):0;
}
break;
case 8:
if (is_it_unsigned)
{
ret = !is_it_null? *(unsigned long long *)col_rbind->buffer:0;
#if WE_WANT_TO_SEE_MORE_FAILURES_IN_UNIT_RESULTSET
if (cutTooBig &&
ret &&
*(unsigned long long *)(col_rbind->buffer) > UL64(9223372036854775807))
{
ret = UL64(9223372036854775807);
}
#endif
}
else
{
ret = !is_it_null? *(long long *)(col_rbind->buffer):0;
}
break;
default:
return 0;
}
return ret;
}
default:
break;/* Basically should be prevented by earlier tests of
conversion possibility */
/* TODO : Geometry? default ? */
}
return 0; // fool compilers
}