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 Change-Id: Iddc6f7e8b97f5abc136bbbfd02d175b80152ac90 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit 44ac742f730a5e8cac229067429eb2f5cb90105a)
This commit is contained in:
parent
6b5eac4697
commit
7d452d17a4
@ -370,7 +370,7 @@ static QMetaType qDecodeODBCType(SQLSMALLINT sqltype, bool isSigned = true)
|
|||||||
return QMetaType(type);
|
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;
|
QString fieldVal;
|
||||||
SQLRETURN r = SQL_ERROR;
|
SQLRETURN r = SQL_ERROR;
|
||||||
@ -404,8 +404,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni
|
|||||||
&lengthIndicator);
|
&lengthIndicator);
|
||||||
if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {
|
if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {
|
||||||
if (lengthIndicator == SQL_NULL_DATA) {
|
if (lengthIndicator == SQL_NULL_DATA) {
|
||||||
fieldVal.clear();
|
return {};
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
// starting with ODBC Native Client 2012, SQL_NO_TOTAL is returned
|
// starting with ODBC Native Client 2012, SQL_NO_TOTAL is returned
|
||||||
// instead of the length (which sometimes was wrong in older versions)
|
// 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;
|
break;
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')';
|
qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')';
|
||||||
fieldVal.clear();
|
return {};
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -454,8 +452,7 @@ static QString qGetStringData(SQLHANDLE hStmt, int column, int colSize, bool uni
|
|||||||
&lengthIndicator);
|
&lengthIndicator);
|
||||||
if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {
|
if (r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO) {
|
||||||
if (lengthIndicator == SQL_NULL_DATA || lengthIndicator == SQL_NO_TOTAL) {
|
if (lengthIndicator == SQL_NULL_DATA || lengthIndicator == SQL_NO_TOTAL) {
|
||||||
fieldVal.clear();
|
return {};
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
// if SQL_SUCCESS_WITH_INFO is returned, indicating that
|
// if SQL_SUCCESS_WITH_INFO is returned, indicating that
|
||||||
// more data can be fetched, the length indicator does NOT
|
// 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;
|
break;
|
||||||
} else {
|
} else {
|
||||||
qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')';
|
qWarning() << "qGetStringData: Error while fetching data (" << qWarnODBCHandle(SQL_HANDLE_STMT, hStmt) << ')';
|
||||||
fieldVal.clear();
|
return {};
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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.
|
// by SQLColumns. The hStmt has to point to a valid position.
|
||||||
static QSqlField qMakeFieldInfo(const SQLHANDLE hStmt, const QODBCDriverPrivate* p)
|
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
|
int type = qGetIntData(hStmt, 4).toInt(); // column type
|
||||||
QSqlField f(fname, qDecodeODBCType(type, p));
|
QSqlField f(fname, qDecodeODBCType(type, p));
|
||||||
QVariant var = qGetIntData(hStmt, 6);
|
QVariant var = qGetIntData(hStmt, 6);
|
||||||
@ -1261,7 +1257,7 @@ QVariant QODBCResult::data(int field)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
d->fieldCache[i] = QVariant(qGetStringData(d->hStmt, i, info.length(), false));
|
d->fieldCache[i] = qGetStringData(d->hStmt, i, info.length(), false);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
d->fieldCacheIdx = field + 1;
|
d->fieldCacheIdx = field + 1;
|
||||||
@ -2392,8 +2388,7 @@ QStringList QODBCDriver::tables(QSql::TableType type) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (r == SQL_SUCCESS) {
|
while (r == SQL_SUCCESS) {
|
||||||
QString fieldVal = qGetStringData(hStmt, 2, -1, d->unicode);
|
tl.append(qGetStringData(hStmt, 2, -1, d->unicode).toString());
|
||||||
tl.append(fieldVal);
|
|
||||||
|
|
||||||
if (d->hasSQLFetchScroll)
|
if (d->hasSQLFetchScroll)
|
||||||
r = SQLFetchScroll(hStmt,
|
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
|
// Store all fields in a StringList because some drivers can't detail fields in this FETCH loop
|
||||||
while (r == SQL_SUCCESS) {
|
while (r == SQL_SUCCESS) {
|
||||||
if (usingSpecialColumns) {
|
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
|
idxName = QString::number(fakeId++); // invent a fake index name
|
||||||
} else {
|
} else {
|
||||||
cName = qGetStringData(hStmt, 3, -1, d->unicode); // column name
|
cName = qGetStringData(hStmt, 3, -1, d->unicode).toString(); // column name
|
||||||
idxName = qGetStringData(hStmt, 5, -1, d->unicode); // pk index name
|
idxName = qGetStringData(hStmt, 5, -1, d->unicode).toString(); // pk index name
|
||||||
}
|
}
|
||||||
index.append(rec.field(cName));
|
index.append(rec.field(cName));
|
||||||
index.setName(idxName);
|
index.setName(idxName);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user