/* * 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, bart@big-o.nl * Martin Mirchev, marti_2203@abv.bg * Mike Lische, mike@lischke-online.de */ // $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 ;