diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index 41c4b86..a9ccb4d 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -141,21 +141,21 @@ tracker_data_update_create_service (TrackerDataUpdateMetadataContext *context,
 	is_symlink = g_file_test (path, G_FILE_TEST_IS_SYMLINK);
 
 	/* Add data to the context */
-	tracker_data_update_metadata_context_add (context, "ID", id_str);
-	tracker_data_update_metadata_context_add (context, "Path", dirname);
-	tracker_data_update_metadata_context_add (context, "Name", basename);
-	tracker_data_update_metadata_context_add (context, "ServiceTypeID", service_type_id_str);
+	tracker_data_update_metadata_context_add (context, "ID", id_str, NULL);
+	tracker_data_update_metadata_context_add (context, "Path", dirname, NULL);
+	tracker_data_update_metadata_context_add (context, "Name", basename, NULL);
+	tracker_data_update_metadata_context_add (context, "ServiceTypeID", service_type_id_str, NULL);
 	tracker_data_update_metadata_context_add (context, "Mime",
-						  is_dir ? "Folder" : g_hash_table_lookup (metadata, "File:Mime"));
+						  is_dir ? "Folder" : g_hash_table_lookup (metadata, "File:Mime"), NULL);
 	tracker_data_update_metadata_context_add (context, "Size",
-						  g_hash_table_lookup (metadata, "File:Size"));
+						  g_hash_table_lookup (metadata, "File:Size"), NULL);
 	tracker_data_update_metadata_context_add (context, "IsDirectory",
-						  is_dir ? "1" : "0");
+						  is_dir ? "1" : "0", NULL);
 	tracker_data_update_metadata_context_add (context, "IsLink",
-						  is_symlink ? "1" : "0");
+						  is_symlink ? "1" : "0", NULL);
 	tracker_data_update_metadata_context_add (context, "IndexTime",
-						  g_hash_table_lookup (metadata, "File:Modified"));
-	tracker_data_update_metadata_context_add (context, "AuxilaryID", volume_id_str);
+						  g_hash_table_lookup (metadata, "File:Modified"), NULL);
+	tracker_data_update_metadata_context_add (context, "AuxilaryID", volume_id_str, NULL);
 
 	g_free (id_str);
 	g_free (service_type_id_str);
@@ -404,12 +404,12 @@ tracker_data_update_set_metadata (TrackerDataUpdateMetadataContext *context,
 		gchar *column;
 
 		column = g_strdup_printf ("KeyMetadata%d", metadata_key);
-		tracker_data_update_metadata_context_add (context, column, value);
+		tracker_data_update_metadata_context_add (context, column, value, NULL);
 		g_free (column);
 	} else if (tracker_field_get_data_type (field) == TRACKER_FIELD_TYPE_DATE &&
 		   (strcmp (tracker_field_get_name (field), "File:Modified") == 0)) {
 		/* Handle mtime */
-		tracker_data_update_metadata_context_add (context, "IndexTime", value);
+		tracker_data_update_metadata_context_add (context, "IndexTime", value, NULL);
 	}
 
 	collate_key = tracker_ontology_service_get_key_collate (tracker_service_get_name (service),
@@ -417,14 +417,8 @@ tracker_data_update_set_metadata (TrackerDataUpdateMetadataContext *context,
 	if (collate_key > 0) {
 		gchar *val, *collate_val, *column;
 
-		val = tracker_escape_string (value);
-		collate_val = g_strdup_printf ("CollateKey('%s')", val);
 		column = g_strdup_printf ("KeyMetadataCollation%d", collate_key);
-
-		tracker_data_update_metadata_context_add (context, column, collate_val);
-
-		g_free (val);
-		g_free (collate_val);
+		tracker_data_update_metadata_context_add (context, column, value, "CollateKey");
 		g_free (column);
 	}
 
@@ -914,11 +908,23 @@ tracker_data_update_metadata_context_new (TrackerDataUpdateMetadataContextType
 void
 tracker_data_update_metadata_context_add (TrackerDataUpdateMetadataContext *context,
 					  const gchar                      *column,
-					  const gchar                      *value)
+					  const gchar                      *value,
+					  const gchar                      *function)
 {
+	gchar *escaped = tracker_escape_string (value);
+	gchar *wrapped;
+
+	if (!function) {
+		wrapped = g_strdup_printf ("\"%s\"", escaped);
+	} else {
+		wrapped = g_strdup_printf ("%s(\"%s\")", function, escaped);
+	}
+
 	g_hash_table_replace (context->data,
 			      g_strdup (column),
-			      tracker_escape_string (value));
+			      wrapped);
+
+	g_free (escaped);
 }
 
 static void
@@ -953,7 +959,7 @@ tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *co
 
 		/* Ensure we have an ID */
 		id_str = tracker_guint32_to_string (context->id);
-		tracker_data_update_metadata_context_add (context, "ID", id_str);
+		tracker_data_update_metadata_context_add (context, "ID", id_str, NULL);
 		g_free (id_str);
 
 		/* Compose insert SQL query */
@@ -1000,7 +1006,7 @@ tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *co
 			}
 
 			g_string_append_printf (update_query,
-						"%s = '%s'",
+						"%s = %s",
 						column,
 						val);
 			first = FALSE;
@@ -1022,6 +1028,8 @@ tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *co
 		g_warning ("%s", error->message);
 		g_error_free (error);
 	}
+
+	g_free (sql);
 }
 
 void
diff --git a/src/libtracker-data/tracker-data-update.h b/src/libtracker-data/tracker-data-update.h
index 09783e3..d38f8f3 100644
--- a/src/libtracker-data/tracker-data-update.h
+++ b/src/libtracker-data/tracker-data-update.h
@@ -113,7 +113,8 @@ TrackerDataUpdateMetadataContext *
 							 guint                                 id);
 void tracker_data_update_metadata_context_add           (TrackerDataUpdateMetadataContext *context,
 							 const gchar                      *column,
-							 const gchar                      *value);
+							 const gchar                      *value,
+							 const gchar                      *function);
 void tracker_data_update_metadata_context_close         (TrackerDataUpdateMetadataContext *context);
 void tracker_data_update_metadata_context_free          (TrackerDataUpdateMetadataContext *context);