From 68945c6682270f710e64e85e1c3066f1aa0a7803 Mon Sep 17 00:00:00 2001 From: Harpreet Sangar Date: Wed, 15 Nov 2023 19:07:50 +0530 Subject: [PATCH] Add a test case that produces crash in `filter_result_iterator_t::compute_result`. --- src/filter_result_iterator.cpp | 15 ++++----------- test/collection_filtering_test.cpp | 4 ++++ 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/filter_result_iterator.cpp b/src/filter_result_iterator.cpp index 6b45b32f..620a430b 100644 --- a/src/filter_result_iterator.cpp +++ b/src/filter_result_iterator.cpp @@ -1770,22 +1770,15 @@ void filter_result_iterator_t::compute_result() { filter_result_t::or_filter_results(left_it->filter_result, right_it->filter_result, filter_result); } + // In a complex filter query a sub-expression might not match any document while the full expression does match + // at least one document. If the full expression doesn't match any document, we return early in the search. if (filter_result.count == 0) { is_valid = false; - LOG(ERROR) << "filter_result.count is 0 " << filter_node->filter_query; - return; - } else if (result_index != 0) { - result_index = 0; - LOG(ERROR) << "result_index is not 0 " << filter_node->filter_query; - return; - } - - if (result_index >= filter_result.count) { - is_valid = false; - LOG(ERROR) << "result_index is greater than filter_result.count " << filter_node->filter_query; + is_filter_result_initialized = true; return; } + result_index = 0;; seq_id = filter_result.docs[result_index]; is_filter_result_initialized = true; approx_filter_ids_length = filter_result.count; diff --git a/test/collection_filtering_test.cpp b/test/collection_filtering_test.cpp index ec09ad0f..dc7e49c9 100644 --- a/test/collection_filtering_test.cpp +++ b/test/collection_filtering_test.cpp @@ -2116,6 +2116,10 @@ TEST_F(CollectionFilteringTest, ComplexFilterQuery) { {}, sort_fields_desc, {0}, 10, 1, FREQUENCY, {false}).get(); ASSERT_EQ(0, results["hits"].size()); + results = coll->search("*", {"name"}, "(age:>50 && rating:>5) || years:<2000", + {}, sort_fields_desc, {0}, 10, 1, FREQUENCY, {false}).get(); + ASSERT_EQ(2, results["hits"].size()); + results = coll->search("Jeremy", {"name"}, "(age:>50 || rating:>5) && years:<2000", {}, sort_fields_desc, {0}, 10, 1, FREQUENCY, {false}).get(); ASSERT_EQ(2, results["hits"].size());