summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-12-10 03:55:08 +0100
committerCarlos Garnacho <carlosg@gnome.org>2020-12-10 11:00:50 +0100
commit040e22d005985a19a0dc435a7631f91700804ce4 (patch)
tree566c6b2ca4302903f0d5b72797907f44d6622328
parentc812962f2d9a04ec20017c03d3e895db309b9787 (diff)
downloadtracker-wip/carlosg/fts-with-sqlite-3.34.0.tar.gz
libtracker-data: Avoid deletion of empty rows in FTS tablewip/carlosg/fts-with-sqlite-3.34.0
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.c2
-rw-r--r--src/libtracker-data/tracker-db-interface-sqlite.c5
2 files changed, 5 insertions, 2 deletions
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index e97006631..cb2f39eff 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -1902,6 +1902,8 @@ cache_delete_resource_type_full (TrackerData *data,
if (strcmp (tracker_class_get_uri (class), TRACKER_PREFIX_RDFS "Resource") == 0 &&
g_hash_table_size (data->resource_buffer->tables) == 0) {
tracker_db_interface_sqlite_fts_delete_id (iface, database, data->resource_buffer->id);
+ data->resource_buffer->fts_updated = TRUE;
+
/* 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 260b81d87..f5e91de29 100644
--- a/src/libtracker-data/tracker-db-interface-sqlite.c
+++ b/src/libtracker-data/tracker-db-interface-sqlite.c
@@ -2315,11 +2315,12 @@ tracker_db_interface_sqlite_fts_create_delete_all_query (TrackerDBInterface *db_
g_string_append_printf (insert_str,
"INSERT INTO \"%s\".fts5 (fts5, rowid %s) "
"SELECT 'delete', rowid %s FROM \"%s\".fts_view "
- "WHERE rowid = ?",
+ "WHERE rowid = ? AND COALESCE(NULL %s) IS NOT NULL",
database,
db_interface->fts_properties,
db_interface->fts_properties,
- database);
+ database,
+ db_interface->fts_properties);
return g_string_free (insert_str, FALSE);
}