summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql/core
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-12-01 15:27:32 +0100
committerCarlos Garnacho <carlosg@gnome.org>2022-12-24 01:12:53 +0100
commitc33df958d080dd2ee5bc7446ceb61863b2e8d595 (patch)
tree667843020ff6884d2a0ada80296f2323ec3daeb2 /src/libtracker-sparql/core
parent99f2917b63212295f561f938100b053c68a298f5 (diff)
downloadtracker-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.c35
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);