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)

This commit is contained in:
Kovid Goyal 2022-08-02 19:47:16 +05:30
parent 5f67cc961e
commit 64ea016aa1
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -9,7 +9,6 @@ import hashlib
import os import os
import sys import sys
from contextlib import suppress from contextlib import suppress
from itertools import repeat
from threading import Lock from threading import Lock
from calibre.db import FTSQueryError 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 += f' JOIN {fts_table} ON fts_db.books_text.id = {fts_table}.rowid'
query += ' WHERE ' query += ' WHERE '
data = [] data = []
conn = self.get_connection()
if restrict_to_book_ids: if restrict_to_book_ids:
pl = ','.join(repeat('?', len(restrict_to_book_ids))) conn.execute('CREATE TABLE IF NOT EXISTS temp.restrict_fts_items(x INTEGER); DELETE FROM temp.restrict_fts_items;')
query += f' fts_db.books_text.book IN ({pl}) AND ' conn.executemany('INSERT INTO temp.restrict_fts_items VALUES (?)', tuple((x,) for x in restrict_to_book_ids))
data.extend(restrict_to_book_ids) query += ' fts_db.books_text.book IN temp.restrict_fts_items AND '
query += f' "{fts_table}" MATCH ?' query += f' "{fts_table}" MATCH ?'
data.append(fts_engine_query) data.append(fts_engine_query)
query += f' ORDER BY {fts_table}.rank ' query += f' ORDER BY {fts_table}.rank '
conn = self.get_connection()
try: try:
for record in conn.execute(query, tuple(data)): for record in conn.execute(query, tuple(data)):
ret = yield { ret = yield {