diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 7a06304..c835fbd 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -2212,24 +2212,26 @@ class Table(Queryable): def detect_fts(self) -> Optional[str]: "Detect if table has a corresponding FTS virtual table and return it" - sql = ( - textwrap.dedent( - """ + sql = textwrap.dedent( + """ SELECT name FROM sqlite_master WHERE rootpage = 0 AND ( - sql LIKE '%VIRTUAL TABLE%USING FTS%content=%{table}%' + sql LIKE :like + OR sql LIKE :like2 OR ( - tbl_name = "{table}" + tbl_name = :table AND sql LIKE '%VIRTUAL TABLE%USING FTS%' ) ) """ - ) - .strip() - .format(table=self.name) - ) - rows = self.db.execute(sql).fetchall() + ).strip() + args = { + "like": "%VIRTUAL TABLE%USING FTS%content=[{}]%".format(self.name), + "like2": '%VIRTUAL TABLE%USING FTS%content="{}"%'.format(self.name), + "table": self.name, + } + rows = self.db.execute(sql, args).fetchall() if len(rows) == 0: return None else: diff --git a/tests/test_introspect.py b/tests/test_introspect.py index 28a5009..fe9542b 100644 --- a/tests/test_introspect.py +++ b/tests/test_introspect.py @@ -36,6 +36,23 @@ def test_detect_fts(existing_db): assert existing_db["foo"].detect_fts() is None +@pytest.mark.parametrize("reverse_order", (True, False)) +def test_detect_fts_similar_tables(fresh_db, reverse_order): + # https://github.com/simonw/sqlite-utils/issues/434 + table1, table2 = ("demo", "demo2") + if reverse_order: + table1, table2 = table2, table1 + + fresh_db[table1].insert({"title": "Hello"}).enable_fts( + ["title"], fts_version="FTS4" + ) + fresh_db[table2].insert({"title": "Hello"}).enable_fts( + ["title"], fts_version="FTS4" + ) + assert fresh_db[table1].detect_fts() == "{}_fts".format(table1) + assert fresh_db[table2].detect_fts() == "{}_fts".format(table2) + + def test_tables(existing_db): assert 1 == len(existing_db.tables) assert "foo" == existing_db.tables[0].name diff --git a/tests/test_tracer.py b/tests/test_tracer.py index 618d1e6..2d76c74 100644 --- a/tests/test_tracer.py +++ b/tests/test_tracer.py @@ -54,14 +54,19 @@ def test_with_tracer(): "SELECT name FROM sqlite_master\n" " WHERE rootpage = 0\n" " AND (\n" - " sql LIKE '%VIRTUAL TABLE%USING FTS%content=%dogs%'\n" + " sql LIKE :like\n" + " OR sql LIKE :like2\n" " OR (\n" - ' tbl_name = "dogs"\n' + " tbl_name = :table\n" " AND sql LIKE '%VIRTUAL TABLE%USING FTS%'\n" " )\n" - " )" - ), - None, + " )", + { + "like": "%VIRTUAL TABLE%USING FTS%content=[dogs]%", + "like2": '%VIRTUAL TABLE%USING FTS%content="dogs"%', + "table": "dogs", + }, + ) ), ("select name from sqlite_master where type = 'view'", None), ("select sql from sqlite_master where name = ?", ("dogs_fts",)),