From 0f7ab71e24a2f162bfecfb7cb527d81ee59ce731 Mon Sep 17 00:00:00 2001 From: Ariel Mashraki <7413593+a8m@users.noreply.github.com> Date: Mon, 28 Dec 2020 11:45:16 +0200 Subject: [PATCH] dialect/sql: reset predicate before execute (#1092) --- dialect/sql/builder.go | 6 +++++- dialect/sql/builder_test.go | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/dialect/sql/builder.go b/dialect/sql/builder.go index f714e4e37..3cc5e1ade 100644 --- a/dialect/sql/builder.go +++ b/dialect/sql/builder.go @@ -769,7 +769,7 @@ func (u *UpdateBuilder) Empty() bool { // Query returns query representation of an `UPDATE` statement. func (u *UpdateBuilder) Query() (string, []interface{}) { u.WriteString("UPDATE ") - u.Ident(u.table).Pad().WriteString("SET ") + u.Ident(u.table).WriteString(" SET ") for i, c := range u.nulls { if i > 0 { u.Comma() @@ -1219,6 +1219,10 @@ func (p *Predicate) Append(f func(*Builder)) *Predicate { // Query returns query representation of a predicate. func (p *Predicate) Query() (string, []interface{}) { + if p.Len() > 0 || len(p.args) > 0 { + p.Reset() + p.args = nil + } for _, f := range p.fns { f(&p.Builder) } diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index 3eecc1dd5..fdf0c3761 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -297,6 +297,20 @@ func TestBuilder(t *testing.T) { wantQuery: `UPDATE "users" SET "name" = $1 WHERE "name" = $2`, wantArgs: []interface{}{"foo", "bar"}, }, + { + input: func() Querier { + p1, p2 := EQ("name", "bar"), Or(EQ("age", 10), EQ("age", 20)) + return Dialect(dialect.Postgres). + Update("users"). + Set("name", "foo"). + Where(p1). + Where(p2). + Where(p1). + Where(p2) + }(), + wantQuery: `UPDATE "users" SET "name" = $1 WHERE (("name" = $2 AND ("age" = $3 OR "age" = $4)) AND "name" = $5) AND ("age" = $6 OR "age" = $7)`, + wantArgs: []interface{}{"foo", "bar", 10, 20, "bar", 10, 20}, + }, { input: Update("users").Set("name", "foo").SetNull("spouse_id"), wantQuery: "UPDATE `users` SET `spouse_id` = NULL, `name` = ?",