summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Thursfield <sam@afuera.me.uk>2021-03-02 09:37:03 +0000
committerSam Thursfield <sam@afuera.me.uk>2021-03-02 09:37:03 +0000
commit86a4d087b78732b29dd445d2ea7106397a016a4e (patch)
tree8d585aff13d1df512686cead1b590e0fceb7dbd1
parent54797ce97dfeace9ee4bcd4e176fdacc3ecd908d (diff)
parentf2d2511b5cba7c77432043444eafeab10156b736 (diff)
downloadtracker-86a4d087b78732b29dd445d2ea7106397a016a4e.tar.gz
Merge branch 'wip/carlosg/sparql-corners' into 'master'
Fix some SPARQL corner cases Closes #259 See merge request GNOME/tracker!377
-rw-r--r--src/libtracker-data/tracker-sparql.c134
-rw-r--r--src/libtracker-data/tracker-vtab-service.c10
-rw-r--r--tests/libtracker-data/algebra/modifier-limit-1.out1
-rw-r--r--tests/libtracker-data/algebra/modifier-limit-1.rq1
-rw-r--r--tests/libtracker-data/algebra/modifier-limit-offset-1.out1
-rw-r--r--tests/libtracker-data/algebra/modifier-limit-offset-1.rq1
-rw-r--r--tests/libtracker-data/algebra/modifier-limit-offset-2.out1
-rw-r--r--tests/libtracker-data/algebra/modifier-limit-offset-2.rq2
-rw-r--r--tests/libtracker-data/algebra/modifier-offset-1.out2
-rw-r--r--tests/libtracker-data/algebra/modifier-offset-1.rq1
-rw-r--r--tests/libtracker-data/bind/bind-reused-different-patterns.out2
-rw-r--r--tests/libtracker-data/bind/bind-reused-different-patterns.rq3
-rw-r--r--tests/libtracker-data/error/bind-reused-same-pattern.out0
-rw-r--r--tests/libtracker-data/error/bind-reused-same-pattern.rq3
-rw-r--r--tests/libtracker-data/functions/data-5.ttl19
-rw-r--r--tests/libtracker-data/functions/functions-property-2.out3
-rw-r--r--tests/libtracker-data/functions/functions-property-2.rq8
-rw-r--r--tests/libtracker-data/graph/graph-unbound-1.out2
-rw-r--r--tests/libtracker-data/graph/graph-unbound-1.rq1
-rw-r--r--tests/libtracker-data/graph/graph-unbound-2.out2
-rw-r--r--tests/libtracker-data/graph/graph-unbound-2.rq1
-rw-r--r--tests/libtracker-data/graph/graph-unbound-3.out6
-rw-r--r--tests/libtracker-data/graph/graph-unbound-3.rq1
-rw-r--r--tests/libtracker-data/service/service-empty-1.out0
-rw-r--r--tests/libtracker-data/service/service-empty-1.rq4
-rw-r--r--tests/libtracker-data/service/service-empty-2.out0
-rw-r--r--tests/libtracker-data/service/service-empty-2.rq5
-rw-r--r--tests/libtracker-data/tracker-service-test.c2
-rw-r--r--tests/libtracker-data/tracker-sparql-test.c11
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 },