Skip to content

Commit 954e940

Browse files
authored
fix: field without @ sign in the FT.AGGREGATE command error message fixed (#4955)
fixed: #4935
1 parent 220f20b commit 954e940

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

src/server/search/search_family.cc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -390,16 +390,19 @@ ParseResult<SearchParams> ParseSearchParams(CmdArgParser* parser) {
390390
return params;
391391
}
392392

393-
std::optional<aggregate::SortParams> ParseAggregatorSortParams(CmdArgParser* parser) {
393+
ParseResult<aggregate::SortParams> ParseAggregatorSortParams(CmdArgParser* parser) {
394394
size_t strings_num = parser->Next<size_t>();
395395

396396
aggregate::SortParams sort_params;
397397
sort_params.fields.reserve(strings_num / 2);
398398

399399
while (parser->HasNext() && strings_num > 0) {
400+
std::string_view potential_field =
401+
parser->Peek(); // Peek to get the field name for potential error message
400402
std::optional<std::string_view> parsed_field = ParseFieldWithAtSign(parser);
401403
if (!parsed_field) {
402-
return std::nullopt;
404+
return CreateSyntaxError(
405+
absl::StrCat("SORTBY field name '", potential_field, "' must start with '@'"));
403406
}
404407
strings_num--;
405408

@@ -416,7 +419,7 @@ std::optional<aggregate::SortParams> ParseAggregatorSortParams(CmdArgParser* par
416419
}
417420

418421
if (strings_num) {
419-
return std::nullopt;
422+
return CreateSyntaxError("bad arguments for SORTBY: specified invalid number of strings"sv);
420423
}
421424

422425
if (parser->Check("MAX")) {
@@ -487,7 +490,7 @@ ParseResult<AggregateParams> ParseAggregatorParams(CmdArgParser* parser) {
487490
if (parser->Check("SORTBY")) {
488491
auto sort_params = ParseAggregatorSortParams(parser);
489492
if (!sort_params) {
490-
return CreateSyntaxError("bad arguments for SORTBY: specified invalid number of strings"sv);
493+
return make_unexpected(sort_params.error()); // Propagate the specific error
491494
}
492495

493496
params.steps.push_back(aggregate::MakeSortStep(std::move(sort_params).value()));

src/server/search/search_family_test.cc

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,7 +1060,7 @@ TEST_F(SearchFamilyTest, AggregateGroupByReduceSort) {
10601060
"SORTBY", "1", "count"});
10611061
// clang-format on
10621062

1063-
EXPECT_THAT(resp, ErrArg("bad arguments for SORTBY: specified invalid number of strings"));
1063+
EXPECT_THAT(resp, ErrArg("SORTBY field name 'count' must start with '@'"));
10641064
}
10651065

10661066
TEST_F(SearchFamilyTest, AggregateLoadGroupBy) {
@@ -1700,7 +1700,7 @@ TEST_F(SearchFamilyTest, AggregateResultFields) {
17001700
EXPECT_THAT(resp, IsUnordArrayWithSize(IsMap("a", "1"), IsMap("a", "4"), IsMap("a", "7")));
17011701
absl::SetFlag(&FLAGS_search_reject_legacy_field, true);
17021702
resp = Run({"FT.AGGREGATE", "i1", "*", "SORTBY", "1", "a"});
1703-
EXPECT_THAT(resp, ErrArg("bad arguments for SORTBY: specified invalid number of strings"));
1703+
EXPECT_THAT(resp, ErrArg("SORTBY field name 'a' must start with '@'"));
17041704

17051705
absl::SetFlag(&FLAGS_search_reject_legacy_field, false);
17061706
resp = Run({"FT.AGGREGATE", "i1", "*", "LOAD", "1", "@b", "SORTBY", "1", "a"});
@@ -1709,7 +1709,7 @@ TEST_F(SearchFamilyTest, AggregateResultFields) {
17091709
IsMap("b", "\"8\"", "a", "7")));
17101710
absl::SetFlag(&FLAGS_search_reject_legacy_field, true);
17111711
resp = Run({"FT.AGGREGATE", "i1", "*", "LOAD", "1", "@b", "SORTBY", "1", "a"});
1712-
EXPECT_THAT(resp, ErrArg("bad arguments for SORTBY: specified invalid number of strings"));
1712+
EXPECT_THAT(resp, ErrArg("SORTBY field name 'a' must start with '@'"));
17131713

17141714
absl::SetFlag(&FLAGS_search_reject_legacy_field, false);
17151715
resp = Run({"FT.AGGREGATE", "i1", "*", "SORTBY", "1", "a", "GROUPBY", "2", "@b", "@a", "REDUCE",
@@ -1720,7 +1720,7 @@ TEST_F(SearchFamilyTest, AggregateResultFields) {
17201720
absl::SetFlag(&FLAGS_search_reject_legacy_field, true);
17211721
resp = Run({"FT.AGGREGATE", "i1", "*", "SORTBY", "1", "a", "GROUPBY", "2", "@b", "@a", "REDUCE",
17221722
"COUNT", "0", "AS", "count"});
1723-
EXPECT_THAT(resp, ErrArg("bad arguments for SORTBY: specified invalid number of strings"));
1723+
EXPECT_THAT(resp, ErrArg("SORTBY field name 'a' must start with '@'"));
17241724

17251725
Run({"JSON.SET", "j4", ".", R"({"id":1, "number":4})"});
17261726
Run({"JSON.SET", "j5", ".", R"({"id":2})"});
@@ -1879,6 +1879,29 @@ TEST_F(SearchFamilyTest, AggregateSortByParsingErrors) {
18791879
EXPECT_THAT(resp, ErrArg(kInvalidIntErr));
18801880
}
18811881

1882+
TEST_F(SearchFamilyTest, AggregateSortByParsingErrorsWithoutAt) {
1883+
Run({"JSON.SET", "j1", "$", R"({"name": "first", "number": 1200, "group": "first"})"});
1884+
1885+
Run({"FT.CREATE", "index", "ON", "JSON", "SCHEMA", "$.name", "AS", "name", "TEXT", "$.number",
1886+
"AS", "number", "NUMERIC", "$.group", "AS", "group", "TAG"});
1887+
1888+
// Test SORTBY with field name without '@'
1889+
auto resp = Run({"FT.AGGREGATE", "index", "*", "SORTBY", "1", "name"});
1890+
EXPECT_THAT(resp, ErrArg("SORTBY field name 'name' must start with '@'"));
1891+
1892+
// Test SORTBY with field name without '@' and multiple sort fields
1893+
resp = Run({"FT.AGGREGATE", "index", "*", "SORTBY", "3", "name", "@number", "DESC"});
1894+
EXPECT_THAT(resp, ErrArg("SORTBY field name 'name' must start with '@'"));
1895+
1896+
// Test SORTBY with field name without '@' and MAX option
1897+
resp = Run({"FT.AGGREGATE", "index", "*", "SORTBY", "1", "name", "MAX", "1"});
1898+
EXPECT_THAT(resp, ErrArg("SORTBY field name 'name' must start with '@'"));
1899+
1900+
// Check that the old error still works for wrong number of args
1901+
resp = Run({"FT.AGGREGATE", "index", "*", "SORTBY", "2", "@name"});
1902+
EXPECT_THAT(resp, ErrArg("bad arguments for SORTBY: specified invalid number of strings"));
1903+
}
1904+
18821905
TEST_F(SearchFamilyTest, InvalidSearchOptions) {
18831906
Run({"JSON.SET", "j1", ".", R"({"field1":"first","field2":"second"})"});
18841907
Run({"FT.CREATE", "idx", "ON", "JSON", "SCHEMA", "$.field1", "AS", "field1", "TEXT", "$.field2",

0 commit comments

Comments
 (0)