From 204a72da1f79d95af946a9beda71b856a769f76b Mon Sep 17 00:00:00 2001 From: Albert S Date: Sat, 19 Jun 2021 20:07:38 +0200 Subject: [PATCH] setup: Fix broken FTS DELETE op Thie previous DELETE statement lead to strange behaviours. It was pure luck this did not blow up before all these years. It appears it may leave the index in an undefined state, and the database recently started to display strange behaviour in connection with newer sqlite version. Now, just remove the previous revision from the FTS index, as for now, search only cares about the most recent revisions. Also, remove redundant UPDATE trigger on revision table We never update revisions, thus such trigger is simply redundant. Relevant: https://gitlab.gnome.org/GNOME/tracker/-/merge_requests/353 --- setup/sqlite.sql | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/setup/sqlite.sql b/setup/sqlite.sql index 83c0281..b685173 100644 --- a/setup/sqlite.sql +++ b/setup/sqlite.sql @@ -25,24 +25,13 @@ count integer CREATE TABLE category(id INTEGER PRIMARY KEY, name varchar(255)); CREATE TABLE categorymember(id INTEGER PRIMARY KEY, category REFERENCES category(id), page REFERENCES page (id)); CREATE INDEX revisionid ON revision (revisionid DESC); -CREATE INDEX pagename ON page (name) -; -CREATE INDEX token ON session (token) -; -CREATE TRIGGER search_ai AFTER INSERT ON revision BEGIN - DELETE FROM search WHERE page = new.page; - INSERT INTO search(rowid, content, page) VALUES (new.id, new.content, new.page); -END; -CREATE TRIGGER search_au AFTER UPDATE ON revision BEGIN - DELETE FROM search WHERE page = old.page; - INSERT INTO search(rowid, content, page) VALUES (new.id, new.content, new.page); -END; -CREATE VIRTUAL TABLE search USING fts5(content, page UNINDEXED, content=revision,content_rowid=id) -/* search(content,page) */; -CREATE TABLE IF NOT EXISTS 'search_data'(id INTEGER PRIMARY KEY, block BLOB); -CREATE TABLE IF NOT EXISTS 'search_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID; -CREATE TABLE IF NOT EXISTS 'search_docsize'(id INTEGER PRIMARY KEY, sz BLOB); -CREATE TABLE IF NOT EXISTS 'search_config'(k PRIMARY KEY, v) WITHOUT ROWID; +CREATE INDEX pagename ON page (name); +CREATE INDEX token ON session (token); +CREATE VIRTUAL TABLE search USING fts5(content, page UNINDEXED, content=revision,content_rowid=id); CREATE TRIGGER search_ad AFTER DELETE ON revision BEGIN INSERT INTO search(search, rowid, content, page) VALUES('delete', old.id, old.content, old.page); END; +CREATE TRIGGER search_ai AFTER INSERT ON revision BEGIN + INSERT INTO search(search, rowid, content, page) SELECT 'delete', id, content, page FROM revision WHERE page = new.page AND revisionid = new.revisionid - 1; + INSERT INTO search(rowid, content, page) VALUES (new.id, new.content, new.page); +END;