summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql/core
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-12-25 19:57:59 +0100
committerCarlos Garnacho <carlosg@gnome.org>2023-01-10 15:36:23 +0100
commit9dc2f1067c69f38ad7e28329234df725e8fc5db8 (patch)
treef3ea3dfbd87c651009adbf164481663a8b41da02 /src/libtracker-sparql/core
parentf86f409d6c6810ffb9a7e4c24a170609abbe5ffb (diff)
downloadtracker-9dc2f1067c69f38ad7e28329234df725e8fc5db8.tar.gz
core: Skip empty columns in tracker_triples table
We used to propagate empty values up, just to let the upper layers filter these out. Simply avoid rows with an empty "object" column in the virtual table implementation.
Diffstat (limited to 'src/libtracker-sparql/core')
-rw-r--r--src/libtracker-sparql/core/tracker-vtab-triples.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/libtracker-sparql/core/tracker-vtab-triples.c b/src/libtracker-sparql/core/tracker-vtab-triples.c
index bb0f7f9c5..f3fe7aea1 100644
--- a/src/libtracker-sparql/core/tracker-vtab-triples.c
+++ b/src/libtracker-sparql/core/tracker-vtab-triples.c
@@ -646,24 +646,31 @@ static int
triples_next (sqlite3_vtab_cursor *vtab_cursor)
{
TrackerTriplesCursor *cursor = (TrackerTriplesCursor *) vtab_cursor;
- int rc;
+ int rc, column_count;
- cursor->column++;
cursor->rowid++;
+ column_count = sqlite3_column_count (cursor->stmt);
- if ((cursor->match.idxFlags & IDX_MATCH_PREDICATE_NEG) != 0) {
- TrackerProperty *property;
+ while (cursor->column < column_count) {
+ cursor->column++;
- /* Single valued properties skip the "predicate != ..." here */
- property = get_column_property (cursor, cursor->column);
+ if ((cursor->match.idxFlags & IDX_MATCH_PREDICATE_NEG) != 0) {
+ TrackerProperty *property;
+
+ /* Single valued properties skip the "predicate != ..." here */
+ property = get_column_property (cursor, cursor->column);
- if (property &&
- sqlite3_value_int64 (cursor->match.predicate) ==
- tracker_property_get_id (property))
- cursor->column++;
+ if (property &&
+ sqlite3_value_int64 (cursor->match.predicate) ==
+ tracker_property_get_id (property))
+ cursor->column++;
+ }
+
+ if (sqlite3_column_type (cursor->stmt, cursor->column) != SQLITE_NULL)
+ break;
}
- if (cursor->column < sqlite3_column_count (cursor->stmt))
+ if (cursor->column < column_count)
return SQLITE_OK;
rc = sqlite3_step (cursor->stmt);