diff --git a/internal/codegen/golang/gen.go b/internal/codegen/golang/gen.go index e463849f03..dd802f0150 100644 --- a/internal/codegen/golang/gen.go +++ b/internal/codegen/golang/gen.go @@ -94,7 +94,6 @@ func generate(req *plugin.CodeGenRequest, enums []Enum, structs []Struct, querie SQLDriver: parseDriver(golang.SqlPackage), Q: "`", Package: golang.Package, - GoQueries: queries, Enums: enums, Structs: structs, SqlcVersion: req.SqlcVersion, @@ -111,9 +110,13 @@ func generate(req *plugin.CodeGenRequest, enums []Enum, structs []Struct, querie output := map[string]string{} execute := func(name, templateName string) error { + imports := i.Imports(name) + replacedQueries := replaceConflictedArg(imports, queries) + var b bytes.Buffer w := bufio.NewWriter(&b) tctx.SourceName = name + tctx.GoQueries = replacedQueries err := tmpl.ExecuteTemplate(w, templateName, &tctx) w.Flush() if err != nil { diff --git a/internal/codegen/golang/imports.go b/internal/codegen/golang/imports.go index 94b68aa14e..6da4b9c5e5 100644 --- a/internal/codegen/golang/imports.go +++ b/internal/codegen/golang/imports.go @@ -462,3 +462,22 @@ func trimSliceAndPointerPrefix(v string) string { v = strings.TrimPrefix(v, "*") return v } + +func replaceConflictedArg(imports [][]ImportSpec, queries []Query) []Query { + m := make(map[string]struct{}) + for _, is := range imports { + for _, i := range is { + paths := strings.Split(i.Path, "/") + m[paths[len(paths)-1]] = struct{}{} + } + } + + replacedQueries := make([]Query, 0, len(queries)) + for _, query := range queries { + if _, exist := m[query.Arg.Name]; exist { + query.Arg.Name = toCamelCase(fmt.Sprintf("arg_%s", query.Arg.Name)) + } + replacedQueries = append(replacedQueries, query) + } + return replacedQueries +} diff --git a/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/db.go b/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/db.go new file mode 100644 index 0000000000..35e5f4a4b6 --- /dev/null +++ b/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/db.go @@ -0,0 +1,31 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.17.2 + +package db + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/models.go b/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/models.go new file mode 100644 index 0000000000..eae65e7679 --- /dev/null +++ b/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/models.go @@ -0,0 +1,18 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.17.2 + +package db + +import ( + "time" + + "github.com/google/uuid" +) + +type Foo struct { + Time time.Time + Time2 time.Time + Uuid uuid.UUID + Uuid2 uuid.UUID +} diff --git a/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/query.sql.go b/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/query.sql.go new file mode 100644 index 0000000000..bdbef2b7d4 --- /dev/null +++ b/internal/endtoend/testdata/conflicted_arg_name/postgresql/db/query.sql.go @@ -0,0 +1,35 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.17.2 +// source: query.sql + +package db + +import ( + "context" + "time" + + "github.com/google/uuid" +) + +const time2ByTime = `-- name: Time2ByTime :one +SELECT time2 FROM foo WHERE time=$1 +` + +func (q *Queries) Time2ByTime(ctx context.Context, argTime time.Time) (time.Time, error) { + row := q.db.QueryRowContext(ctx, time2ByTime, argTime) + var time2 time.Time + err := row.Scan(&time2) + return time2, err +} + +const uuid2ByUuid = `-- name: Uuid2ByUuid :one +SELECT uuid2 FROM foo WHERE uuid=$1 +` + +func (q *Queries) Uuid2ByUuid(ctx context.Context, argUuid uuid.UUID) (uuid.UUID, error) { + row := q.db.QueryRowContext(ctx, uuid2ByUuid, argUuid) + var uuid2 uuid.UUID + err := row.Scan(&uuid2) + return uuid2, err +} diff --git a/internal/endtoend/testdata/conflicted_arg_name/postgresql/query.sql b/internal/endtoend/testdata/conflicted_arg_name/postgresql/query.sql new file mode 100644 index 0000000000..db97e5f333 --- /dev/null +++ b/internal/endtoend/testdata/conflicted_arg_name/postgresql/query.sql @@ -0,0 +1,12 @@ +CREATE TABLE foo ( + time date NOT NULL, + time2 date NOT NULL, + uuid uuid NOT NULL, + uuid2 uuid NOT NULL +); + +-- name: Time2ByTime :one +SELECT time2 FROM foo WHERE time=$1; + +-- name: Uuid2ByUuid :one +SELECT uuid2 FROM foo WHERE uuid=$1; diff --git a/internal/endtoend/testdata/conflicted_arg_name/postgresql/sqlc.json b/internal/endtoend/testdata/conflicted_arg_name/postgresql/sqlc.json new file mode 100644 index 0000000000..ff443fe1b9 --- /dev/null +++ b/internal/endtoend/testdata/conflicted_arg_name/postgresql/sqlc.json @@ -0,0 +1,11 @@ +{ + "version": "1", + "packages": [ + { + "path": "db", + "engine": "postgresql", + "schema": "query.sql", + "queries": "query.sql" + } + ] +}