Skip to content

Commit

Permalink
Fixing a BIGINT UNSIGNED bug.
Browse files Browse the repository at this point in the history
Also, previously INT UNSIGNED was converted to dt_long_long.  It seems that
dt_unsigned_long is a better match so I'm changing it.
  • Loading branch information
Pawel Aleksander Fedorynski committed Jul 1, 2012
1 parent 6f5d8ea commit e64ef42
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 6 deletions.
6 changes: 6 additions & 0 deletions src/backends/mysql/standard-into-type.cpp
Expand Up @@ -115,6 +115,12 @@ void mysql_standard_into_type_backend::post_fetch(
parse_num(buf, *dest);
}
break;
case x_unsigned_long_long:
{
unsigned long long *dest =
static_cast<unsigned long long*>(data_);
parse_num(buf, *dest);
}
case x_double:
{
double *dest = static_cast<double*>(data_);
Expand Down
5 changes: 3 additions & 2 deletions src/backends/mysql/statement.cpp
Expand Up @@ -380,10 +380,11 @@ void mysql_statement_backend::describe_column(int colNum,
type = dt_integer;
break;
case FIELD_TYPE_LONG: //MYSQL_TYPE_LONG:
type = field->flags & UNSIGNED_FLAG ? dt_long_long : dt_integer;
type = field->flags & UNSIGNED_FLAG ? dt_unsigned_long : dt_integer;
break;
case FIELD_TYPE_LONGLONG: //MYSQL_TYPE_LONGLONG:
type = dt_long_long;
type = field->flags & UNSIGNED_FLAG ? dt_unsigned_long_long :
dt_long_long;
break;
case FIELD_TYPE_FLOAT: //MYSQL_TYPE_FLOAT:
case FIELD_TYPE_DOUBLE: //MYSQL_TYPE_DOUBLE:
Expand Down
27 changes: 23 additions & 4 deletions src/backends/mysql/test/test-mysql.cpp
Expand Up @@ -135,22 +135,31 @@ void test2()
std::cout << "test 2 passed" << std::endl;
}

struct longlong_table_creator : table_creator_base
struct bigint_table_creator : table_creator_base
{
longlong_table_creator(session & sql)
bigint_table_creator(session & sql)
: table_creator_base(sql)
{
sql << "create table soci_test(val bigint)";
}
};

struct bigint_unsigned_table_creator : table_creator_base
{
bigint_unsigned_table_creator(session & sql)
: table_creator_base(sql)
{
sql << "create table soci_test(val bigint unsigned)";
}
};

// long long test
void test3()
{
{
session sql(backEnd, connectString);

longlong_table_creator tableCreator(sql);
bigint_table_creator tableCreator(sql);

long long v1 = 1000000000000LL;
assert(v1 / 1000000 == 1000000);
Expand All @@ -167,7 +176,7 @@ void test3()
{
session sql(backEnd, connectString);

longlong_table_creator tableCreator(sql);
bigint_table_creator tableCreator(sql);

std::vector<long long> v1;
v1.push_back(1000000000000LL);
Expand All @@ -189,6 +198,16 @@ void test3()
assert(v2[4] == 1000000000000LL);
}

{
session sql(backEnd, connectString);

bigint_unsigned_table_creator tableCreator(sql);

sql << "insert into soci_test set val = 18446744073709551615";
row v;
sql << "select * from soci_test", into(v);
}

std::cout << "test 3 passed" << std::endl;
}

Expand Down

0 comments on commit e64ef42

Please sign in to comment.