(*Session).Iterate for *Session will not reset statement #2393

Closed
opened 2024-01-09 10:59:26 +00:00 by ccbhj · 0 comments
Contributor

It seems that (*Session).Iterate cannot reset statement, causing any Find()/Get() following Iterate() to generate queries contains conditions from the previous Iterate(). See the example (import from integrations/session_iterate_test.go:TestBufferIterate). I wonder whether this is expected, if not I can create an PR to fix it.

	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) // fail here, beans is empty !!!
It seems that (*Session).Iterate cannot reset statement, causing any Find()/Get() following Iterate() to generate queries contains conditions from the previous Iterate(). See the example (import from integrations/session_iterate_test.go:TestBufferIterate). I wonder whether this is expected, if not I can create an PR to fix it. ``` 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) // fail here, beans is empty !!! ```
lunny added the
kind
bug
label 2024-01-15 06:44:10 +00:00
lunny added this to the 1.3.8 milestone 2024-01-15 06:44:13 +00:00
lunny referenced this issue from a commit 2024-01-15 06:52:09 +00:00
lunny modified the milestone from 1.3.8 to 1.3.7 2024-01-15 06:53:55 +00:00
lunny referenced this issue from a commit 2024-01-15 14:06:36 +00:00
lunny closed this issue 2024-01-15 14:06:36 +00:00
lunny referenced this issue from a commit 2024-01-15 14:09:25 +00:00
lunny referenced this issue from a commit 2024-01-15 14:51:09 +00:00
Sign in to join this conversation.
No Milestone
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: xorm/xorm#2393
No description provided.