Skip to content

Commit 44862ae

Browse files
committed
Respect the engine selector on global Go type overrides
Global overrides are shared by every SQL package, but the Go codegen applied all of them regardless of their engine field, so a multi-engine config got the first matching go_type and last matching struct tag in every package. Drop global overrides scoped to a different engine before parsing them. Fixes #4624 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EbVEZseeSLEVPCsmiPymrg
1 parent 971579e commit 44862ae

13 files changed

Lines changed: 288 additions & 2 deletions

File tree

‎internal/codegen/golang/opts/options.go‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,19 @@ func parseGlobalOpts(req *plugin.GenerateRequest) (*GlobalOptions, error) {
153153
if err := json.Unmarshal(req.GlobalOptions, &options); err != nil {
154154
return nil, fmt.Errorf("unmarshalling global options: %w", err)
155155
}
156-
for i := range options.Overrides {
157-
if err := options.Overrides[i].parse(req); err != nil {
156+
// Global overrides are shared by every SQL package, so drop the ones
157+
// scoped to a different engine
158+
overrides := options.Overrides[:0]
159+
for _, o := range options.Overrides {
160+
if o.Engine != "" && o.Engine != req.Settings.GetEngine() {
161+
continue
162+
}
163+
if err := o.parse(req); err != nil {
158164
return nil, err
159165
}
166+
overrides = append(overrides, o)
160167
}
168+
options.Overrides = overrides
161169
return &options, nil
162170
}
163171

‎internal/endtoend/testdata/overrides_global_engine/mysql/db.go‎

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

‎internal/endtoend/testdata/overrides_global_engine/mysql/models.go‎

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

‎internal/endtoend/testdata/overrides_global_engine/mysql/query.sql.go‎

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

‎internal/endtoend/testdata/overrides_global_engine/pg/db.go‎

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

‎internal/endtoend/testdata/overrides_global_engine/pg/models.go‎

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

‎internal/endtoend/testdata/overrides_global_engine/pg/query.sql.go‎

Lines changed: 28 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
-- name: FindEntry :one
2+
SELECT id, value, code FROM entries
3+
WHERE value = sqlc.arg(value) AND code = sqlc.arg(code);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CREATE TABLE entries (
2+
id integer NOT NULL,
3+
value text NOT NULL,
4+
code text NOT NULL
5+
);
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
version: "2"
2+
overrides:
3+
go:
4+
overrides:
5+
- db_type: text
6+
engine: postgresql
7+
go_type: string
8+
go_struct_tag: 'backend:"postgresql"'
9+
- db_type: text
10+
engine: mysql
11+
go_type: "database/sql.NullString"
12+
go_struct_tag: 'backend:"mysql"'
13+
- db_type: text
14+
engine: sqlite
15+
go_type:
16+
type: byte
17+
slice: true
18+
go_struct_tag: 'backend:"sqlite"'
19+
- column: entries.code
20+
engine: postgresql
21+
go_type:
22+
import: encoding/json
23+
type: RawMessage
24+
- column: entries.code
25+
engine: mysql
26+
go_type:
27+
type: byte
28+
slice: true
29+
- column: entries.code
30+
engine: sqlite
31+
go_type: string
32+
sql:
33+
- engine: postgresql
34+
schema: schema.sql
35+
queries: query.sql
36+
gen:
37+
go:
38+
package: pg
39+
out: pg
40+
- engine: mysql
41+
schema: schema.sql
42+
queries: query.sql
43+
gen:
44+
go:
45+
package: mysql
46+
out: mysql
47+
- engine: sqlite
48+
schema: schema.sql
49+
queries: query.sql
50+
gen:
51+
go:
52+
package: sqlite
53+
out: sqlite

0 commit comments

Comments
 (0)