diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-10-10 13:29:12 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-10-10 14:31:04 +0200 |
commit | 5782cf7415370eaf626df772fc6aa41df989ee2f (patch) | |
tree | 369fc8adf241d3aceb06c5b68f55931ea27395c2 | |
parent | 702d56f62a61807b71f85881e959f4f72a28d725 (diff) | |
download | tracker-5782cf7415370eaf626df772fc6aa41df989ee2f.tar.gz |
libtracker-data: Check better for errors in datetime parsing
When parsing iso8601 strings, we may end up with a legit negative
timestamp. Checking for it being negative makes us fail (with no
error!) for dates before the epoch, check the error instead.
Fixes parsing issues with queries with ancient datetimes like:
select ("0100-12-31T21:00:00-03:00"^^xsd:dateTime as ?date) {}
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index cf023cbb8..be046da2a 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -9371,25 +9371,29 @@ prepare_query (TrackerSparql *sparql, return NULL; } } else if (prop_type == TRACKER_PROPERTY_TYPE_DATE) { + GError *inner_error = NULL; gchar *full_str; gdouble datetime; full_str = g_strdup_printf ("%sT00:00:00Z", binding->literal); - datetime = tracker_string_to_date (full_str, NULL, error); + datetime = tracker_string_to_date (full_str, NULL, &inner_error); g_free (full_str); - if (datetime < 0) { + if (inner_error) { + g_propagate_error (error, inner_error); g_object_unref (stmt); return NULL; } tracker_db_statement_bind_int (stmt, i, (int) datetime); } else if (prop_type == TRACKER_PROPERTY_TYPE_DATETIME) { + GError *inner_error = NULL; gdouble datetime; gint offset = 0; - datetime = tracker_string_to_date (binding->literal, offset, error); - if (datetime < 0) { + datetime = tracker_string_to_date (binding->literal, offset, &inner_error); + if (inner_error) { + g_propagate_error (error, inner_error); g_object_unref (stmt); return NULL; } |