summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-12-23 23:32:12 +0100
committerCarlos Garnacho <carlosg@gnome.org>2018-12-26 12:56:06 +0100
commit8433d3869a79e2e7bf2fdcf2952f86cfa6a73d22 (patch)
tree370e8f23309602e8eda8693fd8de1f6208570dd7
parent4f6e983291aea0feeafdac64cbec961267a20627 (diff)
downloadtracker-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.c20
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,