diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-12-23 23:32:12 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-12-26 12:56:06 +0100 |
commit | 8433d3869a79e2e7bf2fdcf2952f86cfa6a73d22 (patch) | |
tree | 370e8f23309602e8eda8693fd8de1f6208570dd7 | |
parent | 4f6e983291aea0feeafdac64cbec961267a20627 (diff) | |
download | tracker-8433d3869a79e2e7bf2fdcf2952f86cfa6a73d22.tar.gz |
libtracker-data: Gracefully exclude NULL subject/pred/object from resultset
This is mentioned in the spec, and was correctly handled in the previous
parser (although the comment mentioned text from a similar restriction with
CONSTRUCT). Solutions with unbound variables should simply be ignored,
this was kinda the case but just detected through g_return_if_fail() later
on.
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index ccbd2ca74..db60aa822 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -735,7 +735,8 @@ _init_token (TrackerToken *token, const gchar *value; value = g_hash_table_lookup (sparql->solution_var_map, str); - tracker_token_literal_init (token, value); + if (value) + tracker_token_literal_init (token, value); } } else if (tracker_grammar_rule_is_a (rule, RULE_TYPE_TERMINAL, TERMINAL_TYPE_PARAMETERIZED_VAR)) { tracker_token_parameter_init (token, str); @@ -4385,10 +4386,8 @@ translate_GraphNode (TrackerSparql *sparql, */ if (_check_in_rule (sparql, NAMED_RULE_VarOrTerm)) { _call_rule (sparql, NAMED_RULE_VarOrTerm, error); - g_assert (!tracker_token_is_empty (&sparql->current_state.object)); } else if (_check_in_rule (sparql, NAMED_RULE_TriplesNode)) { _call_rule (sparql, NAMED_RULE_TriplesNode, error); - g_assert (!tracker_token_is_empty (&sparql->current_state.object)); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_NULL)) { if (sparql->current_state.type != TRACKER_SPARQL_TYPE_UPDATE) _raise (PARSE, "«NULL» literal is not allowed in this mode", "NULL"); @@ -4397,6 +4396,21 @@ translate_GraphNode (TrackerSparql *sparql, g_assert_not_reached (); } + /* Quoting sparql11-update: + * If any solution produces a triple containing an unbound variable + * or an illegal RDF construct, such as a literal in a subject or + * predicate position, then that triple is not included when processing + * the operation: INSERT will not instantiate new data in the output + * graph, and DELETE will not remove anything. + * + * Updates are a Tracker extension and object may be explicitly NULL. + */ + if (tracker_token_is_empty (&sparql->current_state.subject) || + tracker_token_is_empty (&sparql->current_state.predicate) || + (tracker_token_is_empty (&sparql->current_state.object) && + sparql->current_state.type != TRACKER_SPARQL_TYPE_UPDATE)) + return TRUE; + switch (sparql->current_state.type) { case TRACKER_SPARQL_TYPE_SELECT: _add_quad (sparql, |