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>
This commit is contained in:
parent
bafbffb033
commit
44ac742f73
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user