summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-10-10 13:29:12 +0200
committerCarlos Garnacho <carlosg@gnome.org>2020-10-10 14:31:04 +0200
commit5782cf7415370eaf626df772fc6aa41df989ee2f (patch)
tree369fc8adf241d3aceb06c5b68f55931ea27395c2
parent702d56f62a61807b71f85881e959f4f72a28d725 (diff)
downloadtracker-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.c12
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;
}