[tracker/wip/carlosg/sparql-fixes: 1/6] libtracker-data: Check for variables in the most direct context in SERVICE{}




commit 058d2c2c51385ba9c53940869a6ac349ea65a1ee
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Aug 27 09:31:24 2020 +0200

    libtracker-data: Check for variables in the most direct context in SERVICE{}
    
    When joining the service graph pattern with prior triple data in the same
    context, we are looking for variables to join that are possibly out of the
    current scope.
    
    This shouldn't be the case, and leads to SQL-level errors like:
    
      no such column: Left.v_s
    
    Make it sure we are only joining variables in the scope of the service query,
    which yields the correct results.

 src/libtracker-data/tracker-sparql.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 5cff49755..9eee56547 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -5047,7 +5047,7 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
        gssize pattern_start, pattern_end;
        TrackerParserNode *pattern;
        gchar *pattern_str, *escaped_str, *var_str;
-       TrackerContext *context;
+       TrackerContext *context, *parent;
        GList *variables = NULL;
        GList *variable_rules = NULL, *l;
        GList *join_vars = NULL;
@@ -5066,6 +5066,7 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
        }
 
        context = tracker_triple_context_new ();
+       parent = sparql->current_state.context;
        tracker_sparql_push_context (sparql, context);
 
        _expect (sparql, RULE_TYPE_LITERAL, LITERAL_SERVICE);
@@ -5105,6 +5106,7 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
                const TrackerGrammarRule *rule;
                TrackerBinding *binding;
                TrackerVariable *var;
+               gboolean referenced = FALSE;
 
                rule = tracker_parser_node_get_rule (node);
 
@@ -5113,7 +5115,9 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
                        continue;
 
                var_str = _extract_node_string (node, sparql);
-               var = _extract_node_variable (node, sparql);
+               var = tracker_select_context_ensure_variable (TRACKER_SELECT_CONTEXT (sparql->context),
+                                                             var_str);
+               referenced = tracker_context_lookup_variable_ref (parent, var);
 
                if (g_list_find (variables, var))
                        continue;
@@ -5122,12 +5126,13 @@ translate_ServiceGraphPattern (TrackerSparql  *sparql,
                        _append_string (sparql, ", ");
 
                /* Variable was used before in the graph pattern, preserve
-               * for later so we join on it properly.
-               */
-               if (do_join && tracker_variable_get_sample_binding (var))
+                * for later so we join on it properly.
+                */
+               if (do_join && referenced)
                        join_vars = g_list_prepend (join_vars, var);
 
                variables = g_list_prepend (variables, var);
+               tracker_context_add_variable_ref (sparql->current_state.context, var);
                binding = tracker_variable_binding_new (var, NULL, NULL);
                tracker_binding_set_data_type (binding, TRACKER_PROPERTY_TYPE_STRING);
                _add_binding (sparql, binding);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]