diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2021-02-26 14:55:29 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2021-02-26 14:55:29 +0100 |
commit | 986b5fea356dbdbb1a9af399f4ef83874166f619 (patch) | |
tree | cff0cb9ca634ac5006a892681fb4d0d6e19678fd | |
parent | be6422f3922485d45f556a0914dbdda8d0fafebc (diff) | |
download | tracker-986b5fea356dbdbb1a9af399f4ef83874166f619.tar.gz |
libtracker-data: Check BIND variable in the current context
As per https://www.w3.org/TR/sparql11-query/#bind:
"The variable introduced by the BIND clause must not have been
used in the group graph pattern up to the point of use in BIND."
We are currently checking that the variable has bindings, but
that's also true if the variable was used in other graph patterns
prior to the current one.
We must check here only in the current context to match that
behavior. This makes queries like:
SELECT ?u { { BIND (1 AS ?u) } UNION { BIND (2 AS ?u) } }
work as expected.
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 8091aea23..6278978ab 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -5312,7 +5312,8 @@ translate_Bind (TrackerSparql *sparql, TrackerVariable *variable; TrackerBinding *binding; TrackerPropertyType type; - gboolean is_empty; + gboolean is_empty, already_defined; + gchar *var_name; /* Bind ::= 'BIND' '(' Expression 'AS' Var ')' */ @@ -5337,9 +5338,18 @@ translate_Bind (TrackerSparql *sparql, _expect (sparql, RULE_TYPE_LITERAL, LITERAL_AS); _call_rule (sparql, NAMED_RULE_Var, error); + /* "The variable introduced by the BIND clause must + * not have been used in the group graph pattern up + * to the point of use in BIND." + */ + var_name = _dup_last_string (sparql); + already_defined = tracker_context_lookup_variable_by_name (sparql->current_state->context, + var_name); + g_free (var_name); + variable = _last_node_variable (sparql); - if (tracker_variable_has_bindings (variable)) + if (already_defined) _raise (PARSE, "Expected undefined variable in BIND", variable->name); _append_string_printf (sparql, "AS %s ", |