Skip to content

Commit d3b5ff0

Browse files
authored
Fix misusage of IsIdent on parsing CREATE VIEW (#246)
1 parent 0a819f0 commit d3b5ff0

7 files changed

+894
-2
lines changed

parser.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -3150,9 +3150,9 @@ func (p *Parser) parseCreateView(pos token.Pos, orReplace bool) *ast.CreateView
31503150
id := p.expect(token.TokenIdent)
31513151
var securityType ast.SecurityType
31523152
switch {
3153-
case id.IsIdent("INVOKER"):
3153+
case id.IsKeywordLike("INVOKER"):
31543154
securityType = ast.SecurityTypeInvoker
3155-
case id.IsIdent("DEFINER"):
3155+
case id.IsKeywordLike("DEFINER"):
31563156
securityType = ast.SecurityTypeDefiner
31573157
default:
31583158
p.panicfAtToken(id, "expected identifier: INVOKER, DEFINER, but: %s", id.Raw)
+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
create view singernames
2+
sql security `invoker`
3+
as select
4+
singers.singerid as singerid,
5+
singers.firstname || ' ' || singers.lastname as name
6+
from singers
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
create view singernames
2+
sql security `definer`
3+
as select
4+
singers.singerid as singerid,
5+
singers.firstname || ' ' || singers.lastname as name
6+
from singers
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
--- !bad_create_view.sql
2+
create view singernames
3+
sql security `invoker`
4+
as select
5+
singers.singerid as singerid,
6+
singers.firstname || ' ' || singers.lastname as name
7+
from singers
8+
9+
--- Error
10+
syntax error: testdata/input/ddl/!bad_create_view.sql:2:14: expected identifier: INVOKER, DEFINER, but: `invoker`
11+
2| sql security `invoker`
12+
| ^~~~~~~~~
13+
14+
15+
--- AST
16+
&ast.BadDDL{
17+
BadNode: &ast.BadNode{
18+
NodeEnd: 160,
19+
Tokens: []*token.Token{
20+
&token.Token{
21+
Kind: "CREATE",
22+
Raw: "create",
23+
End: 6,
24+
},
25+
&token.Token{
26+
Kind: "<ident>",
27+
Space: " ",
28+
Raw: "view",
29+
AsString: "view",
30+
Pos: 7,
31+
End: 11,
32+
},
33+
&token.Token{
34+
Kind: "<ident>",
35+
Space: " ",
36+
Raw: "singernames",
37+
AsString: "singernames",
38+
Pos: 12,
39+
End: 23,
40+
},
41+
&token.Token{
42+
Kind: "<ident>",
43+
Space: "\n",
44+
Raw: "sql",
45+
AsString: "sql",
46+
Pos: 24,
47+
End: 27,
48+
},
49+
&token.Token{
50+
Kind: "<ident>",
51+
Space: " ",
52+
Raw: "security",
53+
AsString: "security",
54+
Pos: 28,
55+
End: 36,
56+
},
57+
&token.Token{
58+
Kind: "<ident>",
59+
Space: " ",
60+
Raw: "`invoker`",
61+
AsString: "invoker",
62+
Pos: 37,
63+
End: 46,
64+
},
65+
&token.Token{
66+
Kind: "AS",
67+
Space: "\n",
68+
Raw: "as",
69+
Pos: 47,
70+
End: 49,
71+
},
72+
&token.Token{
73+
Kind: "SELECT",
74+
Space: " ",
75+
Raw: "select",
76+
Pos: 50,
77+
End: 56,
78+
},
79+
&token.Token{
80+
Kind: "<ident>",
81+
Space: "\n ",
82+
Raw: "singers",
83+
AsString: "singers",
84+
Pos: 61,
85+
End: 68,
86+
},
87+
&token.Token{
88+
Kind: ".",
89+
Raw: ".",
90+
Pos: 68,
91+
End: 69,
92+
},
93+
&token.Token{
94+
Kind: "<ident>",
95+
Raw: "singerid",
96+
AsString: "singerid",
97+
Pos: 69,
98+
End: 77,
99+
},
100+
&token.Token{
101+
Kind: "AS",
102+
Space: " ",
103+
Raw: "as",
104+
Pos: 78,
105+
End: 80,
106+
},
107+
&token.Token{
108+
Kind: "<ident>",
109+
Space: " ",
110+
Raw: "singerid",
111+
AsString: "singerid",
112+
Pos: 81,
113+
End: 89,
114+
},
115+
&token.Token{
116+
Kind: ",",
117+
Raw: ",",
118+
Pos: 89,
119+
End: 90,
120+
},
121+
&token.Token{
122+
Kind: "<ident>",
123+
Space: "\n ",
124+
Raw: "singers",
125+
AsString: "singers",
126+
Pos: 95,
127+
End: 102,
128+
},
129+
&token.Token{
130+
Kind: ".",
131+
Raw: ".",
132+
Pos: 102,
133+
End: 103,
134+
},
135+
&token.Token{
136+
Kind: "<ident>",
137+
Raw: "firstname",
138+
AsString: "firstname",
139+
Pos: 103,
140+
End: 112,
141+
},
142+
&token.Token{
143+
Kind: "||",
144+
Space: " ",
145+
Raw: "||",
146+
Pos: 113,
147+
End: 115,
148+
},
149+
&token.Token{
150+
Kind: "<string>",
151+
Space: " ",
152+
Raw: "' '",
153+
AsString: " ",
154+
Pos: 116,
155+
End: 119,
156+
},
157+
&token.Token{
158+
Kind: "||",
159+
Space: " ",
160+
Raw: "||",
161+
Pos: 120,
162+
End: 122,
163+
},
164+
&token.Token{
165+
Kind: "<ident>",
166+
Space: " ",
167+
Raw: "singers",
168+
AsString: "singers",
169+
Pos: 123,
170+
End: 130,
171+
},
172+
&token.Token{
173+
Kind: ".",
174+
Raw: ".",
175+
Pos: 130,
176+
End: 131,
177+
},
178+
&token.Token{
179+
Kind: "<ident>",
180+
Raw: "lastname",
181+
AsString: "lastname",
182+
Pos: 131,
183+
End: 139,
184+
},
185+
&token.Token{
186+
Kind: "AS",
187+
Space: " ",
188+
Raw: "as",
189+
Pos: 140,
190+
End: 142,
191+
},
192+
&token.Token{
193+
Kind: "<ident>",
194+
Space: " ",
195+
Raw: "name",
196+
AsString: "name",
197+
Pos: 143,
198+
End: 147,
199+
},
200+
&token.Token{
201+
Kind: "FROM",
202+
Space: "\n",
203+
Raw: "from",
204+
Pos: 148,
205+
End: 152,
206+
},
207+
&token.Token{
208+
Kind: "<ident>",
209+
Space: " ",
210+
Raw: "singers",
211+
AsString: "singers",
212+
Pos: 153,
213+
End: 160,
214+
},
215+
},
216+
},
217+
}
218+
219+
--- SQL
220+
create view singernames sql security `invoker` as select singers.singerid as singerid, singers.firstname || ' ' || singers.lastname as name from singers

0 commit comments

Comments
 (0)