File tree 3 files changed +27
-18
lines changed
3 files changed +27
-18
lines changed Original file line number Diff line number Diff line change @@ -49,11 +49,11 @@ macro_rules! define_keywords {
49
49
}
50
50
}
51
51
52
+ // The following keywords should be sorted to be able to match using binary search
52
53
define_keywords ! (
53
54
ABS ,
54
55
ACTION ,
55
56
ADD ,
56
- ASC ,
57
57
ALL ,
58
58
ALLOCATE ,
59
59
ALTER ,
@@ -65,6 +65,7 @@ define_keywords!(
65
65
ARRAY_AGG ,
66
66
ARRAY_MAX_CARDINALITY ,
67
67
AS ,
68
+ ASC ,
68
69
ASENSITIVE ,
69
70
ASYMMETRIC ,
70
71
AT ,
@@ -93,9 +94,9 @@ define_keywords!(
93
94
CEILING ,
94
95
CHAIN ,
95
96
CHAR ,
96
- CHAR_LENGTH ,
97
97
CHARACTER ,
98
98
CHARACTER_LENGTH ,
99
+ CHAR_LENGTH ,
99
100
CHECK ,
100
101
CLOB ,
101
102
CLOSE ,
@@ -158,6 +159,7 @@ define_keywords!(
158
159
ELEMENT ,
159
160
ELSE ,
160
161
END ,
162
+ END_EXEC = "END-EXEC" ,
161
163
END_FRAME ,
162
164
END_PARTITION ,
163
165
EQUALS ,
@@ -175,8 +177,8 @@ define_keywords!(
175
177
FALSE ,
176
178
FETCH ,
177
179
FIELDS ,
178
- FIRST ,
179
180
FILTER ,
181
+ FIRST ,
180
182
FIRST_VALUE ,
181
183
FLOAT ,
182
184
FLOOR ,
@@ -255,8 +257,8 @@ define_keywords!(
255
257
NATURAL ,
256
258
NCHAR ,
257
259
NCLOB ,
258
- NEXT ,
259
260
NEW ,
261
+ NEXT ,
260
262
NO ,
261
263
NONE ,
262
264
NORMALIZE ,
@@ -268,8 +270,8 @@ define_keywords!(
268
270
NULLS ,
269
271
NUMERIC ,
270
272
OBJECT ,
271
- OCTET_LENGTH ,
272
273
OCCURRENCES_REGEX ,
274
+ OCTET_LENGTH ,
273
275
OF ,
274
276
OFFSET ,
275
277
OLD ,
@@ -285,12 +287,12 @@ define_keywords!(
285
287
OVERLAPS ,
286
288
OVERLAY ,
287
289
PARAMETER ,
288
- PARTITION ,
289
290
PARQUET ,
291
+ PARTITION ,
290
292
PERCENT ,
291
- PERCENT_RANK ,
292
293
PERCENTILE_CONT ,
293
294
PERCENTILE_DISC ,
295
+ PERCENT_RANK ,
294
296
PERIOD ,
295
297
PORTION ,
296
298
POSITION ,
@@ -332,8 +334,8 @@ define_keywords!(
332
334
ROLLBACK ,
333
335
ROLLUP ,
334
336
ROW ,
335
- ROW_NUMBER ,
336
337
ROWS ,
338
+ ROW_NUMBER ,
337
339
SAVEPOINT ,
338
340
SCHEMA ,
339
341
SCOPE ,
@@ -390,10 +392,10 @@ define_keywords!(
390
392
TRANSLATION ,
391
393
TREAT ,
392
394
TRIGGER ,
393
- TRUNCATE ,
394
395
TRIM ,
395
396
TRIM_ARRAY ,
396
397
TRUE ,
398
+ TRUNCATE ,
397
399
UESCAPE ,
398
400
UNBOUNDED ,
399
401
UNCOMMITTED ,
@@ -409,11 +411,11 @@ define_keywords!(
409
411
VALUE ,
410
412
VALUES ,
411
413
VALUE_OF ,
412
- VAR_POP ,
413
- VAR_SAMP ,
414
414
VARBINARY ,
415
415
VARCHAR ,
416
416
VARYING ,
417
+ VAR_POP ,
418
+ VAR_SAMP ,
417
419
VERSIONING ,
418
420
VIEW ,
419
421
WHEN ,
@@ -424,11 +426,10 @@ define_keywords!(
424
426
WITH ,
425
427
WITHIN ,
426
428
WITHOUT ,
427
- WRITE ,
428
429
WORK ,
430
+ WRITE ,
429
431
YEAR ,
430
- ZONE ,
431
- END_EXEC = "END-EXEC"
432
+ ZONE
432
433
) ;
433
434
434
435
/// These keywords can't be used as a table alias, so that `FROM table_name alias`
Original file line number Diff line number Diff line change @@ -143,10 +143,9 @@ impl Token {
143
143
}
144
144
pub fn make_word ( word : & str , quote_style : Option < char > ) -> Self {
145
145
let word_uppercase = word. to_uppercase ( ) ;
146
- //TODO: need to reintroduce FnvHashSet at some point .. iterating over keywords is
147
- // not fast but I want the simplicity for now while I experiment with pluggable
148
- // dialects
149
- let is_keyword = quote_style == None && ALL_KEYWORDS . contains ( & word_uppercase. as_str ( ) ) ;
146
+ //TODO: validate use of a hashset (e.g. FnvHashSet) compared to using binary search
147
+ let is_keyword =
148
+ quote_style == None && ALL_KEYWORDS . binary_search ( & word_uppercase. as_str ( ) ) . is_ok ( ) ;
150
149
Token :: Word ( Word {
151
150
value : word. to_string ( ) ,
152
151
quote_style,
Original file line number Diff line number Diff line change 21
21
use matches:: assert_matches;
22
22
23
23
use sqlparser:: ast:: * ;
24
+ use sqlparser:: dialect:: keywords:: ALL_KEYWORDS ;
24
25
use sqlparser:: parser:: * ;
25
26
use sqlparser:: test_utils:: { all_dialects, expr_from_projection, number, only} ;
26
27
@@ -2851,6 +2852,14 @@ fn parse_drop_index() {
2851
2852
}
2852
2853
}
2853
2854
2855
+ #[ test]
2856
+ fn keywords_sorted ( ) {
2857
+ // assert!(ALL_KEYWORDS.is_sorted())
2858
+ let mut copy = Vec :: from ( ALL_KEYWORDS ) ;
2859
+ copy. sort ( ) ;
2860
+ assert ! ( copy == ALL_KEYWORDS )
2861
+ }
2862
+
2854
2863
fn parse_sql_statements ( sql : & str ) -> Result < Vec < Statement > , ParserError > {
2855
2864
all_dialects ( ) . parse_sql_statements ( sql)
2856
2865
}
You can’t perform that action at this time.
0 commit comments