{"html_url": "https://github.com/simonw/datasette/issues/743#issuecomment-620177365", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/743", "id": 620177365, "node_id": "MDEyOklzc3VlQ29tbWVudDYyMDE3NzM2NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-04-27T19:11:01Z", "updated_at": "2020-04-27T19:11:30Z", "author_association": "OWNER", "body": "Huh... turns out the documentation already claims that wildcards work! Closing this as wontfix:\r\n\r\nhttps://datasette.readthedocs.io/en/stable/full_text_search.html#the-table-view-api\r\n\r\n\"Full-text_search_\u2014_Datasette_documentation\"", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 607770595, "label": "escape_fts() does not correctly escape * wildcards"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/743#issuecomment-620174977", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/743", "id": 620174977, "node_id": "MDEyOklzc3VlQ29tbWVudDYyMDE3NDk3Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-04-27T19:05:56Z", "updated_at": "2020-04-27T19:05:56Z", "author_association": "OWNER", "body": "The other option would be to leave this as-is, and let people wildcard search all they want. I'm leaning in that direction.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 607770595, "label": "escape_fts() does not correctly escape * wildcards"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/743#issuecomment-620170826", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/743", "id": 620170826, "node_id": "MDEyOklzc3VlQ29tbWVudDYyMDE3MDgyNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-04-27T18:58:04Z", "updated_at": "2020-04-27T18:58:04Z", "author_association": "OWNER", "body": "Maybe this is moot because you can't store a `*` character in a FTS table anyway, so it would never make sense to search for one? In which case maybe `escape_fts()` should just strip out `*` entirely?\r\n\r\nBest source of information I could find was this tiny thread from 2014 about FTS4:\r\n\r\nhttp://sqlite.1065341.n5.nabble.com/Escaping-conventions-for-FTS4-virtual-table-queries-td74589.html\r\n\r\n> Dave Baggett wrote:\r\n> > What if I want docids of documents containing the exact literal token \"any*\"?\r\n> \r\n> You would have to use one of the Unicode tokenizers, and configure it to\r\n> interpret * as a token character.\r\n> \r\n> > how do I escape the asterisk so that it's not interpreted as a wildcard?\r\n> \r\n> There are no escapes. When * is a token character, you lose the ability\r\n> to do prefix searches. \r\n\r\nI could investigate further by learning to use the fts5vocab virtual table debugging tool to see what's actually stored in those FTS5 indexes and check if `*` is indeed stripped by them.\r\n\r\nhttps://www.sqlite.org/fts5.html#the_fts5vocab_virtual_table_module", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 607770595, "label": "escape_fts() does not correctly escape * wildcards"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/743#issuecomment-620166959", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/743", "id": 620166959, "node_id": "MDEyOklzc3VlQ29tbWVudDYyMDE2Njk1OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-04-27T18:50:30Z", "updated_at": "2020-04-27T18:50:30Z", "author_association": "OWNER", "body": "Here's the `escape_fts()` function:\r\nhttps://github.com/simonw/datasette/blob/89c4ddd4828623888e91a1d2cb396cba12d4e7b4/datasette/utils/__init__.py#L742-L753\r\n\r\nhttps://latest.datasette.io/fixtures?sql=select+escape_fts%28%27bar%2A%27%29\r\n\r\n\"fixtures__select_escape_fts__bar____and_Launch_Meeting_-_Zoom\"\r\n\r\nSo apparently wrapping a SQLite FTS word like `\"bar*\"` doesn't prevent SQLite from expanding the wildcard.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 607770595, "label": "escape_fts() does not correctly escape * wildcards"}, "performed_via_github_app": null}