diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-10-10 12:53:10 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-10-10 14:31:03 +0200 |
commit | 702d56f62a61807b71f85881e959f4f72a28d725 (patch) | |
tree | 68862bfabe18122dc6ca3b4dc2a02e8111db0279 | |
parent | ffb2eecda216282ab425ede2a90ed0db8693b4e5 (diff) | |
download | tracker-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.c | 14 |
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 && |