Refine error message for field not exist (#26331)

Signed-off-by: cai.zhang <cai.zhang@zilliz.com>
This commit is contained in:
cai.zhang 2023-08-21 11:54:21 +08:00 committed by GitHub
parent 8a98a46bbb
commit 2fd52e7fa3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 30 additions and 14 deletions

View File

@ -938,11 +938,16 @@ func (v *ParserVisitor) VisitBitOr(ctx *parser.BitOrContext) interface{} {
func (v *ParserVisitor) getColumnInfoFromJSONIdentifier(identifier string) (*planpb.ColumnInfo, error) {
fieldName := strings.Split(identifier, "[")[0]
nestedPath := make([]string, 0)
jsonField, err := v.schema.GetFieldFromNameDefaultJSON(fieldName)
field, err := v.schema.GetFieldFromNameDefaultJSON(fieldName)
if err != nil {
return nil, err
}
if fieldName != jsonField.Name {
if field.GetDataType() != schemapb.DataType_JSON &&
field.GetDataType() != schemapb.DataType_Array {
errMsg := fmt.Sprintf("%s data type not supported accessed with []", field.GetDataType())
return nil, fmt.Errorf(errMsg)
}
if fieldName != field.Name {
nestedPath = append(nestedPath, fieldName)
}
jsonKeyStr := identifier[len(fieldName):]
@ -961,13 +966,13 @@ func (v *ParserVisitor) getColumnInfoFromJSONIdentifier(identifier string) (*pla
nestedPath = append(nestedPath, path)
}
if typeutil.IsJSONType(jsonField.DataType) && len(nestedPath) == 0 {
if typeutil.IsJSONType(field.DataType) && len(nestedPath) == 0 {
return nil, fmt.Errorf("can not comparisons jsonField directly")
}
return &planpb.ColumnInfo{
FieldId: jsonField.FieldID,
DataType: jsonField.DataType,
FieldId: field.FieldID,
DataType: field.DataType,
NestedPath: nestedPath,
}, nil
}

View File

@ -1543,3 +1543,18 @@ func Test_InvalidJSONContains(t *testing.T) {
})
assert.Error(t, err)
}
func Test_InvalidAccess(t *testing.T) {
schema := newTestSchema()
expr := ""
var err error
expr = `Int64Field["A"] == 123`
_, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{
Topk: 0,
MetricType: "",
SearchParams: "",
RoundDecimal: 0,
})
assert.Error(t, err)
}

View File

@ -268,24 +268,20 @@ func (helper *SchemaHelper) GetFieldFromName(fieldName string) (*schemapb.FieldS
func (helper *SchemaHelper) GetFieldFromNameDefaultJSON(fieldName string) (*schemapb.FieldSchema, error) {
offset, ok := helper.nameOffset[fieldName]
if !ok {
return helper.getDefaultJSONField()
return helper.getDefaultJSONField(fieldName)
}
return helper.schema.Fields[offset], nil
}
func (helper *SchemaHelper) getDefaultJSONField() (*schemapb.FieldSchema, error) {
var field *schemapb.FieldSchema
func (helper *SchemaHelper) getDefaultJSONField(fieldName string) (*schemapb.FieldSchema, error) {
for _, f := range helper.schema.GetFields() {
if f.DataType == schemapb.DataType_JSON && f.IsDynamic {
return f, nil
}
}
if field == nil {
errMsg := "there is no dynamic json field in schema, need to specified field name"
log.Warn(errMsg)
return nil, fmt.Errorf(errMsg)
}
return field, nil
errMsg := fmt.Sprintf("field %s not exist", fieldName)
log.Warn(errMsg)
return nil, fmt.Errorf(errMsg)
}
// GetFieldFromID returns the schema of specified field