From b8819bdbffcd59835544db1682e5b90e7c478533 Mon Sep 17 00:00:00 2001 From: Liu Yuan Date: Mon, 13 Apr 2026 11:29:02 +0800 Subject: [PATCH] fix(seahorse): drop/recreate FTS5 triggers so existing DBs get corrected bodies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `CREATE TRIGGER IF NOT EXISTS` does not replace an existing trigger body. On databases created with the old (buggy) DELETE-FROM-FTS syntax, the bad trigger body persisted after code updates. Now we explicitly DROP each trigger before CREATE, so any existing DB gets the corrected body on next startup — no manual DB deletion required. --- pkg/seahorse/schema.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/pkg/seahorse/schema.go b/pkg/seahorse/schema.go index bf32d548b..aa829358b 100644 --- a/pkg/seahorse/schema.go +++ b/pkg/seahorse/schema.go @@ -118,26 +118,35 @@ func runSchema(db *sql.DB) error { `CREATE INDEX IF NOT EXISTS idx_summary_messages_message ON summary_messages(message_id)`, `CREATE INDEX IF NOT EXISTS idx_context_items_conv ON context_items(conversation_id, ordinal)`, + // Drop old triggers before creating new ones so existing DBs get updated bodies. + // (CREATE TRIGGER IF NOT EXISTS does NOT replace an existing trigger body.) + `DROP TRIGGER IF EXISTS summaries_ai`, + `DROP TRIGGER IF EXISTS summaries_ad`, + `DROP TRIGGER IF EXISTS summaries_au`, + `DROP TRIGGER IF EXISTS messages_ai`, + `DROP TRIGGER IF EXISTS messages_ad`, + `DROP TRIGGER IF EXISTS messages_au`, + // FTS5 triggers to keep summaries_fts in sync with summaries table - `CREATE TRIGGER IF NOT EXISTS summaries_ai AFTER INSERT ON summaries BEGIN + `CREATE TRIGGER summaries_ai AFTER INSERT ON summaries BEGIN INSERT INTO summaries_fts (summary_id, content) VALUES (new.summary_id, new.content); END`, - `CREATE TRIGGER IF NOT EXISTS summaries_ad AFTER DELETE ON summaries BEGIN + `CREATE TRIGGER summaries_ad AFTER DELETE ON summaries BEGIN DELETE FROM summaries_fts WHERE summary_id = old.summary_id; END`, - `CREATE TRIGGER IF NOT EXISTS summaries_au AFTER UPDATE ON summaries BEGIN + `CREATE TRIGGER summaries_au AFTER UPDATE ON summaries BEGIN DELETE FROM summaries_fts WHERE summary_id = old.summary_id; INSERT INTO summaries_fts (summary_id, content) VALUES (new.summary_id, new.content); END`, // FTS5 triggers to keep messages_fts in sync with messages table - `CREATE TRIGGER IF NOT EXISTS messages_ai AFTER INSERT ON messages BEGIN + `CREATE TRIGGER messages_ai AFTER INSERT ON messages BEGIN INSERT INTO messages_fts (message_id, content) VALUES (new.message_id, new.content); END`, - `CREATE TRIGGER IF NOT EXISTS messages_ad AFTER DELETE ON messages BEGIN + `CREATE TRIGGER messages_ad AFTER DELETE ON messages BEGIN DELETE FROM messages_fts WHERE message_id = old.message_id; END`, - `CREATE TRIGGER IF NOT EXISTS messages_au AFTER UPDATE ON messages BEGIN + `CREATE TRIGGER messages_au AFTER UPDATE ON messages BEGIN DELETE FROM messages_fts WHERE message_id = old.message_id; INSERT INTO messages_fts (message_id, content) VALUES (new.message_id, new.content); END`,