diff --git a/internal/endtoend/testdata/params_duplicate/mysql/go/models.go b/internal/endtoend/testdata/params_duplicate/mysql/go/models.go index 4222f42b1b..ec72cdf8ec 100644 --- a/internal/endtoend/testdata/params_duplicate/mysql/go/models.go +++ b/internal/endtoend/testdata/params_duplicate/mysql/go/models.go @@ -8,6 +8,6 @@ import ( type User struct { ID int32 - FirstName string + FirstName sql.NullString LastName sql.NullString } diff --git a/internal/endtoend/testdata/params_duplicate/mysql/go/query.sql.go b/internal/endtoend/testdata/params_duplicate/mysql/go/query.sql.go index e61cd018c6..1f48521520 100644 --- a/internal/endtoend/testdata/params_duplicate/mysql/go/query.sql.go +++ b/internal/endtoend/testdata/params_duplicate/mysql/go/query.sql.go @@ -5,22 +5,63 @@ package querytest import ( "context" + "database/sql" ) -const selectUserArg = `-- name: SelectUserArg :many +const selectUserByID = `-- name: SelectUserByID :many SELECT first_name from users where (? = id OR ? = 0) ` -func (q *Queries) SelectUserArg(ctx context.Context, id interface{}) ([]string, error) { - rows, err := q.db.QueryContext(ctx, selectUserArg, id) +type SelectUserByIDParams struct { + Column1 interface{} + ID interface{} +} + +func (q *Queries) SelectUserByID(ctx context.Context, arg SelectUserByIDParams) ([]sql.NullString, error) { + rows, err := q.db.QueryContext(ctx, selectUserByID, arg.Column1, arg.ID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []sql.NullString + for rows.Next() { + var first_name sql.NullString + if err := rows.Scan(&first_name); err != nil { + return nil, err + } + items = append(items, first_name) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const selectUserByName = `-- name: SelectUserByName :many +SELECT first_name +FROM users +WHERE first_name = ? + OR last_name = ? +` + +type SelectUserByNameParams struct { + FirstName sql.NullString + Name sql.NullString +} + +func (q *Queries) SelectUserByName(ctx context.Context, arg SelectUserByNameParams) ([]sql.NullString, error) { + rows, err := q.db.QueryContext(ctx, selectUserByName, arg.FirstName, arg.Name) if err != nil { return nil, err } defer rows.Close() - var items []string + var items []sql.NullString for rows.Next() { - var first_name string + var first_name sql.NullString if err := rows.Scan(&first_name); err != nil { return nil, err } @@ -45,15 +86,15 @@ type SelectUserQuestionParams struct { Column2 interface{} } -func (q *Queries) SelectUserQuestion(ctx context.Context, arg SelectUserQuestionParams) ([]string, error) { +func (q *Queries) SelectUserQuestion(ctx context.Context, arg SelectUserQuestionParams) ([]sql.NullString, error) { rows, err := q.db.QueryContext(ctx, selectUserQuestion, arg.Column1, arg.Column2) if err != nil { return nil, err } defer rows.Close() - var items []string + var items []sql.NullString for rows.Next() { - var first_name string + var first_name sql.NullString if err := rows.Scan(&first_name); err != nil { return nil, err } diff --git a/internal/endtoend/testdata/params_duplicate/mysql/query.sql b/internal/endtoend/testdata/params_duplicate/mysql/query.sql index 5f1a4711f6..cd661993c7 100644 --- a/internal/endtoend/testdata/params_duplicate/mysql/query.sql +++ b/internal/endtoend/testdata/params_duplicate/mysql/query.sql @@ -1,7 +1,13 @@ -/* name: SelectUserArg :many */ +/* name: SelectUserByID :many */ SELECT first_name from users where (sqlc.arg(id) = id OR sqlc.arg(id) = 0); +/* name: SelectUserByName :many */ +SELECT first_name +FROM users +WHERE first_name = sqlc.arg(name) + OR last_name = sqlc.arg(name); + /* name: SelectUserQuestion :many */ SELECT first_name from users where (? = id OR ? = 0); diff --git a/internal/endtoend/testdata/params_duplicate/mysql/schema.sql b/internal/endtoend/testdata/params_duplicate/mysql/schema.sql index 015e792e7e..e93e087e50 100644 --- a/internal/endtoend/testdata/params_duplicate/mysql/schema.sql +++ b/internal/endtoend/testdata/params_duplicate/mysql/schema.sql @@ -1,5 +1,5 @@ CREATE TABLE users ( id integer NOT NULL AUTO_INCREMENT PRIMARY KEY, - first_name varchar(255) NOT NULL, + first_name varchar(255), last_name varchar(255) ) ENGINE=InnoDB; diff --git a/internal/sql/rewrite/parameters.go b/internal/sql/rewrite/parameters.go index 87a5fb07cb..7c79e9b6d9 100644 --- a/internal/sql/rewrite/parameters.go +++ b/internal/sql/rewrite/parameters.go @@ -48,6 +48,8 @@ func NamedParameters(engine config.Engine, raw *ast.RawStmt) (*ast.RawStmt, map[ return raw, map[int]string{}, nil } + hasNamedParameterSupport := engine != config.EngineMySQL + args := map[string]int{} argn := 0 var edits []source.Edit @@ -58,7 +60,7 @@ func NamedParameters(engine config.Engine, raw *ast.RawStmt) (*ast.RawStmt, map[ case named.IsParamFunc(node): fun := node.(*ast.FuncCall) param, isConst := flatten(fun.Args) - if num, ok := args[param]; ok { + if num, ok := args[param]; ok && hasNamedParameterSupport { cr.Replace(&ast.ParamRef{ Number: num, Location: fun.Location,