From 24679618ad442e36f0b5104d1dc2cb68d5f91007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C5=82awomir=20Wojtasiak?= Date: Mon, 31 Mar 2025 09:32:05 +0200 Subject: [PATCH] 7403, a race condition bug fix. --- callbacks/create.go | 4 ++++ callbacks/delete.go | 4 ++++ callbacks/query.go | 4 ++++ callbacks/update.go | 4 ++++ scan.go | 4 ---- 5 files changed, 16 insertions(+), 4 deletions(-) diff --git a/callbacks/create.go b/callbacks/create.go index 8b7846b6..fb087e56 100644 --- a/callbacks/create.go +++ b/callbacks/create.go @@ -86,6 +86,10 @@ func Create(config *Config) func(db *gorm.DB) { ) if db.AddError(err) == nil { defer func() { + // Make sure it's processed and errors are taken into account. + if !rows.Next() { + db.AddError(rows.Err()) + } db.AddError(rows.Close()) }() gorm.Scan(rows, db, mode) diff --git a/callbacks/delete.go b/callbacks/delete.go index 84f446a3..c54ce1dd 100644 --- a/callbacks/delete.go +++ b/callbacks/delete.go @@ -166,6 +166,10 @@ func Delete(config *Config) func(db *gorm.DB) { if rows, err := db.Statement.ConnPool.QueryContext(db.Statement.Context, db.Statement.SQL.String(), db.Statement.Vars...); db.AddError(err) == nil { gorm.Scan(rows, db, mode) + // Make sure it's processed and errors are taken into account. + if !rows.Next() { + db.AddError(rows.Err()) + } db.AddError(rows.Close()) } } diff --git a/callbacks/query.go b/callbacks/query.go index bbf238a9..1f619fc8 100644 --- a/callbacks/query.go +++ b/callbacks/query.go @@ -22,6 +22,10 @@ func Query(db *gorm.DB) { return } defer func() { + // Make sure it's processed and errors are taken into account. + if !rows.Next() { + db.AddError(rows.Err()) + } db.AddError(rows.Close()) }() gorm.Scan(rows, db, 0) diff --git a/callbacks/update.go b/callbacks/update.go index 7cde7f61..44d94ec7 100644 --- a/callbacks/update.go +++ b/callbacks/update.go @@ -91,6 +91,10 @@ func Update(config *Config) func(db *gorm.DB) { db.Statement.Dest = db.Statement.ReflectValue.Addr().Interface() gorm.Scan(rows, db, mode) db.Statement.Dest = dest + // Make sure it's processed and errors are taken into account. + if !rows.Next() { + db.AddError(rows.Err()) + } db.AddError(rows.Close()) } } else { diff --git a/scan.go b/scan.go index 6dc55f62..dd939eae 100644 --- a/scan.go +++ b/scan.go @@ -350,10 +350,6 @@ func Scan(rows Rows, db *DB, mode ScanMode) { } } - if err := rows.Err(); err != nil && err != db.Error { - db.AddError(err) - } - if db.RowsAffected == 0 && db.Statement.RaiseErrorOnNotFound && db.Error == nil { db.AddError(ErrRecordNotFound) }