@@ -22,6 +22,7 @@ using namespace util;
2222using namespace facade ;
2323
2424ABSL_DECLARE_FLAG (bool , search_reject_legacy_field);
25+ ABSL_DECLARE_FLAG (size_t , search_query_string_bytes);
2526
2627namespace dfly {
2728
@@ -3330,11 +3331,15 @@ TEST_F(SearchFamilyTest, MAXSEARCHRESULTS) {
33303331 " Maximum number of results from ft.search command" , " Value" , " 1" ));
33313332
33323333 resp = Run ({" FT.CONFIG" , " GET" , " *" });
3333- EXPECT_THAT (resp, IsArray (" MAXSEARCHRESULTS" , " 1" ));
3334+ // Should contain MAXSEARCHRESULTS among other search config parameters
3335+ EXPECT_THAT (resp, RespArray (Contains (" MAXSEARCHRESULTS" )));
3336+ EXPECT_THAT (resp, RespArray (Contains (" 1" )));
33343337
33353338 resp = Run ({" FT.CONFIG" , " HELP" , " *" });
3336- EXPECT_THAT (resp, IsArray (" MAXSEARCHRESULTS" , " Description" ,
3337- " Maximum number of results from ft.search command" , " Value" , " 1" ));
3339+ // Should contain MAXSEARCHRESULTS description among other search configs
3340+ EXPECT_THAT (resp.GetVec (),
3341+ Contains (IsArray (" MAXSEARCHRESULTS" , " Description" ,
3342+ " Maximum number of results from ft.search command" , " Value" , " 1" )));
33383343
33393344 // restore normal value for other tests
33403345 Run ({" FT.CONFIG" , " SET" , " MAXSEARCHRESULTS" , " 1000000" });
@@ -3506,4 +3511,41 @@ TEST_F(SearchFamilyTest, HsetOnDifferentDatabasesCrash) {
35063511 EXPECT_THAT (Run ({" FT.SEARCH" , " idx" , " value1" }), AreDocIds (" hash1" ));
35073512}
35083513
3514+ TEST_F (SearchFamilyTest, QueryStringBytesLimit) {
3515+ Run ({" hset" , " doc1" , " name" , " alice" , " age" , " 30" });
3516+ Run ({" hset" , " doc2" , " name" , " bob" , " age" , " 25" });
3517+
3518+ EXPECT_EQ (Run ({" ft.create" , " idx" , " ON" , " HASH" , " SCHEMA" , " name" , " TEXT" , " age" , " NUMERIC" }),
3519+ " OK" );
3520+
3521+ absl::FlagSaver fs;
3522+
3523+ string query = " @name:alice @age:[25 30]" ;
3524+ size_t query_len = query.size ();
3525+
3526+ // Set limit to query_len - 1 (just below query length)
3527+ absl::SetFlag (&FLAGS_search_query_string_bytes, query_len - 1 );
3528+
3529+ auto resp = Run ({" ft.search" , " idx" , query});
3530+ EXPECT_THAT (resp, ErrArg (absl::StrCat (" Query string is too long, max length is " , query_len - 1 ,
3531+ " bytes" )));
3532+
3533+ absl::SetFlag (&FLAGS_search_query_string_bytes, query_len);
3534+
3535+ resp = Run ({" ft.search" , " idx" , query});
3536+ EXPECT_THAT (resp, AreDocIds (" doc1" ));
3537+
3538+ // Test FT.AGGREGATE with same query
3539+ absl::SetFlag (&FLAGS_search_query_string_bytes, query_len - 1 );
3540+
3541+ resp = Run ({" ft.aggregate" , " idx" , query, " LOAD" , " 1" , " name" });
3542+ EXPECT_THAT (resp, ErrArg (absl::StrCat (" Query string is too long, max length is " , query_len - 1 ,
3543+ " bytes" )));
3544+
3545+ absl::SetFlag (&FLAGS_search_query_string_bytes, query_len);
3546+
3547+ resp = Run ({" ft.aggregate" , " idx" , query, " LOAD" , " 1" , " name" });
3548+ EXPECT_THAT (resp, IsUnordArrayWithSize (IsMap (" name" , " alice" )));
3549+ }
3550+
35093551} // namespace dfly
0 commit comments