summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2019-03-02 21:02:02 +0100
committerCarlos Garnacho <carlosg@gnome.org>2019-03-02 21:02:02 +0100
commit5dca5b65f3983ee19838c201ae95bf7877a0728c (patch)
treef43d8d555ead965798340bbcd660155e71147da7
parent69c3cf70c9ab94727d7e045576a92853c30e58c3 (diff)
parentd47efdcd88f95b8075a73f1540b5c334e767f06f (diff)
downloadtracker-5dca5b65f3983ee19838c201ae95bf7877a0728c.tar.gz
Merge branch 'wip/carlosg/double-precision'
-rw-r--r--src/libtracker-data/tracker-data-update.c6
-rw-r--r--src/libtracker-data/tracker-sparql.c30
-rw-r--r--tests/libtracker-data/tracker-sparql-test.c1
-rw-r--r--tests/libtracker-data/update/delete-where-3.rq10
-rw-r--r--tests/libtracker-data/update/delete-where-query-3.out1
-rw-r--r--tests/libtracker-data/update/delete-where-query-3.rq1
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 }