diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2018-11-17 15:35:55 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-11-17 16:28:53 +0100 |
commit | fc16c98e8eaa6c4067ab8264d232a655f82103d2 (patch) | |
tree | 1a48ba3c9129c0ec1e6b4cfac9a14a7825c5d379 | |
parent | 9d99c8a46ad4c18de9250476e9145701060f42a1 (diff) | |
download | tracker-fc16c98e8eaa6c4067ab8264d232a655f82103d2.tar.gz |
libtracker-data: Convert arguments to string in string functions
This results in eg. URN strings or ISO8601 dates being passed to
those if used in one such function, instead of ROWIDs or timestamps.
It's unclear how that should behave as per the spec, this is however
what the old parser did, so better to stick to the same implementation
defined behavior.
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index e32a4f2b0..1627486cd 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -4966,6 +4966,8 @@ handle_type_cast (TrackerSparql *sparql, const gchar *function, GError **error) { + sparql->current_state.convert_to_string = TRUE; + if (g_str_equal (function, XSD_NS "string")) { _append_string (sparql, "CAST ("); _call_rule (sparql, NAMED_RULE_ArgList, error); @@ -4995,14 +4997,17 @@ handle_xpath_function (TrackerSparql *sparql, { if (g_str_equal (function, FN_NS "lower-case")) { _append_string (sparql, "SparqlLowerCase ("); + sparql->current_state.convert_to_string = TRUE; _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); } else if (g_str_equal (function, FN_NS "upper-case")) { _append_string (sparql, "SparqlUpperCase ("); + sparql->current_state.convert_to_string = TRUE; _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); } else if (g_str_equal (function, FN_NS "contains")) { /* contains('A','B') => 'A' GLOB '*B*' */ + sparql->current_state.convert_to_string = TRUE; _step (sparql); _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "("); @@ -5021,6 +5026,7 @@ handle_xpath_function (TrackerSparql *sparql, * 0010fffd always sorts last. */ + sparql->current_state.convert_to_string = TRUE; _step (sparql); _append_string (sparql, "( "); _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); @@ -5042,6 +5048,7 @@ handle_xpath_function (TrackerSparql *sparql, sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_BOOLEAN; } else if (g_str_equal (function, FN_NS "ends-with")) { /* strends('A','B') => 'A' GLOB '*B' */ + sparql->current_state.convert_to_string = TRUE; _step (sparql); _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "("); @@ -5054,6 +5061,7 @@ handle_xpath_function (TrackerSparql *sparql, sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_BOOLEAN; } else if (g_str_equal (function, FN_NS "substring")) { _append_string (sparql, "SUBSTR ("); + sparql->current_state.convert_to_string = TRUE; _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING; @@ -5061,10 +5069,12 @@ handle_xpath_function (TrackerSparql *sparql, const gchar *old_sep; old_sep = tracker_sparql_swap_current_expression_list_separator (sparql, " || "); + sparql->current_state.convert_to_string = TRUE; _call_rule (sparql, NAMED_RULE_ArgList, error); tracker_sparql_swap_current_expression_list_separator (sparql, old_sep); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING; } else if (g_str_equal (function, FN_NS "string-join")) { + sparql->current_state.convert_to_string = TRUE; _append_string (sparql, "SparqlStringJoin ("); _step (sparql); _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); @@ -5083,6 +5093,7 @@ handle_xpath_function (TrackerSparql *sparql, _append_string (sparql, ") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING; } else if (g_str_equal (function, FN_NS "replace")) { + sparql->current_state.convert_to_string = TRUE; _append_string (sparql, "SparqlReplace ("); _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); @@ -5183,6 +5194,7 @@ handle_custom_function (TrackerSparql *sparql, TrackerParserNode *node; if (g_str_equal (function, TRACKER_NS "case-fold")) { + sparql->current_state.convert_to_string = TRUE; _append_string (sparql, "SparqlCaseFold ("); _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); @@ -5190,14 +5202,17 @@ handle_custom_function (TrackerSparql *sparql, _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, "COLLATE " TRACKER_TITLE_COLLATION_NAME " "); } else if (g_str_equal (function, TRACKER_NS "ascii-lower-case")) { + sparql->current_state.convert_to_string = TRUE; _append_string (sparql, "lower ("); _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); } else if (g_str_equal (function, TRACKER_NS "normalize")) { + sparql->current_state.convert_to_string = TRUE; _append_string (sparql, "SparqlNormalize ("); _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); } else if (g_str_equal (function, TRACKER_NS "unaccent")) { + sparql->current_state.convert_to_string = TRUE; _append_string (sparql, "SparqlUnaccent ("); _call_rule (sparql, NAMED_RULE_ArgList, error); _append_string (sparql, ") "); @@ -5280,7 +5295,10 @@ handle_function_call (TrackerSparql *sparql, GError **error) { gchar *function = _dup_last_string (sparql); - gboolean handled; + gboolean handled, convert_to_string; + + convert_to_string = sparql->current_state.convert_to_string; + sparql->current_state.convert_to_string = FALSE; if (g_str_has_prefix (function, XSD_NS)) { handled = handle_type_cast (sparql, function, error); @@ -5300,6 +5318,7 @@ handle_function_call (TrackerSparql *sparql, } } + sparql->current_state.convert_to_string = convert_to_string; g_free (function); return handled; @@ -5408,8 +5427,12 @@ static gboolean translate_BuiltInCall (TrackerSparql *sparql, GError **error) { + gboolean convert_to_string; const gchar *old_sep; + convert_to_string = sparql->current_state.convert_to_string; + sparql->current_state.convert_to_string = FALSE; + if (_check_in_rule (sparql, NAMED_RULE_Aggregate)) { _call_rule (sparql, NAMED_RULE_Aggregate, error); } else if (_check_in_rule (sparql, NAMED_RULE_RegexExpression)) { @@ -5465,6 +5488,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _expect (sparql, RULE_TYPE_LITERAL, LITERAL_CLOSE_PARENS); _append_string (sparql, ") "); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_STRLEN)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "LENGTH ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5472,12 +5496,14 @@ translate_BuiltInCall (TrackerSparql *sparql, _append_string (sparql, ") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_INTEGER; } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_UCASE)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlUpperCase ("); _call_rule (sparql, NAMED_RULE_Expression, error); _expect (sparql, RULE_TYPE_LITERAL, LITERAL_CLOSE_PARENS); _append_string (sparql, ") "); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_LCASE)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlLowerCase ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5519,6 +5545,7 @@ translate_BuiltInCall (TrackerSparql *sparql, } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_TZ)) { _unimplemented ("TZ"); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_MD5)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlChecksum ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5526,6 +5553,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _append_string (sparql, ", \"md5\") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING; } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_SHA1)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlChecksum ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5533,6 +5561,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _append_string (sparql, ", \"sha1\") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING; } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_SHA256)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlChecksum ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5540,6 +5569,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _append_string (sparql, ", \"sha256\") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING; } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_SHA384)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlChecksum ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5547,6 +5577,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _append_string (sparql, ", \"sha384\") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_STRING; } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_SHA512)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlChecksum ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5581,6 +5612,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _unimplemented ("LANGMATCHES"); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_CONTAINS)) { /* contains('A','B') => 'A' GLOB '*B*' */ + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5597,6 +5629,7 @@ translate_BuiltInCall (TrackerSparql *sparql, /* strstarts('A','B') => 'A' BETWEEN 'B' AND 'B\u0010fffd' * 0010fffd always sorts last. */ + sparql->current_state.convert_to_string = TRUE; _append_string (sparql, "( "); _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5617,6 +5650,7 @@ translate_BuiltInCall (TrackerSparql *sparql, sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_BOOLEAN; } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_STRENDS)) { /* strends('A','B') => 'A' GLOB '*B' */ + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5627,6 +5661,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _append_string (sparql, ") "); sparql->current_state.expression_type = TRACKER_PROPERTY_TYPE_BOOLEAN; } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_STRBEFORE)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlStringBefore ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5636,6 +5671,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _expect (sparql, RULE_TYPE_LITERAL, LITERAL_CLOSE_PARENS); _append_string (sparql, ") "); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_STRAFTER)) { + sparql->current_state.convert_to_string = TRUE; _expect (sparql, RULE_TYPE_LITERAL, LITERAL_OPEN_PARENS); _append_string (sparql, "SparqlStringAfter ("); _call_rule (sparql, NAMED_RULE_Expression, error); @@ -5697,6 +5733,7 @@ translate_BuiltInCall (TrackerSparql *sparql, _expect (sparql, RULE_TYPE_TERMINAL, TERMINAL_TYPE_NIL); _unimplemented ("STRUUID"); } else if (_accept (sparql, RULE_TYPE_LITERAL, LITERAL_CONCAT)) { + sparql->current_state.convert_to_string = TRUE; old_sep = tracker_sparql_swap_current_expression_list_separator (sparql, " || "); _call_rule (sparql, NAMED_RULE_ExpressionList, error); tracker_sparql_swap_current_expression_list_separator (sparql, old_sep); @@ -5708,6 +5745,8 @@ translate_BuiltInCall (TrackerSparql *sparql, tracker_sparql_swap_current_expression_list_separator (sparql, old_sep); } + sparql->current_state.convert_to_string = convert_to_string; + return TRUE; } |