From 167749d46477edfb5787a477c10488262ffbb18f Mon Sep 17 00:00:00 2001 From: Anker Jam Date: Fri, 6 Aug 2021 00:23:06 +0800 Subject: [PATCH 1/2] hotfix:reflect.ValueOf(nil) in getFlatParams --- client/orm/db_utils.go | 3 +- client/orm/models_test.go | 5 +++ client/orm/orm_test.go | 76 +++++++++++++++++++++++---------------- 3 files changed, 51 insertions(+), 33 deletions(-) diff --git a/client/orm/db_utils.go b/client/orm/db_utils.go index 7ae10ca5..8d86b54a 100644 --- a/client/orm/db_utils.go +++ b/client/orm/db_utils.go @@ -58,13 +58,12 @@ func getFlatParams(fi *fieldInfo, args []interface{}, tz *time.Location) (params outFor: for _, arg := range args { - val := reflect.ValueOf(arg) - if arg == nil { params = append(params, arg) continue } + val := reflect.ValueOf(arg) kind := val.Kind() if kind == reflect.Ptr { val = val.Elem() diff --git a/client/orm/models_test.go b/client/orm/models_test.go index e3f74c0b..9b71d968 100644 --- a/client/orm/models_test.go +++ b/client/orm/models_test.go @@ -332,6 +332,11 @@ func NewPost() *Post { return obj } +type NullValue struct { + ID int `orm:"column(id)"` + Value string `orm:"size(30);null"` +} + type Tag struct { ID int `orm:"column(id)"` Name string `orm:"size(30)"` diff --git a/client/orm/orm_test.go b/client/orm/orm_test.go index 08997177..eb0d644f 100644 --- a/client/orm/orm_test.go +++ b/client/orm/orm_test.go @@ -191,6 +191,7 @@ func TestSyncDb(t *testing.T) { RegisterModel(new(Profile)) RegisterModel(new(Post)) RegisterModel(new(Tag)) + RegisterModel(new(NullValue)) RegisterModel(new(Comment)) RegisterModel(new(UserBig)) RegisterModel(new(PostTags)) @@ -217,6 +218,7 @@ func TestRegisterModels(t *testing.T) { RegisterModel(new(User)) RegisterModel(new(Profile)) RegisterModel(new(Post)) + RegisterModel(new(NullValue)) RegisterModel(new(Tag)) RegisterModel(new(Comment)) 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) { + var ( + result sql.Result + err error + pre RawPreparer + ) switch { case IsMysql || IsSqlite: - pre, err := dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare() - throwFail(t, err) + pre, err = dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare() + assert.Nil(t, err) if pre != nil { - r, err := pre.Exec("name1") - throwFail(t, err) + result, err = pre.Exec("name1") + assert.Nil(t, err) - tid, err := r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(tid > 0, true)) + tid, err := result.LastInsertId() + assert.Nil(t, err) + assert.True(t, tid > 0) - r, err = pre.Exec("name2") - throwFail(t, err) + result, err = pre.Exec("name2") + assert.Nil(t, err) - id, err := r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(id, tid+1)) + id, err := result.LastInsertId() + assert.Nil(t, err) + assert.Equal(t, id, tid+1) - r, err = pre.Exec("name3") - throwFail(t, err) + result, err = pre.Exec("name3") + assert.Nil(t, err) - id, err = r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(id, tid+2)) + id, err = result.LastInsertId() + assert.Nil(t, err) + assert.Equal(t, id, tid+2) 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() - throwFail(t, err) + assert.Nil(t, err) num, err := res.RowsAffected() - throwFail(t, err) - throwFail(t, AssertIs(num, 3)) + assert.Nil(t, err) + assert.Equal(t, num, int64(3)) } case IsPostgres: - pre, err := dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare() - throwFail(t, err) + pre, err = dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare() + assert.Nil(t, err) if pre != nil { - _, err := pre.Exec("name1") - throwFail(t, err) + _, err = pre.Exec("name1") + assert.Nil(t, err) _, err = pre.Exec("name2") - throwFail(t, err) + assert.Nil(t, err) _, err = pre.Exec("name3") - throwFail(t, err) + assert.Nil(t, err) 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() - throwFail(t, err) + assert.Nil(t, err) if err == nil { num, err := res.RowsAffected() - throwFail(t, err) - throwFail(t, AssertIs(num, 3)) + assert.Nil(t, err) + assert.Equal(t, num, int64(3)) } } } From 72f24210e8134580536a838c76cf9df4bd9b2d45 Mon Sep 17 00:00:00 2001 From: Anker Jam Date: Fri, 6 Aug 2021 00:25:27 +0800 Subject: [PATCH 2/2] changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea3a4bc7..fef1fb7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,4 +7,5 @@ - Using fixed name `commentRouter.go` as generated file name. [4385](https://github.com/beego/beego/pull/4385) - 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 4435: fix panic when controller dir not found. [4452](https://github.com/beego/beego/pull/4452) \ No newline at end of file +- 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) \ No newline at end of file