From b99ce66f408d824410761df51b945521b5016dad Mon Sep 17 00:00:00 2001 From: Ariel Mashraki <7413593+a8m@users.noreply.github.com> Date: Thu, 25 Nov 2021 12:03:12 +0200 Subject: [PATCH] dialect/sql: calling Update.Add after Update.Set should append expression (#2168) --- dialect/sql/builder.go | 7 +++++-- dialect/sql/builder_test.go | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/dialect/sql/builder.go b/dialect/sql/builder.go index e0fafe2e7..68667e7dd 100644 --- a/dialect/sql/builder.go +++ b/dialect/sql/builder.go @@ -1079,9 +1079,11 @@ func (u *UpdateBuilder) Set(column string, v interface{}) *UpdateBuilder { return u } -// Add adds a numeric value to the given column. +// Add adds a numeric value to the given column. Note that, calling Set(c) +// after Add(c) will erase previous calls with c from the builder. func (u *UpdateBuilder) Add(column string, v interface{}) *UpdateBuilder { - return u.Set(column, ExprFunc(func(b *Builder) { + u.columns = append(u.columns, column) + u.values = append(u.values, ExprFunc(func(b *Builder) { b.WriteString("COALESCE") b.Nested(func(b *Builder) { b.Ident(Table(u.table).C(column)).Comma().WriteByte('0') @@ -1089,6 +1091,7 @@ func (u *UpdateBuilder) Add(column string, v interface{}) *UpdateBuilder { b.WriteString(" + ") b.Arg(v) })) + return u } // SetNull sets a column as null value. diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index be252ec84..fd328c792 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -457,6 +457,22 @@ func TestBuilder(t *testing.T) { wantQuery: "UPDATE `users` SET `age` = COALESCE(`users`.`age`, 0) + ? WHERE `nickname` LIKE ?", wantArgs: []interface{}{1, "a8m%"}, }, + { + input: Update("users"). + Set("age", 1). + Add("age", 2). + Where(HasPrefix("nickname", "a8m")), + wantQuery: "UPDATE `users` SET `age` = ?, `age` = COALESCE(`users`.`age`, 0) + ? WHERE `nickname` LIKE ?", + wantArgs: []interface{}{1, 2, "a8m%"}, + }, + { + input: Update("users"). + Add("age", 2). + Set("age", 1). + Where(HasPrefix("nickname", "a8m")), + wantQuery: "UPDATE `users` SET `age` = ? WHERE `nickname` LIKE ?", + wantArgs: []interface{}{1, "a8m%"}, + }, { input: Dialect(dialect.Postgres). Update("users").