Skip to content

Commit fcf2ab6

Browse files
committed
Add deleted_at check when soft deleting, fix #3720
1 parent 560d303 commit fcf2ab6

File tree

4 files changed

+14
-2
lines changed

4 files changed

+14
-2
lines changed

callbacks/delete.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func Delete(db *gorm.DB) {
135135
db.Statement.Build("DELETE", "FROM", "WHERE")
136136
}
137137

138-
if _, ok := db.Statement.Clauses["WHERE"]; !db.AllowGlobalUpdate && !ok {
138+
if _, ok := db.Statement.Clauses["WHERE"]; !db.AllowGlobalUpdate && !ok && db.Error == nil {
139139
db.AddError(gorm.ErrMissingWhereClause)
140140
return
141141
}

soft_delete.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ func (sd SoftDeleteDeleteClause) ModifyStatement(stmt *Statement) {
124124
}
125125
}
126126

127+
if _, ok := stmt.Clauses["WHERE"]; !stmt.DB.AllowGlobalUpdate && !ok {
128+
stmt.DB.AddError(ErrMissingWhereClause)
129+
} else {
130+
SoftDeleteQueryClause{Field: sd.Field}.ModifyStatement(stmt)
131+
}
132+
127133
stmt.AddClauseIfNotExists(clause.Update{})
128134
stmt.Build("UPDATE", "SET", "WHERE")
129135
}

tests/delete_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func TestDelete(t *testing.T) {
4949
t.Errorf("errors happened when delete: %v", err)
5050
}
5151

52-
if err := DB.Delete(User{}).Error; err != gorm.ErrMissingWhereClause {
52+
if err := DB.Delete(&User{}).Error; err != gorm.ErrMissingWhereClause {
5353
t.Errorf("errors happened when delete: %v", err)
5454
}
5555

tests/soft_delete_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package tests_test
33
import (
44
"encoding/json"
55
"errors"
6+
"regexp"
67
"testing"
78

89
"gorm.io/gorm"
@@ -28,6 +29,11 @@ func TestSoftDelete(t *testing.T) {
2829
t.Fatalf("No error should happen when soft delete user, but got %v", err)
2930
}
3031

32+
sql := DB.Session(&gorm.Session{DryRun: true}).Delete(&user).Statement.SQL.String()
33+
if !regexp.MustCompile(`UPDATE .users. SET .deleted_at.=.* WHERE .users.\..id. = .* AND .users.\..deleted_at. IS NULL`).MatchString(sql) {
34+
t.Fatalf("invalid sql generated, got %v", sql)
35+
}
36+
3137
if DB.First(&User{}, "name = ?", user.Name).Error == nil {
3238
t.Errorf("Can't find a soft deleted record")
3339
}

0 commit comments

Comments
 (0)