Skip to content

Commit bd143e4

Browse files
fix(search_family): Fix crash when no SEPARATOR is specified in the FT.CREATE command (#4205)
fix(search_family): fix(search_family): Fix crash when no SEPARATOR is specified in the FT.CREATE command Signed-off-by: Stepan Bagritsevich <[email protected]>
1 parent 1ceca47 commit bd143e4

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

src/server/search/search_family.cc

+14-3
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,18 @@ search::SchemaField::VectorParams ParseVectorParams(CmdArgParser* parser) {
7272
return params;
7373
}
7474

75-
search::SchemaField::TagParams ParseTagParams(CmdArgParser* parser) {
75+
std::optional<search::SchemaField::TagParams> ParseTagParams(CmdArgParser* parser,
76+
SinkReplyBuilder* builder) {
7677
search::SchemaField::TagParams params{};
7778
while (parser->HasNext()) {
7879
if (parser->Check("SEPARATOR")) {
79-
string_view separator = parser->Next();
80+
std::string_view separator = parser->NextOrDefault();
81+
if (separator.size() != 1) {
82+
builder->SendError(
83+
absl::StrCat("Tag separator must be a single character. Got `", separator, "`"),
84+
kSyntaxErrType);
85+
return std::nullopt;
86+
}
8087
params.separator = separator.front();
8188
continue;
8289
}
@@ -127,7 +134,11 @@ optional<search::Schema> ParseSchemaOrReply(DocIndex::DataType type, CmdArgParse
127134
// Vector fields include: {algorithm} num_args args...
128135
search::SchemaField::ParamsVariant params(monostate{});
129136
if (type == search::SchemaField::TAG) {
130-
params = ParseTagParams(&parser);
137+
auto tag_params = ParseTagParams(&parser, builder);
138+
if (!tag_params) {
139+
return std::nullopt;
140+
}
141+
params = tag_params.value();
131142
} else if (type == search::SchemaField::VECTOR) {
132143
auto vector_params = ParseVectorParams(&parser);
133144
if (parser.HasError()) {

src/server/search/search_family_test.cc

+5
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,11 @@ TEST_F(SearchFamilyTest, Errors) {
332332

333333
// Wrong field type
334334
EXPECT_THAT(Run({"ft.search", "i1", "@foo:lol"}), ErrArg("Wrong access type for field: foo"));
335+
336+
// ft.create index on json schema $.sometag AS sometag TAG SEPARATOR
337+
EXPECT_THAT(Run({"ft.create", "i2", "ON", "JSON", "SCHEMA", "$.sometag", "AS", "sometag", "TAG",
338+
"SEPARATOR"}),
339+
ErrArg("Tag separator must be a single character. Got ``"));
335340
}
336341

337342
TEST_F(SearchFamilyTest, NoPrefix) {

0 commit comments

Comments
 (0)