diff --git a/internal/util/importutil/numpy_parser.go b/internal/util/importutil/numpy_parser.go index 24df73b70b..a664c47d83 100644 --- a/internal/util/importutil/numpy_parser.go +++ b/internal/util/importutil/numpy_parser.go @@ -271,6 +271,12 @@ func (p *NumpyParser) validateHeader(columnReader *NumpyColumnReader) error { elementType := columnReader.reader.GetType() shape := columnReader.reader.GetShape() + // if user only save an element in a numpy file, the shape list will be empty + if len(shape) == 0 { + log.Error("Numpy parser: the content stored in numpy file is not valid numpy array", + zap.String("fieldName", columnReader.fieldName)) + return fmt.Errorf("the content stored in numpy file is not valid numpy array for field '%s'", columnReader.fieldName) + } columnReader.rowCount = shape[0] // 1. field data type should be consist to numpy data type diff --git a/internal/util/importutil/numpy_parser_test.go b/internal/util/importutil/numpy_parser_test.go index 5ba8b07acc..c62518b253 100644 --- a/internal/util/importutil/numpy_parser_test.go +++ b/internal/util/importutil/numpy_parser_test.go @@ -142,6 +142,26 @@ func Test_NumpyParserValidateHeader(t *testing.T) { err = parser.validateHeader(nil) assert.Error(t, err) + t.Run("not a valid numpy array", func(t *testing.T) { + filePath := TempFilesPath + "invalid.npy" + err = CreateNumpyFile(filePath, "aaa") + assert.Nil(t, err) + + file, err := os.Open(filePath) + assert.Nil(t, err) + defer file.Close() + + adapter, err := NewNumpyAdapter(file) + assert.Nil(t, err) + + columnReader := &NumpyColumnReader{ + fieldName: "invalid", + reader: adapter, + } + err = parser.validateHeader(columnReader) + assert.Error(t, err) + }) + validateHeader := func(data interface{}, fieldSchema *schemapb.FieldSchema) error { filePath := TempFilesPath + fieldSchema.GetName() + ".npy"