Skip to content

Commit b898550

Browse files
authored
compiler: Use engine-specific reserved keywords (sqlc-dev#677)
1 parent 613de79 commit b898550

File tree

12 files changed

+561
-130
lines changed

12 files changed

+561
-130
lines changed

internal/compiler/compile.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ import (
1919
"github.com/kyleconroy/sqlc/internal/sql/sqlpath"
2020
)
2121

22+
// TODO: Rename this interface Engine
2223
type Parser interface {
2324
Parse(io.Reader) ([]ast.Statement, error)
2425
CommentSyntax() metadata.CommentSyntax
26+
IsReservedKeyword(string) bool
2527
}
2628

2729
// copied over from gen.go

internal/compiler/expand.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"github.com/kyleconroy/sqlc/internal/source"
99
"github.com/kyleconroy/sqlc/internal/sql/ast"
1010
"github.com/kyleconroy/sqlc/internal/sql/astutils"
11-
"github.com/kyleconroy/sqlc/internal/sql/lang"
1211
)
1312

1413
func (c *Compiler) expand(qc *QueryCatalog, raw *ast.RawStmt) ([]source.Edit, error) {
@@ -38,8 +37,7 @@ func (c *Compiler) expand(qc *QueryCatalog, raw *ast.RawStmt) ([]source.Edit, er
3837
}
3938

4039
func (c *Compiler) quoteIdent(ident string) string {
41-
// TODO: Add a method to the parser / engine for this instead
42-
if lang.IsReservedKeyword(ident) {
40+
if c.parser.IsReservedKeyword(ident) {
4341
switch c.conf.Engine {
4442
case config.EngineMySQL, config.EngineMySQLBeta:
4543
return "`" + ident + "`"

internal/endtoend/testdata/star_expansion_reserved/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/star_expansion_reserved/mysql/go/query.sql.go

Lines changed: 6 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CREATE TABLE foo (`group` text);
1+
CREATE TABLE foo (`group` text, `key` text);
22

33
/* name: StarExpansionReserved :many */
44
SELECT * FROM foo;

internal/endtoend/testdata/star_expansion_reserved/postgresql/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/star_expansion_reserved/postgresql/go/query.sql.go

Lines changed: 6 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
CREATE TABLE foo ("group" text);
1+
CREATE TABLE foo ("group" text, key text);
22
-- name: StarExpansionReserved :many
33
SELECT * FROM foo;
Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
package dolphin
2+
3+
import "strings"
4+
5+
// https://dev.mysql.com/doc/refman/8.0/en/keywords.html
6+
func (p *Parser) IsReservedKeyword(s string) bool {
7+
switch strings.ToLower(s) {
8+
case "accessible":
9+
case "add":
10+
case "all":
11+
case "alter":
12+
case "analyze":
13+
case "and":
14+
case "as":
15+
case "asc":
16+
case "asensitive":
17+
case "before":
18+
case "between":
19+
case "bigint":
20+
case "binary":
21+
case "blob":
22+
case "both":
23+
case "by":
24+
case "call":
25+
case "cascade":
26+
case "case":
27+
case "change":
28+
case "char":
29+
case "character":
30+
case "check":
31+
case "collate":
32+
case "column":
33+
case "condition":
34+
case "constraint":
35+
case "continue":
36+
case "convert":
37+
case "create":
38+
case "cross":
39+
case "cube":
40+
case "cume_dist":
41+
case "current_date":
42+
case "current_time":
43+
case "current_timestamp":
44+
case "current_user":
45+
case "cursor":
46+
case "database":
47+
case "databases":
48+
case "day_hour":
49+
case "day_microsecond":
50+
case "day_minute":
51+
case "day_second":
52+
case "dec":
53+
case "decimal":
54+
case "declare":
55+
case "default":
56+
case "delayed":
57+
case "delete":
58+
case "dense_rank":
59+
case "desc":
60+
case "describe":
61+
case "deterministic":
62+
case "distinct":
63+
case "distinctrow":
64+
case "div":
65+
case "double":
66+
case "drop":
67+
case "dual":
68+
case "each":
69+
case "else":
70+
case "elseif":
71+
case "empty":
72+
case "enclosed":
73+
case "escaped":
74+
case "except":
75+
case "exists":
76+
case "exit":
77+
case "explain":
78+
case "false":
79+
case "fetch":
80+
case "first_value":
81+
case "float":
82+
case "float4":
83+
case "float8":
84+
case "for":
85+
case "force":
86+
case "foreign":
87+
case "from":
88+
case "fulltext":
89+
case "function":
90+
case "generated":
91+
case "get":
92+
case "grant":
93+
case "group":
94+
case "grouping":
95+
case "groups":
96+
case "having":
97+
case "high_priority":
98+
case "hour_microsecond":
99+
case "hour_minute":
100+
case "hour_second":
101+
case "if":
102+
case "ignore":
103+
case "in":
104+
case "index":
105+
case "infile":
106+
case "inner":
107+
case "inout":
108+
case "insensitive":
109+
case "insert":
110+
case "int":
111+
case "int1":
112+
case "int2":
113+
case "int3":
114+
case "int4":
115+
case "int8":
116+
case "integer":
117+
case "interval":
118+
case "into":
119+
case "io_after_gtids":
120+
case "io_before_gtids":
121+
case "is":
122+
case "iterate":
123+
case "join":
124+
case "json_table":
125+
case "key":
126+
case "keys":
127+
case "kill":
128+
case "lag":
129+
case "last_value":
130+
case "lateral":
131+
case "lead":
132+
case "leading":
133+
case "leave":
134+
case "left":
135+
case "like":
136+
case "limit":
137+
case "linear":
138+
case "lines":
139+
case "load":
140+
case "localtime":
141+
case "localtimestamp":
142+
case "lock":
143+
case "long":
144+
case "longblob":
145+
case "longtext":
146+
case "loop":
147+
case "low_priority":
148+
case "master_bind":
149+
case "master_ssl_verify_server_cert":
150+
case "match":
151+
case "maxvalue":
152+
case "mediumblob":
153+
case "mediumint":
154+
case "mediumtext":
155+
case "middleint":
156+
case "minute_microsecond":
157+
case "minute_second":
158+
case "mod":
159+
case "modifies":
160+
case "natural":
161+
case "not":
162+
case "no_write_to_binlog":
163+
case "nth_value":
164+
case "ntile":
165+
case "null":
166+
case "numeric":
167+
case "of":
168+
case "on":
169+
case "optimize":
170+
case "optimizer_costs":
171+
case "option":
172+
case "optionally":
173+
case "or":
174+
case "order":
175+
case "out":
176+
case "outer":
177+
case "outfile":
178+
case "over":
179+
case "partition":
180+
case "percent_rank":
181+
case "precision":
182+
case "primary":
183+
case "procedure":
184+
case "purge":
185+
case "range":
186+
case "rank":
187+
case "read":
188+
case "reads":
189+
case "read_write":
190+
case "real":
191+
case "recursive":
192+
case "references":
193+
case "regexp":
194+
case "release":
195+
case "rename":
196+
case "repeat":
197+
case "replace":
198+
case "require":
199+
case "resignal":
200+
case "restrict":
201+
case "return":
202+
case "revoke":
203+
case "right":
204+
case "rlike":
205+
case "row":
206+
case "rows":
207+
case "row_number":
208+
case "schema":
209+
case "schemas":
210+
case "second_microsecond":
211+
case "select":
212+
case "sensitive":
213+
case "separator":
214+
case "set":
215+
case "show":
216+
case "signal":
217+
case "smallint":
218+
case "spatial":
219+
case "specific":
220+
case "sql":
221+
case "sqlexception":
222+
case "sqlstate":
223+
case "sqlwarning":
224+
case "sql_big_result":
225+
case "sql_calc_found_rows":
226+
case "sql_small_result":
227+
case "ssl":
228+
case "starting":
229+
case "stored":
230+
case "straight_join":
231+
case "system":
232+
case "table":
233+
case "terminated":
234+
case "then":
235+
case "tinyblob":
236+
case "tinyint":
237+
case "tinytext":
238+
case "to":
239+
case "trailing":
240+
case "trigger":
241+
case "true":
242+
case "undo":
243+
case "union":
244+
case "unique":
245+
case "unlock":
246+
case "unsigned":
247+
case "update":
248+
case "usage":
249+
case "use":
250+
case "using":
251+
case "utc_date":
252+
case "utc_time":
253+
case "utc_timestamp":
254+
case "values":
255+
case "varbinary":
256+
case "varchar":
257+
case "varcharacter":
258+
case "varying":
259+
case "virtual":
260+
case "when":
261+
case "where":
262+
case "while":
263+
case "window":
264+
case "with":
265+
case "write":
266+
case "xor":
267+
case "year_month":
268+
case "zerofill":
269+
default:
270+
return false
271+
}
272+
return true
273+
}

0 commit comments

Comments
 (0)