From 44ac742f730a5e8cac229067429eb2f5cb90105a Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Mon, 26 Sep 2022 19:58:27 +0200 Subject: QODBC: fix handling NULL values for strings Qt6 added a slight behavior change in QVariant - an empty QString in a QVariant no longer results in QVariant::isNull(). This created an issue that qGetStringData() could no longer return a NULL value. On the other side, NULL values in Qt5 could not be distinguished to an empty string which we now can. Fixes: QTBUG-106607 Pick-to: 6.2 Change-Id: Iddc6f7e8b97f5abc136bbbfd02d175b80152ac90 Reviewed-by: Volker Hilsheimer --- src/plugins/sqldrivers/odbc/qsql_odbc.cpp | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'src/plugins/sqldrivers/odbc/qsql_odbc.cpp') diff --git a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp index 49ceaf9c69..386ffccf36 100644 --- a/src/plugins/sqldrivers/odbc/qsql_odbc.cpp +++ b/src/plugins/sqldrivers/odbc/qsql_odbc.cpp @@ -370,7 +370,7 @@ static QMetaType qDecodeODBCType(SQLSMALLINT sqltype, bool isSigned = true) return QMetaType(type); } -static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool unicode = false) +static QVariant qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool unicode) { QString fieldVal; SQLRETURN r = SQL_ERROR; @@ -404,8 +404,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni &lengthIndicator); if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { if (lengthIndicator == SQL_NULL_DATA) { - fieldVal.clear(); - break; + return {}; } // starting with ODBC Native Client 2012, SQL_NO_TOTAL is returned // instead of the length (which sometimes was wrong in older versions) @@ -431,8 +430,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni break; } else { qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')'; - fieldVal.clear(); - break; + return {}; } } } else { @@ -454,8 +452,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni &lengthIndicator); if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) { if (lengthIndicator == SQL_NULL_DATA || lengthIndicator == SQL_NO_TOTAL) { - fieldVal.clear(); - break; + return {}; } // if SQL_SUCCESS_WITH_INFO is returned, indicating that // more data can be fetched, the length indicator does NOT @@ -475,8 +472,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni break; } else { qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')'; - fieldVal.clear(); - break; + return {}; } } } @@ -620,7 +616,7 @@ static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, int i, QString *errorMess // by SQLColumns. The hStmt has to point to a valid position. static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, const QODBCDriverPrivate* p) { - QString fname = qGetStringData(hStmt, 3, -1, p->unicode); + QString fname = qGetStringData(hStmt, 3, -1, p->unicode).toString(); int type = qGetIntData(hStmt, 4).toInt(); // column type QSqlField f(fname, qDecodeODBCType(type, p)); QVariant var = qGetIntData(hStmt, 6); @@ -1261,7 +1257,7 @@ QVariant QODBCResult::data(int field) } break; default: - d->fieldCache[i] = QVariant(qGetStringData(d->hStmt, i, info.length(), false)); + d->fieldCache[i] = qGetStringData(d->hStmt, i, info.length(), false); break; } d->fieldCacheIdx = field + 1; @@ -2392,8 +2388,7 @@ QStringList QODBCDriver::tables(QSql::TableType type) const } while (r == SQL_SUCCESS) { - QString fieldVal = qGetStringData(hStmt, 2, -1, d->unicode); - tl.append(fieldVal); + tl.append(qGetStringData(hStmt, 2, -1, d->unicode).toString()); if (d->hasSQLFetchScroll) r = SQLFetchScroll(hStmt, @@ -2490,11 +2485,11 @@ QSqlIndex QODBCDriver::primaryIndex(const QString& tablename) const // Store all fields in a StringList because some drivers can't detail fields in this FETCH loop while (r == SQL_SUCCESS) { if (usingSpecialColumns) { - cName = qGetStringData(hStmt, 1, -1, d->unicode); // column name + cName = qGetStringData(hStmt, 1, -1, d->unicode).toString(); // column name idxName = QString::number(fakeId++); // invent a fake index name } else { - cName = qGetStringData(hStmt, 3, -1, d->unicode); // column name - idxName = qGetStringData(hStmt, 5, -1, d->unicode); // pk index name + cName = qGetStringData(hStmt, 3, -1, d->unicode).toString(); // column name + idxName = qGetStringData(hStmt, 5, -1, d->unicode).toString(); // pk index name } index.append(rec.field(cName)); index.setName(idxName); -- cgit v1.2.3