From f9a86e9148fab7af0f932d8c1350683087d794a4 Mon Sep 17 00:00:00 2001 From: a631807682 <631807682@qq.com> Date: Thu, 14 Apr 2022 19:14:46 +0800 Subject: [PATCH] fix: FindInBatches Limit zero --- finisher_api.go | 2 +- tests/query_test.go | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/finisher_api.go b/finisher_api.go index bc44dbd4..fb765d33 100644 --- a/finisher_api.go +++ b/finisher_api.go @@ -187,7 +187,7 @@ func (db *DB) FindInBatches(dest interface{}, batchSize int, fc func(tx *DB, bat if limit, ok := c.Expression.(clause.Limit); ok { totalSize = limit.Limit - if batchSize > totalSize { + if totalSize > 0 && batchSize > totalSize { batchSize = totalSize } diff --git a/tests/query_test.go b/tests/query_test.go index 9dd61bab..f66cf83a 100644 --- a/tests/query_test.go +++ b/tests/query_test.go @@ -330,14 +330,24 @@ func TestFindInBatchesWithOffsetLimit(t *testing.T) { AssertEqual(t, results[i], targetUsers[i]) } + var sub1 []User // limit < batchSize - if result := DB.Limit(5).Where("name = ?", users[0].Name).FindInBatches(&sub, 10, func(tx *gorm.DB, batch int) error { + if result := DB.Limit(5).Where("name = ?", users[0].Name).FindInBatches(&sub1, 10, func(tx *gorm.DB, batch int) error { return nil }); result.Error != nil || result.RowsAffected != 5 { t.Errorf("Failed to batch find, got error %v, rows affected: %v", result.Error, result.RowsAffected) } - if result := DB.Limit(4).Where("name = ?", users[0].Name).FindInBatches(&sub, 2, func(tx *gorm.DB, batch int) error { + var sub2 []User + // only offset + if result := DB.Offset(3).Where("name = ?", users[0].Name).FindInBatches(&sub2, 2, func(tx *gorm.DB, batch int) error { + return nil + }); result.Error != nil || result.RowsAffected != 7 { + t.Errorf("Failed to batch find, got error %v, rows affected: %v", result.Error, result.RowsAffected) + } + + var sub3 []User + if result := DB.Limit(4).Where("name = ?", users[0].Name).FindInBatches(&sub3, 2, func(tx *gorm.DB, batch int) error { return nil }); result.Error != nil || result.RowsAffected != 4 { t.Errorf("Failed to batch find, got error %v, rows affected: %v", result.Error, result.RowsAffected)