[tracker/wip/carlosg/fix-tracker-search: 2/4] libtracker-data: Convert arguments to string in string functions
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker/wip/carlosg/fix-tracker-search: 2/4] libtracker-data: Convert arguments to string in string functions
- Date: Sat, 17 Nov 2018 14:59:26 +0000 (UTC)
commit 22ab599c20d1070041cf708be6c68610592dd8f4
Author: Carlos Garnacho <carlosg gnome org>
Date: Sat Nov 17 15:35:55 2018 +0100
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.
src/libtracker-data/tracker-sparql.c | 41 +++++++++++++++++++++++++++++++++++-
1 file changed, 40 insertions(+), 1 deletion(-)
---
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index b7d519dac..1e903d308 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -4965,6 +4965,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);
@@ -4994,14 +4996,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, "(");
@@ -5020,6 +5025,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);
@@ -5041,6 +5047,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, "(");
@@ -5053,6 +5060,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;
@@ -5060,10 +5068,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);
@@ -5082,6 +5092,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, ") ");
@@ -5182,6 +5193,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, ") ");
@@ -5189,14 +5201,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, ") ");
@@ -5279,7 +5294,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);
@@ -5299,6 +5317,7 @@ handle_function_call (TrackerSparql *sparql,
}
}
+ sparql->current_state.convert_to_string = convert_to_string;
g_free (function);
return handled;
@@ -5407,8 +5426,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)) {
@@ -5464,6 +5487,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);
@@ -5471,12 +5495,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);
@@ -5518,6 +5544,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);
@@ -5525,6 +5552,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);
@@ -5532,6 +5560,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);
@@ -5539,6 +5568,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);
@@ -5546,6 +5576,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);
@@ -5580,6 +5611,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);
@@ -5596,6 +5628,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);
@@ -5616,6 +5649,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);
@@ -5626,6 +5660,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);
@@ -5635,6 +5670,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);
@@ -5696,6 +5732,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);
@@ -5707,6 +5744,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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]