From 64ea016aa11aa6a34b324cfe98eee9dbde1e6b95 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 2 Aug 2022 19:47:16 +0530 Subject: [PATCH] Full text search: Fix error when using restrict searched books and more than 900 books are present in the searched list. Fixes #1983230 [FTS - Restricting returns error](https://bugs.launchpad.net/calibre/+bug/1983230) --- src/calibre/db/fts/connect.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/calibre/db/fts/connect.py b/src/calibre/db/fts/connect.py index fff6830b0d..5f86a597d7 100644 --- a/src/calibre/db/fts/connect.py +++ b/src/calibre/db/fts/connect.py @@ -9,7 +9,6 @@ import hashlib import os import sys from contextlib import suppress -from itertools import repeat from threading import Lock from calibre.db import FTSQueryError @@ -169,14 +168,14 @@ class FTS: query += f' JOIN {fts_table} ON fts_db.books_text.id = {fts_table}.rowid' query += ' WHERE ' data = [] + conn = self.get_connection() if restrict_to_book_ids: - pl = ','.join(repeat('?', len(restrict_to_book_ids))) - query += f' fts_db.books_text.book IN ({pl}) AND ' - data.extend(restrict_to_book_ids) + conn.execute('CREATE TABLE IF NOT EXISTS temp.restrict_fts_items(x INTEGER); DELETE FROM temp.restrict_fts_items;') + conn.executemany('INSERT INTO temp.restrict_fts_items VALUES (?)', tuple((x,) for x in restrict_to_book_ids)) + query += ' fts_db.books_text.book IN temp.restrict_fts_items AND ' query += f' "{fts_table}" MATCH ?' data.append(fts_engine_query) query += f' ORDER BY {fts_table}.rank ' - conn = self.get_connection() try: for record in conn.execute(query, tuple(data)): ret = yield {