diff --git a/internal/parser/planparserv2/parser_visitor.go b/internal/parser/planparserv2/parser_visitor.go index 2cda352498..f509dd1d4e 100644 --- a/internal/parser/planparserv2/parser_visitor.go +++ b/internal/parser/planparserv2/parser_visitor.go @@ -952,7 +952,8 @@ func (v *ParserVisitor) getColumnInfoFromJSONIdentifier(identifier string) (*pla if path == "" { return nil, fmt.Errorf("invalid identifier: %s", identifier) } - if strings.HasPrefix(path, "\"") && strings.HasSuffix(path, "\"") { + if (strings.HasPrefix(path, "\"") && strings.HasSuffix(path, "\"")) || + (strings.HasPrefix(path, "'") && strings.HasSuffix(path, "'")) { path = path[1 : len(path)-1] } else if _, err := strconv.ParseInt(path, 10, 64); err != nil { return nil, fmt.Errorf("json key must be enclosed in double quotes: \"%s\"", path) diff --git a/internal/parser/planparserv2/plan_parser_v2_test.go b/internal/parser/planparserv2/plan_parser_v2_test.go index 06ef4e5b80..3ae3c09e88 100644 --- a/internal/parser/planparserv2/plan_parser_v2_test.go +++ b/internal/parser/planparserv2/plan_parser_v2_test.go @@ -891,6 +891,33 @@ func Test_JSONExpr(t *testing.T) { RoundDecimal: 0, }) assert.NoError(t, err) + + expr = `A['B'] == "abc\"bbb\"cc"` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + + expr = `A['B'] == 'abc"cba'` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) + + expr = `A['B'] == 'abc\"cba'` + _, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{ + Topk: 0, + MetricType: "", + SearchParams: "", + RoundDecimal: 0, + }) + assert.NoError(t, err) } func Test_InvalidExprOnJSONField(t *testing.T) {