diff options
author | Sam Thursfield <sam@afuera.me.uk> | 2021-03-02 09:37:03 +0000 |
---|---|---|
committer | Sam Thursfield <sam@afuera.me.uk> | 2021-03-02 09:37:03 +0000 |
commit | 86a4d087b78732b29dd445d2ea7106397a016a4e (patch) | |
tree | 8d585aff13d1df512686cead1b590e0fceb7dbd1 | |
parent | 54797ce97dfeace9ee4bcd4e176fdacc3ecd908d (diff) | |
parent | f2d2511b5cba7c77432043444eafeab10156b736 (diff) | |
download | tracker-86a4d087b78732b29dd445d2ea7106397a016a4e.tar.gz |
Merge branch 'wip/carlosg/sparql-corners' into 'master'
Fix some SPARQL corner cases
Closes #259
See merge request GNOME/tracker!377
29 files changed, 209 insertions, 18 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 8091aea23..c4aaaaaa9 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -150,6 +150,7 @@ typedef struct gint fts_match_idx; gboolean convert_to_string; + gboolean in_property_function; } TrackerSparqlState; struct _TrackerSparql @@ -790,6 +791,49 @@ tracker_sparql_add_union_graph_subquery_for_class (TrackerSparql *sparql, tracker_sparql_swap_builder (sparql, old); } +static void +tracker_sparql_add_union_graph_subquery_for_named_graphs (TrackerSparql *sparql) +{ + TrackerStringBuilder *old; + gpointer graph_id; + GHashTable *graphs; + GHashTableIter iter; + gboolean first = TRUE; + + if (g_hash_table_lookup (sparql->current_state->union_views, "graphs")) + return; + + g_hash_table_add (sparql->current_state->union_views, g_strdup ("graphs")); + old = tracker_sparql_swap_builder (sparql, sparql->current_state->with_clauses); + + if (tracker_string_builder_is_empty (sparql->current_state->with_clauses)) + _append_string (sparql, "WITH "); + else + _append_string (sparql, ", "); + + graphs = tracker_sparql_get_effective_graphs (sparql); + + _append_string (sparql, "\"unionGraph_graphs\"(graph) AS ("); + + g_hash_table_iter_init (&iter, graphs); + while (g_hash_table_iter_next (&iter, NULL, &graph_id)) { + if (first) + _append_string (sparql, "VALUES "); + else + _append_string (sparql, ", "); + + _append_string_printf (sparql, "(%d) ", GPOINTER_TO_INT (graph_id)); + first = FALSE; + } + + if (g_hash_table_size (graphs) == 0) + _append_string (sparql, "SELECT NULL WHERE FALSE"); + + _append_string (sparql, ") "); + + tracker_sparql_swap_builder (sparql, old); +} + static gint tracker_sparql_find_graph (TrackerSparql *sparql, const gchar *name) @@ -3665,6 +3709,8 @@ translate_LimitOffsetClauses (TrackerSparql *sparql, TRACKER_LITERAL_BINDING (limit)); _append_literal_sql (sparql, TRACKER_LITERAL_BINDING (limit)); g_object_unref (limit); + } else if (offset) { + _append_string (sparql, "LIMIT -1 "); } if (offset) { @@ -5049,7 +5095,9 @@ static gboolean translate_GraphGraphPattern (TrackerSparql *sparql, GError **error) { + TrackerStringBuilder *str, *old; TrackerToken old_graph; + TrackerVariable *graph_var; gboolean do_join; /* GraphGraphPattern ::= 'GRAPH' VarOrIri GroupGraphPattern @@ -5066,10 +5114,37 @@ translate_GraphGraphPattern (TrackerSparql *sparql, _expect (sparql, RULE_TYPE_LITERAL, LITERAL_GRAPH); _call_rule (sparql, NAMED_RULE_VarOrIri, error); + graph_var = _last_node_variable (sparql); _init_token (&sparql->current_state->graph, sparql->current_state->prev_node, sparql); + + str = _append_placeholder (sparql); + _call_rule (sparql, NAMED_RULE_GroupGraphPattern, error); + if (graph_var && !tracker_variable_has_bindings (graph_var)) { + TrackerBinding *binding; + + tracker_sparql_add_union_graph_subquery_for_named_graphs (sparql); + + old = tracker_sparql_swap_builder (sparql, str); + _append_string_printf (sparql, + "SELECT * FROM ( " + "SELECT graph AS %s FROM \"unionGraph_graphs\")," + " (", + tracker_variable_get_sql_expression (graph_var)); + + tracker_sparql_swap_builder (sparql, old); + _append_string (sparql, ") "); + + binding = tracker_variable_binding_new (graph_var, NULL, NULL); + tracker_binding_set_data_type (TRACKER_BINDING (binding), + TRACKER_PROPERTY_TYPE_RESOURCE); + tracker_variable_set_sample_binding (graph_var, + TRACKER_VARIABLE_BINDING (binding)); + g_object_unref (binding); + } + tracker_token_unset (&sparql->current_state->graph); sparql->current_state->graph = old_graph; @@ -5122,7 +5197,7 @@ translate_ServiceGraphPattern (TrackerSparql *sparql, GList *variable_rules = NULL, *l; GList *join_vars = NULL; TrackerToken service; - GString *service_sparql; + GString *service_sparql = NULL; gboolean silent = FALSE, do_join; gint i = 0; @@ -5167,7 +5242,6 @@ translate_ServiceGraphPattern (TrackerSparql *sparql, pattern = _skip_rule (sparql, NAMED_RULE_GroupGraphPattern); _append_string (sparql, "SELECT "); - service_sparql = g_string_new ("SELECT "); variable_rules = extract_variables (sparql, pattern); @@ -5195,6 +5269,9 @@ translate_ServiceGraphPattern (TrackerSparql *sparql, if (i > 0) _append_string (sparql, ", "); + if (!service_sparql) + service_sparql = g_string_new ("SELECT "); + /* Variable was used before in the graph pattern, preserve * for later so we join on it properly. */ @@ -5215,6 +5292,9 @@ translate_ServiceGraphPattern (TrackerSparql *sparql, i++; } + if (variable_rules == NULL) + _append_string (sparql, "* "); + if (tracker_token_get_variable (&service)) { if (variable_rules != NULL) _append_string (sparql, ", "); @@ -5224,16 +5304,18 @@ translate_ServiceGraphPattern (TrackerSparql *sparql, join_vars = g_list_prepend (join_vars, tracker_token_get_variable (&service)); } - tracker_parser_node_get_extents (pattern, &pattern_start, &pattern_end); - pattern_str = g_strndup (&sparql->sparql[pattern_start], pattern_end - pattern_start); - escaped_str = _escape_sql_string (pattern_str, '"'); - g_string_append (service_sparql, escaped_str); - g_list_free (variables); - g_free (pattern_str); - g_free (escaped_str); + if (service_sparql) { + tracker_parser_node_get_extents (pattern, &pattern_start, &pattern_end); + pattern_str = g_strndup (&sparql->sparql[pattern_start], pattern_end - pattern_start); + escaped_str = _escape_sql_string (pattern_str, '"'); + g_string_append (service_sparql, escaped_str); + g_list_free (variables); + g_free (pattern_str); + g_free (escaped_str); + } _append_string_printf (sparql, "FROM tracker_service WHERE query=\"%s\" AND silent=%d ", - service_sparql->str, + service_sparql ? service_sparql->str : "", silent); if (!tracker_token_get_variable (&service)) { @@ -5241,6 +5323,9 @@ translate_ServiceGraphPattern (TrackerSparql *sparql, tracker_token_get_idstring (&service)); } + if (service_sparql) + g_string_free (service_sparql, TRUE); + i = 0; /* Proxy parameters to the virtual table */ @@ -5270,7 +5355,6 @@ translate_ServiceGraphPattern (TrackerSparql *sparql, tracker_token_unset (&service); tracker_sparql_pop_context (sparql, TRUE); - g_string_free (service_sparql, TRUE); g_list_free (variable_rules); if (do_join) { @@ -5312,7 +5396,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 +5422,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 ", @@ -7502,8 +7596,13 @@ handle_property_function (TrackerSparql *sparql, GError **error) { TrackerPropertyType type; + gboolean in_property_function; - if (tracker_property_get_multiple_values (property)) { + in_property_function = sparql->current_state->in_property_function; + sparql->current_state->in_property_function = TRUE; + + if (!in_property_function && + tracker_property_get_multiple_values (property)) { TrackerStringBuilder *str, *old; _append_string (sparql, "(SELECT GROUP_CONCAT ("); @@ -7545,12 +7644,13 @@ handle_property_function (TrackerSparql *sparql, } } - _append_string (sparql, "WHERE ID = "); + _append_string (sparql, "WHERE ID IN ("); _call_rule (sparql, NAMED_RULE_ArgList, error); - _append_string_printf (sparql, "AND \"%s\" IS NOT NULL", + _append_string_printf (sparql, ") AND \"%s\" IS NOT NULL", tracker_property_get_name (property)); _append_string (sparql, ") "); + sparql->current_state->in_property_function = in_property_function; sparql->current_state->expression_type = type; return TRUE; @@ -9324,6 +9424,8 @@ tracker_sparql_new (TrackerDataManager *manager, sparql = g_object_new (TRACKER_TYPE_SPARQL, NULL); sparql->query_type = TRACKER_SPARQL_QUERY_SELECT; sparql->data_manager = g_object_ref (manager); + sparql->generation = tracker_data_manager_get_generation (sparql->data_manager); + if (strcasestr (query, "\\u")) sparql->sparql = tracker_unescape_unichars (query, -1); else diff --git a/src/libtracker-data/tracker-vtab-service.c b/src/libtracker-data/tracker-vtab-service.c index f141bd2a1..469f05f4d 100644 --- a/src/libtracker-data/tracker-vtab-service.c +++ b/src/libtracker-data/tracker-vtab-service.c @@ -296,6 +296,7 @@ service_filter (sqlite3_vtab_cursor *vtab_cursor, TrackerSparqlStatement *statement; GHashTable *names = NULL, *values = NULL; GError *error = NULL; + gboolean empty_query = FALSE; gint i; cursor->finished = FALSE; @@ -354,6 +355,11 @@ service_filter (sqlite3_vtab_cursor *vtab_cursor, TRACKER_SPARQL_ERROR_PARSE, "Query not given to services virtual table"); goto fail; + } else if (*cursor->query == '\0') { + g_clear_pointer (&names, g_hash_table_unref); + g_clear_pointer (&values, g_hash_table_unref); + cursor->finished = TRUE; + return SQLITE_OK; } connection = tracker_data_manager_get_remote_connection (module->data_manager, @@ -389,9 +395,9 @@ fail: g_clear_pointer (&names, g_hash_table_unref); g_clear_pointer (&values, g_hash_table_unref); - if (cursor->silent) { + if (cursor->silent || empty_query) { cursor->finished = TRUE; - g_error_free (error); + g_clear_error (&error); return SQLITE_OK; } else { tracker_service_cursor_set_vtab_error (cursor, error->message); diff --git a/tests/libtracker-data/algebra/modifier-limit-1.out b/tests/libtracker-data/algebra/modifier-limit-1.out new file mode 100644 index 000000000..f27b76c59 --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-limit-1.out @@ -0,0 +1 @@ +"1" diff --git a/tests/libtracker-data/algebra/modifier-limit-1.rq b/tests/libtracker-data/algebra/modifier-limit-1.rq new file mode 100644 index 000000000..2d0e3b986 --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-limit-1.rq @@ -0,0 +1 @@ +SELECT ?a { VALUES ?a { 1 2 3 } } LIMIT 1 diff --git a/tests/libtracker-data/algebra/modifier-limit-offset-1.out b/tests/libtracker-data/algebra/modifier-limit-offset-1.out new file mode 100644 index 000000000..1026c253e --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-limit-offset-1.out @@ -0,0 +1 @@ +"2" diff --git a/tests/libtracker-data/algebra/modifier-limit-offset-1.rq b/tests/libtracker-data/algebra/modifier-limit-offset-1.rq new file mode 100644 index 000000000..5a60710b4 --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-limit-offset-1.rq @@ -0,0 +1 @@ +SELECT ?a { VALUES ?a { 1 2 3 } } LIMIT 1 OFFSET 1 diff --git a/tests/libtracker-data/algebra/modifier-limit-offset-2.out b/tests/libtracker-data/algebra/modifier-limit-offset-2.out new file mode 100644 index 000000000..1026c253e --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-limit-offset-2.out @@ -0,0 +1 @@ +"2" diff --git a/tests/libtracker-data/algebra/modifier-limit-offset-2.rq b/tests/libtracker-data/algebra/modifier-limit-offset-2.rq new file mode 100644 index 000000000..83aefe64e --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-limit-offset-2.rq @@ -0,0 +1,2 @@ +# Try OFFSET/LIMIT ordering +SELECT ?a { VALUES ?a { 1 2 3 } } OFFSET 1 LIMIT 1 diff --git a/tests/libtracker-data/algebra/modifier-offset-1.out b/tests/libtracker-data/algebra/modifier-offset-1.out new file mode 100644 index 000000000..f1861d764 --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-offset-1.out @@ -0,0 +1,2 @@ +"2" +"3" diff --git a/tests/libtracker-data/algebra/modifier-offset-1.rq b/tests/libtracker-data/algebra/modifier-offset-1.rq new file mode 100644 index 000000000..3059b418a --- /dev/null +++ b/tests/libtracker-data/algebra/modifier-offset-1.rq @@ -0,0 +1 @@ +SELECT ?a { VALUES ?a { 1 2 3 } } OFFSET 1 diff --git a/tests/libtracker-data/bind/bind-reused-different-patterns.out b/tests/libtracker-data/bind/bind-reused-different-patterns.out new file mode 100644 index 000000000..e1c03aad4 --- /dev/null +++ b/tests/libtracker-data/bind/bind-reused-different-patterns.out @@ -0,0 +1,2 @@ +"1" +"2" diff --git a/tests/libtracker-data/bind/bind-reused-different-patterns.rq b/tests/libtracker-data/bind/bind-reused-different-patterns.rq new file mode 100644 index 000000000..24a86d6b4 --- /dev/null +++ b/tests/libtracker-data/bind/bind-reused-different-patterns.rq @@ -0,0 +1,3 @@ +# Bound variables are allowed to be reused across different +# group graph patterns. +SELECT ?u { { BIND (1 AS ?u) } UNION { BIND (2 AS ?u) } } diff --git a/tests/libtracker-data/error/bind-reused-same-pattern.out b/tests/libtracker-data/error/bind-reused-same-pattern.out new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/libtracker-data/error/bind-reused-same-pattern.out diff --git a/tests/libtracker-data/error/bind-reused-same-pattern.rq b/tests/libtracker-data/error/bind-reused-same-pattern.rq new file mode 100644 index 000000000..37bf436c7 --- /dev/null +++ b/tests/libtracker-data/error/bind-reused-same-pattern.rq @@ -0,0 +1,3 @@ +# BIND is not allowed to redefine variables already defined +# in the same group graph pattern. +SELECT ?u { BIND (1 AS ?u) . BIND (2 AS ?u) } diff --git a/tests/libtracker-data/functions/data-5.ttl b/tests/libtracker-data/functions/data-5.ttl new file mode 100644 index 000000000..f82135711 --- /dev/null +++ b/tests/libtracker-data/functions/data-5.ttl @@ -0,0 +1,19 @@ +@prefix : <http://example/> . +@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . + +:x a :A . +:x :s "first" . + +:q a :A . +:q :s "second" . + +:ba a :B . +:ba :o "First group" . +:ba :a :x . + +:bb a :B . +:bb :o "Second group" . +:bb :a :q . + +:bc a :B . +:bc :o "Third group" . diff --git a/tests/libtracker-data/functions/functions-property-2.out b/tests/libtracker-data/functions/functions-property-2.out new file mode 100644 index 000000000..0831c62bc --- /dev/null +++ b/tests/libtracker-data/functions/functions-property-2.out @@ -0,0 +1,3 @@ +"http://example/ba" "first" +"http://example/bb" "second" +"http://example/bc" diff --git a/tests/libtracker-data/functions/functions-property-2.rq b/tests/libtracker-data/functions/functions-property-2.rq new file mode 100644 index 000000000..ec3193db5 --- /dev/null +++ b/tests/libtracker-data/functions/functions-property-2.rq @@ -0,0 +1,8 @@ +PREFIX ex: <http://example/> +PREFIX ns: <http://www.w3.org/2005/xpath-functions#> + +SELECT ?b ex:s(ex:a(?b)) +{ + ?b a ex:B ; +} +ORDER BY ?b diff --git a/tests/libtracker-data/graph/graph-unbound-1.out b/tests/libtracker-data/graph/graph-unbound-1.out new file mode 100644 index 000000000..dabff8b9f --- /dev/null +++ b/tests/libtracker-data/graph/graph-unbound-1.out @@ -0,0 +1,2 @@ +"http://example/graphA" +"http://example/graphB" diff --git a/tests/libtracker-data/graph/graph-unbound-1.rq b/tests/libtracker-data/graph/graph-unbound-1.rq new file mode 100644 index 000000000..2ed6176a5 --- /dev/null +++ b/tests/libtracker-data/graph/graph-unbound-1.rq @@ -0,0 +1 @@ +SELECT ?g { GRAPH ?g { } } diff --git a/tests/libtracker-data/graph/graph-unbound-2.out b/tests/libtracker-data/graph/graph-unbound-2.out new file mode 100644 index 000000000..b472b5bf2 --- /dev/null +++ b/tests/libtracker-data/graph/graph-unbound-2.out @@ -0,0 +1,2 @@ +"http://example/graphA" "1" +"http://example/graphB" "1" diff --git a/tests/libtracker-data/graph/graph-unbound-2.rq b/tests/libtracker-data/graph/graph-unbound-2.rq new file mode 100644 index 000000000..34a91b5d7 --- /dev/null +++ b/tests/libtracker-data/graph/graph-unbound-2.rq @@ -0,0 +1 @@ +SELECT ?g ?a { GRAPH ?g { BIND (1 AS ?a) } } ORDER BY ?g ?a diff --git a/tests/libtracker-data/graph/graph-unbound-3.out b/tests/libtracker-data/graph/graph-unbound-3.out new file mode 100644 index 000000000..984ce4453 --- /dev/null +++ b/tests/libtracker-data/graph/graph-unbound-3.out @@ -0,0 +1,6 @@ +"http://example/graphA" "1" +"http://example/graphA" "2" +"http://example/graphA" "3" +"http://example/graphB" "1" +"http://example/graphB" "2" +"http://example/graphB" "3" diff --git a/tests/libtracker-data/graph/graph-unbound-3.rq b/tests/libtracker-data/graph/graph-unbound-3.rq new file mode 100644 index 000000000..a95980fe9 --- /dev/null +++ b/tests/libtracker-data/graph/graph-unbound-3.rq @@ -0,0 +1 @@ +SELECT ?g ?a { GRAPH ?g { VALUES ?a { 1 2 3 } } } ORDER BY ?g ?a diff --git a/tests/libtracker-data/service/service-empty-1.out b/tests/libtracker-data/service/service-empty-1.out new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/libtracker-data/service/service-empty-1.out diff --git a/tests/libtracker-data/service/service-empty-1.rq b/tests/libtracker-data/service/service-empty-1.rq new file mode 100644 index 000000000..476290070 --- /dev/null +++ b/tests/libtracker-data/service/service-empty-1.rq @@ -0,0 +1,4 @@ +SELECT ?u { + SERVICE <dbus:%s> { + } +} diff --git a/tests/libtracker-data/service/service-empty-2.out b/tests/libtracker-data/service/service-empty-2.out new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/libtracker-data/service/service-empty-2.out diff --git a/tests/libtracker-data/service/service-empty-2.rq b/tests/libtracker-data/service/service-empty-2.rq new file mode 100644 index 000000000..688f584b9 --- /dev/null +++ b/tests/libtracker-data/service/service-empty-2.rq @@ -0,0 +1,5 @@ +SELECT ?u { + SERVICE <dbus:%s> { + SELECT 42 { } + } +} diff --git a/tests/libtracker-data/tracker-service-test.c b/tests/libtracker-data/tracker-service-test.c index f2e67e468..5fd33e3f9 100644 --- a/tests/libtracker-data/tracker-service-test.c +++ b/tests/libtracker-data/tracker-service-test.c @@ -43,6 +43,8 @@ const TestInfo tests[] = { { "service/service-union-with-local-2", FALSE }, { "service/service-var-1", FALSE }, { "service/service-var-2", FALSE }, + { "service/service-empty-1", FALSE }, + { "service/service-empty-2", FALSE }, }; static GDBusConnection *dbus_conn = NULL; diff --git a/tests/libtracker-data/tracker-sparql-test.c b/tests/libtracker-data/tracker-sparql-test.c index c2b7d6225..9552d0aa4 100644 --- a/tests/libtracker-data/tracker-sparql-test.c +++ b/tests/libtracker-data/tracker-sparql-test.c @@ -62,6 +62,10 @@ const TestInfo tests[] = { { "algebra/filter-in-4", "algebra/data-2", FALSE }, { "algebra/filter-in-5", "algebra/data-2", FALSE }, { "algebra/var-scope-join-1", "algebra/var-scope-join-1", FALSE }, + { "algebra/modifier-limit-offset-1", "algebra/data-1", FALSE }, + { "algebra/modifier-limit-offset-2", "algebra/data-1", FALSE }, + { "algebra/modifier-limit-1", "algebra/data-1", FALSE }, + { "algebra/modifier-offset-1", "algebra/data-1", FALSE }, { "anon/query", "anon/data", FALSE }, { "anon/query-2", "anon/data", FALSE }, { "anon/query-3", "anon/data", FALSE }, @@ -114,6 +118,7 @@ const TestInfo tests[] = { { "expr-ops/query-unplus-1", "expr-ops/data", FALSE }, { "expr-ops/query-res-1", "expr-ops/data", FALSE }, { "functions/functions-property-1", "functions/data-1", FALSE }, + { "functions/functions-property-2", "functions/data-5", FALSE }, { "functions/functions-tracker-1", "functions/data-1", FALSE }, { "functions/functions-tracker-2", "functions/data-2", FALSE }, { "functions/functions-tracker-3", "functions/data-2", FALSE }, @@ -160,6 +165,9 @@ const TestInfo tests[] = { { "graph/non-existent-1", "graph/data-1", FALSE }, { "graph/non-existent-2", "graph/data-1", FALSE }, { "graph/non-existent-3", "graph/data-1", FALSE }, + { "graph/graph-unbound-1", "graph/data-1", FALSE }, + { "graph/graph-unbound-2", "graph/data-1", FALSE }, + { "graph/graph-unbound-3", "graph/data-1", FALSE }, { "graph/drop", "graph/data-drop", FALSE }, { "graph/drop-non-existent", "graph/data-drop-non-existent", FALSE, TRUE }, { "graph/drop-default", "graph/data-drop-default", FALSE }, @@ -229,6 +237,8 @@ const TestInfo tests[] = { /* Unknown property */ { "error/query-error-2", "error/query-error-2", TRUE, FALSE }, { "error/update-error-query-1", "error/update-error-1", FALSE, TRUE }, + /* Remapping variables in BIND */ + { "error/bind-reused-same-pattern", "error/query-error-1", TRUE, FALSE }, { "turtle/turtle-query-001", "turtle/turtle-data-001", FALSE }, { "turtle/turtle-query-002", "turtle/turtle-data-002", FALSE }, @@ -243,6 +253,7 @@ const TestInfo tests[] = { { "bind/bind5", "bind/data", FALSE }, { "bind/bind6", "bind/data", FALSE }, { "bind/bind7", "bind/data", FALSE }, + { "bind/bind-reused-different-patterns", "bind/data", FALSE }, /* Property paths */ { "property-paths/inverse-path-1", "property-paths/data", FALSE }, { "property-paths/inverse-path-2", "property-paths/data", FALSE }, |