From a7e35f0de356e010d4e5f5c6c6cef79fca02dc24 Mon Sep 17 00:00:00 2001 From: Steven Murray <Steven.Murray@cern.ch> Date: Wed, 25 Sep 2019 15:25:21 +0200 Subject: [PATCH] Fixed bug in MysqlStmt::bindOptionalUint64() where a uint64 was treated as a double --- rdbms/StmtTest.cpp | 38 +++++++++++++++++++++++++++++++++++++ rdbms/wrapper/MysqlStmt.cpp | 4 ++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/rdbms/StmtTest.cpp b/rdbms/StmtTest.cpp index 4aef36d0ce..c48a794dbf 100644 --- a/rdbms/StmtTest.cpp +++ b/rdbms/StmtTest.cpp @@ -231,6 +231,44 @@ TEST_P(cta_rdbms_StmtTest, insert_with_bindUint64_2_pow_64_minus_1) { } } +TEST_P(cta_rdbms_StmtTest, insert_with_bindUint64_2_pow_64_minus_2) { + using namespace cta::rdbms; + + const uint64_t insertValue = 18446744073709551614U; + + // Insert a row into the test table + { + const char *const sql = + "INSERT INTO STMT_TEST(" + "UINT64_COL) " + "VALUES(" + ":UINT64_COL)"; + auto stmt = m_conn.createStmt(sql); + stmt.bindUint64(":UINT64_COL", insertValue); + stmt.executeNonQuery(); + } + + // Select the row back from the table + { + const char *const sql = + "SELECT " + "UINT64_COL AS UINT64_COL " + "FROM " + "STMT_TEST"; + auto stmt = m_conn.createStmt(sql); + auto rset = stmt.executeQuery(); + ASSERT_TRUE(rset.next()); + + const auto selectValue = rset.columnOptionalUint64("UINT64_COL"); + + ASSERT_TRUE((bool)selectValue); + + ASSERT_EQ(insertValue,selectValue.value()); + + ASSERT_FALSE(rset.next()); + } +} + TEST_P(cta_rdbms_StmtTest, insert_with_bindString) { using namespace cta::rdbms; diff --git a/rdbms/wrapper/MysqlStmt.cpp b/rdbms/wrapper/MysqlStmt.cpp index 85787bcf2f..31c713947f 100644 --- a/rdbms/wrapper/MysqlStmt.cpp +++ b/rdbms/wrapper/MysqlStmt.cpp @@ -189,14 +189,14 @@ void MysqlStmt::bindOptionalUint64(const std::string ¶mName, const optional< const unsigned int paramIdx = getParamIdx(paramName); // starts from 1. const unsigned int idx = paramIdx - 1; - Mysql::Placeholder_Double* holder = dynamic_cast<Mysql::Placeholder_Double*>(m_placeholder[idx]); + Mysql::Placeholder_Uint64* holder = dynamic_cast<Mysql::Placeholder_Uint64*>(m_placeholder[idx]); // if already exists, try to reuse if (!holder and m_placeholder[idx]) { throw exception::Exception(std::string(__FUNCTION__) + " can't cast from Placeholder to Placeholder_Uint64. " ); } if (!holder) { - holder = new Mysql::Placeholder_Double(); + holder = new Mysql::Placeholder_Uint64(); holder->idx = idx; holder->length = sizeof(uint64_t); } -- GitLab