fix: check array field data is nil before getting the type (#33114) (#33311)

issue: https://github.com/milvus-io/milvus/issues/33074
pr: #33114

---------

Signed-off-by: sunby <sunbingyi1992@gmail.com>
pull/33360/head
Bingyi Sun 2024-05-24 09:07:11 +08:00 committed by GitHub
parent e8c9bdfa5c
commit e3f1331c47
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 0 deletions

View File

@ -525,6 +525,9 @@ func (v *validateUtil) checkArrayElement(array *schemapb.ArrayArray, field *sche
switch field.GetElementType() {
case schemapb.DataType_Bool:
for _, row := range array.GetData() {
if row.GetData() == nil {
return merr.WrapErrParameterInvalid("bool array", "nil array", "insert data does not match")
}
actualType := reflect.TypeOf(row.GetData())
if actualType != reflect.TypeOf((*schemapb.ScalarField_BoolData)(nil)) {
return merr.WrapErrParameterInvalid("bool array",
@ -533,6 +536,9 @@ func (v *validateUtil) checkArrayElement(array *schemapb.ArrayArray, field *sche
}
case schemapb.DataType_Int8, schemapb.DataType_Int16, schemapb.DataType_Int32:
for _, row := range array.GetData() {
if row.GetData() == nil {
return merr.WrapErrParameterInvalid("int array", "nil array", "insert data does not match")
}
actualType := reflect.TypeOf(row.GetData())
if actualType != reflect.TypeOf((*schemapb.ScalarField_IntData)(nil)) {
return merr.WrapErrParameterInvalid("int array",
@ -553,6 +559,9 @@ func (v *validateUtil) checkArrayElement(array *schemapb.ArrayArray, field *sche
}
case schemapb.DataType_Int64:
for _, row := range array.GetData() {
if row.GetData() == nil {
return merr.WrapErrParameterInvalid("int64 array", "nil array", "insert data does not match")
}
actualType := reflect.TypeOf(row.GetData())
if actualType != reflect.TypeOf((*schemapb.ScalarField_LongData)(nil)) {
return merr.WrapErrParameterInvalid("int64 array",
@ -561,6 +570,9 @@ func (v *validateUtil) checkArrayElement(array *schemapb.ArrayArray, field *sche
}
case schemapb.DataType_Float:
for _, row := range array.GetData() {
if row.GetData() == nil {
return merr.WrapErrParameterInvalid("float array", "nil array", "insert data does not match")
}
actualType := reflect.TypeOf(row.GetData())
if actualType != reflect.TypeOf((*schemapb.ScalarField_FloatData)(nil)) {
return merr.WrapErrParameterInvalid("float array",
@ -569,6 +581,9 @@ func (v *validateUtil) checkArrayElement(array *schemapb.ArrayArray, field *sche
}
case schemapb.DataType_Double:
for _, row := range array.GetData() {
if row.GetData() == nil {
return merr.WrapErrParameterInvalid("double array", "nil array", "insert data does not match")
}
actualType := reflect.TypeOf(row.GetData())
if actualType != reflect.TypeOf((*schemapb.ScalarField_DoubleData)(nil)) {
return merr.WrapErrParameterInvalid("double array",
@ -577,6 +592,9 @@ func (v *validateUtil) checkArrayElement(array *schemapb.ArrayArray, field *sche
}
case schemapb.DataType_VarChar, schemapb.DataType_String:
for _, row := range array.GetData() {
if row.GetData() == nil {
return merr.WrapErrParameterInvalid("string array", "nil array", "insert data does not match")
}
actualType := reflect.TypeOf(row.GetData())
if actualType != reflect.TypeOf((*schemapb.ScalarField_StringData)(nil)) {
return merr.WrapErrParameterInvalid("string array",

View File

@ -11,6 +11,7 @@ import (
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
"github.com/milvus-io/milvus-proto/go-api/v2/schemapb"
"github.com/milvus-io/milvus/pkg/common"
"github.com/milvus-io/milvus/pkg/util/merr"
"github.com/milvus-io/milvus/pkg/util/paramtable"
"github.com/milvus-io/milvus/pkg/util/testutils"
"github.com/milvus-io/milvus/pkg/util/typeutil"
@ -3960,3 +3961,19 @@ func Test_validateUtil_checkDoubleFieldData(t *testing.T) {
},
}, nil))
}
func TestCheckArrayElementNilData(t *testing.T) {
data := &schemapb.ArrayArray{
Data: []*schemapb.ScalarField{nil},
}
fieldSchema := &schemapb.FieldSchema{
Name: "test",
DataType: schemapb.DataType_Array,
ElementType: schemapb.DataType_Int64,
}
v := newValidateUtil()
err := v.checkArrayElement(data, fieldSchema)
assert.True(t, merr.ErrParameterInvalid.Is(err))
}