Skip to content

Commit 07c3808

Browse files
authored
Rename :one return variable when it conflicts with a parameter (#4383)
1 parent 837d7c9 commit 07c3808

File tree

7 files changed

+61
-29
lines changed

7 files changed

+61
-29
lines changed

internal/codegen/golang/result.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,26 @@ func buildQueries(req *plugin.GenerateRequest, options *opts.Options, structs []
268268
c := query.Columns[0]
269269
name := columnName(c, 0)
270270
name = strings.Replace(name, "$", "_", -1)
271+
retName := escape(name)
272+
// For :one queries the scan destination lives in the same scope as
273+
// the query parameters, so reusing a parameter's name would cause
274+
// Scan to overwrite the input and leak it back to the caller on
275+
// sql.ErrNoRows (see sqlc-dev/sqlc#4354). Rename the return
276+
// variable when it would collide.
277+
if query.Cmd == metadata.CmdOne {
278+
argNames := map[string]struct{}{}
279+
for _, p := range gq.Arg.Pairs() {
280+
argNames[p.Name] = struct{}{}
281+
}
282+
for {
283+
if _, conflict := argNames[retName]; !conflict {
284+
break
285+
}
286+
retName += "_2"
287+
}
288+
}
271289
gq.Ret = QueryValue{
272-
Name: escape(name),
290+
Name: retName,
273291
DBName: name,
274292
Typ: goType(req, options, c),
275293
SQLDriver: sqlpkg,

internal/endtoend/testdata/single_param_conflict/mysql/go/query.sql.go

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/single_param_conflict/postgresql/pgx/v4/go/query.sql.go

Lines changed: 9 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/single_param_conflict/postgresql/pgx/v5/go/query.sql.go

Lines changed: 9 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/single_param_conflict/postgresql/stdlib/go/query.sql.go

Lines changed: 9 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/single_param_conflict/sqlite/go/query.sql.go

Lines changed: 6 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/vet_explain/mysql/db/query.sql.go

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)