[tracker/wip/carlosg/blank-node-label-lifetime] libtracker-data: Fix lifetime of blank node labels



commit a6013fe3d92c3f9e6de3baf9a1ff203c1f637e13
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Apr 26 21:53:39 2020 +0200

    libtracker-data: Fix lifetime of blank node labels
    
    According to https://www.w3.org/TR/sparql11-query/#grammarBNodes:
    
      Blank node labels are scoped to the SPARQL Request String in which
      they occur. Different uses of the same blank node label in a request
      string refer to the same blank node.
    
    Scope correctly blank node labels to the full update string, instead
    of each InsertClause within.

 src/libtracker-data/tracker-sparql.c | 18 ++++++------------
 1 file changed, 6 insertions(+), 12 deletions(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index ebc8b6608..781ee469d 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -2293,6 +2293,9 @@ translate_Update (TrackerSparql  *sparql,
         */
        _call_rule (sparql, NAMED_RULE_Prologue, error);
 
+       sparql->current_state.blank_node_map =
+               g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+
        if (_check_in_rule (sparql, NAMED_RULE_Update1)) {
                if (sparql->blank_nodes)
                        g_variant_builder_open (sparql->blank_nodes, G_VARIANT_TYPE ("aa{ss}"));
@@ -2308,6 +2311,9 @@ translate_Update (TrackerSparql  *sparql,
                        _call_rule (sparql, NAMED_RULE_Update, error);
        }
 
+       g_clear_pointer (&sparql->current_state.blank_node_map,
+                        g_hash_table_unref);
+
        return TRUE;
 }
 
@@ -3818,9 +3824,6 @@ translate_InsertData (TrackerSparql  *sparql,
                g_variant_builder_open (sparql->blank_nodes, G_VARIANT_TYPE ("a{ss}"));
        }
 
-       sparql->current_state.blank_node_map =
-               g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
        sparql->current_state.type = TRACKER_SPARQL_TYPE_INSERT;
        _call_rule (sparql, NAMED_RULE_QuadData, error);
 
@@ -3828,9 +3831,6 @@ translate_InsertData (TrackerSparql  *sparql,
                g_variant_builder_close (sparql->blank_nodes);
        }
 
-       g_clear_pointer (&sparql->current_state.blank_node_map,
-                        g_hash_table_unref);
-
        return TRUE;
 }
 
@@ -4155,9 +4155,6 @@ translate_InsertClause (TrackerSparql  *sparql,
                g_variant_builder_open (sparql->blank_nodes, G_VARIANT_TYPE ("a{ss}"));
        }
 
-       sparql->current_state.blank_node_map =
-               g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
        sparql->current_state.type = TRACKER_SPARQL_TYPE_INSERT;
        _expect (sparql, RULE_TYPE_LITERAL, LITERAL_INSERT);
 
@@ -4189,9 +4186,6 @@ translate_InsertClause (TrackerSparql  *sparql,
                g_variant_builder_close (sparql->blank_nodes);
        }
 
-       g_clear_pointer (&sparql->current_state.blank_node_map,
-                        g_hash_table_unref);
-
        return TRUE;
 }
 


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