Skip to content

Commit

Permalink
fix: respect nullzero when appending struct fields. Fixes #339
Browse files Browse the repository at this point in the history
  • Loading branch information
vmihailenco committed Dec 1, 2021
1 parent 51bf856 commit ffd02f3
Show file tree
Hide file tree
Showing 17 changed files with 58 additions and 25 deletions.
16 changes: 16 additions & 0 deletions internal/dbtest/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,22 @@ func TestQuery(t *testing.T) {
func(db *bun.DB) schema.QueryAppender {
return db.NewCreateTable().Model(new(Model)).TableSpace("fasttablespace")
},
func(db *bun.DB) schema.QueryAppender {
type Model struct {
ID int64
Int int64 `bun:",nullzero"`
Uint uint64 `bun:",nullzero"`
Str string `bun:",nullzero"`
Time time.Time `bun:",nullzero"`
}
return db.NewUpdate().
Model(new(Model)).
Set("int = ?int").
Set("uint = ?uint").
Set("str = ?str").
Set("time = ?time").
WherePK()
},
}

timeRE := regexp.MustCompile(`'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+(\+\d{2}:\d{2})?'`)
Expand Down
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-mysql5-104
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UPDATE `models` AS `model` SET int = NULL, uint = NULL, str = NULL, time = NULL WHERE (`model`.`id` = NULL)
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-mysql5-75
Original file line number Diff line number Diff line change
@@ -1 +1 @@
UPDATE `users` AS `user` SET name = 'Hello' WHERE (id = 0)
UPDATE `users` AS `user` SET name = 'Hello' WHERE (id = NULL)
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-mysql8-104
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UPDATE `models` AS `model` SET int = NULL, uint = NULL, str = NULL, time = NULL WHERE (`model`.`id` = NULL)
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-mysql8-75
Original file line number Diff line number Diff line change
@@ -1 +1 @@
UPDATE `users` AS `user` SET name = 'Hello' WHERE (id = 0)
UPDATE `users` AS `user` SET name = 'Hello' WHERE (id = NULL)
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-pg-104
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UPDATE "models" AS "model" SET int = NULL, uint = NULL, str = NULL, time = NULL WHERE ("model"."id" = NULL)
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pg-75
Original file line number Diff line number Diff line change
@@ -1 +1 @@
UPDATE "users" AS "user" SET name = 'Hello' WHERE (id = 0)
UPDATE "users" AS "user" SET name = 'Hello' WHERE (id = NULL)
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-pgx-104
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UPDATE "models" AS "model" SET int = NULL, uint = NULL, str = NULL, time = NULL WHERE ("model"."id" = NULL)
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pgx-75
Original file line number Diff line number Diff line change
@@ -1 +1 @@
UPDATE "users" AS "user" SET name = 'Hello' WHERE (id = 0)
UPDATE "users" AS "user" SET name = 'Hello' WHERE (id = NULL)
1 change: 1 addition & 0 deletions internal/dbtest/testdata/snapshots/TestQuery-sqlite-104
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UPDATE "models" AS "model" SET int = NULL, uint = NULL, str = NULL, time = NULL WHERE ("model"."id" = NULL)
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-sqlite-75
Original file line number Diff line number Diff line change
@@ -1 +1 @@
UPDATE "users" AS "user" SET name = 'Hello' WHERE (id = 0)
UPDATE "users" AS "user" SET name = 'Hello' WHERE (id = NULL)
34 changes: 15 additions & 19 deletions query_base.go
Original file line number Diff line number Diff line change
Expand Up @@ -607,34 +607,30 @@ func (q *whereBaseQuery) addWhereCols(cols []string) {
q.setErr(err)
return
}

var fields []*schema.Field
if q.whereFields != nil {
err := errors.New("bun: WherePK can only be called once")
q.setErr(err)
return
}

if cols == nil {
if err := q.table.CheckPKs(); err != nil {
q.setErr(err)
return
}
fields = q.table.PKs
} else {
fields = make([]*schema.Field, len(cols))
for i, col := range cols {
field, err := q.table.Field(col)
if err != nil {
q.setErr(err)
return
}
fields[i] = field
}
}

if q.whereFields != nil {
err := errors.New("bun: WherePK can only be called once")
q.setErr(err)
q.whereFields = q.table.PKs
return
}

q.whereFields = fields
q.whereFields = make([]*schema.Field, len(cols))
for i, col := range cols {
field, err := q.table.Field(col)
if err != nil {
q.setErr(err)
return
}
q.whereFields[i] = field
}
}

func (q *whereBaseQuery) mustAppendWhere(
Expand Down
4 changes: 4 additions & 0 deletions query_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,10 @@ func (q *DeleteQuery) Operation() string {
}

func (q *DeleteQuery) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte, err error) {
if q.err != nil {
return nil, q.err
}

fmter = formatterWithModel(fmter, q)

if q.isSoftDelete() {
Expand Down
4 changes: 4 additions & 0 deletions query_insert.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ func (q *InsertQuery) Operation() string {
}

func (q *InsertQuery) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte, err error) {
if q.err != nil {
return nil, q.err
}

fmter = formatterWithModel(fmter, q)

b, err = q.appendWith(fmter, b)
Expand Down
4 changes: 4 additions & 0 deletions query_select.go
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,10 @@ func (q *SelectQuery) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte, e
func (q *SelectQuery) appendQuery(
fmter schema.Formatter, b []byte, count bool,
) (_ []byte, err error) {
if q.err != nil {
return nil, q.err
}

fmter = formatterWithModel(fmter, q)

cteCount := count && (len(q.group) > 0 || q.distinctOn != nil)
Expand Down
4 changes: 4 additions & 0 deletions query_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,10 @@ func (q *UpdateQuery) Operation() string {
}

func (q *UpdateQuery) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte, err error) {
if q.err != nil {
return nil, q.err
}

fmter = formatterWithModel(fmter, q)

b, err = q.appendWith(fmter, b)
Expand Down
2 changes: 1 addition & 1 deletion schema/table.go
Original file line number Diff line number Diff line change
Expand Up @@ -834,7 +834,7 @@ func (t *Table) AppendNamedArg(
fmter Formatter, b []byte, name string, strct reflect.Value,
) ([]byte, bool) {
if field, ok := t.FieldMap[name]; ok {
return fmter.appendArg(b, field.Value(strct).Interface()), true
return field.AppendValue(fmter, b, strct), true
}
return b, false
}
Expand Down

0 comments on commit ffd02f3

Please sign in to comment.