diff --git a/orm/db.go b/orm/db.go index a5f6471a..7d4833e2 100644 --- a/orm/db.go +++ b/orm/db.go @@ -705,7 +705,13 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi ind.Set(mind) } else { if cnt == 0 { - slice = reflect.New(ind.Type()).Elem() + // you can use a empty & caped container list + // orm will not replace it + if ind.Len() != 0 { + // if container is not empty + // create a new one + slice = reflect.New(ind.Type()).Elem() + } } if isPtr { @@ -718,8 +724,16 @@ func (d *dbBase) ReadBatch(q dbQuerier, qs *querySet, mi *modelInfo, cond *Condi cnt++ } - if one == false && cnt > 0 { - ind.Set(slice) + if one == false { + if cnt > 0 { + ind.Set(slice) + } else { + // when a result is empty and container is nil + // to set a empty container + if ind.IsNil() { + ind.Set(reflect.MakeSlice(ind.Type(), 0, 0)) + } + } } return cnt, nil @@ -1058,12 +1072,24 @@ func (d *dbBase) ReadValues(q dbQuerier, qs *querySet, mi *modelInfo, cond *Cond ) typ := 0 - switch container.(type) { + switch v := container.(type) { case *[]Params: + d := *v + if len(d) == 0 { + maps = d + } typ = 1 case *[]ParamsList: + d := *v + if len(d) == 0 { + lists = d + } typ = 2 case *ParamsList: + d := *v + if len(d) == 0 { + list = d + } typ = 3 default: panic(fmt.Errorf("unsupport read values type `%T`", container)) diff --git a/orm/orm_test.go b/orm/orm_test.go index 25093cf2..5448e032 100644 --- a/orm/orm_test.go +++ b/orm/orm_test.go @@ -696,8 +696,13 @@ func TestAll(t *testing.T) { qs = dORM.QueryTable("user") num, err = qs.Filter("user_name", "nothing").All(&users) - throwFail(t, err) - throwFail(t, AssertIs(num, 0)) + throwFailNow(t, err) + throwFailNow(t, AssertIs(num, 0)) + + var users3 []*User + qs = dORM.QueryTable("user") + num, err = qs.Filter("user_name", "nothing").All(&users3) + throwFailNow(t, AssertIs(users3 == nil, false)) } func TestOne(t *testing.T) {