summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2021-02-27 12:48:32 +0100
committerCarlos Garnacho <carlosg@gnome.org>2021-02-27 12:55:58 +0100
commit9e023e3b052dcc51c974c365c763e19091c0a37b (patch)
tree12d7612a981027f93bf3216e799e5b0692eaa0e9
parentd8035fe97c435ee8d2b642fbaed2a91828f67368 (diff)
downloadtracker-9e023e3b052dcc51c974c365c763e19091c0a37b.tar.gz
libtracker-data: Detect remote queries with no projected parameters
Querying a service that does not use any variable in its graph pattern is fairly pointless. There are no variables to project into the rest of the query, thus there's no way to match anything with the service graph pattern. In pure SPARQL, that is basically just: SELECT * { SERVICE <...> { } } But since in Tracker we are more lenient wrt giving each projected variable a name, we also have cases like: SELECT * { SERVICE <...> { SELECT 2 { } } } That are anyways pointless to execute. Detect all these cases and send an empty query string instead, the service vtable will behave as expected.
-rw-r--r--src/libtracker-data/tracker-sparql.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index ce33a5ca2..10e04bfd1 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -5196,7 +5196,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;
@@ -5241,7 +5241,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);
@@ -5269,6 +5268,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.
*/
@@ -5289,6 +5291,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, ", ");
@@ -5298,16 +5303,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)) {
@@ -5315,6 +5322,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 */
@@ -5344,7 +5354,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) {