diff --git a/src/core/lock.rs b/src/core/lock.rs index 8abd886..2e43ed2 100644 --- a/src/core/lock.rs +++ b/src/core/lock.rs @@ -121,12 +121,17 @@ impl AppLock { let _ = handle.join(); } - let _ = self.conn.execute( + match self.conn.execute( "DELETE FROM app_locks WHERE name = ? AND owner = ?", (&self.name, &self.owner), - ); - - info!(owner = %self.owner, "Lock released"); + ) { + Ok(_) => info!(owner = %self.owner, "Lock released"), + Err(e) => error!( + owner = %self.owner, + error = %e, + "Failed to release lock; may require --force on next sync" + ), + } } fn start_heartbeat(&mut self) { diff --git a/src/search/filters.rs b/src/search/filters.rs index c615fe8..0d6465a 100644 --- a/src/search/filters.rs +++ b/src/search/filters.rs @@ -98,15 +98,22 @@ pub fn apply_filters( } if !filters.labels.is_empty() { - let placeholders: Vec = (0..filters.labels.len()) + // SQLite has a default limit of 999 bind parameters. + let max_labels = 900_usize.saturating_sub(param_idx); + let label_slice = if filters.labels.len() > max_labels { + &filters.labels[..max_labels] + } else { + &filters.labels + }; + let placeholders: Vec = (0..label_slice.len()) .map(|i| format!("?{}", param_idx + i)) .collect(); sql.push_str(&format!( " AND EXISTS (SELECT 1 FROM document_labels dl WHERE dl.document_id = d.id AND dl.label_name IN ({}) GROUP BY dl.document_id HAVING COUNT(DISTINCT dl.label_name) = {})", placeholders.join(","), - filters.labels.len() + label_slice.len() )); - for label in &filters.labels { + for label in label_slice { params.push(Box::new(label.clone())); param_idx += 1; } diff --git a/src/search/vector.rs b/src/search/vector.rs index d60863e..bb09ec8 100644 --- a/src/search/vector.rs +++ b/src/search/vector.rs @@ -50,8 +50,8 @@ pub fn search_vector( .flat_map(|f| f.to_le_bytes()) .collect(); - let max_chunks = max_chunks_per_document(conn); - let multiplier = ((max_chunks as usize * 3 / 2) + 1).max(8); + let max_chunks = max_chunks_per_document(conn).max(1); + let multiplier = ((max_chunks.unsigned_abs() as usize * 3 / 2) + 1).max(8); let k = limit * multiplier; let mut stmt = conn.prepare(