summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-10-10 12:53:10 +0200
committerCarlos Garnacho <carlosg@gnome.org>2020-10-10 14:31:03 +0200
commit702d56f62a61807b71f85881e959f4f72a28d725 (patch)
tree68862bfabe18122dc6ca3b4dc2a02e8111db0279
parentffb2eecda216282ab425ede2a90ed0db8693b4e5 (diff)
downloadtracker-702d56f62a61807b71f85881e959f4f72a28d725.tar.gz
libtracker-data: Use correct binding types for datetimes
When creating a binding from a literal datetime value, we mistakenly use doubles (as used to be the common thing in Tracker 2.x). We now store datetimes as either iso8601 strings or int64 timestamps, so forward these types. This code is in consistence with the update bits at tracker-data-update.c. Fixes select queries like: SELECT ("2020-01-01T01:01:01Z"^^xsd:dateTime AS ?date) { }
-rw-r--r--src/libtracker-data/tracker-sparql.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c
index 2ff43d045..cf023cbb8 100644
--- a/src/libtracker-data/tracker-sparql.c
+++ b/src/libtracker-data/tracker-sparql.c
@@ -21,6 +21,8 @@
#include "config.h"
#include <glib-object.h>
+#include <math.h>
+
#include "tracker-data-query.h"
#include "tracker-string-builder.h"
#include "tracker-sparql.h"
@@ -9384,14 +9386,22 @@ prepare_query (TrackerSparql *sparql,
tracker_db_statement_bind_int (stmt, i, (int) datetime);
} else if (prop_type == TRACKER_PROPERTY_TYPE_DATETIME) {
gdouble datetime;
+ gint offset = 0;
- datetime = tracker_string_to_date (binding->literal, NULL, error);
+ datetime = tracker_string_to_date (binding->literal, offset, error);
if (datetime < 0) {
g_object_unref (stmt);
return NULL;
}
- tracker_db_statement_bind_double (stmt, i, datetime);
+ /* If we have anything that prevents a unix timestamp to be
+ * lossless, we use the ISO8601 string.
+ */
+ if (offset != 0 || floor (datetime) != datetime) {
+ tracker_db_statement_bind_text (stmt, i, binding->literal);
+ } else {
+ tracker_db_statement_bind_int (stmt, i, datetime);
+ }
} else if (prop_type == TRACKER_PROPERTY_TYPE_INTEGER) {
tracker_db_statement_bind_int (stmt, i, atoi (binding->literal));
} else if (prop_type == TRACKER_PROPERTY_TYPE_LANGSTRING &&