From ded448a7a41e042ff0b3f2d2d90c8bebca28b1ee Mon Sep 17 00:00:00 2001 From: Igor Lazarev Date: Fri, 12 Nov 2021 14:45:13 +0300 Subject: [PATCH] #301 Conjunction produces wrong dollar parameter placeholders --- expr.go | 2 +- select_test.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/expr.go b/expr.go index 4c943e5e..eba1b457 100644 --- a/expr.go +++ b/expr.go @@ -372,7 +372,7 @@ func (c conj) join(sep, defaultExpr string) (sql string, args []interface{}, err } var sqlParts []string for _, sqlizer := range c { - partSQL, partArgs, err := sqlizer.ToSql() + partSQL, partArgs, err := nestedToSql(sqlizer) if err != nil { return "", nil, err } diff --git a/select_test.go b/select_test.go index 08cfedb6..aa3742fa 100644 --- a/select_test.go +++ b/select_test.go @@ -264,6 +264,21 @@ func TestSelectSubqueryPlaceholderNumbering(t *testing.T) { assert.Equal(t, []interface{}{1, 1, 2}, args) } +func TestSelectSubqueryInConjunctionPlaceholderNumbering(t *testing.T) { + subquery := Select("a").Where(Eq{"b": 1}).Prefix("EXISTS(").Suffix(")").PlaceholderFormat(Dollar) + + sql, args, err := Select("*"). + Where(Or{subquery}). + Where("c = ?", 2). + PlaceholderFormat(Dollar). + ToSql() + assert.NoError(t, err) + + expectedSql := "SELECT * WHERE (EXISTS( SELECT a WHERE b = $1 )) AND c = $2" + assert.Equal(t, expectedSql, sql) + assert.Equal(t, []interface{}{1, 2}, args) +} + func ExampleSelect() { Select("id", "created", "first_name").From("users") // ... continue building up your query