From 0f40824f57573c264c425d50e3c780a162b70ed7 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 10:42:54 +0800 Subject: [PATCH 1/7] fix bug:reflect.ValueOf(nil) in getFlatParams --- client/orm/db_utils.go | 5 ++- client/orm/orm_test.go | 73 ++++++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/client/orm/db_utils.go b/client/orm/db_utils.go index dbe49ae5..755aa336 100644 --- a/client/orm/db_utils.go +++ b/client/orm/db_utils.go @@ -57,13 +57,12 @@ func getExistPk(mi *modelInfo, ind reflect.Value) (column string, value interfac func getFlatParams(fi *fieldInfo, args []interface{}, tz *time.Location) (params []interface{}) { 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/orm_test.go b/client/orm/orm_test.go index eb8108db..6a09b131 100644 --- a/client/orm/orm_test.go +++ b/client/orm/orm_test.go @@ -2055,68 +2055,79 @@ func TestRawValues(t *testing.T) { } 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(nil) + assert.Nil(t, err) - tid, err := r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(tid > 0, true)) + result, err = pre.Exec("name1") + assert.Nil(t, err) - r, err = pre.Exec("name2") - throwFail(t, err) + tid, err := result.LastInsertId() + assert.Nil(t, err) + assert.True(t, tid > 0) - id, err := r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(id, tid+1)) + result, err = pre.Exec("name2") + assert.Nil(t, err) - r, err = pre.Exec("name3") - throwFail(t, err) + id, err := result.LastInsertId() + assert.Nil(t, err) + assert.Equal(t, id, tid+1) - id, err = r.LastInsertId() - throwFail(t, err) - throwFail(t, AssertIs(id, tid+2)) + result, err = pre.Exec("name3") + assert.Nil(t, err) + + 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, 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(nil) + assert.Nil(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, 3) } } } From 54cff71defb3be069a641a89f013e9b899d4e5ff Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 10:47:05 +0800 Subject: [PATCH 2/7] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aaa6b35f..699341f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ - Deprecated BeeMap and replace all usage with `sync.map` [4616](https://github.com/beego/beego/pull/4616) - TaskManager support graceful shutdown [4635](https://github.com/beego/beego/pull/4635) - Add comments to `web.Config`, rename `RouterXXX` to `CtrlXXX`, define `HandleFunc` [4714](https://github.com/beego/beego/pull/4714) +- fix bug:reflect.ValueOf(nil) in getFlatParams [4715](https://github.com/beego/beego/pull/4715) ## Fix Sonar From d8c4b0fc85b2f2a3a3fe9a3d1d1137cf289e7d60 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 10:58:17 +0800 Subject: [PATCH 3/7] add test example --- client/orm/models_test.go | 6 ++++++ client/orm/orm_test.go | 14 ++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/client/orm/models_test.go b/client/orm/models_test.go index 421ff3de..d93afcb0 100644 --- a/client/orm/models_test.go +++ b/client/orm/models_test.go @@ -348,6 +348,12 @@ 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 6a09b131..21cdb341 100644 --- a/client/orm/orm_test.go +++ b/client/orm/orm_test.go @@ -216,6 +216,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)) @@ -2054,6 +2055,13 @@ 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 @@ -2066,9 +2074,6 @@ func TestRawPrepare(t *testing.T) { pre, err = dORM.Raw("INSERT INTO tag (name) VALUES (?)").Prepare() assert.Nil(t, err) if pre != nil { - result, err = pre.Exec(nil) - assert.Nil(t, err) - result, err = pre.Exec("name1") assert.Nil(t, err) @@ -2106,9 +2111,6 @@ func TestRawPrepare(t *testing.T) { pre, err = dORM.Raw(`INSERT INTO "tag" ("name") VALUES (?) RETURNING "id"`).Prepare() assert.Nil(t, err) if pre != nil { - _, err = pre.Exec(nil) - assert.Nil(t, err) - _, err = pre.Exec("name1") assert.Nil(t, err) From 61d801c21e2b33de861b3d00fe97a0ab85b86611 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 11:02:13 +0800 Subject: [PATCH 4/7] fix format --- client/orm/models_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/client/orm/models_test.go b/client/orm/models_test.go index d93afcb0..ea8a89fc 100644 --- a/client/orm/models_test.go +++ b/client/orm/models_test.go @@ -353,7 +353,6 @@ type NullValue struct { Value string `orm:"size(30);null"` } - type Tag struct { ID int `orm:"column(id)"` Name string `orm:"size(30)"` From d9f8c030856ae72313994c012268197d486b8de1 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 11:03:05 +0800 Subject: [PATCH 5/7] fix format --- client/orm/db_utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/orm/db_utils.go b/client/orm/db_utils.go index 755aa336..f2e1353c 100644 --- a/client/orm/db_utils.go +++ b/client/orm/db_utils.go @@ -61,7 +61,7 @@ outFor: params = append(params, arg) continue } - + val := reflect.ValueOf(arg) kind := val.Kind() if kind == reflect.Ptr { From 48538d5a02251728d127c0b6c10e216b785f9cfa Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 11:08:30 +0800 Subject: [PATCH 6/7] add table --- client/orm/orm_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/client/orm/orm_test.go b/client/orm/orm_test.go index 21cdb341..977d73aa 100644 --- a/client/orm/orm_test.go +++ b/client/orm/orm_test.go @@ -188,6 +188,7 @@ func TestSyncDb(t *testing.T) { RegisterModel(new(User)) RegisterModel(new(Profile)) RegisterModel(new(Post)) + RegisterModel(new(NullValue)) RegisterModel(new(Tag)) RegisterModel(new(Comment)) RegisterModel(new(UserBig)) From 8e8c02ba7b4804b7e5a70de7dcbafbdee0e5d89e Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 11:13:14 +0800 Subject: [PATCH 7/7] fix --- client/orm/orm_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/orm/orm_test.go b/client/orm/orm_test.go index 977d73aa..f7805572 100644 --- a/client/orm/orm_test.go +++ b/client/orm/orm_test.go @@ -2104,7 +2104,7 @@ func TestRawPrepare(t *testing.T) { num, err := res.RowsAffected() assert.Nil(t, err) - assert.Equal(t, num, 3) + assert.Equal(t, num, int64(3)) } case IsPostgres: @@ -2130,7 +2130,7 @@ func TestRawPrepare(t *testing.T) { if err == nil { num, err := res.RowsAffected() assert.Nil(t, err) - assert.Equal(t, num, 3) + assert.Equal(t, num, int64(3)) } } }