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 &paramName, 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