diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2018-02-07 20:12:33 +0100 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2018-03-07 18:35:57 +0000 |
commit | 3185b40d5de1092ed2bdd83f72478a344c5fc9e9 (patch) | |
tree | 044e6b8d3182b13b94529f2a62dabdb6f98a93d5 /tests/auto/sql | |
parent | 70cfe551b285b4a3e770aabbca8f8bdcfadffb09 (diff) |
SQL/Postgres: Fix support for nan, inf and -inf
Postgresql needs a special value for nan and +/- inf. This was
considered during insert but not during select.
Also remove some pre-c++11 inf/nan - handling and replace it with
Qt equivalents.
Change-Id: I044ca58e9cf673f4b100b05a0d8e25c8a9c29ec5
Reviewed-by: Robert Szefner <robertsz27@interia.pl>
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Diffstat (limited to 'tests/auto/sql')
-rw-r--r-- | tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp index 427bc092a5..89978319a0 100644 --- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp +++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp @@ -126,6 +126,8 @@ private slots: void formatValueTrimStrings(); void precisionPolicy_data() { generic_data(); } void precisionPolicy(); + void infinityAndNan_data() { generic_data(); } + void infinityAndNan(); void multipleThreads_data() { generic_data(); } void multipleThreads(); @@ -1467,6 +1469,46 @@ void tst_QSqlDatabase::precisionPolicy() db.setNumericalPrecisionPolicy(oldPrecision); } +void tst_QSqlDatabase::infinityAndNan() +{ + QFETCH(QString, dbName); + QSqlDatabase db = QSqlDatabase::database(dbName); + CHECK_DATABASE(db); + + if (tst_Databases::getDatabaseType(db) != QSqlDriver::PostgreSQL) + QSKIP("checking for infinity/nan currently only works for PostgreSQL"); + + QSqlQuery q(db); + const QString tableName(qTableName("infititytest", __FILE__, db)); + tst_Databases::safeDropTables(db, {tableName}); + QVERIFY_SQL(q, exec(QString("CREATE TABLE %1 (id smallint, val double precision)").arg(tableName))); + + QVERIFY_SQL(q, prepare(QString("INSERT INTO %1 VALUES (?, ?)").arg(tableName))); + + q.bindValue(0, 1); + q.bindValue(1, qQNaN()); + QVERIFY_SQL(q, exec()); + q.bindValue(0, 2); + q.bindValue(1, qInf()); + QVERIFY_SQL(q, exec()); + q.bindValue(0, 3); + q.bindValue(1, -qInf()); + QVERIFY_SQL(q, exec()); + + QVERIFY_SQL(q, exec(QString("SELECT val FROM %1 ORDER BY id").arg(tableName))); + + QVERIFY_SQL(q, next()); + QVERIFY(qIsNaN(q.value(0).toDouble())); + + QVERIFY_SQL(q, next()); + QVERIFY(qIsInf(q.value(0).toDouble())); + QVERIFY(q.value(0).toDouble() > 0); + + QVERIFY_SQL(q, next()); + QVERIFY(qIsInf(q.value(0).toDouble())); + QVERIFY(q.value(0).toDouble() < 0); +} + // This test needs a ODBC data source containing MYSQL in it's name void tst_QSqlDatabase::mysqlOdbc_unsignedIntegers() { |