blob: ab602025320cfc0122aad951056f642e1c52ad48 [file] [log] [blame]
Yigit Boyar19b41102016-11-20 10:46:32 -08001/*
2 * The MIT License (MIT)
3 *
4 * Copyright (c) 2014 by Bart Kiers
5 *
6 * Permission is hereby granted, free of charge, to any person
7 * obtaining a copy of this software and associated documentation
8 * files (the "Software"), to deal in the Software without
9 * restriction, including without limitation the rights to use,
10 * copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following
13 * conditions:
14 *
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25 * OTHER DEALINGS IN THE SOFTWARE.
26 *
27 * Project : sqlite-parser; an ANTLR4 grammar for SQLite
28 * https://github.com/bkiers/sqlite-parser
29 * Developed by : Bart Kiers, [email protected]
30 */
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -080031grammar SQLite; // For version 3.24.0 of SQLite
Yigit Boyar19b41102016-11-20 10:46:32 -080032
33parse
34 : ( sql_stmt_list | error )* EOF
35 ;
36
37error
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -080038 : UNEXPECTED_CHAR
39 {
40 throw new RuntimeException("UNEXPECTED_CHAR=" + $UNEXPECTED_CHAR.text);
Yigit Boyar19b41102016-11-20 10:46:32 -080041 }
42 ;
43
44sql_stmt_list
45 : ';'* sql_stmt ( ';'+ sql_stmt )* ';'*
46 ;
47
48sql_stmt
49 : ( K_EXPLAIN ( K_QUERY K_PLAN )? )? ( alter_table_stmt
50 | analyze_stmt
51 | attach_stmt
52 | begin_stmt
53 | commit_stmt
Yigit Boyar19b41102016-11-20 10:46:32 -080054 | create_index_stmt
55 | create_table_stmt
56 | create_trigger_stmt
57 | create_view_stmt
58 | create_virtual_table_stmt
59 | delete_stmt
60 | delete_stmt_limited
61 | detach_stmt
62 | drop_index_stmt
63 | drop_table_stmt
64 | drop_trigger_stmt
65 | drop_view_stmt
Yigit Boyar19b41102016-11-20 10:46:32 -080066 | insert_stmt
67 | pragma_stmt
68 | reindex_stmt
69 | release_stmt
70 | rollback_stmt
71 | savepoint_stmt
Yigit Boyar19b41102016-11-20 10:46:32 -080072 | select_stmt
73 | update_stmt
74 | update_stmt_limited
75 | vacuum_stmt )
76 ;
77
78alter_table_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -080079 : K_ALTER K_TABLE ( schema_name '.' )? table_name
Yigit Boyar19b41102016-11-20 10:46:32 -080080 ( K_RENAME K_TO new_table_name
81 | K_ADD K_COLUMN? column_def
82 )
83 ;
84
85analyze_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -080086 : K_ANALYZE ( schema_name | table_or_index_name | schema_name '.' table_or_index_name )?
Yigit Boyar19b41102016-11-20 10:46:32 -080087 ;
88
89attach_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -080090 : K_ATTACH K_DATABASE? expr K_AS schema_name
Yigit Boyar19b41102016-11-20 10:46:32 -080091 ;
92
93begin_stmt
94 : K_BEGIN ( K_DEFERRED | K_IMMEDIATE | K_EXCLUSIVE )? ( K_TRANSACTION transaction_name? )?
95 ;
96
97commit_stmt
98 : ( K_COMMIT | K_END ) ( K_TRANSACTION transaction_name? )?
99 ;
100
Yigit Boyar19b41102016-11-20 10:46:32 -0800101create_index_stmt
102 : K_CREATE K_UNIQUE? K_INDEX ( K_IF K_NOT K_EXISTS )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800103 ( schema_name '.' )? index_name K_ON table_name '(' indexed_column ( ',' indexed_column )* ')'
Yigit Boyar19b41102016-11-20 10:46:32 -0800104 ( K_WHERE expr )?
105 ;
106
107create_table_stmt
108 : K_CREATE ( K_TEMP | K_TEMPORARY )? K_TABLE ( K_IF K_NOT K_EXISTS )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800109 ( schema_name '.' )? table_name
110 ( '(' column_def ( ',' column_def )*? ( ',' table_constraint )* ')' WITHOUT_ROWID?
Yigit Boyar19b41102016-11-20 10:46:32 -0800111 | K_AS select_stmt
112 )
113 ;
114
115create_trigger_stmt
116 : K_CREATE ( K_TEMP | K_TEMPORARY )? K_TRIGGER ( K_IF K_NOT K_EXISTS )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800117 ( schema_name '.' )? trigger_name ( K_BEFORE | K_AFTER | K_INSTEAD K_OF )?
118 ( K_DELETE | K_INSERT | K_UPDATE ( K_OF column_name ( ',' column_name )* )? ) K_ON ( schema_name '.' )? table_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800119 ( K_FOR K_EACH K_ROW )? ( K_WHEN expr )?
120 K_BEGIN ( ( update_stmt | insert_stmt | delete_stmt | select_stmt ) ';' )+ K_END
121 ;
122
123create_view_stmt
124 : K_CREATE ( K_TEMP | K_TEMPORARY )? K_VIEW ( K_IF K_NOT K_EXISTS )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800125 ( schema_name '.' )? view_name ( column_name ( ',' column_name )* )? K_AS select_stmt
Yigit Boyar19b41102016-11-20 10:46:32 -0800126 ;
127
128create_virtual_table_stmt
129 : K_CREATE K_VIRTUAL K_TABLE ( K_IF K_NOT K_EXISTS )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800130 ( schema_name '.' )? table_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800131 K_USING module_name ( '(' module_argument ( ',' module_argument )* ')' )?
132 ;
133
134delete_stmt
135 : with_clause? K_DELETE K_FROM qualified_table_name
136 ( K_WHERE expr )?
137 ;
138
139delete_stmt_limited
140 : with_clause? K_DELETE K_FROM qualified_table_name
141 ( K_WHERE expr )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800142 ( order_clause? limit_clause )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800143 ;
144
145detach_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800146 : K_DETACH K_DATABASE? schema_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800147 ;
148
149drop_index_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800150 : K_DROP K_INDEX ( K_IF K_EXISTS )? ( schema_name '.' )? index_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800151 ;
152
153drop_table_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800154 : K_DROP K_TABLE ( K_IF K_EXISTS )? ( schema_name '.' )? table_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800155 ;
156
157drop_trigger_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800158 : K_DROP K_TRIGGER ( K_IF K_EXISTS )? ( schema_name '.' )? trigger_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800159 ;
160
161drop_view_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800162 : K_DROP K_VIEW ( K_IF K_EXISTS )? ( schema_name '.' )? view_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800163 ;
164
165insert_stmt
166 : with_clause? ( K_INSERT
167 | K_REPLACE
168 | K_INSERT K_OR K_REPLACE
169 | K_INSERT K_OR K_ROLLBACK
170 | K_INSERT K_OR K_ABORT
171 | K_INSERT K_OR K_FAIL
172 | K_INSERT K_OR K_IGNORE ) K_INTO
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800173 ( schema_name '.' )? table_name ( K_AS table_alias )? ( '(' column_name ( ',' column_name )* ')' )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800174 ( K_VALUES '(' expr ( ',' expr )* ')' ( ',' '(' expr ( ',' expr )* ')' )*
175 | select_stmt
176 | K_DEFAULT K_VALUES
177 )
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800178 upsert_clause?
179 ;
180
181upsert_clause
182 : K_ON K_CONFLICT ( '(' indexed_column ( ',' indexed_column )* ')' ( K_WHERE expr )? )?
183 ( DO_NOTHING
184 | DO_UPDATE K_SET ( column_name | column_name_list ) '=' expr
185 ( ',' ( column_name | column_name_list ) '=' expr )*
186 ( K_WHERE expr )?
187 )
Yigit Boyar19b41102016-11-20 10:46:32 -0800188 ;
189
190pragma_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800191 : K_PRAGMA ( schema_name '.' )? pragma_name ( '=' pragma_value | '(' pragma_value ')' )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800192 ;
193
194reindex_stmt
195 : K_REINDEX ( collation_name
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800196 | ( schema_name '.' )? ( table_name | index_name )
Yigit Boyar19b41102016-11-20 10:46:32 -0800197 )?
198 ;
199
200release_stmt
201 : K_RELEASE K_SAVEPOINT? savepoint_name
202 ;
203
204rollback_stmt
205 : K_ROLLBACK ( K_TRANSACTION transaction_name? )? ( K_TO K_SAVEPOINT? savepoint_name )?
206 ;
207
208savepoint_stmt
209 : K_SAVEPOINT savepoint_name
210 ;
211
Yigit Boyar19b41102016-11-20 10:46:32 -0800212select_stmt
213 : with_clause?
214 select_or_values ( compound_operator select_or_values )*
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800215 order_clause?
216 limit_clause?
Yigit Boyar19b41102016-11-20 10:46:32 -0800217 ;
218
219select_or_values
220 : K_SELECT ( K_DISTINCT | K_ALL )? result_column ( ',' result_column )*
221 ( K_FROM ( table_or_subquery ( ',' table_or_subquery )* | join_clause ) )?
222 ( K_WHERE expr )?
223 ( K_GROUP K_BY expr ( ',' expr )* ( K_HAVING expr )? )?
224 | K_VALUES '(' expr ( ',' expr )* ')' ( ',' '(' expr ( ',' expr )* ')' )*
225 ;
226
227update_stmt
228 : with_clause? K_UPDATE ( K_OR K_ROLLBACK
229 | K_OR K_ABORT
230 | K_OR K_REPLACE
231 | K_OR K_FAIL
232 | K_OR K_IGNORE )? qualified_table_name
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800233 K_SET ( column_name | column_name_list ) '=' expr ( ',' ( column_name | column_name_list ) '=' expr )*
234 ( K_WHERE expr )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800235 ;
236
237update_stmt_limited
238 : with_clause? K_UPDATE ( K_OR K_ROLLBACK
239 | K_OR K_ABORT
240 | K_OR K_REPLACE
241 | K_OR K_FAIL
242 | K_OR K_IGNORE )? qualified_table_name
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800243 K_SET ( column_name | column_name_list ) '=' expr ( ',' ( column_name | column_name_list ) '=' expr )*
244 ( K_WHERE expr )?
245 ( order_clause? limit_clause )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800246 ;
247
248vacuum_stmt
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800249 : K_VACUUM schema_name?
Yigit Boyar19b41102016-11-20 10:46:32 -0800250 ;
251
252column_def
253 : column_name type_name? column_constraint*
254 ;
255
256type_name
257 : name+? ( '(' signed_number ')'
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800258 | '(' signed_number ',' signed_number ')' )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800259 ;
260
261column_constraint
262 : ( K_CONSTRAINT name )?
263 ( K_PRIMARY K_KEY ( K_ASC | K_DESC )? conflict_clause K_AUTOINCREMENT?
264 | K_NOT? K_NULL conflict_clause
265 | K_UNIQUE conflict_clause
266 | K_CHECK '(' expr ')'
267 | K_DEFAULT (signed_number | literal_value | '(' expr ')')
268 | K_COLLATE collation_name
269 | foreign_key_clause
270 )
271 ;
272
273conflict_clause
274 : ( K_ON K_CONFLICT ( K_ROLLBACK
275 | K_ABORT
276 | K_FAIL
277 | K_IGNORE
278 | K_REPLACE
279 )
280 )?
281 ;
282
Yigit Boyar19b41102016-11-20 10:46:32 -0800283expr
284 : literal_value
285 | BIND_PARAMETER
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800286 | ( ( schema_name '.' )? table_name '.' )? column_name
Yigit Boyar19b41102016-11-20 10:46:32 -0800287 | unary_operator expr
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800288 | expr binary_operator expr
Yigit Boyar19b41102016-11-20 10:46:32 -0800289 | function_name '(' ( K_DISTINCT? expr ( ',' expr )* | '*' )? ')'
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800290 | '(' expr ( ',' expr )* ')'
Yigit Boyar19b41102016-11-20 10:46:32 -0800291 | K_CAST '(' expr K_AS type_name ')'
292 | expr K_COLLATE collation_name
293 | expr K_NOT? ( K_LIKE | K_GLOB | K_REGEXP | K_MATCH ) expr ( K_ESCAPE expr )?
294 | expr ( K_ISNULL | K_NOTNULL | K_NOT K_NULL )
295 | expr K_IS K_NOT? expr
296 | expr K_NOT? K_BETWEEN expr K_AND expr
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800297 | expr K_NOT? K_IN ( '(' ( select_stmt | expr ( ',' expr )* )? ')'
298 | ( schema_name '.' )? table_name
299 | ( schema_name '.' )? table_function '(' ( expr ( ',' expr )* )? ')' )
Yigit Boyar19b41102016-11-20 10:46:32 -0800300 | ( ( K_NOT )? K_EXISTS )? '(' select_stmt ')'
301 | K_CASE expr? ( K_WHEN expr K_THEN expr )+ ( K_ELSE expr )? K_END
302 | raise_function
303 ;
304
305foreign_key_clause
306 : K_REFERENCES foreign_table ( '(' column_name ( ',' column_name )* ')' )?
307 ( ( K_ON ( K_DELETE | K_UPDATE ) ( K_SET K_NULL
308 | K_SET K_DEFAULT
309 | K_CASCADE
310 | K_RESTRICT
311 | K_NO K_ACTION )
312 | K_MATCH name
313 )
314 )*
315 ( K_NOT? K_DEFERRABLE ( K_INITIALLY K_DEFERRED | K_INITIALLY K_IMMEDIATE )? )?
316 ;
317
318raise_function
319 : K_RAISE '(' ( K_IGNORE
320 | ( K_ROLLBACK | K_ABORT | K_FAIL ) ',' error_message )
321 ')'
322 ;
323
324indexed_column
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800325 : ( column_name | expr ) ( K_COLLATE collation_name )? ( K_ASC | K_DESC )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800326 ;
327
328table_constraint
329 : ( K_CONSTRAINT name )?
330 ( ( K_PRIMARY K_KEY | K_UNIQUE ) '(' indexed_column ( ',' indexed_column )* ')' conflict_clause
331 | K_CHECK '(' expr ')'
332 | K_FOREIGN K_KEY '(' column_name ( ',' column_name )* ')' foreign_key_clause
333 )
334 ;
335
336with_clause
337 : K_WITH K_RECURSIVE? common_table_expression ( ',' common_table_expression )*
338 ;
339
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800340common_table_expression
341 : table_name ( '(' column_name ( ',' column_name )* ')' )? K_AS '(' select_stmt ')'
342 ;
343
Yigit Boyar19b41102016-11-20 10:46:32 -0800344qualified_table_name
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800345 : ( schema_name '.' )? table_name ( K_AS table_alias )?
346 ( K_INDEXED K_BY index_name | K_NOT K_INDEXED )?
347 ;
348
349order_clause
350 : K_ORDER K_BY ordering_term ( ',' ordering_term )*
Yigit Boyar19b41102016-11-20 10:46:32 -0800351 ;
352
353ordering_term
354 : expr ( K_COLLATE collation_name )? ( K_ASC | K_DESC )?
355 ;
356
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800357limit_clause
358 : K_LIMIT expr ( ( K_OFFSET | ',' ) expr )?
359 ;
360
Yigit Boyar19b41102016-11-20 10:46:32 -0800361pragma_value
362 : signed_number
363 | name
364 | STRING_LITERAL
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800365 | boolean_literal
Yigit Boyar19b41102016-11-20 10:46:32 -0800366 ;
367
368result_column
369 : '*'
370 | table_name '.' '*'
371 | expr ( K_AS? column_alias )?
372 ;
373
374table_or_subquery
375 : ( schema_name '.' )? table_name ( K_AS? table_alias )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800376 ( K_INDEXED K_BY index_name | K_NOT K_INDEXED )?
377 | ( schema_name '.' )? table_function '(' ( expr ( ',' expr )* )? ')' ( K_AS? table_alias )?
378 | '(' ( table_or_subquery ( ',' table_or_subquery )* | join_clause ) ')'
Yigit Boyar19b41102016-11-20 10:46:32 -0800379 | '(' select_stmt ')' ( K_AS? table_alias )?
380 ;
381
382join_clause
383 : table_or_subquery ( join_operator table_or_subquery join_constraint )*
384 ;
385
386join_operator
387 : ','
388 | K_NATURAL? ( K_LEFT K_OUTER? | K_INNER | K_CROSS )? K_JOIN
389 ;
390
391join_constraint
392 : ( K_ON expr
393 | K_USING '(' column_name ( ',' column_name )* ')' )?
394 ;
395
Yigit Boyar19b41102016-11-20 10:46:32 -0800396compound_operator
397 : K_UNION
398 | K_UNION K_ALL
399 | K_INTERSECT
400 | K_EXCEPT
401 ;
402
403signed_number
404 : ( '+' | '-' )? NUMERIC_LITERAL
405 ;
406
407literal_value
408 : NUMERIC_LITERAL
409 | STRING_LITERAL
410 | BLOB_LITERAL
411 | K_NULL
412 | K_CURRENT_TIME
413 | K_CURRENT_DATE
414 | K_CURRENT_TIMESTAMP
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800415 | boolean_literal
416 ;
417
418boolean_literal
419 : TRUE
420 | FALSE
Yigit Boyar19b41102016-11-20 10:46:32 -0800421 ;
422
423unary_operator
424 : '-'
425 | '+'
426 | '~'
427 | K_NOT
428 ;
429
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800430/*
431 SQLite understands the following binary operators, in order from highest to
432 lowest precedence:
433
434 ||
435 * / %
436 + -
437 << >> & |
438 < <= > >=
439 = == != <> IS IS NOT IN LIKE GLOB MATCH REGEXP
440 AND
441 OR
442
443 This rule is only used in `expr`, which has more complete directives for `IS` through `REGEXP`,
444 so we leave them out here.
445*/
446binary_operator
447 : '||'
448 | ( '*' | '/' | '%' )
449 | ( '+' | '-' )
450 | ( '<<' | '>>' | '&' | '|' )
451 | ( '<' | '<=' | '>' | '>=' )
452 | ( '=' | '==' | '!=' | '<>' )
453 | K_AND
454 | K_OR
455 ;
456
Yigit Boyar19b41102016-11-20 10:46:32 -0800457error_message
458 : STRING_LITERAL
459 ;
460
461module_argument // TODO check what exactly is permitted here
462 : expr
463 | column_def
464 ;
465
466column_alias
467 : IDENTIFIER
468 | STRING_LITERAL
469 ;
470
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800471column_name_list
472 : '(' column_name ( ',' column_name )* ')'
473 ;
474
Yigit Boyar19b41102016-11-20 10:46:32 -0800475keyword
476 : K_ABORT
477 | K_ACTION
478 | K_ADD
479 | K_AFTER
480 | K_ALL
481 | K_ALTER
482 | K_ANALYZE
483 | K_AND
484 | K_AS
485 | K_ASC
486 | K_ATTACH
487 | K_AUTOINCREMENT
488 | K_BEFORE
489 | K_BEGIN
490 | K_BETWEEN
491 | K_BY
492 | K_CASCADE
493 | K_CASE
494 | K_CAST
495 | K_CHECK
496 | K_COLLATE
497 | K_COLUMN
498 | K_COMMIT
499 | K_CONFLICT
500 | K_CONSTRAINT
501 | K_CREATE
502 | K_CROSS
503 | K_CURRENT_DATE
504 | K_CURRENT_TIME
505 | K_CURRENT_TIMESTAMP
506 | K_DATABASE
507 | K_DEFAULT
508 | K_DEFERRABLE
509 | K_DEFERRED
510 | K_DELETE
511 | K_DESC
512 | K_DETACH
513 | K_DISTINCT
514 | K_DROP
515 | K_EACH
516 | K_ELSE
517 | K_END
518 | K_ESCAPE
519 | K_EXCEPT
520 | K_EXCLUSIVE
521 | K_EXISTS
522 | K_EXPLAIN
523 | K_FAIL
524 | K_FOR
525 | K_FOREIGN
526 | K_FROM
527 | K_FULL
528 | K_GLOB
529 | K_GROUP
530 | K_HAVING
531 | K_IF
532 | K_IGNORE
533 | K_IMMEDIATE
534 | K_IN
535 | K_INDEX
536 | K_INDEXED
537 | K_INITIALLY
538 | K_INNER
539 | K_INSERT
540 | K_INSTEAD
541 | K_INTERSECT
542 | K_INTO
543 | K_IS
544 | K_ISNULL
545 | K_JOIN
546 | K_KEY
547 | K_LEFT
548 | K_LIKE
549 | K_LIMIT
550 | K_MATCH
551 | K_NATURAL
552 | K_NO
553 | K_NOT
554 | K_NOTNULL
555 | K_NULL
556 | K_OF
557 | K_OFFSET
558 | K_ON
559 | K_OR
560 | K_ORDER
561 | K_OUTER
562 | K_PLAN
563 | K_PRAGMA
564 | K_PRIMARY
565 | K_QUERY
566 | K_RAISE
567 | K_RECURSIVE
568 | K_REFERENCES
569 | K_REGEXP
570 | K_REINDEX
571 | K_RELEASE
572 | K_RENAME
573 | K_REPLACE
574 | K_RESTRICT
575 | K_RIGHT
576 | K_ROLLBACK
577 | K_ROW
578 | K_SAVEPOINT
579 | K_SELECT
580 | K_SET
581 | K_TABLE
582 | K_TEMP
583 | K_TEMPORARY
584 | K_THEN
585 | K_TO
586 | K_TRANSACTION
587 | K_TRIGGER
588 | K_UNION
589 | K_UNIQUE
590 | K_UPDATE
591 | K_USING
592 | K_VACUUM
593 | K_VALUES
594 | K_VIEW
595 | K_VIRTUAL
596 | K_WHEN
597 | K_WHERE
598 | K_WITH
599 | K_WITHOUT
600 ;
601
602// TODO check all names below
603
604name
605 : any_name
606 ;
607
608function_name
609 : any_name
610 ;
611
Yigit Boyar19b41102016-11-20 10:46:32 -0800612schema_name
613 : any_name
614 ;
615
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800616table_function
Yigit Boyar19b41102016-11-20 10:46:32 -0800617 : any_name
618 ;
619
620table_name
621 : any_name
622 ;
623
624table_or_index_name
625 : any_name
626 ;
627
628new_table_name
629 : any_name
630 ;
631
632column_name
633 : any_name
634 ;
635
636collation_name
637 : any_name
638 ;
639
640foreign_table
641 : any_name
642 ;
643
644index_name
645 : any_name
646 ;
647
648trigger_name
649 : any_name
650 ;
651
652view_name
653 : any_name
654 ;
655
656module_name
657 : any_name
658 ;
659
660pragma_name
661 : any_name
662 ;
663
664savepoint_name
665 : any_name
666 ;
667
668table_alias
669 : IDENTIFIER
670 | STRING_LITERAL
671 | '(' table_alias ')'
672 ;
673
674transaction_name
675 : any_name
676 ;
677
678any_name
679 : IDENTIFIER
680 | keyword
681 | STRING_LITERAL
682 | '(' any_name ')'
683 ;
684
685SCOL : ';';
686DOT : '.';
687OPEN_PAR : '(';
688CLOSE_PAR : ')';
689COMMA : ',';
690ASSIGN : '=';
691STAR : '*';
692PLUS : '+';
693MINUS : '-';
694TILDE : '~';
695PIPE2 : '||';
696DIV : '/';
697MOD : '%';
698LT2 : '<<';
699GT2 : '>>';
700AMP : '&';
701PIPE : '|';
702LT : '<';
703LT_EQ : '<=';
704GT : '>';
705GT_EQ : '>=';
706EQ : '==';
707NOT_EQ1 : '!=';
708NOT_EQ2 : '<>';
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800709TRUE : T R U E;
710FALSE : F A L S E;
Yigit Boyar19b41102016-11-20 10:46:32 -0800711
712// http://www.sqlite.org/lang_keywords.html
713K_ABORT : A B O R T;
714K_ACTION : A C T I O N;
715K_ADD : A D D;
716K_AFTER : A F T E R;
717K_ALL : A L L;
718K_ALTER : A L T E R;
719K_ANALYZE : A N A L Y Z E;
720K_AND : A N D;
721K_AS : A S;
722K_ASC : A S C;
723K_ATTACH : A T T A C H;
724K_AUTOINCREMENT : A U T O I N C R E M E N T;
725K_BEFORE : B E F O R E;
726K_BEGIN : B E G I N;
727K_BETWEEN : B E T W E E N;
728K_BY : B Y;
729K_CASCADE : C A S C A D E;
730K_CASE : C A S E;
731K_CAST : C A S T;
732K_CHECK : C H E C K;
733K_COLLATE : C O L L A T E;
734K_COLUMN : C O L U M N;
735K_COMMIT : C O M M I T;
736K_CONFLICT : C O N F L I C T;
737K_CONSTRAINT : C O N S T R A I N T;
738K_CREATE : C R E A T E;
739K_CROSS : C R O S S;
740K_CURRENT_DATE : C U R R E N T '_' D A T E;
741K_CURRENT_TIME : C U R R E N T '_' T I M E;
742K_CURRENT_TIMESTAMP : C U R R E N T '_' T I M E S T A M P;
743K_DATABASE : D A T A B A S E;
744K_DEFAULT : D E F A U L T;
745K_DEFERRABLE : D E F E R R A B L E;
746K_DEFERRED : D E F E R R E D;
747K_DELETE : D E L E T E;
748K_DESC : D E S C;
749K_DETACH : D E T A C H;
750K_DISTINCT : D I S T I N C T;
751K_DROP : D R O P;
752K_EACH : E A C H;
753K_ELSE : E L S E;
754K_END : E N D;
755K_ESCAPE : E S C A P E;
756K_EXCEPT : E X C E P T;
757K_EXCLUSIVE : E X C L U S I V E;
758K_EXISTS : E X I S T S;
759K_EXPLAIN : E X P L A I N;
760K_FAIL : F A I L;
761K_FOR : F O R;
762K_FOREIGN : F O R E I G N;
763K_FROM : F R O M;
764K_FULL : F U L L;
765K_GLOB : G L O B;
766K_GROUP : G R O U P;
767K_HAVING : H A V I N G;
768K_IF : I F;
769K_IGNORE : I G N O R E;
770K_IMMEDIATE : I M M E D I A T E;
771K_IN : I N;
772K_INDEX : I N D E X;
773K_INDEXED : I N D E X E D;
774K_INITIALLY : I N I T I A L L Y;
775K_INNER : I N N E R;
776K_INSERT : I N S E R T;
777K_INSTEAD : I N S T E A D;
778K_INTERSECT : I N T E R S E C T;
779K_INTO : I N T O;
780K_IS : I S;
781K_ISNULL : I S N U L L;
782K_JOIN : J O I N;
783K_KEY : K E Y;
784K_LEFT : L E F T;
785K_LIKE : L I K E;
786K_LIMIT : L I M I T;
787K_MATCH : M A T C H;
788K_NATURAL : N A T U R A L;
789K_NO : N O;
790K_NOT : N O T;
791K_NOTNULL : N O T N U L L;
792K_NULL : N U L L;
793K_OF : O F;
794K_OFFSET : O F F S E T;
795K_ON : O N;
796K_OR : O R;
797K_ORDER : O R D E R;
798K_OUTER : O U T E R;
799K_PLAN : P L A N;
800K_PRAGMA : P R A G M A;
801K_PRIMARY : P R I M A R Y;
802K_QUERY : Q U E R Y;
803K_RAISE : R A I S E;
804K_RECURSIVE : R E C U R S I V E;
805K_REFERENCES : R E F E R E N C E S;
806K_REGEXP : R E G E X P;
807K_REINDEX : R E I N D E X;
808K_RELEASE : R E L E A S E;
809K_RENAME : R E N A M E;
810K_REPLACE : R E P L A C E;
811K_RESTRICT : R E S T R I C T;
812K_RIGHT : R I G H T;
813K_ROLLBACK : R O L L B A C K;
814K_ROW : R O W;
815K_SAVEPOINT : S A V E P O I N T;
816K_SELECT : S E L E C T;
817K_SET : S E T;
818K_TABLE : T A B L E;
819K_TEMP : T E M P;
820K_TEMPORARY : T E M P O R A R Y;
821K_THEN : T H E N;
822K_TO : T O;
823K_TRANSACTION : T R A N S A C T I O N;
824K_TRIGGER : T R I G G E R;
825K_UNION : U N I O N;
826K_UNIQUE : U N I Q U E;
827K_UPDATE : U P D A T E;
828K_USING : U S I N G;
829K_VACUUM : V A C U U M;
830K_VALUES : V A L U E S;
831K_VIEW : V I E W;
832K_VIRTUAL : V I R T U A L;
833K_WHEN : W H E N;
834K_WHERE : W H E R E;
835K_WITH : W I T H;
836K_WITHOUT : W I T H O U T;
837
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800838// These are not keywords, but their constituents might be wrongly matched as identifiers.
839WITHOUT_ROWID: K_WITHOUT SPACES R O W I D;
840DO_NOTHING: D O SPACES N O T H I N G;
841DO_UPDATE: D O SPACES K_UPDATE;
842
Yigit Boyar19b41102016-11-20 10:46:32 -0800843IDENTIFIER
844 : '"' (~'"' | '""')* '"'
845 | '`' (~'`' | '``')* '`'
846 | '[' ~']'* ']'
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800847 | [a-zA-Z_\u00a1-\uffff] [a-zA-Z_0-9\u00a1-\uffff]*
Yigit Boyar19b41102016-11-20 10:46:32 -0800848 ;
849
850NUMERIC_LITERAL
851 : DIGIT+ ( '.' DIGIT* )? ( E [-+]? DIGIT+ )?
852 | '.' DIGIT+ ( E [-+]? DIGIT+ )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800853 | '0' X HEXDIGIT+
Yigit Boyar19b41102016-11-20 10:46:32 -0800854 ;
855
856BIND_PARAMETER
857 : '?' DIGIT*
858 | [:@$] IDENTIFIER
859 ;
860
861STRING_LITERAL
862 : '\'' ( ~'\'' | '\'\'' )* '\''
863 ;
864
865BLOB_LITERAL
866 : X STRING_LITERAL
867 ;
868
869SINGLE_LINE_COMMENT
870 : '--' ~[\r\n]* -> channel(HIDDEN)
871 ;
872
873MULTILINE_COMMENT
874 : '/*' .*? ( '*/' | EOF ) -> channel(HIDDEN)
875 ;
876
877SPACES
878 : [ \u000B\t\r\n] -> channel(HIDDEN)
879 ;
880
881UNEXPECTED_CHAR
882 : .
883 ;
884
885fragment DIGIT : [0-9];
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800886fragment HEXDIGIT : [0-9a-fA-F];
Yigit Boyar19b41102016-11-20 10:46:32 -0800887
888fragment A : [aA];
889fragment B : [bB];
890fragment C : [cC];
891fragment D : [dD];
892fragment E : [eE];
893fragment F : [fF];
894fragment G : [gG];
895fragment H : [hH];
896fragment I : [iI];
897fragment J : [jJ];
898fragment K : [kK];
899fragment L : [lL];
900fragment M : [mM];
901fragment N : [nN];
902fragment O : [oO];
903fragment P : [pP];
904fragment Q : [qQ];
905fragment R : [rR];
906fragment S : [sS];
907fragment T : [tT];
908fragment U : [uU];
909fragment V : [vV];
910fragment W : [wW];
911fragment X : [xX];
912fragment Y : [yY];
913fragment Z : [zZ];