diff options
author | Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> | 2015-02-17 14:29:09 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> | 2015-02-18 11:01:15 +0000 |
commit | 916af48cff66e0acbeb6da39997498ce3b9626ce (patch) | |
tree | 7ab51827d5816daa06c1697876d8ccc63102550f /src/sql | |
parent | 2f5c2ec12f3c45a0806b5872c206a680e9fce014 (diff) |
PostgreSQL: Fix special floating point handling for 'float' types.
Introduce a template function to determine the special values
via macro and use that for QVariant::Double and QMetaType::Float.
Task-number: QTBUG-44381
Change-Id: I379dd82b22d467b0aebaa42f4f0f5c52472a5c47
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Diffstat (limited to 'src/sql')
-rw-r--r-- | src/sql/drivers/psql/qsql_psql.cpp | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/src/sql/drivers/psql/qsql_psql.cpp b/src/sql/drivers/psql/qsql_psql.cpp index c83c633fd0..3aa2455ff0 100644 --- a/src/sql/drivers/psql/qsql_psql.cpp +++ b/src/sql/drivers/psql/qsql_psql.cpp @@ -1248,6 +1248,23 @@ QSqlRecord QPSQLDriver::record(const QString& tablename) const return info; } +template <class FloatType> +inline void assignSpecialPsqlFloatValue(FloatType val, QString *target) +{ + if (isnan(val)) { + *target = QLatin1String("'NaN'"); + } else { + switch (isinf(val)) { + case 1: + *target = QLatin1String("'Infinity'"); + break; + case -1: + *target = QLatin1String("'-Infinity'"); + break; + } + } +} + QString QPSQLDriver::formatValue(const QSqlField &field, bool trimStrings) const { Q_D(const QPSQLDriver); @@ -1255,7 +1272,7 @@ QString QPSQLDriver::formatValue(const QSqlField &field, bool trimStrings) const if (field.isNull()) { r = QLatin1String("NULL"); } else { - switch (field.type()) { + switch (int(field.type())) { case QVariant::DateTime: #ifndef QT_NO_DATESTRING if (field.value().toDateTime().isValid()) { @@ -1305,21 +1322,16 @@ QString QPSQLDriver::formatValue(const QSqlField &field, bool trimStrings) const qPQfreemem(data); break; } - case QVariant::Double: { - double val = field.value().toDouble(); - if (isnan(val)) - r = QLatin1String("'NaN'"); - else { - int res = isinf(val); - if (res == 1) - r = QLatin1String("'Infinity'"); - else if (res == -1) - r = QLatin1String("'-Infinity'"); - else - r = QSqlDriver::formatValue(field, trimStrings); - } + case QMetaType::Float: + assignSpecialPsqlFloatValue(field.value().toFloat(), &r); + if (r.isEmpty()) + r = QSqlDriver::formatValue(field, trimStrings); + break; + case QVariant::Double: + assignSpecialPsqlFloatValue(field.value().toDouble(), &r); + if (r.isEmpty()) + r = QSqlDriver::formatValue(field, trimStrings); break; - } default: r = QSqlDriver::formatValue(field, trimStrings); break; |