From aad12db2ff01ef9ebd0dd3ed429c2423d618695e Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Wed, 12 Jul 2017 04:20:18 -0400 Subject: [PATCH] Fix 'too many terms in compound SELECT' sync error --- chrome/content/zotero/xpcom/sync/syncLocal.js | 25 ++++++++++++------- 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 index 414a497f2..becd3a83a 100644 --- 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)); }),