diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2019-03-02 21:02:02 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2019-03-02 21:02:02 +0100 |
commit | 5dca5b65f3983ee19838c201ae95bf7877a0728c (patch) | |
tree | f43d8d555ead965798340bbcd660155e71147da7 | |
parent | 69c3cf70c9ab94727d7e045576a92853c30e58c3 (diff) | |
parent | d47efdcd88f95b8075a73f1540b5c334e767f06f (diff) | |
download | tracker-5dca5b65f3983ee19838c201ae95bf7877a0728c.tar.gz |
Merge branch 'wip/carlosg/double-precision'
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 30 | ||||
-rw-r--r-- | tests/libtracker-data/tracker-sparql-test.c | 1 | ||||
-rw-r--r-- | tests/libtracker-data/update/delete-where-3.rq | 10 | ||||
-rw-r--r-- | tests/libtracker-data/update/delete-where-query-3.out | 1 | ||||
-rw-r--r-- | tests/libtracker-data/update/delete-where-query-3.rq | 1 |
6 files changed, 43 insertions, 6 deletions
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index 47426f674..c5d2941fc 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -1659,7 +1659,7 @@ string_to_gvalue (const gchar *value, break; case TRACKER_PROPERTY_TYPE_DOUBLE: g_value_init (gvalue, G_TYPE_DOUBLE); - g_value_set_double (gvalue, atof (value)); + g_value_set_double (gvalue, g_ascii_strtod (value, NULL)); break; case TRACKER_PROPERTY_TYPE_DATE: g_value_init (gvalue, G_TYPE_INT64); @@ -1700,7 +1700,9 @@ gvalue_to_string (TrackerPropertyType type, retval = g_value_get_int64 (gvalue) == 0 ? g_strdup ("false") : g_strdup ("true"); break; case TRACKER_PROPERTY_TYPE_DOUBLE: - retval = g_strdup_printf ("%f", g_value_get_double (gvalue)); + retval = g_new0 (char, G_ASCII_DTOSTR_BUF_SIZE); + g_ascii_dtostr (retval, G_ASCII_DTOSTR_BUF_SIZE, + g_value_get_double (gvalue)); break; case TRACKER_PROPERTY_TYPE_DATE: datet = g_value_get_int64 (gvalue); diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 6abdffe28..fcb8a93df 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -1369,8 +1369,9 @@ convert_expression_to_string (TrackerSparql *sparql, switch (type) { case TRACKER_PROPERTY_TYPE_STRING: case TRACKER_PROPERTY_TYPE_INTEGER: - /* Nothing to convert. Do not use CAST to convert integers to - * strings as this breaks use of index when sorting by variable + case TRACKER_PROPERTY_TYPE_DOUBLE: + /* Nothing to convert. Do not use CAST to convert integer/double to + * to string as this breaks use of index when sorting by variable * introduced in select expression */ break; @@ -2612,8 +2613,29 @@ get_solution_for_pattern (TrackerSparql *sparql, while (tracker_db_cursor_iter_next (cursor, NULL, NULL)) { for (i = 0; i < n_cols; i++) { - const gchar *str = tracker_db_cursor_get_string (cursor, i, NULL); - tracker_solution_add_value (solution, str); + GValue value = G_VALUE_INIT; + + tracker_db_cursor_get_value (cursor, i, &value); + + if (G_VALUE_TYPE (&value) == G_TYPE_STRING) { + tracker_solution_add_value (solution, + g_value_get_string (&value)); + } else if (G_VALUE_TYPE (&value) == G_TYPE_INT64) { + gchar *str; + str = g_strdup_printf ("%" G_GINT64_FORMAT, + g_value_get_int64 (&value)); + tracker_solution_add_value (solution, str); + g_free (str); + } else if (G_VALUE_TYPE (&value) == G_TYPE_DOUBLE) { + gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; + g_ascii_dtostr (buf, sizeof (buf), + g_value_get_double (&value)); + tracker_solution_add_value (solution, buf); + } else { + g_assert_not_reached (); + } + + g_value_unset (&value); } } diff --git a/tests/libtracker-data/tracker-sparql-test.c b/tests/libtracker-data/tracker-sparql-test.c index 68bd1f77b..f674782a2 100644 --- a/tests/libtracker-data/tracker-sparql-test.c +++ b/tests/libtracker-data/tracker-sparql-test.c @@ -180,6 +180,7 @@ const TestInfo tests[] = { { "update/delete-data-query-2", "update/delete-data-2", FALSE, TRUE }, { "update/delete-where-query-1", "update/delete-where-1", FALSE, FALSE }, { "update/delete-where-query-2", "update/delete-where-2", FALSE, FALSE }, + { "update/delete-where-query-3", "update/delete-where-3", FALSE, FALSE }, { "update/invalid-insert-where-query-1", "update/invalid-insert-where-1", FALSE, TRUE }, { "update/delete-insert-where-query-1", "update/delete-insert-where-1", FALSE, FALSE }, { "update/delete-insert-where-query-2", "update/delete-insert-where-2", FALSE, FALSE }, diff --git a/tests/libtracker-data/update/delete-where-3.rq b/tests/libtracker-data/update/delete-where-3.rq new file mode 100644 index 000000000..2d236089b --- /dev/null +++ b/tests/libtracker-data/update/delete-where-3.rq @@ -0,0 +1,10 @@ +INSERT DATA { + example:a a example:A ; + example:double 0.333333333333333333333 . + example:b a example:A ; + example:double 0.444444444444444444444 . +} + +DELETE WHERE { + example:a example:double ?o +} diff --git a/tests/libtracker-data/update/delete-where-query-3.out b/tests/libtracker-data/update/delete-where-query-3.out new file mode 100644 index 000000000..14e945cec --- /dev/null +++ b/tests/libtracker-data/update/delete-where-query-3.out @@ -0,0 +1 @@ +"http://example/b" "0.444444444444444" diff --git a/tests/libtracker-data/update/delete-where-query-3.rq b/tests/libtracker-data/update/delete-where-query-3.rq new file mode 100644 index 000000000..ee1e9e4a9 --- /dev/null +++ b/tests/libtracker-data/update/delete-where-query-3.rq @@ -0,0 +1 @@ +SELECT ?s ?o { ?s example:double ?o } |