commit aad12db2ff01ef9ebd0dd3ed429c2423d618695e
parent 8f2508e167def8f6128e43ab25673e2e9642908e
Author: Dan Stillman <dstillman@zotero.org>
Date: Wed, 12 Jul 2017 04:20:18 -0400
Fix 'too many terms in compound SELECT' sync error
Diffstat:
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/chrome/content/zotero/xpcom/sync/syncLocal.js b/chrome/content/zotero/xpcom/sync/syncLocal.js
@@ -593,15 +593,22 @@ Zotero.Sync.Data.Local = {
getCacheObjects: Zotero.Promise.coroutine(function* (objectType, libraryID, keyVersionPairs) {
if (!keyVersionPairs.length) return [];
- var sql = "SELECT data FROM syncCache SC JOIN (SELECT "
- + keyVersionPairs.map(function (pair) {
- Zotero.DataObjectUtilities.checkKey(pair[0]);
- return "'" + pair[0] + "' AS key, " + parseInt(pair[1]) + " AS version";
- }).join(" UNION SELECT ")
- + ") AS pairs ON (pairs.key=SC.key AND pairs.version=SC.version) "
- + "WHERE libraryID=? AND "
- + "syncObjectTypeID IN (SELECT syncObjectTypeID FROM syncObjectTypes WHERE name=?)";
- var rows = yield Zotero.DB.columnQueryAsync(sql, [libraryID, objectType]);
+ var rows = [];
+ yield Zotero.Utilities.Internal.forEachChunkAsync(
+ keyVersionPairs,
+ 240, // SQLITE_MAX_COMPOUND_SELECT defaults to 500
+ async function (chunk) {
+ var sql = "SELECT data FROM syncCache SC JOIN (SELECT "
+ + chunk.map((pair) => {
+ Zotero.DataObjectUtilities.checkKey(pair[0]);
+ return "'" + pair[0] + "' AS key, " + parseInt(pair[1]) + " AS version";
+ }).join(" UNION SELECT ")
+ + ") AS pairs ON (pairs.key=SC.key AND pairs.version=SC.version) "
+ + "WHERE libraryID=? AND "
+ + "syncObjectTypeID IN (SELECT syncObjectTypeID FROM syncObjectTypes WHERE name=?)";
+ rows.push(...await Zotero.DB.columnQueryAsync(sql, [libraryID, objectType]));
+ }
+ )
return rows.map(row => JSON.parse(row));
}),