diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-12-01 15:27:32 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-12-24 01:12:53 +0100 |
commit | c33df958d080dd2ee5bc7446ceb61863b2e8d595 (patch) | |
tree | 667843020ff6884d2a0ada80296f2323ec3daeb2 /src/libtracker-sparql/core | |
parent | 99f2917b63212295f561f938100b053c68a298f5 (diff) | |
download | tracker-c33df958d080dd2ee5bc7446ceb61863b2e8d595.tar.gz |
core: Handle error differently
When raising an error if variables are used in INSERT/DELETE DATA
statements (disallowed by the spec), we indirectly rely on
solution_var_map being present (indication that this is an update
with a WHERE clause).
Make things clearer, avoid this dependency on this hashtable
(which will disappear soon), and reference the parts of the spec
that require this behavior.
Diffstat (limited to 'src/libtracker-sparql/core')
-rw-r--r-- | src/libtracker-sparql/core/tracker-sparql.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/src/libtracker-sparql/core/tracker-sparql.c b/src/libtracker-sparql/core/tracker-sparql.c index 46977212b..83259185e 100644 --- a/src/libtracker-sparql/core/tracker-sparql.c +++ b/src/libtracker-sparql/core/tracker-sparql.c @@ -176,6 +176,7 @@ typedef struct gboolean convert_to_string; gboolean in_property_function; gboolean in_relational_expression; + gboolean in_quad_data; struct { GPtrArray *graphs; @@ -5242,9 +5243,11 @@ translate_QuadData (TrackerSparql *sparql, { /* QuadData ::= '{' Quads '}' */ + sparql->current_state->in_quad_data = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_BRACE); _call_rule (sparql, NAMED_RULE_Quads, error); _expect (sparql, RULE_TYPE_LITERAL, LITERAL_CLOSE_BRACE); + sparql->current_state->in_quad_data = FALSE; return TRUE; } @@ -7619,30 +7622,14 @@ translate_VarOrTerm (TrackerSparql *sparql, switch (rule) { case NAMED_RULE_Var: - if (sparql->current_state->type != TRACKER_SPARQL_TYPE_SELECT && - sparql->current_state->type != TRACKER_SPARQL_TYPE_CONSTRUCT && - !sparql->solution_var_map) { - TrackerParserNode *node = sparql->current_state->node; - const gchar *str = "Unknown"; - - /* Find the insert/delete clause, a child of Update1 */ - while (node) { - TrackerParserNode *parent; - const TrackerGrammarRule *rule; - - parent = (TrackerParserNode *) ((GNode *)node)->parent; - rule = tracker_parser_node_get_rule (parent); - - if (tracker_grammar_rule_is_a (rule, RULE_TYPE_RULE, NAMED_RULE_Update1)) { - rule = tracker_parser_node_get_rule (node); - str = rule->string; - break; - } - - node = parent; - } - - _raise (PARSE, "Variables are not allowed in update clause", str); + /* https://www.w3.org/TR/sparql11-query/#sparqlGrammar, point 8 in + * the notes: + * + * The rule QuadData, used in INSERT DATA and DELETE DATA, must + * not allow variables in the quad patterns. + */ + if (sparql->current_state->in_quad_data) { + _raise (PARSE, "Variables are not allowed in INSERT/DELETE DATA", "QuadData"); } _call_rule (sparql, rule, error); |