Merge pull request #4716 from jianzhiyao/master

hotfix:reflect.ValueOf(nil) in getFlatParams
This commit is contained in:
Ming Deng 2021-08-06 00:27:58 +08:00 committed by GitHub
commit 17e857a762
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 53 additions and 34 deletions

View File

@ -8,3 +8,4 @@
- Fix 4383: ORM Adapter produces panic when using orm.RegisterModelWithPrefix. [4386](https://github.com/beego/beego/pull/4386) - Fix 4383: ORM Adapter produces panic when using orm.RegisterModelWithPrefix. [4386](https://github.com/beego/beego/pull/4386)
- Fix 4444: panic when 404 not found. [4446](https://github.com/beego/beego/pull/4446) - Fix 4444: panic when 404 not found. [4446](https://github.com/beego/beego/pull/4446)
- Fix 4435: fix panic when controller dir not found. [4452](https://github.com/beego/beego/pull/4452) - Fix 4435: fix panic when controller dir not found. [4452](https://github.com/beego/beego/pull/4452)
- Hotfix:reflect.ValueOf(nil) in getFlatParams [4716](https://github.com/beego/beego/issues/4716)

View File

@ -58,13 +58,12 @@ func getFlatParams(fi *fieldInfo, args []interface{}, tz *time.Location) (params
outFor: outFor:
for _, arg := range args { for _, arg := range args {
val := reflect.ValueOf(arg)
if arg == nil { if arg == nil {
params = append(params, arg) params = append(params, arg)
continue continue
} }
val := reflect.ValueOf(arg)
kind := val.Kind() kind := val.Kind()
if kind == reflect.Ptr { if kind == reflect.Ptr {
val = val.Elem() val = val.Elem()

View File

@ -332,6 +332,11 @@ func NewPost() *Post {
return obj return obj
} }
type NullValue struct {
ID int `orm:"column(id)"`
Value string `orm:"size(30);null"`
}
type Tag struct { type Tag struct {
ID int `orm:"column(id)"` ID int `orm:"column(id)"`
Name string `orm:"size(30)"` Name string `orm:"size(30)"`

View File

@ -191,6 +191,7 @@ func TestSyncDb(t *testing.T) {
RegisterModel(new(Profile)) RegisterModel(new(Profile))
RegisterModel(new(Post)) RegisterModel(new(Post))
RegisterModel(new(Tag)) RegisterModel(new(Tag))
RegisterModel(new(NullValue))
RegisterModel(new(Comment)) RegisterModel(new(Comment))
RegisterModel(new(UserBig)) RegisterModel(new(UserBig))
RegisterModel(new(PostTags)) RegisterModel(new(PostTags))
@ -217,6 +218,7 @@ func TestRegisterModels(t *testing.T) {
RegisterModel(new(User)) RegisterModel(new(User))
RegisterModel(new(Profile)) RegisterModel(new(Profile))
RegisterModel(new(Post)) RegisterModel(new(Post))
RegisterModel(new(NullValue))
RegisterModel(new(Tag)) RegisterModel(new(Tag))
RegisterModel(new(Comment)) RegisterModel(new(Comment))
RegisterModel(new(UserBig)) RegisterModel(new(UserBig))
@ -1962,69 +1964,81 @@ func TestRawValues(t *testing.T) {
} }
} }
func TestForIssue4709(t *testing.T) {
pre, err := dORM.Raw("INSERT into null_value (value) VALUES (?)").Prepare()
assert.Nil(t, err)
_, err = pre.Exec(nil)
assert.Nil(t, err)
}
func TestRawPrepare(t *testing.T) { func TestRawPrepare(t *testing.T) {
var (
result sql.Result
err error
pre RawPreparer
)
switch { switch {
case IsMysql || IsSqlite: case IsMysql || IsSqlite:
pre, err := dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare() pre, err = dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare()
throwFail(t, err) assert.Nil(t, err)
if pre != nil { if pre != nil {
r, err := pre.Exec("name1") result, err = pre.Exec("name1")
throwFail(t, err) assert.Nil(t, err)
tid, err := r.LastInsertId() tid, err := result.LastInsertId()
throwFail(t, err) assert.Nil(t, err)
throwFail(t, AssertIs(tid > 0, true)) assert.True(t, tid > 0)
r, err = pre.Exec("name2") result, err = pre.Exec("name2")
throwFail(t, err) assert.Nil(t, err)
id, err := r.LastInsertId() id, err := result.LastInsertId()
throwFail(t, err) assert.Nil(t, err)
throwFail(t, AssertIs(id, tid+1)) assert.Equal(t, id, tid+1)
r, err = pre.Exec("name3") result, err = pre.Exec("name3")
throwFail(t, err) assert.Nil(t, err)
id, err = r.LastInsertId() id, err = result.LastInsertId()
throwFail(t, err) assert.Nil(t, err)
throwFail(t, AssertIs(id, tid+2)) assert.Equal(t, id, tid+2)
err = pre.Close() err = pre.Close()
throwFail(t, err) assert.Nil(t, err)
res, err := dORM.Raw("DELETE FROM tag WHERE name IN (?, ?, ?)", []string{"name1", "name2", "name3"}).Exec() res, err := dORM.Raw("DELETE FROM tag WHERE name IN (?, ?, ?)", []string{"name1", "name2", "name3"}).Exec()
throwFail(t, err) assert.Nil(t, err)
num, err := res.RowsAffected() num, err := res.RowsAffected()
throwFail(t, err) assert.Nil(t, err)
throwFail(t, AssertIs(num, 3)) assert.Equal(t, num, int64(3))
} }
case IsPostgres: case IsPostgres:
pre, err := dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare() pre, err = dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare()
throwFail(t, err) assert.Nil(t, err)
if pre != nil { if pre != nil {
_, err := pre.Exec("name1") _, err = pre.Exec("name1")
throwFail(t, err) assert.Nil(t, err)
_, err = pre.Exec("name2") _, err = pre.Exec("name2")
throwFail(t, err) assert.Nil(t, err)
_, err = pre.Exec("name3") _, err = pre.Exec("name3")
throwFail(t, err) assert.Nil(t, err)
err = pre.Close() err = pre.Close()
throwFail(t, err) assert.Nil(t, err)
res, err := dORM.Raw(`DELETE FROM "tag" WHERE "name" IN (?, ?, ?)`, []string{"name1", "name2", "name3"}).Exec() res, err := dORM.Raw(`DELETE FROM "tag" WHERE "name" IN (?, ?, ?)`, []string{"name1", "name2", "name3"}).Exec()
throwFail(t, err) assert.Nil(t, err)
if err == nil { if err == nil {
num, err := res.RowsAffected() num, err := res.RowsAffected()
throwFail(t, err) assert.Nil(t, err)
throwFail(t, AssertIs(num, 3)) assert.Equal(t, num, int64(3))
} }
} }
} }