diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-12-25 19:57:59 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2023-01-10 15:36:23 +0100 |
commit | 9dc2f1067c69f38ad7e28329234df725e8fc5db8 (patch) | |
tree | f3ea3dfbd87c651009adbf164481663a8b41da02 /src/libtracker-sparql/core | |
parent | f86f409d6c6810ffb9a7e4c24a170609abbe5ffb (diff) | |
download | tracker-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.c | 29 |
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); |