From 0f40824f57573c264c425d50e3c780a162b70ed7 Mon Sep 17 00:00:00 2001 From: jianzhiyao Date: Thu, 5 Aug 2021 10:42:54 +0800 Subject: [PATCH] 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) } } }