From c5b7f4c8642c92f9d5f01a97f39af4c358982935 Mon Sep 17 00:00:00 2001 From: teernisse Date: Wed, 18 Feb 2026 12:39:57 -0500 Subject: [PATCH] (no description set) --- src/search/vector.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/search/vector.rs b/src/search/vector.rs index 1d307fe..5fc0633 100644 --- a/src/search/vector.rs +++ b/src/search/vector.rs @@ -136,6 +136,7 @@ mod tests { #[test] fn test_knn_k_never_exceeds_sqlite_vec_limit() { + // Brute-force: no combination of valid inputs should exceed 4096. for limit in [1, 10, 50, 100, 500, 1000, 1500, 2000, 5000] { for max_chunks in [1, 2, 5, 10, 50, 100, 200, 500, 1000] { let k = compute_knn_k(limit, max_chunks); @@ -149,33 +150,37 @@ mod tests { #[test] fn test_knn_k_reproduces_original_bug_scenario() { + // The original bug: limit=1500 (RECALL_CAP) with multiplier >= 8 + // produced k=10_000 which exceeded sqlite-vec's 4096 cap. let k = compute_knn_k(1500, 1); - assert!( - k <= SQLITE_VEC_KNN_MAX, - "k={k} exceeded 4096 at RECALL_CAP with 1 chunk" - ); + assert!(k <= SQLITE_VEC_KNN_MAX, "k={k} exceeded 4096 at RECALL_CAP with 1 chunk"); } #[test] fn test_knn_k_small_limit_uses_minimum_multiplier() { + // With 1 chunk, multiplier clamps to minimum of 8. let k = compute_knn_k(10, 1); assert_eq!(k, 80); } #[test] fn test_knn_k_high_chunks_caps_multiplier() { + // With 200 chunks, multiplier = (200*3/2 + 1) = 301 → clamped to 200. + // limit=10 * 200 = 2000 < 4096. let k = compute_knn_k(10, 200); assert_eq!(k, 2000); } #[test] fn test_knn_k_zero_max_chunks_treated_as_one() { + // max_chunks_per_doc=0 → unsigned_abs().max(1) = 1 let k = compute_knn_k(10, 0); - assert_eq!(k, 80); + assert_eq!(k, 80); // multiplier clamp(8, 200) → 8 } #[test] fn test_knn_k_negative_max_chunks_uses_absolute() { + // Defensive: negative values use unsigned_abs let k = compute_knn_k(10, -5); assert_eq!(k, compute_knn_k(10, 5)); }