From 70d46f3e233385ad3cc049e51bae315cbad62055 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 15 Jan 2024 14:51:57 +0800 Subject: [PATCH] Fix #2393 --- session_iterate.go | 14 ++++++++++---- tests/session_iterate_test.go | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/session_iterate.go b/session_iterate.go index afb9a7cc..ff42555f 100644 --- a/session_iterate.go +++ b/session_iterate.go @@ -27,6 +27,12 @@ func (session *Session) Iterate(bean interface{}, fun IterFunc) error { defer session.Close() } + session.autoResetStatement = false + defer func() { + session.autoResetStatement = true + session.resetStatement() + }() + if session.statement.LastError != nil { return session.statement.LastError } @@ -64,15 +70,15 @@ func (session *Session) BufferSize(size int) *Session { } func (session *Session) bufferIterate(bean interface{}, fun IterFunc) error { - var bufferSize = session.statement.BufferSize - var pLimitN = session.statement.LimitN + bufferSize := session.statement.BufferSize + pLimitN := session.statement.LimitN if pLimitN != nil && bufferSize > *pLimitN { bufferSize = *pLimitN } - var start = session.statement.Start + start := session.statement.Start v := utils.ReflectValue(bean) sliceType := reflect.SliceOf(v.Type()) - var idx = 0 + idx := 0 session.autoResetStatement = false defer func() { session.autoResetStatement = true diff --git a/tests/session_iterate_test.go b/tests/session_iterate_test.go index f2e36899..f42f724f 100644 --- a/tests/session_iterate_test.go +++ b/tests/session_iterate_test.go @@ -111,4 +111,25 @@ func TestBufferIterate(t *testing.T) { }) assert.NoError(t, err) assert.EqualValues(t, 10, cnt) + + // test reset statement + cnt = 0 + sess := testEngine.NewSession() + defer sess.Close() + // generate: SELECT `id`, `is_man` FROM `user_buffer_iterate` WHERE (`id` <= 10) LIMIT 2 OFFSET 10 [] + err = sess.Where("`id` <= 10").BufferSize(2).Iterate(new(UserBufferIterate), func(i int, bean interface{}) error { + user := bean.(*UserBufferIterate) + assert.EqualValues(t, cnt+1, user.Id) + assert.EqualValues(t, true, user.IsMan) + cnt++ + return nil + }) + assert.NoError(t, err) + assert.EqualValues(t, 10, cnt) + + beans := make([]*UserBufferIterate, 0, 10) + // generate: SELECT `id`, `is_man` FROM `user_buffer_iterate` WHERE (`id` <= 10) AND (`id` >= 10) LIMIT 2 OFFSET 10 [] + err = sess.Where("`id` >= 10").Limit(2).Find(&beans) + assert.NoError(t, err) + assert.Len(t, beans, 2) }