diff --git a/src/planner/expression_binder.cpp b/src/planner/expression_binder.cpp index 13a58cbb95..71423ef304 100644 --- a/src/planner/expression_binder.cpp +++ b/src/planner/expression_binder.cpp @@ -737,6 +737,9 @@ SharedPtr ExpressionBinder::BuildMatchSparseExpr(const MatchSpar SharedPtr query_expr = BuildExpression(*expr.query_sparse_expr_, bind_context_ptr, depth, root); + if (expr.topn_ == 0) { + RecoverableError(Status::InvalidParameterValue("topk", std::to_string(expr.topn_), "100")); + } auto bound_match_sparse_expr = MakeShared(std::move(arguments), query_expr, expr.metric_type_, diff --git a/src/storage/knn_index/sparse/bmp_alg.cppm b/src/storage/knn_index/sparse/bmp_alg.cppm index 36c75d6b2c..472e35b9c4 100644 --- a/src/storage/knn_index/sparse/bmp_alg.cppm +++ b/src/storage/knn_index/sparse/bmp_alg.cppm @@ -186,6 +186,9 @@ Pair, Vector> BMPAlg i32 topk, const BmpSearchOptions &options, const Filter &filter) const { + if (topk == 0) { + return {{}, {}}; + } std::shared_lock lock(mtx_, std::defer_lock); if (options.use_lock_) { lock.lock(); diff --git a/src/unit_test/storage/knnindex/knn_sparse/test_bmp_index.cpp b/src/unit_test/storage/knnindex/knn_sparse/test_bmp_index.cpp index 7e47f7ac68..f7eb0dc4de 100644 --- a/src/unit_test/storage/knnindex/knn_sparse/test_bmp_index.cpp +++ b/src/unit_test/storage/knnindex/knn_sparse/test_bmp_index.cpp @@ -55,6 +55,13 @@ class BMPIndexTest : public BaseTest { LocalFileSystem fs; auto test_query = [&](const BMPAlg &index) { + { + SparseMatrixIter iter(query_set); + SparseVecRef vec = iter.val(); + auto [indices, scores] = index.SearchKnn(vec, 0/*topk*/, options); + EXPECT_EQ(indices.size(), 0); + EXPECT_EQ(scores.size(), 0); + } u32 hit_all = 0; u32 total_all = 0; for (SparseMatrixIter iter(query_set); iter.HasNext(); iter.Next()) {