1
0
Fork 0
mirror of https://github.com/dragonflydb/dragonfly.git synced 2024-12-14 11:58:02 +00:00

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 <stefan@dragonflydb.io>
This commit is contained in:
Stepan Bagritsevich 2024-11-27 16:30:36 +04:00 committed by GitHub
parent 1ceca471be
commit bd143e4b81
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 19 additions and 3 deletions

View file

@ -72,11 +72,18 @@ search::SchemaField::VectorParams ParseVectorParams(CmdArgParser* parser) {
return params;
}
search::SchemaField::TagParams ParseTagParams(CmdArgParser* parser) {
std::optional<search::SchemaField::TagParams> ParseTagParams(CmdArgParser* parser,
SinkReplyBuilder* builder) {
search::SchemaField::TagParams params{};
while (parser->HasNext()) {
if (parser->Check("SEPARATOR")) {
string_view separator = parser->Next();
std::string_view separator = parser->NextOrDefault();
if (separator.size() != 1) {
builder->SendError(
absl::StrCat("Tag separator must be a single character. Got `", separator, "`"),
kSyntaxErrType);
return std::nullopt;
}
params.separator = separator.front();
continue;
}
@ -127,7 +134,11 @@ optional<search::Schema> ParseSchemaOrReply(DocIndex::DataType type, CmdArgParse
// Vector fields include: {algorithm} num_args args...
search::SchemaField::ParamsVariant params(monostate{});
if (type == search::SchemaField::TAG) {
params = ParseTagParams(&parser);
auto tag_params = ParseTagParams(&parser, builder);
if (!tag_params) {
return std::nullopt;
}
params = tag_params.value();
} else if (type == search::SchemaField::VECTOR) {
auto vector_params = ParseVectorParams(&parser);
if (parser.HasError()) {

View file

@ -332,6 +332,11 @@ TEST_F(SearchFamilyTest, Errors) {
// Wrong field type
EXPECT_THAT(Run({"ft.search", "i1", "@foo:lol"}), ErrArg("Wrong access type for field: foo"));
// ft.create index on json schema $.sometag AS sometag TAG SEPARATOR
EXPECT_THAT(Run({"ft.create", "i2", "ON", "JSON", "SCHEMA", "$.sometag", "AS", "sometag", "TAG",
"SEPARATOR"}),
ErrArg("Tag separator must be a single character. Got ``"));
}
TEST_F(SearchFamilyTest, NoPrefix) {