FTS detection treats table names as LIKE patterns

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

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

@IlyaKhalafi y travaille déjà.

Depuis le 6/11/2026.

  • #931 par @IlyaKhalafi — ouverte

Évaluation

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

Piste de recherche

Commencez par lire detect_fts() et les motifs LIKE qu’il utilise pour trouver les tables FTS ; l’issue identifie le traitement des caractères génériques dans les noms de tables comme cause. Reproduisez le problème avec l’exemple fourni book_titles et bookXtitles, puis vérifiez qu’un test de régression couvre _ et %. Le travail est terminé lorsque book_titles_fts est détectée et que la recherche de incorrect ne renvoie aucune ligne.

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

Description

When a table name contains _ or %, detect_fts() treats those characters as SQL LIKE wildcards. It can select another table's FTS index and use its matching row IDs against the requested table.

from sqlite_utils import Database

db = Database(memory=True)
db["bookXtitles"].insert({"title": "incorrect"}).enable_fts(["title"])
db["book_titles"].insert({"title": "correct"}).enable_fts(["title"])

print(db["book_titles"].detect_fts())
print(list(db["book_titles"].search("incorrect")))

Current main prints bookXtitles_fts and returns the row containing correct, even though that row does not match the search. It should detect book_titles_fts and return no rows for this query.

The same issue occurs with % in the table name. The table-name portion of the LIKE patterns needs escaping. The quote delimiters added for #434 prevent prefix matches but leave wildcard characters active.

Reproduced on Python 3.12 and SQLite 3.53.1 using current main.

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.