From 1e7326cd8c8687666263cf997f6120b64f57251e Mon Sep 17 00:00:00 2001 From: devteamaegis Date: Wed, 3 Jun 2026 17:05:43 -0400 Subject: [PATCH] fix(rerankers/mrr): raise ValueError on empty vector_results list (#3469) ## What's broken `MRRReranker.rerank_multivector([])` raises `IndexError: list index out of range`. The crash happens on line 128 (the `all()` type-homogeneity check passes vacuously on an empty iterable) and on line 134 which accesses `vector_results[0]` unconditionally, with no prior guard for an empty list. ## Why it happens `all()` over an empty iterable returns `True`, so the type check silently passes and execution falls through to `vector_results[0]` which crashes. ## Fix Added a two-line guard at the top of `rerank_multivector` that raises a clear `ValueError("vector_results must not be empty")` before any indexing occurs. ## Test Added `test_mrr_reranker_empty_input` in `test_rerankers.py` which calls `rerank_multivector([])` and asserts that a `ValueError` with the message "must not be empty" is raised. Fixes #3468 Co-authored-by: Aegis Dev --- python/python/lancedb/rerankers/mrr.py | 3 +++ python/python/tests/test_rerankers.py | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/python/python/lancedb/rerankers/mrr.py b/python/python/lancedb/rerankers/mrr.py index e2d5d1a97..af5ce778d 100644 --- a/python/python/lancedb/rerankers/mrr.py +++ b/python/python/lancedb/rerankers/mrr.py @@ -125,6 +125,9 @@ class MRRReranker(Reranker): This cannot reuse rerank_hybrid because MRR semantics require treating each vector result as a separate ranking system. """ + if not vector_results: + raise ValueError("vector_results must not be empty") + if not all(isinstance(v, type(vector_results[0])) for v in vector_results): raise ValueError( "All elements in vector_results should be of the same type" diff --git a/python/python/tests/test_rerankers.py b/python/python/tests/test_rerankers.py index c886772bb..5ab24be5d 100644 --- a/python/python/tests/test_rerankers.py +++ b/python/python/tests/test_rerankers.py @@ -344,6 +344,12 @@ def test_mrr_reranker(tmp_path): assert len(result_deduped) == len(result) +def test_mrr_reranker_empty_input(): + reranker = MRRReranker() + with pytest.raises(ValueError, match="must not be empty"): + reranker.rerank_multivector([]) + + def test_rrf_reranker_distance(): data = pa.table( {