diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-12-10 03:55:08 +0100 |
---|---|---|
committer | David King <amigadave@amigadave.com> | 2020-12-23 13:00:03 +0000 |
commit | 29a6650f698bbd449e11fc0481269cd8f0593f27 (patch) | |
tree | a44e32ace094f56d0f6b804ac7aabb4058159678 | |
parent | ad23d572a6e68257f88ef4704c3971eb42a55497 (diff) | |
download | tracker-29a6650f698bbd449e11fc0481269cd8f0593f27.tar.gz |
libtracker-data: Avoid deletion of empty rows in FTS table
Starting with SQLite 3.34.0, this turns into a consistency error. Ensure
rows being deleted have actually some content before proceeding to deletion,
and ensure we don't process individual properties one by one in the course
of a whole rdfs:Resource deletion.
Fixes: https://bugs.archlinux.org/task/68903
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 1 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-interface-sqlite.c | 3 |
2 files changed, 3 insertions, 1 deletions
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index e2f46685e..19cae25f9 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -2244,6 +2244,7 @@ cache_delete_resource_type_full (TrackerData *data, g_hash_table_size (data->resource_buffer->tables) == 0) { #if HAVE_TRACKER_FTS tracker_db_interface_sqlite_fts_delete_id (iface, data->resource_buffer->id); + data->resource_buffer->fts_updated = TRUE; #endif /* skip subclass query when deleting whole resource to improve performance */ diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c index da88080ed..cdeb960e7 100644 --- a/src/libtracker-data/tracker-db-interface-sqlite.c +++ b/src/libtracker-data/tracker-db-interface-sqlite.c @@ -1770,7 +1770,8 @@ tracker_db_interface_sqlite_fts_create_delete_all_query (TrackerDBInterface *db_ g_string_append_printf (insert_str, "INSERT INTO fts5 (fts5, rowid %s) " "SELECT 'delete', rowid %s FROM fts_view " - "WHERE rowid = ?", + "WHERE rowid = ? AND COALESCE(NULL %s) IS NOT NULL", + db_interface->fts_properties, db_interface->fts_properties, db_interface->fts_properties); return g_string_free (insert_str, FALSE); |