Skip to content

Commit 3ae9e3c

Browse files
authored
fix(golang): Escape reserved keywords (#2849)
* fix(golang): Escape reserved keywords Append `_` to variable names that are reserved
1 parent b178c8c commit 3ae9e3c

File tree

11 files changed

+843
-11
lines changed

11 files changed

+843
-11
lines changed

internal/codegen/golang/query.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,15 @@ func (v QueryValue) Pairs() []Argument {
6161
var out []Argument
6262
for _, f := range v.Struct.Fields {
6363
out = append(out, Argument{
64-
Name: toLowerCase(f.Name),
64+
Name: escape(toLowerCase(f.Name)),
6565
Type: f.Type,
6666
})
6767
}
6868
return out
6969
}
7070
return []Argument{
7171
{
72-
Name: v.Name,
72+
Name: escape(v.Name),
7373
Type: v.DefineType(),
7474
},
7575
}
@@ -102,9 +102,9 @@ func (v *QueryValue) DefineType() string {
102102

103103
func (v *QueryValue) ReturnName() string {
104104
if v.IsPointer() {
105-
return "&" + v.Name
105+
return "&" + escape(v.Name)
106106
}
107-
return v.Name
107+
return escape(v.Name)
108108
}
109109

110110
func (v QueryValue) UniqueFields() []Field {
@@ -129,16 +129,16 @@ func (v QueryValue) Params() string {
129129
var out []string
130130
if v.Struct == nil {
131131
if !v.Column.IsSqlcSlice && strings.HasPrefix(v.Typ, "[]") && v.Typ != "[]byte" && !v.SQLDriver.IsPGX() {
132-
out = append(out, "pq.Array("+v.Name+")")
132+
out = append(out, "pq.Array("+escape(v.Name)+")")
133133
} else {
134-
out = append(out, v.Name)
134+
out = append(out, escape(v.Name))
135135
}
136136
} else {
137137
for _, f := range v.Struct.Fields {
138138
if !f.HasSqlcSlice() && strings.HasPrefix(f.Type, "[]") && f.Type != "[]byte" && !v.SQLDriver.IsPGX() {
139-
out = append(out, "pq.Array("+v.VariableForField(f)+")")
139+
out = append(out, "pq.Array("+escape(v.VariableForField(f))+")")
140140
} else {
141-
out = append(out, v.VariableForField(f))
141+
out = append(out, escape(v.VariableForField(f)))
142142
}
143143
}
144144
}

internal/codegen/golang/reserved.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package golang
2+
3+
func escape(s string) string {
4+
if IsReserved(s) {
5+
return s + "_"
6+
}
7+
return s
8+
}
9+
10+
func IsReserved(s string) bool {
11+
switch s {
12+
case "break":
13+
return true
14+
case "default":
15+
return true
16+
case "func":
17+
return true
18+
case "interface":
19+
return true
20+
case "select":
21+
return true
22+
case "case":
23+
return true
24+
case "defer":
25+
return true
26+
case "go":
27+
return true
28+
case "map":
29+
return true
30+
case "struct":
31+
return true
32+
case "chan":
33+
return true
34+
case "else":
35+
return true
36+
case "goto":
37+
return true
38+
case "package":
39+
return true
40+
case "switch":
41+
return true
42+
case "const":
43+
return true
44+
case "fallthrough":
45+
return true
46+
case "if":
47+
return true
48+
case "range":
49+
return true
50+
case "type":
51+
return true
52+
case "continue":
53+
return true
54+
case "for":
55+
return true
56+
case "import":
57+
return true
58+
case "return":
59+
return true
60+
case "var":
61+
return true
62+
default:
63+
return false
64+
}
65+
}

internal/codegen/golang/result.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ func buildQueries(req *plugin.CodeGenRequest, options *opts, structs []Struct) (
215215
if len(query.Params) == 1 && qpl != 0 {
216216
p := query.Params[0]
217217
gq.Arg = QueryValue{
218-
Name: paramName(p),
218+
Name: escape(paramName(p)),
219219
DBName: p.Column.GetName(),
220220
Typ: goType(req, options, p.Column),
221221
SQLDriver: sqlpkg,
@@ -251,7 +251,7 @@ func buildQueries(req *plugin.CodeGenRequest, options *opts, structs []Struct) (
251251
name := columnName(c, 0)
252252
name = strings.Replace(name, "$", "_", -1)
253253
gq.Ret = QueryValue{
254-
Name: name,
254+
Name: escape(name),
255255
DBName: name,
256256
Typ: goType(req, options, c),
257257
SQLDriver: sqlpkg,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# TODO

internal/endtoend/testdata/params_go_keywords/postgresql/go/db.go

Lines changed: 32 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_go_keywords/postgresql/go/models.go

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

0 commit comments

Comments
 (0)