diff --git a/internal/proxy/task_query.go b/internal/proxy/task_query.go index 58b8376f21..076207a739 100644 --- a/internal/proxy/task_query.go +++ b/internal/proxy/task_query.go @@ -394,6 +394,13 @@ func (t *queryTask) PostExecute(ctx context.Context) error { } for _, field := range schema.Fields { if field.FieldID == t.OutputFieldsId[i] { + // deal with the situation that offset equal to or greater than the number of entities + if t.result.FieldsData[i] == nil { + t.result.FieldsData[i], err = typeutil.GenEmptyFieldData(field) + if err != nil { + return err + } + } t.result.FieldsData[i].FieldName = field.Name t.result.FieldsData[i].FieldId = field.FieldID t.result.FieldsData[i].Type = field.DataType diff --git a/internal/proxy/task_query_test.go b/internal/proxy/task_query_test.go index ab3bf81991..3c1a47f5cb 100644 --- a/internal/proxy/task_query_test.go +++ b/internal/proxy/task_query_test.go @@ -200,6 +200,10 @@ func TestQueryTask_all(t *testing.T) { assert.NoError(t, task.Execute(ctx)) + task.queryParams = &queryParams{ + limit: 100, + offset: 100, + } assert.NoError(t, task.PostExecute(ctx)) for i := 0; i < len(task.result.FieldsData); i++ { diff --git a/internal/util/typeutil/gen_empty_field_data.go b/internal/util/typeutil/gen_empty_field_data.go index 013f5b6141..1a9feb576b 100644 --- a/internal/util/typeutil/gen_empty_field_data.go +++ b/internal/util/typeutil/gen_empty_field_data.go @@ -140,7 +140,7 @@ func genEmptyFloatVectorFieldData(field *schemapb.FieldSchema) (*schemapb.FieldD }, nil } -func genEmptyFieldData(field *schemapb.FieldSchema) (*schemapb.FieldData, error) { +func GenEmptyFieldData(field *schemapb.FieldSchema) (*schemapb.FieldData, error) { dataType := field.GetDataType() switch dataType { case schemapb.DataType_Bool: diff --git a/internal/util/typeutil/result_helper.go b/internal/util/typeutil/result_helper.go index 9a4cdb6b17..dd49eeeccb 100644 --- a/internal/util/typeutil/result_helper.go +++ b/internal/util/typeutil/result_helper.go @@ -29,7 +29,7 @@ func FillRetrieveResultIfEmpty(result RetrieveResults, outputFieldIds []int64, s return err } - emptyFieldData, err := genEmptyFieldData(field) + emptyFieldData, err := GenEmptyFieldData(field) if err != nil { return err } diff --git a/internal/util/typeutil/result_helper_test.go b/internal/util/typeutil/result_helper_test.go index ffad286482..f54f89fbeb 100644 --- a/internal/util/typeutil/result_helper_test.go +++ b/internal/util/typeutil/result_helper_test.go @@ -39,7 +39,7 @@ func TestGenEmptyFieldData(t *testing.T) { field := &schemapb.FieldSchema{Name: "field_name", FieldID: 100} for _, dataType := range allTypes { field.DataType = dataType - fieldData, err := genEmptyFieldData(field) + fieldData, err := GenEmptyFieldData(field) assert.NoError(t, err) assert.Equal(t, dataType, fieldData.GetType()) assert.Equal(t, field.GetName(), fieldData.GetFieldName()) @@ -49,21 +49,21 @@ func TestGenEmptyFieldData(t *testing.T) { for _, dataType := range allUnsupportedTypes { field.DataType = dataType - _, err := genEmptyFieldData(field) + _, err := GenEmptyFieldData(field) assert.Error(t, err) } // dim not found for _, dataType := range vectorTypes { field.DataType = dataType - _, err := genEmptyFieldData(field) + _, err := GenEmptyFieldData(field) assert.Error(t, err) } field.TypeParams = []*commonpb.KeyValuePair{{Key: "dim", Value: "128"}} for _, dataType := range vectorTypes { field.DataType = dataType - fieldData, err := genEmptyFieldData(field) + fieldData, err := GenEmptyFieldData(field) assert.NoError(t, err) assert.Equal(t, dataType, fieldData.GetType()) assert.Equal(t, field.GetName(), fieldData.GetFieldName())