Skip to content

Commit 2d60910

Browse files
committed
Dedupe sqlc.arg parameters wrapped in a type cast for MySQL
When a sqlc.arg() call was wrapped in a CAST (or MySQL's synthetic MATCH...AGAINST type cast), the resulting Parameter was not marked as named. Downstream struct-field generation then added numeric suffixes to disambiguate identical names, producing spurious fields like SearchTerm_3 alongside SearchTerm. Capture the isNamed result from FetchMerge so the column correctly reflects that it came from a named parameter, letting the code generator reuse a single struct field for repeated sqlc.arg(name) references. Fixes #4376
1 parent 3f41c61 commit 2d60910

File tree

5 files changed

+43
-2
lines changed

5 files changed

+43
-2
lines changed

internal/compiler/resolve.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,10 +513,11 @@ func (comp *Compiler) resolveCatalogRefs(qc *QueryCatalog, rvs []*ast.RangeVar,
513513
}
514514
col := toColumn(n.TypeName)
515515
defaultP := named.NewInferredParam(col.Name, col.NotNull)
516-
p, _ := params.FetchMerge(ref.ref.Number, defaultP)
516+
p, isNamed := params.FetchMerge(ref.ref.Number, defaultP)
517517

518518
col.Name = p.Name()
519519
col.NotNull = p.NotNull()
520+
col.IsNamedParam = isNamed
520521
a = append(a, Parameter{
521522
Number: ref.ref.Number,
522523
Column: col,

internal/endtoend/testdata/params_duplicate/mysql/go/models.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

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

internal/endtoend/testdata/params_duplicate/mysql/query.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,8 @@ WHERE first_name = sqlc.arg(name)
1111
/* name: SelectUserQuestion :many */
1212
SELECT first_name from
1313
users where (? = id OR ? = 0);
14+
15+
/* name: SelectUserByAgeCast :many */
16+
SELECT first_name FROM users
17+
WHERE age > CAST(sqlc.arg(threshold) AS SIGNED)
18+
OR age < CAST(sqlc.arg(threshold) AS SIGNED);
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
CREATE TABLE users (
22
id integer NOT NULL AUTO_INCREMENT PRIMARY KEY,
33
first_name varchar(255),
4-
last_name varchar(255)
4+
last_name varchar(255),
5+
age int
56
) ENGINE=InnoDB;

0 commit comments

Comments
 (0)