1/*
2 * The MIT License (MIT)
3 *
4 * Copyright (c) 2020 by Martin Mirchev
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
7 * associated documentation files (the "Software"), to deal in the Software without restriction,
8 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
9 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in all copies or
13 * substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
16 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 *
21 * Project : sqlite-parser; an ANTLR4 grammar for SQLite https://github.com/bkiers/sqlite-parser
22 * Developed by : Bart Kiers, bart@big-o.nl
23 */
24
25// $antlr-format alignTrailingComments on, columnLimit 150, maxEmptyLinesToKeep 1, reflowComments off, useTab off
26// $antlr-format allowShortRulesOnASingleLine on, alignSemicolons ownLine
27
28lexer grammar SQLiteLexer;
29
30options {
31    caseInsensitive = true;
32}
33
34// TODO: Add JSON operators -> and ->> added in 3.38.0
35SCOL      : ';';
36DOT       : '.';
37OPEN_PAR  : '(';
38CLOSE_PAR : ')';
39COMMA     : ',';
40ASSIGN    : '=';
41STAR      : '*';
42PLUS      : '+';
43MINUS     : '-';
44TILDE     : '~';
45PIPE2     : '||';
46DIV       : '/';
47MOD       : '%';
48LT2       : '<<';
49GT2       : '>>';
50AMP       : '&';
51PIPE      : '|';
52LT        : '<';
53LT_EQ     : '<=';
54GT        : '>';
55GT_EQ     : '>=';
56EQ        : '==';
57NOT_EQ1   : '!=';
58NOT_EQ2   : '<>';
59
60// http://www.sqlite.org/lang_keywords.html
61ABORT_             : 'ABORT';
62ACTION_            : 'ACTION';
63ADD_               : 'ADD';
64AFTER_             : 'AFTER';
65ALL_               : 'ALL';
66ALTER_             : 'ALTER';
67ANALYZE_           : 'ANALYZE';
68AND_               : 'AND';
69AS_                : 'AS';
70ASC_               : 'ASC';
71ATTACH_            : 'ATTACH';
72AUTOINCREMENT_     : 'AUTOINCREMENT';
73BEFORE_            : 'BEFORE';
74BEGIN_             : 'BEGIN';
75BETWEEN_           : 'BETWEEN';
76BY_                : 'BY';
77CASCADE_           : 'CASCADE';
78CASE_              : 'CASE';
79CAST_              : 'CAST';
80CHECK_             : 'CHECK';
81COLLATE_           : 'COLLATE';
82COLUMN_            : 'COLUMN';
83COMMIT_            : 'COMMIT';
84CONFLICT_          : 'CONFLICT';
85CONSTRAINT_        : 'CONSTRAINT';
86CREATE_            : 'CREATE';
87CROSS_             : 'CROSS';
88CURRENT_DATE_      : 'CURRENT_DATE';
89CURRENT_TIME_      : 'CURRENT_TIME';
90CURRENT_TIMESTAMP_ : 'CURRENT_TIMESTAMP';
91DATABASE_          : 'DATABASE';
92DEFAULT_           : 'DEFAULT';
93DEFERRABLE_        : 'DEFERRABLE';
94DEFERRED_          : 'DEFERRED';
95DELETE_            : 'DELETE';
96DESC_              : 'DESC';
97DETACH_            : 'DETACH';
98DISTINCT_          : 'DISTINCT';
99DROP_              : 'DROP';
100EACH_              : 'EACH';
101ELSE_              : 'ELSE';
102END_               : 'END';
103ESCAPE_            : 'ESCAPE';
104EXCEPT_            : 'EXCEPT';
105EXCLUSIVE_         : 'EXCLUSIVE';
106EXISTS_            : 'EXISTS';
107EXPLAIN_           : 'EXPLAIN';
108FAIL_              : 'FAIL';
109FOR_               : 'FOR';
110FOREIGN_           : 'FOREIGN';
111FROM_              : 'FROM';
112FULL_              : 'FULL';
113GLOB_              : 'GLOB';
114GROUP_             : 'GROUP';
115HAVING_            : 'HAVING';
116IF_                : 'IF';
117IGNORE_            : 'IGNORE';
118IMMEDIATE_         : 'IMMEDIATE';
119IN_                : 'IN';
120INDEX_             : 'INDEX';
121INDEXED_           : 'INDEXED';
122INITIALLY_         : 'INITIALLY';
123INNER_             : 'INNER';
124INSERT_            : 'INSERT';
125INSTEAD_           : 'INSTEAD';
126INTERSECT_         : 'INTERSECT';
127INTO_              : 'INTO';
128IS_                : 'IS';
129ISNULL_            : 'ISNULL';
130JOIN_              : 'JOIN';
131KEY_               : 'KEY';
132LEFT_              : 'LEFT';
133LIKE_              : 'LIKE';
134LIMIT_             : 'LIMIT';
135MATCH_             : 'MATCH';
136NATURAL_           : 'NATURAL';
137NO_                : 'NO';
138NOT_               : 'NOT';
139NOTNULL_           : 'NOTNULL';
140NULL_              : 'NULL';
141OF_                : 'OF';
142OFFSET_            : 'OFFSET';
143ON_                : 'ON';
144OR_                : 'OR';
145ORDER_             : 'ORDER';
146OUTER_             : 'OUTER';
147PLAN_              : 'PLAN';
148PRAGMA_            : 'PRAGMA';
149PRIMARY_           : 'PRIMARY';
150QUERY_             : 'QUERY';
151RAISE_             : 'RAISE';
152RECURSIVE_         : 'RECURSIVE';
153REFERENCES_        : 'REFERENCES';
154REGEXP_            : 'REGEXP';
155REINDEX_           : 'REINDEX';
156RELEASE_           : 'RELEASE';
157RENAME_            : 'RENAME';
158REPLACE_           : 'REPLACE';
159RESTRICT_          : 'RESTRICT';
160RETURNING_         : 'RETURNING';
161RIGHT_             : 'RIGHT';
162ROLLBACK_          : 'ROLLBACK';
163ROW_               : 'ROW';
164ROWS_              : 'ROWS';
165SAVEPOINT_         : 'SAVEPOINT';
166SELECT_            : 'SELECT';
167SET_               : 'SET';
168TABLE_             : 'TABLE';
169TEMP_              : 'TEMP';
170TEMPORARY_         : 'TEMPORARY';
171THEN_              : 'THEN';
172TO_                : 'TO';
173TRANSACTION_       : 'TRANSACTION';
174TRIGGER_           : 'TRIGGER';
175UNION_             : 'UNION';
176UNIQUE_            : 'UNIQUE';
177UPDATE_            : 'UPDATE';
178USING_             : 'USING';
179VACUUM_            : 'VACUUM';
180VALUES_            : 'VALUES';
181VIEW_              : 'VIEW';
182VIRTUAL_           : 'VIRTUAL';
183WHEN_              : 'WHEN';
184WHERE_             : 'WHERE';
185WITH_              : 'WITH';
186WITHOUT_           : 'WITHOUT';
187FIRST_VALUE_       : 'FIRST_VALUE';
188OVER_              : 'OVER';
189PARTITION_         : 'PARTITION';
190RANGE_             : 'RANGE';
191PRECEDING_         : 'PRECEDING';
192UNBOUNDED_         : 'UNBOUNDED';
193CURRENT_           : 'CURRENT';
194FOLLOWING_         : 'FOLLOWING';
195CUME_DIST_         : 'CUME_DIST';
196DENSE_RANK_        : 'DENSE_RANK';
197LAG_               : 'LAG';
198LAST_VALUE_        : 'LAST_VALUE';
199LEAD_              : 'LEAD';
200NTH_VALUE_         : 'NTH_VALUE';
201NTILE_             : 'NTILE';
202PERCENT_RANK_      : 'PERCENT_RANK';
203RANK_              : 'RANK';
204ROW_NUMBER_        : 'ROW_NUMBER';
205GENERATED_         : 'GENERATED';
206ALWAYS_            : 'ALWAYS';
207STORED_            : 'STORED';
208TRUE_              : 'TRUE';
209FALSE_             : 'FALSE';
210WINDOW_            : 'WINDOW';
211NULLS_             : 'NULLS';
212FIRST_             : 'FIRST';
213LAST_              : 'LAST';
214FILTER_            : 'FILTER';
215GROUPS_            : 'GROUPS';
216EXCLUDE_           : 'EXCLUDE';
217TIES_              : 'TIES';
218OTHERS_            : 'OTHERS';
219DO_                : 'DO';
220NOTHING_           : 'NOTHING';
221
222IDENTIFIER:
223    '"' (~'"' | '""')* '"'
224    | '`' (~'`' | '``')* '`'
225    | '[' ~']'* ']'
226    | [A-Z_\u007f-\uffff] [A-Z_0-9\u007f-\uffff]*
227;
228
229NUMERIC_LITERAL: ((DIGIT+ ('.' DIGIT*)?) | ('.' DIGIT+)) ('E' [-+]? DIGIT+)? | '0x' HEX_DIGIT+;
230
231BIND_PARAMETER: '?' DIGIT* | [:@$] IDENTIFIER;
232
233STRING_LITERAL: '\'' ( ~'\'' | '\'\'')* '\'';
234
235BLOB_LITERAL: 'X' STRING_LITERAL;
236
237SINGLE_LINE_COMMENT: '--' ~[\r\n]* (('\r'? '\n') | EOF) -> channel(HIDDEN);
238
239MULTILINE_COMMENT: '/*' .*? '*/' -> channel(HIDDEN);
240
241SPACES: [ \u000B\t\r\n] -> channel(HIDDEN);
242
243UNEXPECTED_CHAR: .;
244
245fragment HEX_DIGIT : [0-9A-F];
246fragment DIGIT     : [0-9];