Delete Limit with start will return error because it's not supported by database

This commit is contained in:
Lunny Xiao 2021-04-12 13:09:04 +08:00
parent 7fd6356a85
commit 8ab43f5d08
2 changed files with 55 additions and 0 deletions

View File

@ -70,6 +70,58 @@ func TestDelete(t *testing.T) {
assert.False(t, has)
}
func TestDeleteLimit(t *testing.T) {
assert.NoError(t, PrepareEngine())
type UserinfoDeleteLimit struct {
Uid int64 `xorm:"id pk not null autoincr"`
IsMan bool
}
assert.NoError(t, testEngine.Sync2(new(UserinfoDeleteLimit)))
session := testEngine.NewSession()
defer session.Close()
var err error
if testEngine.Dialect().URI().DBType == schemas.MSSQL {
err = session.Begin()
assert.NoError(t, err)
_, err = session.Exec("SET IDENTITY_INSERT userinfo_delete ON")
assert.NoError(t, err)
}
user := UserinfoDeleteLimit{Uid: 1, IsMan: true}
cnt, err := session.Insert(&user)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
user2 := UserinfoDeleteLimit{Uid: 2}
cnt, err = session.Insert(&user2)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
if testEngine.Dialect().URI().DBType == schemas.MSSQL {
err = session.Commit()
assert.NoError(t, err)
}
cnt, err = testEngine.Limit(1, 1).Delete(&UserinfoDeleteLimit{})
assert.Error(t, err)
assert.EqualValues(t, 0, cnt)
cnt, err = testEngine.Limit(1).Desc("id").Delete(&UserinfoDeleteLimit{})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var users []UserinfoDeleteLimit
err = testEngine.Find(&users)
assert.NoError(t, err)
assert.EqualValues(t, 1, len(users))
assert.EqualValues(t, 1, users[0].Uid)
assert.EqualValues(t, true, users[0].IsMan)
}
func TestDeleted(t *testing.T) {
assert.NoError(t, PrepareEngine())

View File

@ -126,6 +126,9 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
orderSQL += fmt.Sprintf(" ORDER BY %s", session.statement.OrderStr)
}
if pLimitN != nil && *pLimitN > 0 {
if session.statement.Start > 0 {
return 0, fmt.Errorf("Delete with Limit start is unsupported")
}
limitNValue := *pLimitN
orderSQL += fmt.Sprintf(" LIMIT %d", limitNValue)
}