enable_fts() exhausts iterator columns before populating the index

Ouverte Adaptée aux débutants
#902 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 3 jours

@syahra712 y travaille déjà.

Depuis le 11/10/2026.

  • #903 par @syahra712 — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
83/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
python, sqlite
Domaine
databases

Piste de recherche

Lis l’implémentation de Table.enable_fts() et populate_fts(), y compris la construction des triggers, puis exécute la reproduction de l’issue avec une base de données en mémoire. Vérifie comment l’itérable columns est utilisé pour créer et remplir la table FTS et construire les triggers. Le travail est terminé lorsqu’un itérateur à usage unique fonctionne avec FTS4 et FTS5, avec ou sans triggers, et que l’entrée sous forme de liste fonctionne toujours.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Problem

Table.enable_fts() accepts columns: Iterable[str], but passing a one-shot iterator raises sqlite3.OperationalError: near ")": syntax error. The same columns supplied as a list work. The FTS virtual table has already been created when the error occurs, so a retry without replace=True also encounters an existing table.

Reproduced locally against main 9c66bafa52ae23d40499c74b0db3b635bcddb876, Python 3.12.14, using an in-memory database:

from sqlite_utils import Database

db = Database(memory=True)
table = db["notes"].insert({"text": "hello"})
table.enable_fts(iter(["text"]))
# sqlite3.OperationalError: near ")": syntax error

Replacing iter(["text"]) with ["text"] succeeds and list(table.search("hello")) returns the record. I reproduced the failure with both FTS4 and FTS5, with and without create_triggers=True.

The iterable is consumed while building CREATE VIRTUAL TABLE, then passed to populate_fts(). Trigger construction also reuses it. Materializing the columns once would preserve the declared iterable contract.

AI assistance: OpenAI Codex inspected the code and ran this reproduction. No live service, user database, or external model call was used.

Langage dominant
Python
Étoiles
2.2k
Forks
215
Métriques de merge des PR
Aucune PR mergée en 30 j

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de simonw/sqlite-utils

Toutes les issues de simonw/sqlite-utils

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.