Skip to content

Commit 13a88fd

Browse files
Merge pull request #22 from oracle-samples/delete_tests
Fix soft delete returning test.
2 parents a83001f + 06dcc26 commit 13a88fd

File tree

4 files changed

+20
-25
lines changed

4 files changed

+20
-25
lines changed

oracle/delete.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,22 @@ func Delete(db *gorm.DB) {
9393
addPrimaryKeyWhereClause(db)
9494
}
9595

96+
// redirect soft-delete to update clause with bulk returning
97+
if stmt.Schema != nil {
98+
if deletedAtField := stmt.Schema.LookUpField("deleted_at"); deletedAtField != nil && !stmt.Unscoped {
99+
for _, c := range stmt.Schema.DeleteClauses {
100+
stmt.AddClause(c)
101+
}
102+
delete(stmt.Clauses, "DELETE")
103+
delete(stmt.Clauses, "FROM")
104+
stmt.SQL.Reset()
105+
stmt.Vars = stmt.Vars[:0]
106+
stmt.AddClauseIfNotExists(clause.Update{})
107+
Update(db)
108+
return
109+
}
110+
}
111+
96112
// This prevents soft deletes from bypassing the safety check
97113
checkMissingWhereConditions(db)
98114
if db.Error != nil {
@@ -432,25 +448,7 @@ func executeDelete(db *gorm.DB) {
432448
_, hasReturning := stmt.Clauses["RETURNING"]
433449

434450
if hasReturning {
435-
// For RETURNING, we need to check if it's a soft delete or hard delete
436-
if stmt.Schema != nil {
437-
if deletedAtField := stmt.Schema.LookUpField("deleted_at"); deletedAtField != nil && !stmt.Unscoped {
438-
// Soft delete with RETURNING - use QueryContext
439-
if rows, err := stmt.ConnPool.QueryContext(stmt.Context, stmt.SQL.String(), stmt.Vars...); err == nil {
440-
defer rows.Close()
441-
gorm.Scan(rows, db, gorm.ScanInitialized)
442-
443-
if stmt.Result != nil {
444-
stmt.Result.RowsAffected = db.RowsAffected
445-
}
446-
} else {
447-
db.AddError(err)
448-
}
449-
return
450-
}
451-
}
452-
453-
// Hard delete with RETURNING - use ExecContext (for PL/SQL blocks)
451+
// Hard delete & soft delete with RETURNING - use ExecContext (for PL/SQL blocks)
454452
result, err := stmt.ConnPool.ExecContext(stmt.Context, stmt.SQL.String(), stmt.Vars...)
455453
if err == nil {
456454
db.RowsAffected, _ = result.RowsAffected()

tests/delete_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ func TestDeleteSliceWithAssociations(t *testing.T) {
248248

249249
// only sqlite, postgres, sqlserver support returning
250250
func TestSoftDeleteReturning(t *testing.T) {
251-
t.Skip()
252251
users := []*User{
253252
GetUser("delete-returning-1", Config{}),
254253
GetUser("delete-returning-2", Config{}),
@@ -257,13 +256,13 @@ func TestSoftDeleteReturning(t *testing.T) {
257256
DB.Create(&users)
258257

259258
var results []User
260-
DB.Where("name IN ?", []string{users[0].Name, users[1].Name}).Clauses(clause.Returning{}).Delete(&results)
259+
DB.Where("\"name\" IN ?", []string{users[0].Name, users[1].Name}).Clauses(clause.Returning{}).Delete(&results)
261260
if len(results) != 2 {
262261
t.Errorf("failed to return delete data, got %v", results)
263262
}
264263

265264
var count int64
266-
DB.Model(&User{}).Where("name IN ?", []string{users[0].Name, users[1].Name, users[2].Name}).Count(&count)
265+
DB.Model(&User{}).Where("\"name\" IN ?", []string{users[0].Name, users[1].Name, users[2].Name}).Count(&count)
267266
if count != 1 {
268267
t.Errorf("failed to delete data, current count %v", count)
269268
}

tests/joins_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,6 @@ func TestJoinCount(t *testing.T) {
252252
}
253253

254254
func TestJoinWithSoftDeleted(t *testing.T) {
255-
t.Skip()
256-
257255
user := GetUser("TestJoinWithSoftDeletedUser", Config{Account: true, NamedPet: true})
258256
DB.Create(&user)
259257

tests/passed-tests.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ TestBlockGlobalDelete
7979
TestDeleteWithAssociations
8080
TestDeleteAssociationsWithUnscoped
8181
TestDeleteSliceWithAssociations
82-
#TestSoftDeleteReturning
82+
TestSoftDeleteReturning
8383
TestDeleteReturning
8484
TestDeleteByPrimaryKeyOnly
8585
TestHardDeleteAfterSoftDelete

0 commit comments

Comments
 (0)