summaryrefslogtreecommitdiffstats
path: root/src/plugins/sqldrivers
diff options
context:
space:
mode:
authorChristian Ehrlicher <ch.ehrlicher@gmx.de>2022-09-26 19:58:27 +0200
committerChristian Ehrlicher <ch.ehrlicher@gmx.de>2022-10-01 03:15:24 +0200
commit44ac742f730a5e8cac229067429eb2f5cb90105a (patch)
treefd6e0df2d5cbe754e088a0a820c44a404efc857b /src/plugins/sqldrivers
parentbafbffb0337e2159c0355e66c8de8e1f4ceda296 (diff)
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 <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/plugins/sqldrivers')
-rw-r--r--src/plugins/sqldrivers/odbc/qsql_odbc.cpp27
1 files changed, 11 insertions, 16 deletions
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);