sql/builder: expand limit / offset into query instead of args (#816)

This commit is contained in:
Alex Snast
2020-10-04 13:13:56 +03:00
committed by GitHub
parent d0a175f508
commit cd0a79e821
3 changed files with 12 additions and 14 deletions

View File

@@ -1782,11 +1782,11 @@ func (s *Selector) Query() (string, []interface{}) {
}
if s.limit != nil {
b.WriteString(" LIMIT ")
b.Arg(*s.limit)
b.WriteString(strconv.Itoa(*s.limit))
}
if s.offset != nil {
b.WriteString(" OFFSET ")
b.Arg(*s.offset)
b.WriteString(strconv.Itoa(*s.offset))
}
s.total = b.total
return b.String(), b.args
@@ -2110,9 +2110,9 @@ func (b *Builder) join(qs []Querier, sep string) *Builder {
// Nested gets a callback, and wraps its result with parentheses.
func (b *Builder) Nested(f func(*Builder)) *Builder {
nb := &Builder{dialect: b.dialect, total: b.total}
nb.WriteString("(")
nb.WriteByte('(')
f(nb)
nb.WriteString(")")
nb.WriteByte(')')
nb.WriteTo(b)
b.args = append(b.args, nb.args...)
b.total = nb.total

View File

@@ -1055,16 +1055,14 @@ func TestBuilder(t *testing.T) {
input: Select("*").
From(Table("users")).
Limit(1),
wantQuery: "SELECT * FROM `users` LIMIT ?",
wantArgs: []interface{}{1},
wantQuery: "SELECT * FROM `users` LIMIT 1",
},
{
input: Dialect(dialect.Postgres).
Select("*").
From(Table("users")).
Limit(1),
wantQuery: `SELECT * FROM "users" LIMIT $1`,
wantArgs: []interface{}{1},
wantQuery: `SELECT * FROM "users" LIMIT 1`,
},
{
input: Select("age").Distinct().From(Table("users")),
@@ -1130,8 +1128,8 @@ func TestBuilder(t *testing.T) {
Join(t4).
On(t1.C("id"), t4.C("id")).Limit(1)
}(),
wantQuery: `SELECT * FROM "groups" JOIN (SELECT "user_groups"."id" FROM "user_groups" JOIN "users" AS "t0" ON "user_groups"."id" = "t0"."id2" WHERE "t0"."id" = $1) AS "t1" ON "groups"."id" = "t1"."id" LIMIT $2`,
wantArgs: []interface{}{"baz", 1},
wantQuery: `SELECT * FROM "groups" JOIN (SELECT "user_groups"."id" FROM "user_groups" JOIN "users" AS "t0" ON "user_groups"."id" = "t0"."id2" WHERE "t0"."id" = $1) AS "t1" ON "groups"."id" = "t1"."id" LIMIT 1`,
wantArgs: []interface{}{"baz"},
},
{
input: func() Querier {

View File

@@ -1311,14 +1311,14 @@ func TestDeleteNodes(t *testing.T) {
func TestQueryNodes(t *testing.T) {
db, mock, err := sqlmock.New()
require.NoError(t, err)
mock.ExpectQuery(escape("SELECT DISTINCT `users`.`id`, `users`.`age`, `users`.`name`, `users`.`fk1`, `users`.`fk2` FROM `users` WHERE `age` < ? ORDER BY `id` LIMIT ? OFFSET ?")).
WithArgs(40, 3, 4).
mock.ExpectQuery(escape("SELECT DISTINCT `users`.`id`, `users`.`age`, `users`.`name`, `users`.`fk1`, `users`.`fk2` FROM `users` WHERE `age` < ? ORDER BY `id` LIMIT 3 OFFSET 4")).
WithArgs(40).
WillReturnRows(sqlmock.NewRows([]string{"id", "age", "name", "fk1", "fk2"}).
AddRow(1, 10, nil, nil, nil).
AddRow(2, 20, "", 0, 0).
AddRow(3, 30, "a8m", 1, 1))
mock.ExpectQuery(escape("SELECT COUNT(DISTINCT `users`.`id`) FROM `users` WHERE `age` < ? ORDER BY `id` LIMIT ? OFFSET ?")).
WithArgs(40, 3, 4).
mock.ExpectQuery(escape("SELECT COUNT(DISTINCT `users`.`id`) FROM `users` WHERE `age` < ? ORDER BY `id` LIMIT 3 OFFSET 4")).
WithArgs(40).
WillReturnRows(sqlmock.NewRows([]string{"COUNT"}).
AddRow(3))