blob: 0eef7ea528ad8d524a16f6e0e95994ddd5e5879b [file] [log] [blame]
/*
* The MIT License (MIT)
*
* Copyright (c) 2014 by Bart Kiers
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
* associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* Project : sqlite-parser; an ANTLR4 grammar for SQLite https://github.com/bkiers/sqlite-parser
* Developed by:
* Bart Kiers, [email protected]
* Martin Mirchev, [email protected]
* Mike Lische, [email protected]
*/
// $antlr-format alignTrailingComments on, columnLimit 130, minEmptyLines 1, maxEmptyLinesToKeep 1, reflowComments off
// $antlr-format useTab off, allowShortRulesOnASingleLine off, allowShortBlocksOnASingleLine on, alignSemicolons ownLine
parser grammar SQLiteParser; // For version 3.41.0 of SQLite
options {
tokenVocab = SQLiteLexer;
}
parse
: (sql_stmt_list)* EOF
;
sql_stmt_list
: SCOL* sql_stmt (SCOL+ sql_stmt)* SCOL*
;
sql_stmt
: (EXPLAIN_ (QUERY_ PLAN_)?)? (
alter_table_stmt
| analyze_stmt
| attach_stmt
| begin_stmt
| commit_stmt
| create_index_stmt
| create_table_stmt
| create_trigger_stmt
| create_view_stmt
| create_virtual_table_stmt
| delete_stmt
| delete_stmt_limited
| detach_stmt
| drop_stmt
| insert_stmt
| pragma_stmt
| reindex_stmt
| release_stmt
| rollback_stmt
| savepoint_stmt
| select_stmt
| update_stmt
| update_stmt_limited
| vacuum_stmt
)
;
alter_table_stmt
: ALTER_ TABLE_ (schema_name DOT)? table_name (
RENAME_ (
TO_ new_table_name = table_name
| COLUMN_? old_column_name = column_name TO_ new_column_name = column_name
)
| ADD_ COLUMN_? column_def
| DROP_ COLUMN_? column_name
)
;
analyze_stmt
: ANALYZE_ (schema_name | (schema_name DOT)? table_or_index_name)?
;
attach_stmt
: ATTACH_ DATABASE_? expr AS_ schema_name
;
begin_stmt
: BEGIN_ (DEFERRED_ | IMMEDIATE_ | EXCLUSIVE_)? (TRANSACTION_ transaction_name?)?
;
commit_stmt
: (COMMIT_ | END_) TRANSACTION_?
;
rollback_stmt
: ROLLBACK_ TRANSACTION_? (TO_ SAVEPOINT_? savepoint_name)?
;
savepoint_stmt
: SAVEPOINT_ savepoint_name
;
release_stmt
: RELEASE_ SAVEPOINT_? savepoint_name
;
create_index_stmt
: CREATE_ UNIQUE_? INDEX_ (IF_ NOT_ EXISTS_)? (schema_name DOT)? index_name ON_ table_name OPEN_PAR indexed_column (
COMMA indexed_column
)* CLOSE_PAR (WHERE_ expr)?
;
indexed_column
: (column_name | expr) (COLLATE_ collation_name)? asc_desc?
;
create_table_stmt
: CREATE_ (TEMP_ | TEMPORARY_)? TABLE_ (IF_ NOT_ EXISTS_)? (schema_name DOT)? table_name (
OPEN_PAR column_def (COMMA column_def)*? (COMMA table_constraint)* CLOSE_PAR (
WITHOUT_ row_ROW_ID = IDENTIFIER
)?
| AS_ select_stmt
)
;
column_def
: column_name type_name? column_constraint*
;
type_name
: name+? (
OPEN_PAR signed_number CLOSE_PAR
| OPEN_PAR signed_number COMMA signed_number CLOSE_PAR
)?
;
column_constraint
: (CONSTRAINT_ name)? (
(PRIMARY_ KEY_ asc_desc? conflict_clause? AUTOINCREMENT_?)
| (NOT_? NULL_ | UNIQUE_) conflict_clause?
| CHECK_ OPEN_PAR expr CLOSE_PAR
| DEFAULT_ (signed_number | literal_value | OPEN_PAR expr CLOSE_PAR)
| COLLATE_ collation_name
| foreign_key_clause
| (GENERATED_ ALWAYS_)? AS_ OPEN_PAR expr CLOSE_PAR (STORED_ | VIRTUAL_)?
)
;
signed_number
: (PLUS | MINUS)? NUMERIC_LITERAL
;
table_constraint
: (CONSTRAINT_ name)? (
(PRIMARY_ KEY_ | UNIQUE_) OPEN_PAR indexed_column (COMMA indexed_column)* CLOSE_PAR conflict_clause?
| CHECK_ OPEN_PAR expr CLOSE_PAR
| FOREIGN_ KEY_ OPEN_PAR column_name (COMMA column_name)* CLOSE_PAR foreign_key_clause
)
;
foreign_key_clause
: REFERENCES_ foreign_table (OPEN_PAR column_name (COMMA column_name)* CLOSE_PAR)? (
ON_ (DELETE_ | UPDATE_) (
SET_ (NULL_ | DEFAULT_)
| CASCADE_
| RESTRICT_
| NO_ ACTION_
)
| MATCH_ name
)* (NOT_? DEFERRABLE_ (INITIALLY_ (DEFERRED_ | IMMEDIATE_))?)?
;
conflict_clause
: ON_ CONFLICT_ (ROLLBACK_ | ABORT_ | FAIL_ | IGNORE_ | REPLACE_)
;
create_trigger_stmt
: CREATE_ (TEMP_ | TEMPORARY_)? TRIGGER_ (IF_ NOT_ EXISTS_)? (schema_name DOT)? trigger_name (
BEFORE_
| AFTER_
| INSTEAD_ OF_
)? (DELETE_ | INSERT_ | UPDATE_ (OF_ column_name ( COMMA column_name)*)?) ON_ table_name (
FOR_ EACH_ ROW_
)? (WHEN_ expr)? BEGIN_ (
(update_stmt | insert_stmt | delete_stmt | select_stmt) SCOL
)+ END_
;
create_view_stmt
: CREATE_ (TEMP_ | TEMPORARY_)? VIEW_ (IF_ NOT_ EXISTS_)? (schema_name DOT)? view_name (
OPEN_PAR column_name (COMMA column_name)* CLOSE_PAR
)? AS_ select_stmt
;
create_virtual_table_stmt
: CREATE_ VIRTUAL_ TABLE_ (IF_ NOT_ EXISTS_)? (schema_name DOT)? table_name USING_ module_name (
OPEN_PAR module_argument (COMMA module_argument)* CLOSE_PAR
)?
;
with_clause
: WITH_ RECURSIVE_? cte_table_name AS_ OPEN_PAR select_stmt CLOSE_PAR (
COMMA cte_table_name AS_ OPEN_PAR select_stmt CLOSE_PAR
)*
;
cte_table_name
: table_name (OPEN_PAR column_name ( COMMA column_name)* CLOSE_PAR)?
;
recursive_cte
: cte_table_name AS_ OPEN_PAR initial_select UNION_ ALL_? recursive_select CLOSE_PAR
;
common_table_expression
: table_name (OPEN_PAR column_name ( COMMA column_name)* CLOSE_PAR)? AS_ OPEN_PAR select_stmt CLOSE_PAR
;
delete_stmt
: with_clause? DELETE_ FROM_ qualified_table_name (WHERE_ expr)? returning_clause?
;
delete_stmt_limited
: with_clause? DELETE_ FROM_ qualified_table_name (WHERE_ expr)? returning_clause? (
order_by_stmt? limit_stmt
)?
;
detach_stmt
: DETACH_ DATABASE_? schema_name
;
drop_stmt
: DROP_ object = (INDEX_ | TABLE_ | TRIGGER_ | VIEW_) (IF_ EXISTS_)? (
schema_name DOT
)? any_name
;
/*
SQLite understands the following binary operators, in order from highest to lowest precedence:
||
* / %
+ -
<< >> & |
< <= > >=
= == != <> IS IS NOT IS DISTINCT FROM IS NOT DISTINCT FROM IN LIKE GLOB MATCH REGEXP
AND
OR
*/
expr
: literal_value
| BIND_PARAMETER
| ((schema_name DOT)? table_name DOT)? column_name
| unary_operator expr
| expr PIPE2 expr
| expr ( STAR | DIV | MOD) expr
| expr ( PLUS | MINUS) expr
| expr ( LT2 | GT2 | AMP | PIPE) expr
| expr ( LT | LT_EQ | GT | GT_EQ) expr
| expr (
ASSIGN
| EQ
| NOT_EQ1
| NOT_EQ2
| IS_
| IS_ NOT_
| IS_ DISTINCT_ FROM_
| IS_ NOT_ DISTINCT_ FROM_
| IN_
| LIKE_
| GLOB_
| MATCH_
| REGEXP_
) expr
| expr AND_ expr
| expr OR_ expr
| function_name OPEN_PAR ((DISTINCT_? comma_separated_expr) | STAR)? CLOSE_PAR filter_clause? over_clause?
| OPEN_PAR comma_separated_expr CLOSE_PAR
| CAST_ OPEN_PAR expr AS_ type_name CLOSE_PAR
| expr COLLATE_ collation_name
| expr NOT_? (LIKE_ | GLOB_ | REGEXP_ | MATCH_) expr (ESCAPE_ expr)?
| expr ( ISNULL_ | NOTNULL_ | NOT_ NULL_)
| expr IS_ NOT_? expr
| expr NOT_? BETWEEN_ expr AND_ expr
| expr NOT_? IN_ (
OPEN_PAR (select_stmt | comma_separated_expr)? CLOSE_PAR
| ( schema_name DOT)? table_name
| (schema_name DOT)? table_function_name OPEN_PAR (comma_separated_expr)? CLOSE_PAR
)
| ((NOT_)? EXISTS_)? OPEN_PAR select_stmt CLOSE_PAR
| CASE_ expr? (WHEN_ expr THEN_ expr)+ (ELSE_ expr)? END_
| raise_function
;
comma_separated_expr
: expr ( COMMA expr )*
;
raise_function
: RAISE_ OPEN_PAR (IGNORE_ | (ROLLBACK_ | ABORT_ | FAIL_) COMMA error_message) CLOSE_PAR
;
literal_value
: NUMERIC_LITERAL
| STRING_LITERAL
| BLOB_LITERAL
| NULL_
| TRUE_
| FALSE_
| CURRENT_TIME_
| CURRENT_DATE_
| CURRENT_TIMESTAMP_
;
value_row
: OPEN_PAR comma_separated_expr CLOSE_PAR
;
values_clause
: VALUES_ value_row (COMMA value_row)*
;
insert_stmt
: with_clause? (
INSERT_
| REPLACE_
| INSERT_ OR_ ( REPLACE_ | ROLLBACK_ | ABORT_ | FAIL_ | IGNORE_)
) INTO_ (schema_name DOT)? table_name (AS_ table_alias)? (
OPEN_PAR column_name ( COMMA column_name)* CLOSE_PAR
)? (( ( values_clause | select_stmt) upsert_clause?) | DEFAULT_ VALUES_) returning_clause?
;
returning_clause
: RETURNING_ result_column (COMMA result_column)*
;
upsert_clause
: ON_ CONFLICT_ (
OPEN_PAR indexed_column (COMMA indexed_column)* CLOSE_PAR (WHERE_ expr)?
)? DO_ (
NOTHING_
| UPDATE_ SET_ (
(column_name | column_name_list) ASSIGN expr (
COMMA (column_name | column_name_list) ASSIGN expr
)* (WHERE_ expr)?
)
)
;
pragma_stmt
: PRAGMA_ (schema_name DOT)? pragma_name (
ASSIGN pragma_value
| OPEN_PAR pragma_value CLOSE_PAR
)?
;
pragma_value
: signed_number
| name
| STRING_LITERAL
;
reindex_stmt
: REINDEX_ (collation_name | (schema_name DOT)? (table_name | index_name))?
;
select_stmt
: common_table_stmt? select_core (compound_operator select_core)* order_by_stmt? limit_stmt?
;
join_clause
: table_or_subquery (join_operator table_or_subquery join_constraint?)*
;
select_core
: (
SELECT_ (DISTINCT_ | ALL_)? result_column (COMMA result_column)* (
FROM_ (table_or_subquery (COMMA table_or_subquery)* | join_clause)
)? (WHERE_ whereExpr = expr)? (
GROUP_ BY_ groupByExpr += expr (COMMA groupByExpr += expr)* (
HAVING_ havingExpr = expr
)?
)? (WINDOW_ window_name AS_ window_defn ( COMMA window_name AS_ window_defn)*)?
)
| values_clause
;
factored_select_stmt
: select_stmt
;
simple_select_stmt
: common_table_stmt? select_core order_by_stmt? limit_stmt?
;
compound_select_stmt
: common_table_stmt? select_core (
(UNION_ ALL_? | INTERSECT_ | EXCEPT_) select_core
)+ order_by_stmt? limit_stmt?
;
table_or_subquery
: (
(schema_name DOT)? table_name (AS_? table_alias)? (
INDEXED_ BY_ index_name
| NOT_ INDEXED_
)?
)
| (schema_name DOT)? table_function_name OPEN_PAR expr (COMMA expr)* CLOSE_PAR (
AS_? table_alias
)?
| OPEN_PAR (table_or_subquery (COMMA table_or_subquery)* | join_clause) CLOSE_PAR
| OPEN_PAR select_stmt CLOSE_PAR (AS_? table_alias)?
;
result_column
: STAR
| table_name DOT STAR
| expr ( AS_? column_alias)?
;
join_operator
: COMMA
| NATURAL_? ((LEFT_ | RIGHT_ | FULL_) OUTER_? | INNER_ | CROSS_)? JOIN_
;
join_constraint
: ON_ expr
| USING_ OPEN_PAR column_name ( COMMA column_name)* CLOSE_PAR
;
compound_operator
: UNION_ ALL_?
| INTERSECT_
| EXCEPT_
;
update_stmt
: with_clause? UPDATE_ (OR_ (ROLLBACK_ | ABORT_ | REPLACE_ | FAIL_ | IGNORE_))? qualified_table_name SET_ (
column_name
| column_name_list
) ASSIGN expr (COMMA (column_name | column_name_list) ASSIGN expr)* (
FROM_ (table_or_subquery (COMMA table_or_subquery)* | join_clause)
)? (WHERE_ expr)? returning_clause?
;
column_name_list
: OPEN_PAR column_name (COMMA column_name)* CLOSE_PAR
;
update_stmt_limited
: with_clause? UPDATE_ (OR_ (ROLLBACK_ | ABORT_ | REPLACE_ | FAIL_ | IGNORE_))? qualified_table_name SET_ (
column_name
| column_name_list
) ASSIGN expr (COMMA (column_name | column_name_list) ASSIGN expr)* (WHERE_ expr)? returning_clause? (
order_by_stmt? limit_stmt
)?
;
qualified_table_name
: (schema_name DOT)? table_name (AS_ alias)? (
INDEXED_ BY_ index_name
| NOT_ INDEXED_
)?
;
vacuum_stmt
: VACUUM_ schema_name? (INTO_ filename)?
;
filter_clause
: FILTER_ OPEN_PAR WHERE_ expr CLOSE_PAR
;
window_defn
: OPEN_PAR base_window_name? (PARTITION_ BY_ expr (COMMA expr)*)? (
ORDER_ BY_ ordering_term (COMMA ordering_term)*
) frame_spec? CLOSE_PAR
;
over_clause
: OVER_ (
window_name
| OPEN_PAR base_window_name? (PARTITION_ BY_ expr (COMMA expr)*)? (
ORDER_ BY_ ordering_term (COMMA ordering_term)*
)? frame_spec? CLOSE_PAR
)
;
frame_spec
: frame_clause (EXCLUDE_ ( NO_ OTHERS_ | CURRENT_ ROW_ | GROUP_ | TIES_))?
;
frame_clause
: (RANGE_ | ROWS_ | GROUPS_) (
frame_single
| BETWEEN_ frame_left AND_ frame_right
)
;
simple_function_invocation
: simple_func OPEN_PAR (expr (COMMA expr)* | STAR) CLOSE_PAR
;
aggregate_function_invocation
: aggregate_func OPEN_PAR (DISTINCT_? expr (COMMA expr)* | STAR)? CLOSE_PAR filter_clause?
;
window_function_invocation
: window_function OPEN_PAR (expr (COMMA expr)* | STAR)? CLOSE_PAR filter_clause? OVER_ (
window_defn
| window_name
)
;
common_table_stmt
: //additional structures
WITH_ RECURSIVE_? common_table_expression (COMMA common_table_expression)*
;
order_by_stmt
: ORDER_ BY_ ordering_term (COMMA ordering_term)*
;
limit_stmt
: LIMIT_ expr ((OFFSET_ | COMMA) expr)?
;
ordering_term
: expr (COLLATE_ collation_name)? asc_desc? (NULLS_ (FIRST_ | LAST_))?
;
asc_desc
: ASC_
| DESC_
;
frame_left
: expr PRECEDING_
| expr FOLLOWING_
| CURRENT_ ROW_
| UNBOUNDED_ PRECEDING_
;
frame_right
: expr PRECEDING_
| expr FOLLOWING_
| CURRENT_ ROW_
| UNBOUNDED_ FOLLOWING_
;
frame_single
: expr PRECEDING_
| UNBOUNDED_ PRECEDING_
| CURRENT_ ROW_
;
// unknown
window_function
: (FIRST_VALUE_ | LAST_VALUE_) OPEN_PAR expr CLOSE_PAR OVER_ OPEN_PAR partition_by? order_by_expr_asc_desc frame_clause?
CLOSE_PAR
| (CUME_DIST_ | PERCENT_RANK_) OPEN_PAR CLOSE_PAR OVER_ OPEN_PAR partition_by? order_by_expr? CLOSE_PAR
| (DENSE_RANK_ | RANK_ | ROW_NUMBER_) OPEN_PAR CLOSE_PAR OVER_ OPEN_PAR partition_by? order_by_expr_asc_desc CLOSE_PAR
| (LAG_ | LEAD_) OPEN_PAR expr offset? default_value? CLOSE_PAR OVER_ OPEN_PAR partition_by? order_by_expr_asc_desc CLOSE_PAR
| NTH_VALUE_ OPEN_PAR expr COMMA signed_number CLOSE_PAR OVER_ OPEN_PAR partition_by? order_by_expr_asc_desc frame_clause?
CLOSE_PAR
| NTILE_ OPEN_PAR expr CLOSE_PAR OVER_ OPEN_PAR partition_by? order_by_expr_asc_desc CLOSE_PAR
;
offset
: COMMA signed_number
;
default_value
: COMMA signed_number
;
partition_by
: PARTITION_ BY_ expr+
;
order_by_expr
: ORDER_ BY_ expr+
;
order_by_expr_asc_desc
: ORDER_ BY_ expr_asc_desc
;
expr_asc_desc
: expr asc_desc? (COMMA expr asc_desc?)*
;
initial_select
: select_stmt
;
recursive_select
: select_stmt
;
unary_operator
: MINUS
| PLUS
| TILDE
| NOT_
;
error_message
: STRING_LITERAL
;
module_argument
:
expr
| column_def
;
column_alias
: IDENTIFIER
| STRING_LITERAL
;
keyword
: ABORT_
| ACTION_
| ADD_
| AFTER_
| ALL_
| ALTER_
| ANALYZE_
| AND_
| AS_
| ASC_
| ATTACH_
| AUTOINCREMENT_
| BEFORE_
| BEGIN_
| BETWEEN_
| BY_
| CASCADE_
| CASE_
| CAST_
| CHECK_
| COLLATE_
| COLUMN_
| COMMIT_
| CONFLICT_
| CONSTRAINT_
| CREATE_
| CROSS_
| CURRENT_DATE_
| CURRENT_TIME_
| CURRENT_TIMESTAMP_
| DATABASE_
| DEFAULT_
| DEFERRABLE_
| DEFERRED_
| DELETE_
| DESC_
| DETACH_
| DISTINCT_
| DROP_
| EACH_
| ELSE_
| END_
| ESCAPE_
| EXCEPT_
| EXCLUSIVE_
| EXISTS_
| EXPLAIN_
| FAIL_
| FOR_
| FOREIGN_
| FROM_
| FULL_
| GLOB_
| GROUP_
| HAVING_
| IF_
| IGNORE_
| IMMEDIATE_
| IN_
| INDEX_
| INDEXED_
| INITIALLY_
| INNER_
| INSERT_
| INSTEAD_
| INTERSECT_
| INTO_
| IS_
| ISNULL_
| JOIN_
| KEY_
| LEFT_
| LIKE_
| LIMIT_
| MATCH_
| NATURAL_
| NO_
| NOT_
| NOTNULL_
| NULL_
| OF_
| OFFSET_
| ON_
| OR_
| ORDER_
| OUTER_
| PLAN_
| PRAGMA_
| PRIMARY_
| QUERY_
| RAISE_
| RECURSIVE_
| REFERENCES_
| REGEXP_
| REINDEX_
| RELEASE_
| RENAME_
| REPLACE_
| RESTRICT_
| RIGHT_
| ROLLBACK_
| ROW_
| ROWS_
| SAVEPOINT_
| SELECT_
| SET_
| TABLE_
| TEMP_
| TEMPORARY_
| THEN_
| TO_
| TRANSACTION_
| TRIGGER_
| UNION_
| UNIQUE_
| UPDATE_
| USING_
| VACUUM_
| VALUES_
| VIEW_
| VIRTUAL_
| WHEN_
| WHERE_
| WITH_
| WITHOUT_
| FIRST_VALUE_
| OVER_
| PARTITION_
| RANGE_
| PRECEDING_
| UNBOUNDED_
| CURRENT_
| FOLLOWING_
| CUME_DIST_
| DENSE_RANK_
| LAG_
| LAST_VALUE_
| LEAD_
| NTH_VALUE_
| NTILE_
| PERCENT_RANK_
| RANK_
| ROW_NUMBER_
| GENERATED_
| ALWAYS_
| STORED_
| TRUE_
| FALSE_
| WINDOW_
| NULLS_
| FIRST_
| LAST_
| FILTER_
| GROUPS_
| EXCLUDE_
;
name
: any_name
;
function_name
: any_name
;
schema_name
: any_name
;
table_name
: any_name
;
table_or_index_name
: any_name
;
column_name
: any_name
;
collation_name
: any_name
;
foreign_table
: any_name
;
index_name
: any_name
;
trigger_name
: any_name
;
view_name
: any_name
;
module_name
: any_name
;
pragma_name
: any_name
;
savepoint_name
: any_name
;
table_alias
: IDENTIFIER
| STRING_LITERAL
| OPEN_PAR table_alias CLOSE_PAR
;
transaction_name
: any_name
;
window_name
: any_name
;
alias
: any_name
;
filename
: any_name
;
base_window_name
: any_name
;
simple_func
: any_name
;
aggregate_func
: any_name
;
table_function_name
: any_name
;
any_name
: IDENTIFIER
| keyword
| STRING_LITERAL
| OPEN_PAR any_name CLOSE_PAR
;