From f6d9ee795984dc500861165bb8747f00be36de46 Mon Sep 17 00:00:00 2001 From: demoManito <1430482733@qq.com> Date: Mon, 11 Mar 2024 12:05:02 +0800 Subject: [PATCH 1/4] fix(scan): array element is set to a zero value --- scan.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scan.go b/scan.go index 54cd6769d..1c161a208 100644 --- a/scan.go +++ b/scan.go @@ -274,7 +274,11 @@ func Scan(rows Rows, db *DB, mode ScanMode) { if !update || reflectValue.Len() == 0 { update = false - if !isArrayKind { + if isArrayKind { + for i := 0; i < reflectValue.Len(); i++ { + reflectValue.Index(i).Set(reflect.Zero(reflectValue.Index(i).Type())) + } + } else { // if the slice cap is externally initialized, the externally initialized slice is directly used here if reflectValue.Cap() == 0 { db.Statement.ReflectValue.Set(reflect.MakeSlice(reflectValue.Type(), 0, 20)) From d57f4f18082ed7ce9e5a371c39b63bcfe58c8981 Mon Sep 17 00:00:00 2001 From: demoManito <1430482733@qq.com> Date: Mon, 11 Mar 2024 13:24:06 +0800 Subject: [PATCH 2/4] add test --- tests/query_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/query_test.go b/tests/query_test.go index e780e3bfe..f9f11ab21 100644 --- a/tests/query_test.go +++ b/tests/query_test.go @@ -1409,3 +1409,22 @@ func TestQueryError(t *testing.T) { }, Value: 1}).Scan(&p2).Error AssertEqual(t, err, gorm.ErrModelValueRequired) } + +func TestQueryScanArray(t *testing.T) { + err := DB.Create(&User{Name: "testname1", Age: 10}).Error + if err != nil { + t.Fatal(err) + } + + users := [2]*User{{Name: "testname2"}, {Name: "testname3"}} + err = DB.Model(&User{}).Where("name = ?", "testname1").Find(&users).Error + if err != nil { + t.Fatal(err) + } + if users[0].Name != "testname1" { + t.Error("users[0] not covere") + } + if users[1].Name != "" { + t.Error("users[1] should be empty") + } +} From 5d68f566d38cb13935fa98708da37a69b33fdc08 Mon Sep 17 00:00:00 2001 From: demoManito <1430482733@qq.com> Date: Mon, 11 Mar 2024 13:27:58 +0800 Subject: [PATCH 3/4] fix test --- tests/query_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/query_test.go b/tests/query_test.go index f9f11ab21..c0259a14a 100644 --- a/tests/query_test.go +++ b/tests/query_test.go @@ -1410,21 +1410,21 @@ func TestQueryError(t *testing.T) { AssertEqual(t, err, gorm.ErrModelValueRequired) } -func TestQueryScanArray(t *testing.T) { +func TestQueryScanToArray(t *testing.T) { err := DB.Create(&User{Name: "testname1", Age: 10}).Error if err != nil { t.Fatal(err) } - users := [2]*User{{Name: "testname2"}, {Name: "testname3"}} + users := [2]*User{{Name: "1"}, {Name: "2"}} err = DB.Model(&User{}).Where("name = ?", "testname1").Find(&users).Error if err != nil { t.Fatal(err) } - if users[0].Name != "testname1" { + if users[0] == nil || users[0].Name != "testname1" { t.Error("users[0] not covere") } - if users[1].Name != "" { + if users[1] != nil { t.Error("users[1] should be empty") } } From 27318ac628d513692e9956364e70b499067c2e95 Mon Sep 17 00:00:00 2001 From: demoManito <1430482733@qq.com> Date: Mon, 11 Mar 2024 13:35:19 +0800 Subject: [PATCH 4/4] optimization --- scan.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scan.go b/scan.go index 1c161a208..415b9f0d7 100644 --- a/scan.go +++ b/scan.go @@ -275,9 +275,7 @@ func Scan(rows Rows, db *DB, mode ScanMode) { if !update || reflectValue.Len() == 0 { update = false if isArrayKind { - for i := 0; i < reflectValue.Len(); i++ { - reflectValue.Index(i).Set(reflect.Zero(reflectValue.Index(i).Type())) - } + db.Statement.ReflectValue.Set(reflect.Zero(reflectValue.Type())) } else { // if the slice cap is externally initialized, the externally initialized slice is directly used here if reflectValue.Cap() == 0 {