Skip to content

Commit 371377d

Browse files
BackEndTeawilliamdes
authored andcommitted
Allow the COLLATE keyword in WHERE clauses
1 parent 18da8b1 commit 371377d

File tree

4 files changed

+371
-0
lines changed

4 files changed

+371
-0
lines changed

src/Components/Condition.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class Condition extends Component
4343
'ALL' => 1,
4444
'AND' => 1,
4545
'BETWEEN' => 1,
46+
'COLLATE' => 1,
4647
'EXISTS' => 1,
4748
'IF' => 1,
4849
'IN' => 1,

tests/Parser/SelectStatementTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public function selectProvider(): array
9090
['parser/parseSelectUnion'],
9191
['parser/parseSelectUnion2'],
9292
['parser/parseSelectWhere'],
93+
['parser/parseSelectWhereCollate'],
9394
['parser/parseSelectIndexHint1'],
9495
['parser/parseSelectIndexHint2'],
9596
['parser/parseSelectOrderByIsNull'],
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SELECT 1 FROM my_table WHERE first_col = 'foo' AND second_col COLLATE utf8_bin = 'bar';
Lines changed: 368 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,368 @@
1+
{
2+
"query": "SELECT 1 FROM my_table WHERE first_col = 'foo' AND second_col COLLATE utf8_bin = 'bar';",
3+
"lexer": {
4+
"@type": "PhpMyAdmin\\SqlParser\\Lexer",
5+
"str": "SELECT 1 FROM my_table WHERE first_col = 'foo' AND second_col COLLATE utf8_bin = 'bar';",
6+
"len": 96,
7+
"last": 96,
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": "1",
32+
"value": 1,
33+
"keyword": null,
34+
"type": 6,
35+
"flags": 0,
36+
"position": 8
37+
},
38+
{
39+
"@type": "PhpMyAdmin\\SqlParser\\Token",
40+
"token": " ",
41+
"value": " ",
42+
"keyword": null,
43+
"type": 3,
44+
"flags": 0,
45+
"position": 9
46+
},
47+
{
48+
"@type": "PhpMyAdmin\\SqlParser\\Token",
49+
"token": "FROM",
50+
"value": "FROM",
51+
"keyword": "FROM",
52+
"type": 1,
53+
"flags": 3,
54+
"position": 10
55+
},
56+
{
57+
"@type": "PhpMyAdmin\\SqlParser\\Token",
58+
"token": " ",
59+
"value": " ",
60+
"keyword": null,
61+
"type": 3,
62+
"flags": 0,
63+
"position": 14
64+
},
65+
{
66+
"@type": "PhpMyAdmin\\SqlParser\\Token",
67+
"token": "my_table",
68+
"value": "my_table",
69+
"keyword": null,
70+
"type": 0,
71+
"flags": 0,
72+
"position": 17
73+
},
74+
{
75+
"@type": "PhpMyAdmin\\SqlParser\\Token",
76+
"token": " ",
77+
"value": " ",
78+
"keyword": null,
79+
"type": 3,
80+
"flags": 0,
81+
"position": 25
82+
},
83+
{
84+
"@type": "PhpMyAdmin\\SqlParser\\Token",
85+
"token": "WHERE",
86+
"value": "WHERE",
87+
"keyword": "WHERE",
88+
"type": 1,
89+
"flags": 3,
90+
"position": 26
91+
},
92+
{
93+
"@type": "PhpMyAdmin\\SqlParser\\Token",
94+
"token": " ",
95+
"value": " ",
96+
"keyword": null,
97+
"type": 3,
98+
"flags": 0,
99+
"position": 31
100+
},
101+
{
102+
"@type": "PhpMyAdmin\\SqlParser\\Token",
103+
"token": "first_col",
104+
"value": "first_col",
105+
"keyword": null,
106+
"type": 0,
107+
"flags": 0,
108+
"position": 34
109+
},
110+
{
111+
"@type": "PhpMyAdmin\\SqlParser\\Token",
112+
"token": " ",
113+
"value": " ",
114+
"keyword": null,
115+
"type": 3,
116+
"flags": 0,
117+
"position": 43
118+
},
119+
{
120+
"@type": "PhpMyAdmin\\SqlParser\\Token",
121+
"token": "=",
122+
"value": "=",
123+
"keyword": null,
124+
"type": 2,
125+
"flags": 2,
126+
"position": 44
127+
},
128+
{
129+
"@type": "PhpMyAdmin\\SqlParser\\Token",
130+
"token": " ",
131+
"value": " ",
132+
"keyword": null,
133+
"type": 3,
134+
"flags": 0,
135+
"position": 45
136+
},
137+
{
138+
"@type": "PhpMyAdmin\\SqlParser\\Token",
139+
"token": "'foo'",
140+
"value": "foo",
141+
"keyword": null,
142+
"type": 7,
143+
"flags": 1,
144+
"position": 46
145+
},
146+
{
147+
"@type": "PhpMyAdmin\\SqlParser\\Token",
148+
"token": " ",
149+
"value": " ",
150+
"keyword": null,
151+
"type": 3,
152+
"flags": 0,
153+
"position": 51
154+
},
155+
{
156+
"@type": "PhpMyAdmin\\SqlParser\\Token",
157+
"token": "AND",
158+
"value": "AND",
159+
"keyword": "AND",
160+
"type": 1,
161+
"flags": 3,
162+
"position": 52
163+
},
164+
{
165+
"@type": "PhpMyAdmin\\SqlParser\\Token",
166+
"token": " ",
167+
"value": " ",
168+
"keyword": null,
169+
"type": 3,
170+
"flags": 0,
171+
"position": 55
172+
},
173+
{
174+
"@type": "PhpMyAdmin\\SqlParser\\Token",
175+
"token": "second_col",
176+
"value": "second_col",
177+
"keyword": null,
178+
"type": 0,
179+
"flags": 0,
180+
"position": 60
181+
},
182+
{
183+
"@type": "PhpMyAdmin\\SqlParser\\Token",
184+
"token": " ",
185+
"value": " ",
186+
"keyword": null,
187+
"type": 3,
188+
"flags": 0,
189+
"position": 70
190+
},
191+
{
192+
"@type": "PhpMyAdmin\\SqlParser\\Token",
193+
"token": "COLLATE",
194+
"value": "COLLATE",
195+
"keyword": "COLLATE",
196+
"type": 1,
197+
"flags": 3,
198+
"position": 71
199+
},
200+
{
201+
"@type": "PhpMyAdmin\\SqlParser\\Token",
202+
"token": " ",
203+
"value": " ",
204+
"keyword": null,
205+
"type": 3,
206+
"flags": 0,
207+
"position": 78
208+
},
209+
{
210+
"@type": "PhpMyAdmin\\SqlParser\\Token",
211+
"token": "utf8_bin",
212+
"value": "utf8_bin",
213+
"keyword": null,
214+
"type": 0,
215+
"flags": 0,
216+
"position": 79
217+
},
218+
{
219+
"@type": "PhpMyAdmin\\SqlParser\\Token",
220+
"token": " ",
221+
"value": " ",
222+
"keyword": null,
223+
"type": 3,
224+
"flags": 0,
225+
"position": 87
226+
},
227+
{
228+
"@type": "PhpMyAdmin\\SqlParser\\Token",
229+
"token": "=",
230+
"value": "=",
231+
"keyword": null,
232+
"type": 2,
233+
"flags": 2,
234+
"position": 88
235+
},
236+
{
237+
"@type": "PhpMyAdmin\\SqlParser\\Token",
238+
"token": " ",
239+
"value": " ",
240+
"keyword": null,
241+
"type": 3,
242+
"flags": 0,
243+
"position": 89
244+
},
245+
{
246+
"@type": "PhpMyAdmin\\SqlParser\\Token",
247+
"token": "'bar'",
248+
"value": "bar",
249+
"keyword": null,
250+
"type": 7,
251+
"flags": 1,
252+
"position": 90
253+
},
254+
{
255+
"@type": "PhpMyAdmin\\SqlParser\\Token",
256+
"token": ";",
257+
"value": ";",
258+
"keyword": null,
259+
"type": 9,
260+
"flags": 0,
261+
"position": 95
262+
},
263+
{
264+
"@type": "PhpMyAdmin\\SqlParser\\Token",
265+
"token": null,
266+
"value": null,
267+
"keyword": null,
268+
"type": 9,
269+
"flags": 0,
270+
"position": null
271+
}
272+
],
273+
"count": 29,
274+
"idx": 29
275+
},
276+
"delimiter": ";",
277+
"delimiterLen": 1,
278+
"strict": false,
279+
"errors": []
280+
},
281+
"parser": {
282+
"@type": "PhpMyAdmin\\SqlParser\\Parser",
283+
"list": {
284+
"@type": "@1"
285+
},
286+
"statements": [
287+
{
288+
"@type": "PhpMyAdmin\\SqlParser\\Statements\\SelectStatement",
289+
"expr": [
290+
{
291+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
292+
"database": null,
293+
"table": null,
294+
"column": null,
295+
"expr": "1",
296+
"alias": null,
297+
"function": null,
298+
"subquery": null
299+
}
300+
],
301+
"from": [
302+
{
303+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Expression",
304+
"database": null,
305+
"table": "my_table",
306+
"column": null,
307+
"expr": "my_table",
308+
"alias": null,
309+
"function": null,
310+
"subquery": null
311+
}
312+
],
313+
"index_hints": null,
314+
"partition": null,
315+
"where": [
316+
{
317+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Condition",
318+
"identifiers": [
319+
"first_col",
320+
"foo"
321+
],
322+
"isOperator": false,
323+
"expr": "first_col = 'foo'"
324+
},
325+
{
326+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Condition",
327+
"identifiers": [],
328+
"isOperator": true,
329+
"expr": "AND"
330+
},
331+
{
332+
"@type": "PhpMyAdmin\\SqlParser\\Components\\Condition",
333+
"identifiers": [
334+
"second_col",
335+
"utf8_bin",
336+
"bar"
337+
],
338+
"isOperator": false,
339+
"expr": "second_col COLLATE utf8_bin = 'bar'"
340+
}
341+
],
342+
"group": null,
343+
"group_options": null,
344+
"having": null,
345+
"order": null,
346+
"limit": null,
347+
"procedure": null,
348+
"into": null,
349+
"join": null,
350+
"union": [],
351+
"end_options": null,
352+
"options": {
353+
"@type": "PhpMyAdmin\\SqlParser\\Components\\OptionsArray",
354+
"options": []
355+
},
356+
"first": 0,
357+
"last": 26
358+
}
359+
],
360+
"brackets": 0,
361+
"strict": false,
362+
"errors": []
363+
},
364+
"errors": {
365+
"lexer": [],
366+
"parser": []
367+
}
368+
}

0 commit comments

Comments
 (0)