blob: 83af9e3232d58b00c1aa230dba022a81af7cee74 [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 )* ')' )?
Daniel Santiago Rivera3ed95002020-11-13 16:49:51 -0800174 ( K_VALUES '(' comma_separated_expr ')' ( ',' '(' comma_separated_expr ')' )*
Yigit Boyar19b41102016-11-20 10:46:32 -0800175 | 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 )?
Daniel Santiago Rivera3ed95002020-11-13 16:49:51 -0800223 ( K_GROUP K_BY comma_separated_expr ( K_HAVING expr )? )?
224 | K_VALUES '(' comma_separated_expr ')' ( ',' '(' comma_separated_expr ')' )*
Yigit Boyar19b41102016-11-20 10:46:32 -0800225 ;
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
Daniel Santiago Rivera3ed95002020-11-13 16:49:51 -0800289 | function_name '(' ( K_DISTINCT? comma_separated_expr | '*' )? ')'
290 | '(' comma_separated_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 Rivera3ed95002020-11-13 16:49:51 -0800297 | expr K_NOT? K_IN ( '(' ( select_stmt | comma_separated_expr )? ')'
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800298 | ( schema_name '.' )? table_name
Daniel Santiago Rivera3ed95002020-11-13 16:49:51 -0800299 | ( schema_name '.' )? table_function '(' ( comma_separated_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
Daniel Santiago Rivera3ed95002020-11-13 16:49:51 -0800305comma_separated_expr
306 : expr ( ',' expr )*
307 ;
308
Yigit Boyar19b41102016-11-20 10:46:32 -0800309foreign_key_clause
310 : K_REFERENCES foreign_table ( '(' column_name ( ',' column_name )* ')' )?
311 ( ( K_ON ( K_DELETE | K_UPDATE ) ( K_SET K_NULL
312 | K_SET K_DEFAULT
313 | K_CASCADE
314 | K_RESTRICT
315 | K_NO K_ACTION )
316 | K_MATCH name
317 )
318 )*
319 ( K_NOT? K_DEFERRABLE ( K_INITIALLY K_DEFERRED | K_INITIALLY K_IMMEDIATE )? )?
320 ;
321
322raise_function
323 : K_RAISE '(' ( K_IGNORE
324 | ( K_ROLLBACK | K_ABORT | K_FAIL ) ',' error_message )
325 ')'
326 ;
327
328indexed_column
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800329 : ( column_name | expr ) ( K_COLLATE collation_name )? ( K_ASC | K_DESC )?
Yigit Boyar19b41102016-11-20 10:46:32 -0800330 ;
331
332table_constraint
333 : ( K_CONSTRAINT name )?
334 ( ( K_PRIMARY K_KEY | K_UNIQUE ) '(' indexed_column ( ',' indexed_column )* ')' conflict_clause
335 | K_CHECK '(' expr ')'
336 | K_FOREIGN K_KEY '(' column_name ( ',' column_name )* ')' foreign_key_clause
337 )
338 ;
339
340with_clause
341 : K_WITH K_RECURSIVE? common_table_expression ( ',' common_table_expression )*
342 ;
343
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800344common_table_expression
345 : table_name ( '(' column_name ( ',' column_name )* ')' )? K_AS '(' select_stmt ')'
346 ;
347
Yigit Boyar19b41102016-11-20 10:46:32 -0800348qualified_table_name
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800349 : ( schema_name '.' )? table_name ( K_AS table_alias )?
350 ( K_INDEXED K_BY index_name | K_NOT K_INDEXED )?
351 ;
352
353order_clause
354 : K_ORDER K_BY ordering_term ( ',' ordering_term )*
Yigit Boyar19b41102016-11-20 10:46:32 -0800355 ;
356
357ordering_term
358 : expr ( K_COLLATE collation_name )? ( K_ASC | K_DESC )?
359 ;
360
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800361limit_clause
362 : K_LIMIT expr ( ( K_OFFSET | ',' ) expr )?
363 ;
364
Yigit Boyar19b41102016-11-20 10:46:32 -0800365pragma_value
366 : signed_number
367 | name
368 | STRING_LITERAL
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800369 | boolean_literal
Yigit Boyar19b41102016-11-20 10:46:32 -0800370 ;
371
372result_column
373 : '*'
374 | table_name '.' '*'
375 | expr ( K_AS? column_alias )?
376 ;
377
378table_or_subquery
379 : ( schema_name '.' )? table_name ( K_AS? table_alias )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800380 ( K_INDEXED K_BY index_name | K_NOT K_INDEXED )?
381 | ( schema_name '.' )? table_function '(' ( expr ( ',' expr )* )? ')' ( K_AS? table_alias )?
382 | '(' ( table_or_subquery ( ',' table_or_subquery )* | join_clause ) ')'
Yigit Boyar19b41102016-11-20 10:46:32 -0800383 | '(' select_stmt ')' ( K_AS? table_alias )?
384 ;
385
386join_clause
387 : table_or_subquery ( join_operator table_or_subquery join_constraint )*
388 ;
389
390join_operator
391 : ','
392 | K_NATURAL? ( K_LEFT K_OUTER? | K_INNER | K_CROSS )? K_JOIN
393 ;
394
395join_constraint
396 : ( K_ON expr
397 | K_USING '(' column_name ( ',' column_name )* ')' )?
398 ;
399
Yigit Boyar19b41102016-11-20 10:46:32 -0800400compound_operator
401 : K_UNION
402 | K_UNION K_ALL
403 | K_INTERSECT
404 | K_EXCEPT
405 ;
406
407signed_number
408 : ( '+' | '-' )? NUMERIC_LITERAL
409 ;
410
411literal_value
412 : NUMERIC_LITERAL
413 | STRING_LITERAL
414 | BLOB_LITERAL
415 | K_NULL
416 | K_CURRENT_TIME
417 | K_CURRENT_DATE
418 | K_CURRENT_TIMESTAMP
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800419 | boolean_literal
420 ;
421
422boolean_literal
423 : TRUE
424 | FALSE
Yigit Boyar19b41102016-11-20 10:46:32 -0800425 ;
426
427unary_operator
428 : '-'
429 | '+'
430 | '~'
431 | K_NOT
432 ;
433
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800434/*
435 SQLite understands the following binary operators, in order from highest to
436 lowest precedence:
437
438 ||
439 * / %
440 + -
441 << >> & |
442 < <= > >=
443 = == != <> IS IS NOT IN LIKE GLOB MATCH REGEXP
444 AND
445 OR
446
447 This rule is only used in `expr`, which has more complete directives for `IS` through `REGEXP`,
448 so we leave them out here.
449*/
450binary_operator
451 : '||'
452 | ( '*' | '/' | '%' )
453 | ( '+' | '-' )
454 | ( '<<' | '>>' | '&' | '|' )
455 | ( '<' | '<=' | '>' | '>=' )
456 | ( '=' | '==' | '!=' | '<>' )
457 | K_AND
458 | K_OR
459 ;
460
Yigit Boyar19b41102016-11-20 10:46:32 -0800461error_message
462 : STRING_LITERAL
463 ;
464
465module_argument // TODO check what exactly is permitted here
466 : expr
467 | column_def
468 ;
469
470column_alias
471 : IDENTIFIER
472 | STRING_LITERAL
473 ;
474
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800475column_name_list
476 : '(' column_name ( ',' column_name )* ')'
477 ;
478
Yigit Boyar19b41102016-11-20 10:46:32 -0800479keyword
480 : K_ABORT
481 | K_ACTION
482 | K_ADD
483 | K_AFTER
484 | K_ALL
485 | K_ALTER
486 | K_ANALYZE
487 | K_AND
488 | K_AS
489 | K_ASC
490 | K_ATTACH
491 | K_AUTOINCREMENT
492 | K_BEFORE
493 | K_BEGIN
494 | K_BETWEEN
495 | K_BY
496 | K_CASCADE
497 | K_CASE
498 | K_CAST
499 | K_CHECK
500 | K_COLLATE
501 | K_COLUMN
502 | K_COMMIT
503 | K_CONFLICT
504 | K_CONSTRAINT
505 | K_CREATE
506 | K_CROSS
507 | K_CURRENT_DATE
508 | K_CURRENT_TIME
509 | K_CURRENT_TIMESTAMP
510 | K_DATABASE
511 | K_DEFAULT
512 | K_DEFERRABLE
513 | K_DEFERRED
514 | K_DELETE
515 | K_DESC
516 | K_DETACH
517 | K_DISTINCT
518 | K_DROP
519 | K_EACH
520 | K_ELSE
521 | K_END
522 | K_ESCAPE
523 | K_EXCEPT
524 | K_EXCLUSIVE
525 | K_EXISTS
526 | K_EXPLAIN
527 | K_FAIL
528 | K_FOR
529 | K_FOREIGN
530 | K_FROM
531 | K_FULL
532 | K_GLOB
533 | K_GROUP
534 | K_HAVING
535 | K_IF
536 | K_IGNORE
537 | K_IMMEDIATE
538 | K_IN
539 | K_INDEX
540 | K_INDEXED
541 | K_INITIALLY
542 | K_INNER
543 | K_INSERT
544 | K_INSTEAD
545 | K_INTERSECT
546 | K_INTO
547 | K_IS
548 | K_ISNULL
549 | K_JOIN
550 | K_KEY
551 | K_LEFT
552 | K_LIKE
553 | K_LIMIT
554 | K_MATCH
555 | K_NATURAL
556 | K_NO
557 | K_NOT
558 | K_NOTNULL
559 | K_NULL
560 | K_OF
561 | K_OFFSET
562 | K_ON
563 | K_OR
564 | K_ORDER
565 | K_OUTER
566 | K_PLAN
567 | K_PRAGMA
568 | K_PRIMARY
569 | K_QUERY
570 | K_RAISE
571 | K_RECURSIVE
572 | K_REFERENCES
573 | K_REGEXP
574 | K_REINDEX
575 | K_RELEASE
576 | K_RENAME
577 | K_REPLACE
578 | K_RESTRICT
579 | K_RIGHT
580 | K_ROLLBACK
581 | K_ROW
582 | K_SAVEPOINT
583 | K_SELECT
584 | K_SET
585 | K_TABLE
586 | K_TEMP
587 | K_TEMPORARY
588 | K_THEN
589 | K_TO
590 | K_TRANSACTION
591 | K_TRIGGER
592 | K_UNION
593 | K_UNIQUE
594 | K_UPDATE
595 | K_USING
596 | K_VACUUM
597 | K_VALUES
598 | K_VIEW
599 | K_VIRTUAL
600 | K_WHEN
601 | K_WHERE
602 | K_WITH
603 | K_WITHOUT
604 ;
605
606// TODO check all names below
607
608name
609 : any_name
610 ;
611
612function_name
613 : any_name
614 ;
615
Yigit Boyar19b41102016-11-20 10:46:32 -0800616schema_name
617 : any_name
618 ;
619
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800620table_function
Yigit Boyar19b41102016-11-20 10:46:32 -0800621 : any_name
622 ;
623
624table_name
625 : any_name
626 ;
627
628table_or_index_name
629 : any_name
630 ;
631
632new_table_name
633 : any_name
634 ;
635
636column_name
637 : any_name
638 ;
639
640collation_name
641 : any_name
642 ;
643
644foreign_table
645 : any_name
646 ;
647
648index_name
649 : any_name
650 ;
651
652trigger_name
653 : any_name
654 ;
655
656view_name
657 : any_name
658 ;
659
660module_name
661 : any_name
662 ;
663
664pragma_name
665 : any_name
666 ;
667
668savepoint_name
669 : any_name
670 ;
671
672table_alias
673 : IDENTIFIER
674 | STRING_LITERAL
675 | '(' table_alias ')'
676 ;
677
678transaction_name
679 : any_name
680 ;
681
682any_name
683 : IDENTIFIER
684 | keyword
685 | STRING_LITERAL
686 | '(' any_name ')'
687 ;
688
689SCOL : ';';
690DOT : '.';
691OPEN_PAR : '(';
692CLOSE_PAR : ')';
693COMMA : ',';
694ASSIGN : '=';
695STAR : '*';
696PLUS : '+';
697MINUS : '-';
698TILDE : '~';
699PIPE2 : '||';
700DIV : '/';
701MOD : '%';
702LT2 : '<<';
703GT2 : '>>';
704AMP : '&';
705PIPE : '|';
706LT : '<';
707LT_EQ : '<=';
708GT : '>';
709GT_EQ : '>=';
710EQ : '==';
711NOT_EQ1 : '!=';
712NOT_EQ2 : '<>';
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800713TRUE : T R U E;
714FALSE : F A L S E;
Yigit Boyar19b41102016-11-20 10:46:32 -0800715
716// http://www.sqlite.org/lang_keywords.html
717K_ABORT : A B O R T;
718K_ACTION : A C T I O N;
719K_ADD : A D D;
720K_AFTER : A F T E R;
721K_ALL : A L L;
722K_ALTER : A L T E R;
723K_ANALYZE : A N A L Y Z E;
724K_AND : A N D;
725K_AS : A S;
726K_ASC : A S C;
727K_ATTACH : A T T A C H;
728K_AUTOINCREMENT : A U T O I N C R E M E N T;
729K_BEFORE : B E F O R E;
730K_BEGIN : B E G I N;
731K_BETWEEN : B E T W E E N;
732K_BY : B Y;
733K_CASCADE : C A S C A D E;
734K_CASE : C A S E;
735K_CAST : C A S T;
736K_CHECK : C H E C K;
737K_COLLATE : C O L L A T E;
738K_COLUMN : C O L U M N;
739K_COMMIT : C O M M I T;
740K_CONFLICT : C O N F L I C T;
741K_CONSTRAINT : C O N S T R A I N T;
742K_CREATE : C R E A T E;
743K_CROSS : C R O S S;
744K_CURRENT_DATE : C U R R E N T '_' D A T E;
745K_CURRENT_TIME : C U R R E N T '_' T I M E;
746K_CURRENT_TIMESTAMP : C U R R E N T '_' T I M E S T A M P;
747K_DATABASE : D A T A B A S E;
748K_DEFAULT : D E F A U L T;
749K_DEFERRABLE : D E F E R R A B L E;
750K_DEFERRED : D E F E R R E D;
751K_DELETE : D E L E T E;
752K_DESC : D E S C;
753K_DETACH : D E T A C H;
754K_DISTINCT : D I S T I N C T;
755K_DROP : D R O P;
756K_EACH : E A C H;
757K_ELSE : E L S E;
758K_END : E N D;
759K_ESCAPE : E S C A P E;
760K_EXCEPT : E X C E P T;
761K_EXCLUSIVE : E X C L U S I V E;
762K_EXISTS : E X I S T S;
763K_EXPLAIN : E X P L A I N;
764K_FAIL : F A I L;
765K_FOR : F O R;
766K_FOREIGN : F O R E I G N;
767K_FROM : F R O M;
768K_FULL : F U L L;
769K_GLOB : G L O B;
770K_GROUP : G R O U P;
771K_HAVING : H A V I N G;
772K_IF : I F;
773K_IGNORE : I G N O R E;
774K_IMMEDIATE : I M M E D I A T E;
775K_IN : I N;
776K_INDEX : I N D E X;
777K_INDEXED : I N D E X E D;
778K_INITIALLY : I N I T I A L L Y;
779K_INNER : I N N E R;
780K_INSERT : I N S E R T;
781K_INSTEAD : I N S T E A D;
782K_INTERSECT : I N T E R S E C T;
783K_INTO : I N T O;
784K_IS : I S;
785K_ISNULL : I S N U L L;
786K_JOIN : J O I N;
787K_KEY : K E Y;
788K_LEFT : L E F T;
789K_LIKE : L I K E;
790K_LIMIT : L I M I T;
791K_MATCH : M A T C H;
792K_NATURAL : N A T U R A L;
793K_NO : N O;
794K_NOT : N O T;
795K_NOTNULL : N O T N U L L;
796K_NULL : N U L L;
797K_OF : O F;
798K_OFFSET : O F F S E T;
799K_ON : O N;
800K_OR : O R;
801K_ORDER : O R D E R;
802K_OUTER : O U T E R;
803K_PLAN : P L A N;
804K_PRAGMA : P R A G M A;
805K_PRIMARY : P R I M A R Y;
806K_QUERY : Q U E R Y;
807K_RAISE : R A I S E;
808K_RECURSIVE : R E C U R S I V E;
809K_REFERENCES : R E F E R E N C E S;
810K_REGEXP : R E G E X P;
811K_REINDEX : R E I N D E X;
812K_RELEASE : R E L E A S E;
813K_RENAME : R E N A M E;
814K_REPLACE : R E P L A C E;
815K_RESTRICT : R E S T R I C T;
816K_RIGHT : R I G H T;
817K_ROLLBACK : R O L L B A C K;
818K_ROW : R O W;
819K_SAVEPOINT : S A V E P O I N T;
820K_SELECT : S E L E C T;
821K_SET : S E T;
822K_TABLE : T A B L E;
823K_TEMP : T E M P;
824K_TEMPORARY : T E M P O R A R Y;
825K_THEN : T H E N;
826K_TO : T O;
827K_TRANSACTION : T R A N S A C T I O N;
828K_TRIGGER : T R I G G E R;
829K_UNION : U N I O N;
830K_UNIQUE : U N I Q U E;
831K_UPDATE : U P D A T E;
832K_USING : U S I N G;
833K_VACUUM : V A C U U M;
834K_VALUES : V A L U E S;
835K_VIEW : V I E W;
836K_VIRTUAL : V I R T U A L;
837K_WHEN : W H E N;
838K_WHERE : W H E R E;
839K_WITH : W I T H;
840K_WITHOUT : W I T H O U T;
841
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800842// These are not keywords, but their constituents might be wrongly matched as identifiers.
843WITHOUT_ROWID: K_WITHOUT SPACES R O W I D;
844DO_NOTHING: D O SPACES N O T H I N G;
845DO_UPDATE: D O SPACES K_UPDATE;
846
Yigit Boyar19b41102016-11-20 10:46:32 -0800847IDENTIFIER
848 : '"' (~'"' | '""')* '"'
849 | '`' (~'`' | '``')* '`'
850 | '[' ~']'* ']'
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800851 | [a-zA-Z_\u00a1-\uffff] [a-zA-Z_0-9\u00a1-\uffff]*
Yigit Boyar19b41102016-11-20 10:46:32 -0800852 ;
853
854NUMERIC_LITERAL
855 : DIGIT+ ( '.' DIGIT* )? ( E [-+]? DIGIT+ )?
856 | '.' DIGIT+ ( E [-+]? DIGIT+ )?
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800857 | '0' X HEXDIGIT+
Yigit Boyar19b41102016-11-20 10:46:32 -0800858 ;
859
860BIND_PARAMETER
861 : '?' DIGIT*
862 | [:@$] IDENTIFIER
863 ;
864
865STRING_LITERAL
866 : '\'' ( ~'\'' | '\'\'' )* '\''
867 ;
868
869BLOB_LITERAL
870 : X STRING_LITERAL
871 ;
872
873SINGLE_LINE_COMMENT
874 : '--' ~[\r\n]* -> channel(HIDDEN)
875 ;
876
877MULTILINE_COMMENT
878 : '/*' .*? ( '*/' | EOF ) -> channel(HIDDEN)
879 ;
880
881SPACES
882 : [ \u000B\t\r\n] -> channel(HIDDEN)
883 ;
884
885UNEXPECTED_CHAR
886 : .
887 ;
888
889fragment DIGIT : [0-9];
Daniel Santiago Riverac93f5cd2019-03-08 14:37:44 -0800890fragment HEXDIGIT : [0-9a-fA-F];
Yigit Boyar19b41102016-11-20 10:46:32 -0800891
892fragment A : [aA];
893fragment B : [bB];
894fragment C : [cC];
895fragment D : [dD];
896fragment E : [eE];
897fragment F : [fF];
898fragment G : [gG];
899fragment H : [hH];
900fragment I : [iI];
901fragment J : [jJ];
902fragment K : [kK];
903fragment L : [lL];
904fragment M : [mM];
905fragment N : [nN];
906fragment O : [oO];
907fragment P : [pP];
908fragment Q : [qQ];
909fragment R : [rR];
910fragment S : [sS];
911fragment T : [tT];
912fragment U : [uU];
913fragment V : [vV];
914fragment W : [wW];
915fragment X : [xX];
916fragment Y : [yY];
917fragment Z : [zZ];