diff --git a/internal/endtoend/testdata/mysql_param/go/query.sql.go b/internal/endtoend/testdata/mysql_param/go/query.sql.go index 532361e99b..44c297b727 100644 --- a/internal/endtoend/testdata/mysql_param/go/query.sql.go +++ b/internal/endtoend/testdata/mysql_param/go/query.sql.go @@ -104,6 +104,44 @@ func (q *Queries) ListUserOrders(ctx context.Context, minPrice float64) ([]ListU return items, nil } +const listUserParenExpr = `-- name: ListUserParenExpr :many +select id, first_name, last_name, age, job_status from users where (job_status = 'APPLIED' or job_status = 'PENDING') and id > ? order by id asc limit ? +` + +type ListUserParenExprParams struct { + LastID int + Limit uint32 +} + +func (q *Queries) ListUserParenExpr(ctx context.Context, arg ListUserParenExprParams) ([]User, error) { + rows, err := q.db.QueryContext(ctx, listUserParenExpr, arg.LastID, arg.Limit) + if err != nil { + return nil, err + } + defer rows.Close() + var items []User + for rows.Next() { + var i User + if err := rows.Scan( + &i.ID, + &i.FirstName, + &i.LastName, + &i.Age, + &i.JobStatus, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const listUsersByFamily = `-- name: ListUsersByFamily :many select first_name, last_name from users where age < ? and last_name = ? ` diff --git a/internal/endtoend/testdata/mysql_param/query.sql b/internal/endtoend/testdata/mysql_param/query.sql index 48c01d83bb..ed9caa52cf 100644 --- a/internal/endtoend/testdata/mysql_param/query.sql +++ b/internal/endtoend/testdata/mysql_param/query.sql @@ -25,3 +25,9 @@ select first_name, id FROM users LIMIT sqlc.arg(UsersLimit); /* name: InsertNewUser :exec */ INSERT INTO users (first_name, last_name) VALUES (?, sqlc.arg(user_last_name)); + +/* name: ListUserParenExpr :many */ +SELECT * FROM users WHERE (job_status = 'APPLIED' OR job_status = 'PENDING') +AND id > :lastID +ORDER BY id +LIMIT :usersLimit; diff --git a/internal/mysql/param.go b/internal/mysql/param.go index 112cb4d40c..d2fca69a2f 100644 --- a/internal/mysql/param.go +++ b/internal/mysql/param.go @@ -110,6 +110,12 @@ func (pGen PackageGenerator) paramsInWhereExpr(e sqlparser.SQLNode, tableAliasMa case *sqlparser.IsExpr: // TODO: see if there is a use case for params in IS expressions return []*Param{}, nil + case *sqlparser.ParenExpr: + expr, err := pGen.paramsInWhereExpr(v.Expr, tableAliasMap, defaultTable) + if err != nil { + return nil, err + } + params = append(params, expr...) default: panic(fmt.Sprintf("Failed to handle %T in where", v)) }