Fix panic when batch creating from slice contains invalid data, close #3385

This commit is contained in:
Jinzhu 2020-09-03 20:59:41 +08:00
parent 6a86646469
commit 28121d4455
2 changed files with 19 additions and 0 deletions

View File

@ -1,6 +1,7 @@
package callbacks package callbacks
import ( import (
"fmt"
"reflect" "reflect"
"gorm.io/gorm" "gorm.io/gorm"
@ -259,6 +260,11 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) {
for i := 0; i < stmt.ReflectValue.Len(); i++ { for i := 0; i < stmt.ReflectValue.Len(); i++ {
rv := reflect.Indirect(stmt.ReflectValue.Index(i)) rv := reflect.Indirect(stmt.ReflectValue.Index(i))
if !rv.IsValid() {
stmt.AddError(fmt.Errorf("slice data #%v is invalid: %w", i, gorm.ErrInvalidData))
return
}
values.Values[i] = make([]interface{}, len(values.Columns)) values.Values[i] = make([]interface{}, len(values.Columns))
for idx, column := range values.Columns { for idx, column := range values.Columns {
field := stmt.Schema.FieldsByDBName[column.Name] field := stmt.Schema.FieldsByDBName[column.Name]

View File

@ -1,6 +1,7 @@
package tests_test package tests_test
import ( import (
"errors"
"testing" "testing"
"time" "time"
@ -299,6 +300,18 @@ func TestCreateEmptySlice(t *testing.T) {
} }
} }
func TestCreateInvalidSlice(t *testing.T) {
users := []*User{
GetUser("invalid_slice_1", Config{}),
GetUser("invalid_slice_2", Config{}),
nil,
}
if err := DB.Create(&users).Error; !errors.Is(err, gorm.ErrInvalidData) {
t.Errorf("should returns error invalid data when creating from slice that contains invalid data")
}
}
func TestCreateWithExistingTimestamp(t *testing.T) { func TestCreateWithExistingTimestamp(t *testing.T) {
user := User{Name: "CreateUserExistingTimestamp"} user := User{Name: "CreateUserExistingTimestamp"}
curTime := now.MustParse("2016-01-01") curTime := now.MustParse("2016-01-01")