From e64ef42356765fb90df47cfd4e10171082cd9b9f Mon Sep 17 00:00:00 2001 From: Pawel Aleksander Fedorynski Date: Sun, 1 Jul 2012 13:33:00 -0700 Subject: [PATCH] Fixing a BIGINT UNSIGNED bug. 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. --- src/backends/mysql/standard-into-type.cpp | 6 +++++ src/backends/mysql/statement.cpp | 5 +++-- src/backends/mysql/test/test-mysql.cpp | 27 +++++++++++++++++++---- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/backends/mysql/standard-into-type.cpp b/src/backends/mysql/standard-into-type.cpp index c74b16f90..2752ee8a7 100644 --- a/src/backends/mysql/standard-into-type.cpp +++ b/src/backends/mysql/standard-into-type.cpp @@ -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(data_); + parse_num(buf, *dest); + } case x_double: { double *dest = static_cast(data_); diff --git a/src/backends/mysql/statement.cpp b/src/backends/mysql/statement.cpp index 71f0ec3fd..5f5d5facd 100644 --- a/src/backends/mysql/statement.cpp +++ b/src/backends/mysql/statement.cpp @@ -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: diff --git a/src/backends/mysql/test/test-mysql.cpp b/src/backends/mysql/test/test-mysql.cpp index f206835e2..e54d2c917 100644 --- a/src/backends/mysql/test/test-mysql.cpp +++ b/src/backends/mysql/test/test-mysql.cpp @@ -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); @@ -167,7 +176,7 @@ void test3() { session sql(backEnd, connectString); - longlong_table_creator tableCreator(sql); + bigint_table_creator tableCreator(sql); std::vector v1; v1.push_back(1000000000000LL); @@ -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; }