diff --git a/internal/proxy/validate_util.go b/internal/proxy/validate_util.go index 206bb6b726..3843b82fff 100644 --- a/internal/proxy/validate_util.go +++ b/internal/proxy/validate_util.go @@ -5,6 +5,7 @@ import ( "math" "reflect" + "github.com/samber/lo" "go.uber.org/zap" "github.com/milvus-io/milvus-proto/go-api/v2/schemapb" @@ -339,6 +340,11 @@ func (v *validateUtil) fillWithValue(data []*schemapb.FieldData, schema *typeuti return err } + // adapt all valid data for nullable column + if fieldSchema.GetNullable() && len(field.GetValidData()) == 0 { + field.ValidData = lo.RepeatBy(numRows, func(i int) bool { return true }) + } + if fieldSchema.GetDefaultValue() == nil { err = FillWithNullValue(field, fieldSchema, numRows) if err != nil { diff --git a/internal/proxy/validate_util_test.go b/internal/proxy/validate_util_test.go index be31929a90..64b4923c2d 100644 --- a/internal/proxy/validate_util_test.go +++ b/internal/proxy/validate_util_test.go @@ -6277,7 +6277,7 @@ func Test_validateUtil_fillWithValue(t *testing.T) { assert.True(t, flag) }) - t.Run("check the length of ValidData when not has default value", func(t *testing.T) { + t.Run("all_valid_nullable_data_without_validdata", func(t *testing.T) { stringData := []string{"a"} data := []*schemapb.FieldData{ { @@ -6311,6 +6311,44 @@ func Test_validateUtil_fillWithValue(t *testing.T) { err = v.fillWithValue(data, h, 1) + assert.NoError(t, err) + }) + + t.Run("nullable_data_size_not_match", func(t *testing.T) { + stringData := []string{"a"} + data := []*schemapb.FieldData{ + { + FieldName: "test", + Type: schemapb.DataType_VarChar, + Field: &schemapb.FieldData_Scalars{ + Scalars: &schemapb.ScalarField{ + Data: &schemapb.ScalarField_StringData{ + StringData: &schemapb.StringArray{ + Data: stringData, + }, + }, + }, + }, + ValidData: []bool{false}, + }, + } + + schema := &schemapb.CollectionSchema{ + Fields: []*schemapb.FieldSchema{ + { + Name: "test", + DataType: schemapb.DataType_VarChar, + Nullable: true, + }, + }, + } + h, err := typeutil.CreateSchemaHelper(schema) + assert.NoError(t, err) + + v := newValidateUtil() + + err = v.fillWithValue(data, h, 1) + assert.Error(t, err) assert.ErrorIs(t, err, merr.ErrParameterInvalid) })