From dd22022e1b0b1fc9538ae4374477bc2fde00cb85 Mon Sep 17 00:00:00 2001 From: Israel Lins Date: Mon, 11 Feb 2013 16:13:24 -0300 Subject: ODBC: fix loss of milliseconds when binding QDateTime Caused by operator precedence error. Follow-up to commit b8b79a0f37ec74fd5b4ad829e522a384ba3622ae Task-number: QTBUG-2192 Change-Id: I17decd18c469b48a0bc938ae05c16cced8042219 Reviewed-by: Mark Brand (cherry-picked from qtbase commit 36b6d4afc970a328cced87af3d39b70d327eb3ad) Reviewed-by: Andy Shaw --- src/sql/drivers/odbc/qsql_odbc.cpp | 2 +- tests/auto/qsqlquery/tst_qsqlquery.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/sql/drivers/odbc/qsql_odbc.cpp b/src/sql/drivers/odbc/qsql_odbc.cpp index c51637c3dd..f95f40c103 100644 --- a/src/sql/drivers/odbc/qsql_odbc.cpp +++ b/src/sql/drivers/odbc/qsql_odbc.cpp @@ -1413,7 +1413,7 @@ bool QODBCResult::exec() // (How many leading digits do we want to keep? With SQL Server 2005, this should be 3: 123000000) int keep = (int)qPow(10.0, 9 - qMin(9, precision)); - dt->fraction /= keep * keep; + dt->fraction = (dt->fraction / keep) * keep; } r = SQLBindParameter(d->hStmt, diff --git a/tests/auto/qsqlquery/tst_qsqlquery.cpp b/tests/auto/qsqlquery/tst_qsqlquery.cpp index 5ebbc3bf23..27c28b1f8b 100644 --- a/tests/auto/qsqlquery/tst_qsqlquery.cpp +++ b/tests/auto/qsqlquery/tst_qsqlquery.cpp @@ -3294,14 +3294,19 @@ void tst_QSqlQuery::QTBUG_2192() QSqlQuery q(db); QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (dt DATETIME)")); + QDateTime dt = QDateTime(QDate(2012, 7, 4), QTime(23, 59, 59, 999)); QVERIFY_SQL(q, prepare("INSERT INTO " + tableName + " (dt) VALUES (?)")); - q.bindValue(0, QVariant(QDateTime(QDate(2012, 7, 4), QTime(23, 59, 59, 999)))); + q.bindValue(0, dt); QVERIFY_SQL(q, exec()); - // Check if value was stored with at least second precision. QVERIFY_SQL(q, exec("SELECT dt FROM " + tableName)); QVERIFY_SQL(q, next()); - QVERIFY(q.value(0).toDateTime().msecsTo(QDateTime(QDate(2012, 7, 4), QTime(23, 59, 59, 999))) < 1000 ); + + // Check if retrieved value preserves reported precision + int precision = qMax(0, q.record().field("dt").precision()); + int diff = qAbs(q.value(0).toDateTime().msecsTo(dt)); + int keep = qMin(1000, (int)qPow(10.0, precision)); + QVERIFY(diff <= 1000 - keep); } } -- cgit v1.2.3