Skip to content

Commit d58a8ff

Browse files
committed
Merge #487 - Fix #283 - MariaDB window function with alias gives bad linting errors
Pull-request: #487 Fixes: #283 Signed-off-by: William Desportes <[email protected]>
2 parents 3e32dd8 + bf03484 commit d58a8ff

File tree

4 files changed

+329
-1
lines changed

4 files changed

+329
-1
lines changed

src/Components/Expression.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,8 @@ public static function parse(Parser $parser, TokensList $list, array $options =
367367
&& (($prev[1]->type === Token::TYPE_STRING)
368368
|| ($prev[1]->type === Token::TYPE_SYMBOL
369369
&& ! ($prev[1]->flags & Token::FLAG_SYMBOL_VARIABLE))
370-
|| ($prev[1]->type === Token::TYPE_NONE))
370+
|| ($prev[1]->type === Token::TYPE_NONE
371+
&& $prev[1]->token !== 'OVER'))
371372
) {
372373
if (! empty($ret->alias)) {
373374
$parser->error('An alias was previously found.', $token);

tests/Parser/SelectStatementTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public function selectProvider(): array
4646
['parser/parseSelect14'],
4747
['parser/parseSelect15'],
4848
['parser/parseSelect16'],
49+
['parser/parseSelectAggregateWithPartitionAndAlias'],
4950
['parser/parseSelectErr1'],
5051
['parser/parseSelectErr2'],
5152
['parser/parseSelectNested'],
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SELECT *, COUNT(*) OVER(PARTITION BY `REGION`) AS "count(REGION)" FROM `world_borders`
Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
{
2+
"query": "SELECT *, COUNT(*) OVER(PARTITION BY `REGION`) AS \"count(REGION)\" FROM `world_borders`\n",
3+
"lexer": {
4+
"@type": "PhpMyAdmin\\SqlParser\\Lexer",
5+
"str": "SELECT *, COUNT(*) OVER(PARTITION BY `REGION`) AS \"count(REGION)\" FROM `world_borders`\n",
6+
"len": 87,
7+
"last": 87,
8+
"list": {
9+
"@type": "PhpMyAdmin\\SqlParser\\TokensList",
10+
"tokens": [
11+
{
12+
"@type": "PhpMyAdmin\\SqlParser\\Token",
13+
"token": "SELECT",
14+
"value": "SELECT",
15+
"keyword": "SELECT",
16+
"type": 1,
17+
"flags": 3,
18+
"position": 0
19+
},
20+
{
21+
"@type": "PhpMyAdmin\\SqlParser\\Token",
22+
"token": " ",
23+
"value": " ",
24+
"keyword": null,
25+
"type": 3,
26+
"flags": 0,
27+
"position": 6
28+
},
29+
{
30+
"@type": "PhpMyAdmin\\SqlParser\\Token",
31+
"token": "*",
32+
"value": "*",
33+
"keyword": null,
34+
"type": 2,
35+
"flags": 16,
36+
"position": 7
37+
},
38+
{
39+
"@type": "PhpMyAdmin\\SqlParser\\Token",
40+
"token": ",",
41+
"value": ",",
42+
"keyword": null,
43+
"type": 2,
44+
"flags": 16,
45+
"position": 8
46+
},
47+
{
48+
"@type": "PhpMyAdmin\\SqlParser\\Token",
49+
"token": " ",
50+
"value": " ",
51+
"keyword": null,
52+
"type": 3,
53+
"flags": 0,
54+
"position": 9
55+
},
56+
{
57+
"@type": "PhpMyAdmin\\SqlParser\\Token",
58+
"token": "COUNT",
59+
"value": "COUNT",
60+
"keyword": "COUNT",
61+
"type": 1,
62+
"flags": 33,
63+
"position": 10
64+
},
65+
{
66+
"@type": "PhpMyAdmin\\SqlParser\\Token",
67+
"token": "(",
68+
"value": "(",
69+
"keyword": null,
70+
"type": 2,
71+
"flags": 16,
72+
"position": 15
73+
},
74+
{
75+
"@type": "PhpMyAdmin\\SqlParser\\Token",
76+
"token": "*",
77+
"value": "*",
78+
"keyword": null,
79+
"type": 2,
80+
"flags": 16,
81+
"position": 16
82+
},
83+
{
84+
"@type": "PhpMyAdmin\\SqlParser\\Token",
85+
"token": ")",
86+
"value": ")",
87+
"keyword": null,
88+
"type": 2,
89+
"flags": 16,
90+
"position": 17
91+
},
92+
{
93+
"@type": "PhpMyAdmin\\SqlParser\\Token",
94+
"token": " ",
95+
"value": " ",
96+
"keyword": null,
97+
"type": 3,
98+
"flags": 0,
99+
"position": 18
100+
},
101+
{
102+
"@type": "PhpMyAdmin\\SqlParser\\Token",
103+
"token": "OVER",
104+
"value": "OVER",
105+
"keyword": null,
106+
"type": 0,
107+
"flags": 0,
108+
"position": 19
109+
},
110+
{
111+
"@type": "PhpMyAdmin\\SqlParser\\Token",
112+
"token": "(",
113+
"value": "(",
114+
"keyword": null,
115+
"type": 2,
116+
"flags": 16,
117+
"position": 23
118+
},
119+
{
120+
"@type": "PhpMyAdmin\\SqlParser\\Token",
121+
"token": "PARTITION BY",
122+
"value": "PARTITION BY",
123+
"keyword": "PARTITION BY",
124+
"type": 1,
125+
"flags": 7,
126+
"position": 24
127+
},
128+
{
129+
"@type": "PhpMyAdmin\\SqlParser\\Token",
130+
"token": " ",
131+
"value": " ",
132+
"keyword": null,
133+
"type": 3,
134+
"flags": 0,
135+
"position": 36
136+
},
137+
{
138+
"@type": "PhpMyAdmin\\SqlParser\\Token",
139+
"token": "`REGION`",
140+
"value": "REGION",
141+
"keyword": null,
142+
"type": 8,
143+
"flags": 2,
144+
"position": 37
145+
},
146+
{
147+
"@type": "PhpMyAdmin\\SqlParser\\Token",
148+
"token": ")",
149+
"value": ")",
150+
"keyword": null,
151+
"type": 2,
152+
"flags": 16,
153+
"position": 45
154+
},
155+
{
156+
"@type": "PhpMyAdmin\\SqlParser\\Token",
157+
"token": " ",
158+
"value": " ",
159+
"keyword": null,
160+
"type": 3,
161+
"flags": 0,
162+
"position": 46
163+
},
164+
{
165+
"@type": "PhpMyAdmin\\SqlParser\\Token",
166+
"token": "AS",
167+
"value": "AS",
168+
"keyword": "AS",
169+
"type": 1,
170+
"flags": 3,
171+
"position": 47
172+
},
173+
{
174+
"@type": "PhpMyAdmin\\SqlParser\\Token",
175+
"token": " ",
176+
"value": " ",
177+
"keyword": null,
178+
"type": 3,
179+
"flags": 0,
180+
"position": 49
181+
},
182+
{
183+
"@type": "PhpMyAdmin\\SqlParser\\Token",
184+
"token": "\"count(REGION)\"",
185+
"value": "count(REGION)",
186+
"keyword": null,
187+
"type": 7,
188+
"flags": 2,
189+
"position": 50
190+
},
191+
{
192+
"@type": "PhpMyAdmin\\SqlParser\\Token",
193+
"token": " ",
194+
"value": " ",
195+
"keyword": null,
196+
"type": 3,
197+
"flags": 0,
198+
"position": 65
199+
},
200+
{
201+
"@type": "PhpMyAdmin\\SqlParser\\Token",
202+
"token": "FROM",
203+
"value": "FROM",
204+
"keyword": "FROM",
205+
"type": 1,
206+
"flags": 3,
207+
"position": 66
208+
},
209+
{
210+
"@type": "PhpMyAdmin\\SqlParser\\Token",
211+
"token": " ",
212+
"value": " ",
213+
"keyword": null,
214+
"type": 3,
215+
"flags": 0,
216+
"position": 70
217+
},
218+
{
219+
"@type": "PhpMyAdmin\\SqlParser\\Token",
220+
"token": "`world_borders`",
221+
"value": "world_borders",
222+
"keyword": null,
223+
"type": 8,
224+
"flags": 2,
225+
"position": 71
226+
},
227+
{
228+
"@type": "PhpMyAdmin\\SqlParser\\Token",
229+
"token": "\n",
230+
"value": " ",
231+
"keyword": null,
232+
"type": 3,
233+
"flags": 0,
234+
"position": 86
235+
},
236+
{
237+
"@type": "PhpMyAdmin\\SqlParser\\Token",
238+
"token": null,
239+
"value": null,
240+
"keyword": null,
241+
"type": 9,
242+
"flags": 0,
243+
"position": null
244+
}
245+
],
246+
"count": 26,
247+
"idx": 26
248+
},
249+
"delimiter": ";",
250+
"delimiterLen": 1,
251+
"strict": false,
252+
"errors": []
253+
},
254+
"parser": {
255+
"@type": "PhpMyAdmin\\SqlParser\\Parser",
256+
"list": {
257+
"@type": "@1"
258+
},
259+
"statements": [
260+
{
261+
"@type": "PhpMyAdmin\\SqlParser\\Statements\\SelectStatement",
262+
"expr": [
263+
{
264+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
265+
"database": null,
266+
"table": null,
267+
"column": null,
268+
"expr": "*",
269+
"alias": null,
270+
"function": null,
271+
"subquery": null
272+
},
273+
{
274+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
275+
"database": null,
276+
"table": null,
277+
"column": null,
278+
"expr": "COUNT(*) OVER(PARTITION BY `REGION`)",
279+
"alias": "count(REGION)",
280+
"function": "COUNT",
281+
"subquery": null
282+
}
283+
],
284+
"from": [
285+
{
286+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
287+
"database": null,
288+
"table": "world_borders",
289+
"column": null,
290+
"expr": "`world_borders`",
291+
"alias": null,
292+
"function": null,
293+
"subquery": null
294+
}
295+
],
296+
"index_hints": null,
297+
"partition": null,
298+
"where": null,
299+
"group": null,
300+
"group_options": null,
301+
"having": null,
302+
"order": null,
303+
"limit": null,
304+
"procedure": null,
305+
"into": null,
306+
"join": null,
307+
"union": [],
308+
"end_options": null,
309+
"options": {
310+
"@type": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray",
311+
"options": []
312+
},
313+
"first": 0,
314+
"last": 24
315+
}
316+
],
317+
"brackets": 0,
318+
"strict": false,
319+
"errors": []
320+
},
321+
"errors": {
322+
"lexer": [],
323+
"parser": []
324+
}
325+
}

0 commit comments

Comments
 (0)