summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorChristian Ehrlicher <ch.ehrlicher@gmx.de>2021-01-01 20:07:29 +0100
committerChristian Ehrlicher <ch.ehrlicher@gmx.de>2021-01-10 13:02:14 +0100
commitb211148e4b4167483e1a78a45ae8fef97e5a4f2d (patch)
tree884d9e657a8a5e5ae2cbde9b3f781bcf3855968d /src/plugins
parent161e8f4d5dbaa568975d61d770144484e14a62e0 (diff)
Sql ODBC driver: add direct support for float and short datatype
This patch adds native support for SQL_REAL (float) and SQL_SMALLINT (short). Previously those datatypes were mapped to double and integer. [ChangeLog][QtSql] The ODBC driver now properly maps QMetaType::Float to real sql datatype and QMetaType::Short to smallint Fixes: QTBUG-8963 Fixes: QTBUG-57279 Change-Id: Ifec4c609734dbe6165c1ebdadb461c2aae47ba78 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/sqldrivers/odbc/qsql_odbc.cpp53
1 files changed, 49 insertions, 4 deletions
diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
index dd6eaab9cf..026a970cf0 100644
--- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
+++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp
@@ -347,12 +347,16 @@ static QMetaType qDecodeODBCType(SQLSMALLINT sqltype, bool isSigned = true)
switch (sqltype) {
case SQL_DECIMAL:
case SQL_NUMERIC:
- case SQL_REAL:
- case SQL_FLOAT:
- case SQL_DOUBLE:
+ case SQL_FLOAT: // 24 or 53 bits precision
+ case SQL_DOUBLE:// 53 bits
type = QMetaType::Double;
break;
+ case SQL_REAL: // 24 bits
+ type = QMetaType::Float;
+ break;
case SQL_SMALLINT:
+ type = isSigned ? QMetaType::Short : QMetaType::UShort;
+ break;
case SQL_INTEGER:
case SQL_BIT:
type = isSigned ? QMetaType::Int : QMetaType::UInt;
@@ -1220,9 +1224,11 @@ QVariant QODBCResult::data(int field)
d->fieldCache[i] = qGetBigIntData(d->hStmt, i, false);
break;
case QMetaType::Int:
+ case QMetaType::Short:
d->fieldCache[i] = qGetIntData(d->hStmt, i);
- break;
+ break;
case QMetaType::UInt:
+ case QMetaType::UShort:
d->fieldCache[i] = qGetIntData(d->hStmt, i, false);
break;
case QMetaType::QDate:
@@ -1513,6 +1519,30 @@ bool QODBCResult::exec()
0,
*ind == SQL_NULL_DATA ? ind : NULL);
break;
+ case QMetaType::Short:
+ r = SQLBindParameter(d->hStmt,
+ i + 1,
+ qParamType[bindValueType(i) & QSql::InOut],
+ SQL_C_SSHORT,
+ SQL_SMALLINT,
+ 0,
+ 0,
+ const_cast<void *>(val.constData()),
+ 0,
+ *ind == SQL_NULL_DATA ? ind : NULL);
+ break;
+ case QMetaType::UShort:
+ r = SQLBindParameter(d->hStmt,
+ i + 1,
+ qParamType[bindValueType(i) & QSql::InOut],
+ SQL_C_USHORT,
+ SQL_NUMERIC,
+ 15,
+ 0,
+ const_cast<void *>(val.constData()),
+ 0,
+ *ind == SQL_NULL_DATA ? ind : NULL);
+ break;
case QMetaType::Double:
r = SQLBindParameter(d->hStmt,
i + 1,
@@ -1525,6 +1555,18 @@ bool QODBCResult::exec()
0,
*ind == SQL_NULL_DATA ? ind : NULL);
break;
+ case QMetaType::Float:
+ r = SQLBindParameter(d->hStmt,
+ i + 1,
+ qParamType[bindValueType(i) & QSql::InOut],
+ SQL_C_FLOAT,
+ SQL_REAL,
+ 0,
+ 0,
+ const_cast<void *>(val.constData()),
+ 0,
+ *ind == SQL_NULL_DATA ? ind : NULL);
+ break;
case QMetaType::LongLong:
r = SQLBindParameter(d->hStmt,
i + 1,
@@ -1705,8 +1747,11 @@ bool QODBCResult::exec()
QTime(dt.hour, dt.minute, dt.second, dt.fraction / 1000000)));
break; }
case QMetaType::Bool:
+ case QMetaType::Short:
+ case QMetaType::UShort:
case QMetaType::Int:
case QMetaType::UInt:
+ case QMetaType::Float:
case QMetaType::Double:
case QMetaType::QByteArray:
case QMetaType::LongLong: