summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
3c910a4)
Workaround Qt 4 QSqlQuery::bindValue() not handling duplicate
parameter names by giving every duplicated parameter a unique name.
Qt 5 handles this as one expects, so this doesn't need forward-ported
to 0.14/master where Qt 4 support has been dropped.
Applies to SQLite and PostgreSQL.
Note: PostgreSQL prepared statements properly handle repeated "$"
parameters, so there's no need to modify those.
Test case for prepared statements:
> PREPARE qcore_test_var
AS SELECT * FROM buffer WHERE bufferid = $1 AND userid = $1
AND networkid = $1;
> EXECUTE qcore_test_var(1);
Gives a result if bufferid = userid = networkid = 1 exists.
Credit to @justJanne for finding the root cause of the issue, and
suggesting the fix, and to 'galfwender' and @darkstar for reporting.
Fixes #1506
See https://doc.qt.io/archives/qt-4.8/qsqlquery.html#bindValue
And https://doc.qt.io/qt-5/qsqlquery.html#bindValue
14 files changed:
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
AND backlog.messageid >= :firstmsg
AND backlog.type & :type != 0
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
AND backlog.messageid >= :firstmsg
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
-- Unlike SQLite, no LIMIT clause, mimicking the unfiltered version - investigate later..?
ORDER BY messageid DESC
-- Unlike SQLite, no LIMIT clause, mimicking the unfiltered version - investigate later..?
AND backlog.messageid >= :firstmsg
AND backlog.messageid < :lastmsg
AND backlog.type & :type != 0
AND backlog.messageid >= :firstmsg
AND backlog.messageid < :lastmsg
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
-- Unlike SQLite, no LIMIT clause, mimicking the unfiltered version - investigate later..?
ORDER BY messageid DESC
-- Unlike SQLite, no LIMIT clause, mimicking the unfiltered version - investigate later..?
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= :first
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= :first
- AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :buffer)
+ AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferDup1)
AND bufferid = :buffer
AND backlog.type & :type != 0
AND bufferid = :buffer
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :buffer
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :buffer
- AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :buffer)
+ AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferDup1)
AND backlog.type & :type != 0
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
AND backlog.messageid < :last
AND bufferid = :buffer
AND backlog.type & :type != 0
AND backlog.messageid < :last
AND bufferid = :buffer
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
AND backlog.messageid >= :firstmsg
AND backlog.type & :type != 0
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
AND backlog.messageid >= :firstmsg
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
AND backlog.messageid >= :firstmsg
AND backlog.messageid < :lastmsg
AND backlog.type & :type != 0
AND backlog.messageid >= :firstmsg
AND backlog.messageid < :lastmsg
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= :firstmsg
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= :firstmsg
- AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferid)
+ AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferidDup1)
AND bufferid = :bufferid
ORDER BY messageid DESC
LIMIT :limit
AND bufferid = :bufferid
ORDER BY messageid DESC
LIMIT :limit
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= :firstmsg
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= :firstmsg
- AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferid)
+ AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferidDup1)
AND bufferid = :bufferid
AND backlog.type & :type != 0
AND bufferid = :bufferid
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :bufferid
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :bufferid
-AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferid)
+AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferidDup1)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :bufferid
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :bufferid
-AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferid)
+AND backlog.messageid <= (SELECT buffer.lastmsgid FROM buffer WHERE buffer.bufferid = :bufferidDup1)
AND backlog.type & :type != 0
AND backlog.type & :type != 0
-AND (:flags = 0 OR backlog.flags & :flags != 0)
+AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
AND backlog.messageid >= :firstmsg
AND backlog.messageid < :lastmsg
AND backlog.type & :type != 0
AND backlog.messageid >= :firstmsg
AND backlog.messageid < :lastmsg
AND backlog.type & :type != 0
- AND (:flags = 0 OR backlog.flags & :flags != 0)
+ AND (:flags = 0 OR backlog.flags & :flagsDup1 != 0)
ORDER BY messageid DESC
LIMIT :limit
ORDER BY messageid DESC
LIMIT :limit
QSqlQuery query(db);
if (last == -1 && first == -1) {
query.prepare(queryString("select_messagesNewestK_filtered"));
QSqlQuery query(db);
if (last == -1 && first == -1) {
query.prepare(queryString("select_messagesNewestK_filtered"));
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":bufferDup1", bufferId.toInt());
} else if (last == -1) {
query.prepare(queryString("select_messagesNewerThan_filtered"));
query.bindValue(":first", first.toQint64());
} else if (last == -1) {
query.prepare(queryString("select_messagesNewerThan_filtered"));
query.bindValue(":first", first.toQint64());
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":bufferDup1", bufferId.toInt());
} else {
query.prepare(queryString("select_messagesRange_filtered"));
query.bindValue(":last", last.toQint64());
query.bindValue(":first", first.toQint64());
} else {
query.prepare(queryString("select_messagesRange_filtered"));
query.bindValue(":last", last.toQint64());
query.bindValue(":first", first.toQint64());
+ // Workaround for Qt 4 QSqlQuery::bindValue() not needed, only has one ":buffer"
}
query.bindValue(":buffer", bufferId.toInt());
query.bindValue(":limit", limit);
}
query.bindValue(":buffer", bufferId.toInt());
query.bindValue(":limit", limit);
query.bindValue(":type", typeRaw);
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
query.bindValue(":type", typeRaw);
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":flagsDup1", flagsRaw);
safeExec(query);
if (!watchQuery(query)) {
safeExec(query);
if (!watchQuery(query)) {
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":flagsDup1", flagsRaw);
safeExec(query);
if (!watchQuery(query)) {
safeExec(query);
if (!watchQuery(query)) {
QSqlQuery query(db);
if (last == -1 && first == -1) {
query.prepare(queryString("select_messagesNewestK"));
QSqlQuery query(db);
if (last == -1 && first == -1) {
query.prepare(queryString("select_messagesNewestK"));
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":bufferidDup1", bufferId.toInt());
}
else if (last == -1) {
query.prepare(queryString("select_messagesNewerThan"));
query.bindValue(":firstmsg", first.toQint64());
}
else if (last == -1) {
query.prepare(queryString("select_messagesNewerThan"));
query.bindValue(":firstmsg", first.toQint64());
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":bufferidDup1", bufferId.toInt());
}
else {
query.prepare(queryString("select_messagesRange"));
query.bindValue(":lastmsg", last.toQint64());
query.bindValue(":firstmsg", first.toQint64());
}
else {
query.prepare(queryString("select_messagesRange"));
query.bindValue(":lastmsg", last.toQint64());
query.bindValue(":firstmsg", first.toQint64());
+ // Workaround for Qt 4 QSqlQuery::bindValue() not needed, only has one ":bufferid"
}
query.bindValue(":bufferid", bufferId.toInt());
query.bindValue(":limit", limit);
}
query.bindValue(":bufferid", bufferId.toInt());
query.bindValue(":limit", limit);
QSqlQuery query(db);
if (last == -1 && first == -1) {
query.prepare(queryString("select_messagesNewestK_filtered"));
QSqlQuery query(db);
if (last == -1 && first == -1) {
query.prepare(queryString("select_messagesNewestK_filtered"));
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":bufferidDup1", bufferId.toInt());
}
else if (last == -1) {
query.prepare(queryString("select_messagesNewerThan_filtered"));
query.bindValue(":firstmsg", first.toQint64());
}
else if (last == -1) {
query.prepare(queryString("select_messagesNewerThan_filtered"));
query.bindValue(":firstmsg", first.toQint64());
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":bufferidDup1", bufferId.toInt());
}
else {
query.prepare(queryString("select_messagesRange_filtered"));
query.bindValue(":lastmsg", last.toQint64());
query.bindValue(":firstmsg", first.toQint64());
}
else {
query.prepare(queryString("select_messagesRange_filtered"));
query.bindValue(":lastmsg", last.toQint64());
query.bindValue(":firstmsg", first.toQint64());
+ // Workaround for Qt 4 QSqlQuery::bindValue() not needed, only has one ":bufferid"
}
query.bindValue(":bufferid", bufferId.toInt());
query.bindValue(":limit", limit);
}
query.bindValue(":bufferid", bufferId.toInt());
query.bindValue(":limit", limit);
query.bindValue(":type", typeRaw);
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
query.bindValue(":type", typeRaw);
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":flagsDup1", flagsRaw);
safeExec(query);
watchQuery(query);
safeExec(query);
watchQuery(query);
query.bindValue(":type", typeRaw);
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
query.bindValue(":type", typeRaw);
int flagsRaw = flags;
query.bindValue(":flags", flagsRaw);
+ // Workaround for Qt 4 QSqlQuery::bindValue() not supporting repeated placeholder names
+ query.bindValue(":flagsDup1", flagsRaw);
safeExec(query);
watchQuery(query);
safeExec(query);
watchQuery(query);