lalr/cql-naked.y
Charles Baker 00ac18244c CQL: Add cql example
CQL: Use line_comment for comments in SQL example

CQL: Use [[:space:]] not [:space:] in cql.g

CQL: Parse double quoted strings as c-style strings

CQL: Add tokens for lower case, strings, and identifiers

CQL: Accept hexadecimal literals with suffix types as INTLIT

CQL: Add missing BETWEEN token

CQL: Allow mixed case "@dummy_nullables"

CQL: Allow mixed case "offset"

CQL: Allow mixed case "@begin_schema_region"

CQL: Allow mixed case "object"

CQL: Allow mixed case "else if"

CQL: Comment out (call ...) statments/expressions that aren't parsing

CQL: Comment out (...) expressions/statements that aren't parsing

CQL: Comment out references to undefined @emit_constants and @emit_group

CQL: Comment out references to undefined group keywords

CQL: Comment out undefined @blob... directives

CQL: Comment out invalid syntax with blob, cursor, and set as types

CQL: Comment out function declarations that don't match syntax

CQL: Comment out "1 AS int NOT NULL" etc that doesn't match grammar

CQL: Comment out cursor declaration that doesn't match syntax

CQL: Comment out string using double single quotes as an escape sequence
2023-04-22 21:01:06 +12:00

1446 lines
24 KiB
Text

%left UNION_ALL UNION INTERSECT EXCEPT ;
%right ASSIGN ;
%left OR ;
%left AND ;
%left NOT ;
%left BETWEEN NOT_BETWEEN NE NE_ '=' EQEQ LIKE NOT_LIKE GLOB NOT_GLOB MATCH NOT_MATCH REGEXP NOT_REGEXP IN NOT_IN IS_NOT IS IS_TRUE IS_FALSE IS_NOT_TRUE IS_NOT_FALSE ;
%right ISNULL NOTNULL ;
%left '<' '>' GE LE ;
%left LS RS '&' '|' ;
%left '+' '-' ;
%left '*' '/' '%' ;
%left CONCAT ;
%left COLLATE ;
%right UMINUS '~' ;
%token EXCLUDE_GROUP EXCLUDE_CURRENT_ROW EXCLUDE_TIES EXCLUDE_NO_OTHERS CURRENT_ROW UNBOUNDED PRECEDING FOLLOWING
%token AT_BLOB_GET_KEY_TYPE AT_BLOB_GET_VAL_TYPE AT_BLOB_GET_KEY AT_BLOB_GET_VAL AT_BLOB_CREATE_KEY AT_BLOB_CREATE_VAL AT_BLOB_UPDATE_KEY AT_BLOB_UPDATE_VAL
%token CREATE DROP TABLE WITHOUT ROWID PRIMARY KEY NULL_ "NULL" DEFAULT CHECK AT_DUMMY_SEED VIRTUAL AT_EMIT_GROUP AT_EMIT_ENUMS AT_EMIT_CONSTANTS
%token OBJECT TEXT BLOB LONG_ INT_ INTEGER LONG_INT LONG_INTEGER REAL ON UPDATE CASCADE ON_CONFLICT DO NOTHING
%token DELETE INDEX FOREIGN REFERENCES CONSTRAINT UPSERT STATEMENT CONST
%token INSERT INTO VALUES VIEW SELECT QUERY_PLAN EXPLAIN OVER WINDOW FILTER PARTITION RANGE ROWS GROUPS
%token AS CASE WHEN FROM FROM_BLOB THEN ELSE END LEFT SWITCH
%token OUTER JOIN WHERE GROUP BY ORDER ASC NULLS FIRST LAST
%token DESC INNER AUTOINCREMENT DISTINCT
%token LIMIT OFFSET TEMP TRIGGER IF ALL CROSS USING RIGHT AT_EPONYMOUS
%token HIDDEN UNIQUE HAVING SET LET TO DISTINCTROW ENUM
%token FUNC FUNCTION PROC PROCEDURE INTERFACE BEGIN_ OUT INOUT CURSOR DECLARE VAR TYPE FETCH LOOP LEAVE CONTINUE FOR ENCODE CONTEXT_COLUMN CONTEXT_TYPE
%token OPEN CLOSE ELSE_IF WHILE CALL TRY CATCH THROW RETURN
%token SAVEPOINT ROLLBACK COMMIT TRANSACTION RELEASE ARGUMENTS
%token TYPE_CHECK CAST WITH RECURSIVE REPLACE IGNORE ADD COLUMN COLUMNS RENAME ALTER
%token AT_ECHO AT_CREATE AT_RECREATE AT_DELETE AT_SCHEMA_UPGRADE_VERSION AT_PREVIOUS_SCHEMA AT_SCHEMA_UPGRADE_SCRIPT
%token AT_RC AT_PROC AT_FILE AT_ATTRIBUTE AT_SENSITIVE DEFERRED NOT_DEFERRABLE DEFERRABLE IMMEDIATE EXCLUSIVE RESTRICT ACTION INITIALLY NO
%token BEFORE AFTER INSTEAD OF FOR_EACH_ROW EXISTS RAISE FAIL ABORT AT_ENFORCE_STRICT AT_ENFORCE_NORMAL AT_ENFORCE_RESET AT_ENFORCE_PUSH AT_ENFORCE_POP
%token AT_BEGIN_SCHEMA_REGION AT_END_SCHEMA_REGION
%token AT_DECLARE_SCHEMA_REGION AT_DECLARE_DEPLOYABLE_REGION AT_SCHEMA_AD_HOC_MIGRATION PRIVATE
%token SIGN_FUNCTION CURSOR_HAS_ROW AT_UNSUB
%token ID TRUE_ FALSE_
%token STRLIT CSTRLIT BLOBLIT
%token INTLIT
%token BOOL_
%token AT_DUMMY_NULLABLES
%token AT_DUMMY_DEFAULTS
%token LONGLIT
%token REALLIT
%%
program :
opt_stmt_list
;
opt_stmt_list :
/* empty */
| stmt_list
;
stmt_list :
stmt ';'
| stmt_list stmt ';'
;
stmt :
misc_attrs any_stmt
;
any_stmt :
alter_table_add_column_stmt
| begin_schema_region_stmt
| begin_trans_stmt
| call_stmt
| close_stmt
| commit_return_stmt
| commit_trans_stmt
| continue_stmt
| create_index_stmt
| create_proc_stmt
| create_table_stmt
| create_trigger_stmt
| create_view_stmt
| create_virtual_table_stmt
| declare_deployable_region_stmt
| declare_enum_stmt
| declare_func_stmt
| declare_out_call_stmt
| declare_proc_no_check_stmt
| declare_proc_stmt
| declare_schema_region_stmt
| declare_stmt
| delete_stmt
| drop_index_stmt
| drop_table_stmt
| drop_trigger_stmt
| drop_view_stmt
| echo_stmt
| emit_enums_stmt
| end_schema_region_stmt
| enforce_normal_stmt
| enforce_pop_stmt
| enforce_push_stmt
| enforce_reset_stmt
| enforce_strict_stmt
| explain_stmt
| fetch_call_stmt
| fetch_stmt
| fetch_values_stmt
| guard_stmt
| if_stmt
| insert_stmt
| leave_stmt
| let_stmt
| loop_stmt
| open_stmt
| out_stmt
| out_union_stmt
| previous_schema_stmt
| proc_savepoint_stmt
| release_savepoint_stmt
| return_stmt
| rollback_return_stmt
| rollback_trans_stmt
| savepoint_stmt
| select_stmt
| schema_ad_hoc_migration_stmt
| schema_upgrade_script_stmt
| schema_upgrade_version_stmt
| set_stmt
| switch_stmt
| throw_stmt
| trycatch_stmt
| update_cursor_stmt
| update_stmt
| upsert_stmt
| while_stmt
| with_delete_stmt
| with_insert_stmt
| with_update_stmt
| with_upsert_stmt
;
explain_stmt :
EXPLAIN opt_query_plan explain_target
;
opt_query_plan :
/* empty */
| QUERY_PLAN
;
explain_target :
select_stmt
| update_stmt
| delete_stmt
| with_delete_stmt
| with_insert_stmt
| insert_stmt
| upsert_stmt
| drop_table_stmt
| drop_view_stmt
| drop_index_stmt
| drop_trigger_stmt
| begin_trans_stmt
| commit_trans_stmt
;
previous_schema_stmt :
AT_PREVIOUS_SCHEMA
;
schema_upgrade_script_stmt :
AT_SCHEMA_UPGRADE_SCRIPT
;
schema_upgrade_version_stmt :
AT_SCHEMA_UPGRADE_VERSION '(' INTLIT ')'
;
set_stmt :
SET name ASSIGN expr
| SET name FROM CURSOR name
;
let_stmt :
LET name ASSIGN expr
;
version_attrs_opt_recreate :
/* empty */
| AT_RECREATE
| AT_RECREATE '(' name ')'
| version_attrs
;
opt_version_attrs :
/* empty */
| version_attrs
;
version_attrs :
AT_CREATE version_annotation opt_version_attrs
| AT_DELETE version_annotation opt_version_attrs
;
opt_delete_version_attr :
/* empty */
| AT_DELETE version_annotation
;
drop_table_stmt :
DROP TABLE IF EXISTS name
| DROP TABLE name
;
drop_view_stmt :
DROP VIEW IF EXISTS name
| DROP VIEW name
;
drop_index_stmt :
DROP INDEX IF EXISTS name
| DROP INDEX name
;
drop_trigger_stmt :
DROP TRIGGER IF EXISTS name
| DROP TRIGGER name
;
create_virtual_table_stmt :
CREATE VIRTUAL TABLE opt_if_not_exists name USING name opt_module_args AS '(' col_key_list ')' opt_delete_version_attr
;
opt_module_args :
/* empty */
| '(' misc_attr_value_list ')'
| '(' ARGUMENTS FOLLOWING ')'
;
create_table_stmt :
CREATE opt_temp TABLE opt_if_not_exists name '(' col_key_list ')' opt_no_rowid version_attrs_opt_recreate
;
opt_temp :
/* empty */
| TEMP
;
opt_if_not_exists :
/* empty */
| IF NOT EXISTS
;
opt_no_rowid :
/* empty */
| WITHOUT ROWID
;
col_key_list :
col_key_def
| col_key_def ',' col_key_list
;
col_key_def :
col_def
| pk_def
| fk_def
| unq_def
| check_def
| shape_def
;
check_def :
CONSTRAINT name CHECK '(' expr ')'
| CHECK '(' expr ')'
;
shape_def :
LIKE name
| LIKE name ARGUMENTS
;
col_name :
name
;
misc_attr_key :
name
| name ':' name
;
misc_attr_value_list :
misc_attr_value
| misc_attr_value ',' misc_attr_value_list
;
misc_attr_value :
name
| any_literal
| const_expr
| '(' misc_attr_value_list ')'
| '-' num_literal
;
misc_attr :
AT_ATTRIBUTE '(' misc_attr_key ')'
| AT_ATTRIBUTE '(' misc_attr_key '=' misc_attr_value ')'
;
misc_attrs :
/* empty */
| misc_attr misc_attrs
;
col_def :
misc_attrs col_name data_type_any col_attrs
;
pk_def :
CONSTRAINT name PRIMARY KEY '(' indexed_columns ')' opt_conflict_clause
| PRIMARY KEY '(' indexed_columns ')' opt_conflict_clause
;
opt_conflict_clause :
/* empty */
| conflict_clause
;
conflict_clause :
ON_CONFLICT ROLLBACK
| ON_CONFLICT ABORT
| ON_CONFLICT FAIL
| ON_CONFLICT IGNORE
| ON_CONFLICT REPLACE
;
opt_fk_options :
/* empty */
| fk_options
;
fk_options :
fk_on_options
| fk_deferred_options
| fk_on_options fk_deferred_options
;
fk_on_options :
ON DELETE fk_action
| ON UPDATE fk_action
| ON UPDATE fk_action ON DELETE fk_action
| ON DELETE fk_action ON UPDATE fk_action
;
fk_action :
SET NULL_
| SET DEFAULT
| CASCADE
| RESTRICT
| NO ACTION
;
fk_deferred_options :
DEFERRABLE fk_initial_state
| NOT_DEFERRABLE fk_initial_state
;
fk_initial_state :
/* empty */
| INITIALLY DEFERRED
| INITIALLY IMMEDIATE
;
fk_def :
CONSTRAINT name FOREIGN KEY '(' name_list ')' fk_target_options
| FOREIGN KEY '(' name_list ')' fk_target_options
;
fk_target_options :
REFERENCES name '(' name_list ')' opt_fk_options
;
unq_def :
CONSTRAINT name UNIQUE '(' indexed_columns ')' opt_conflict_clause
| UNIQUE '(' indexed_columns ')' opt_conflict_clause
;
opt_unique :
/* empty */
| UNIQUE
;
indexed_column :
expr opt_asc_desc
;
indexed_columns :
indexed_column
| indexed_column ',' indexed_columns
;
create_index_stmt :
CREATE opt_unique INDEX opt_if_not_exists name ON name '(' indexed_columns ')' opt_where opt_delete_version_attr
;
name :
ID
| TEXT
| TRIGGER
| ROWID
| REPLACE
| KEY
| VIRTUAL
| TYPE
| HIDDEN
| PRIVATE
;
opt_name :
/* empty */
| name
;
name_list :
name
| name ',' name_list
;
opt_name_list :
/* empty */
| name_list
;
col_attrs :
/* empty */
| NOT NULL_ opt_conflict_clause col_attrs
| PRIMARY KEY opt_conflict_clause col_attrs
| PRIMARY KEY opt_conflict_clause AUTOINCREMENT col_attrs
| DEFAULT '-' num_literal col_attrs
| DEFAULT num_literal col_attrs
| DEFAULT const_expr col_attrs
| DEFAULT str_literal col_attrs
| COLLATE name col_attrs
| CHECK '(' expr ')' col_attrs
| UNIQUE opt_conflict_clause col_attrs
| HIDDEN col_attrs
| AT_SENSITIVE col_attrs
| AT_CREATE version_annotation col_attrs
| AT_DELETE version_annotation col_attrs
| fk_target_options col_attrs
;
version_annotation :
'(' INTLIT ',' name ')'
| '(' INTLIT ',' name ':' name ')'
| '(' INTLIT ')'
;
opt_kind :
/* empty */
| '<' name '>'
;
data_type_numeric :
INT_ opt_kind
| INTEGER opt_kind
| REAL opt_kind
| LONG_ opt_kind
| BOOL_ opt_kind
| LONG_ INTEGER opt_kind
| LONG_ INT_ opt_kind
| LONG_INT opt_kind
| LONG_INTEGER opt_kind
;
data_type_any :
data_type_numeric
| TEXT opt_kind
| BLOB opt_kind
| OBJECT opt_kind
| OBJECT '<' name CURSOR '>'
| ID
;
data_type_with_options :
data_type_any
| data_type_any NOT NULL_
| data_type_any AT_SENSITIVE
| data_type_any AT_SENSITIVE NOT NULL_
| data_type_any NOT NULL_ AT_SENSITIVE
;
str_literal :
STRLIT
| CSTRLIT
;
num_literal :
INTLIT
| LONGLIT
| REALLIT
| TRUE_
| FALSE_
;
const_expr :
CONST '(' expr ')'
;
any_literal :
str_literal
| num_literal
| NULL_
| AT_FILE '(' str_literal ')'
| AT_PROC
| BLOBLIT
;
raise_expr :
RAISE '(' IGNORE ')'
| RAISE '(' ROLLBACK ',' expr ')'
| RAISE '(' ABORT ',' expr ')'
| RAISE '(' FAIL ',' expr ')'
;
call :
name '(' arg_list ')' opt_filter_clause
| name '(' DISTINCT arg_list ')' opt_filter_clause
;
basic_expr :
name
| AT_RC
| name '.' name
| any_literal
| const_expr
| '(' expr ')'
| call
| window_func_inv
| raise_expr
| '(' select_stmt ')'
| '(' select_stmt IF NOTHING expr ')'
| '(' select_stmt IF NOTHING OR NULL_ expr ')'
| '(' select_stmt IF NOTHING THROW ')'
| EXISTS '(' select_stmt ')'
| CASE expr case_list END
| CASE expr case_list ELSE expr END
| CASE case_list END
| CASE case_list ELSE expr END
| CAST '(' expr AS data_type_any ')'
;
math_expr :
basic_expr
| math_expr '&' math_expr
| math_expr '|' math_expr
| math_expr LS math_expr
| math_expr RS math_expr
| math_expr '+' math_expr
| math_expr '-' math_expr
| math_expr '*' math_expr
| math_expr '/' math_expr
| math_expr '%' math_expr
| math_expr IS_NOT_TRUE
| math_expr IS_NOT_FALSE
| math_expr ISNULL
| math_expr NOTNULL
| math_expr IS_TRUE
| math_expr IS_FALSE
| '-' math_expr %prec UMINUS
| '~' math_expr %prec UMINUS
| NOT math_expr
| math_expr '=' math_expr
| math_expr EQEQ math_expr
| math_expr '<' math_expr
| math_expr '>' math_expr
| math_expr NE math_expr
| math_expr NE_ math_expr
| math_expr GE math_expr
| math_expr LE math_expr
| math_expr NOT_IN '(' expr_list ')'
| math_expr NOT_IN '(' select_stmt ')'
| math_expr IN '(' expr_list ')'
| math_expr IN '(' select_stmt ')'
| math_expr LIKE math_expr
| math_expr NOT_LIKE math_expr
| math_expr MATCH math_expr
| math_expr NOT_MATCH math_expr
| math_expr REGEXP math_expr
| math_expr NOT_REGEXP math_expr
| math_expr GLOB math_expr
| math_expr NOT_GLOB math_expr
| math_expr BETWEEN math_expr AND math_expr %prec BETWEEN
| math_expr NOT_BETWEEN math_expr AND math_expr %prec BETWEEN
| math_expr IS_NOT math_expr
| math_expr IS math_expr
| math_expr CONCAT math_expr
| math_expr COLLATE name
;
expr :
math_expr
| expr AND expr
| expr OR expr
;
case_list :
WHEN expr THEN expr
| WHEN expr THEN expr case_list
;
arg_expr :
'*'
| expr
| shape_arguments
;
arg_list :
/* empty */
| arg_expr
| arg_expr ',' arg_list
;
expr_list :
expr
| expr ',' expr_list
;
shape_arguments :
FROM name
| FROM name shape_def
| FROM ARGUMENTS
| FROM ARGUMENTS shape_def
;
call_expr :
expr
| shape_arguments
;
call_expr_list :
call_expr
| call_expr ',' call_expr_list
;
cte_tables :
cte_table
| cte_table ',' cte_tables
;
cte_table :
name '(' name_list ')' AS '(' select_stmt_no_with ')'
| name '(' '*' ')' AS '(' select_stmt_no_with ')'
;
with_prefix :
WITH cte_tables
| WITH RECURSIVE cte_tables
;
with_select_stmt :
with_prefix select_stmt_no_with
;
select_stmt :
with_select_stmt
| select_stmt_no_with
;
select_stmt_no_with :
select_core_list opt_orderby opt_limit opt_offset
;
select_core_list :
select_core
| select_core compound_operator select_core_list
;
values :
'(' insert_list ')'
| '(' insert_list ')' ',' values
;
select_core :
SELECT select_opts select_expr_list opt_from_query_parts opt_where opt_groupby opt_having opt_select_window
| VALUES values
;
compound_operator :
UNION
| UNION_ALL
| INTERSECT
| EXCEPT
;
window_func_inv :
name '(' arg_list ')' opt_filter_clause OVER window_name_or_defn
;
opt_filter_clause :
/* empty */
| FILTER '(' opt_where ')'
;
window_name_or_defn :
window_defn
| name
;
window_defn :
'(' opt_partition_by opt_orderby opt_frame_spec ')'
;
opt_frame_spec :
/* empty */
| frame_type frame_boundary_opts frame_exclude
;
frame_type :
RANGE
| ROWS
| GROUPS
;
frame_exclude :
/* empty */
| EXCLUDE_NO_OTHERS
| EXCLUDE_CURRENT_ROW
| EXCLUDE_GROUP
| EXCLUDE_TIES
;
frame_boundary_opts :
frame_boundary
| BETWEEN frame_boundary_start AND frame_boundary_end
;
frame_boundary_start :
UNBOUNDED PRECEDING
| expr PRECEDING
| CURRENT_ROW
| expr FOLLOWING
;
frame_boundary_end :
expr PRECEDING
| CURRENT_ROW
| expr FOLLOWING
| UNBOUNDED FOLLOWING
;
frame_boundary :
UNBOUNDED PRECEDING
| expr PRECEDING
| CURRENT_ROW
;
opt_partition_by :
/* empty */
| PARTITION BY expr_list
;
opt_select_window :
/* empty */
| window_clause
;
window_clause :
WINDOW window_name_defn_list
;
window_name_defn_list :
window_name_defn
| window_name_defn ',' window_name_defn_list
;
window_name_defn :
name AS window_defn
;
region_spec :
name
| name PRIVATE
;
region_list :
region_spec ',' region_list
| region_spec
;
declare_schema_region_stmt :
AT_DECLARE_SCHEMA_REGION name
| AT_DECLARE_SCHEMA_REGION name USING region_list
;
declare_deployable_region_stmt :
AT_DECLARE_DEPLOYABLE_REGION name
| AT_DECLARE_DEPLOYABLE_REGION name USING region_list
;
begin_schema_region_stmt :
AT_BEGIN_SCHEMA_REGION name
;
end_schema_region_stmt :
AT_END_SCHEMA_REGION
;
schema_ad_hoc_migration_stmt :
AT_SCHEMA_AD_HOC_MIGRATION version_annotation
| AT_SCHEMA_AD_HOC_MIGRATION FOR AT_RECREATE '(' name ',' name ')'
;
emit_enums_stmt :
AT_EMIT_ENUMS opt_name_list
;
opt_from_query_parts :
/* empty */
| FROM query_parts
;
opt_where :
/* empty */
| WHERE expr
;
opt_groupby :
/* empty */
| GROUP BY groupby_list
;
groupby_list :
groupby_item
| groupby_item ',' groupby_list
;
groupby_item :
expr opt_asc_desc
;
opt_asc_desc :
/* empty */
| ASC
| DESC
;
opt_having :
/* empty */
| HAVING expr
;
opt_orderby :
/* empty */
| ORDER BY groupby_list
;
opt_limit :
/* empty */
| LIMIT expr
;
opt_offset :
/* empty */
| OFFSET expr
;
select_opts :
/* empty */
| ALL
| DISTINCT
| DISTINCTROW
;
select_expr_list :
select_expr
| select_expr ',' select_expr_list
| '*'
;
select_expr :
expr opt_as_alias
| name '.' '*'
;
opt_as_alias :
/* empty */
| as_alias
;
as_alias :
AS name
| name
;
query_parts :
table_or_subquery_list
| join_clause
;
table_or_subquery_list :
table_or_subquery
| table_or_subquery ',' table_or_subquery_list
;
join_clause :
table_or_subquery join_target_list
;
join_target_list :
join_target
| join_target join_target_list
;
table_or_subquery :
name opt_as_alias
| '(' select_stmt ')' opt_as_alias
| table_function opt_as_alias
| '(' query_parts ')'
;
join_type :
/* empty */
| LEFT
| RIGHT
| LEFT OUTER
| RIGHT OUTER
| INNER
| CROSS
;
join_target :
join_type JOIN table_or_subquery opt_join_cond
;
opt_join_cond :
/* empty */
| join_cond
;
join_cond :
ON expr
| USING '(' name_list ')'
;
table_function :
name '(' arg_list ')'
;
create_view_stmt :
CREATE opt_temp VIEW opt_if_not_exists name AS select_stmt opt_delete_version_attr
;
with_delete_stmt :
with_prefix delete_stmt
;
delete_stmt :
DELETE FROM name opt_where
;
opt_insert_dummy_spec :
/* empty */
| AT_DUMMY_SEED '(' expr ')' dummy_modifier
;
dummy_modifier :
/* empty */
| AT_DUMMY_NULLABLES
| AT_DUMMY_DEFAULTS
| AT_DUMMY_NULLABLES AT_DUMMY_DEFAULTS
| AT_DUMMY_DEFAULTS AT_DUMMY_NULLABLES
;
insert_stmt_type :
INSERT INTO
| INSERT OR REPLACE INTO
| INSERT OR IGNORE INTO
| INSERT OR ROLLBACK INTO
| INSERT OR ABORT INTO
| INSERT OR FAIL INTO
| REPLACE INTO
;
with_insert_stmt :
with_prefix insert_stmt
;
opt_column_spec :
/* empty */
| '(' opt_name_list ')'
| '(' shape_def ')'
;
from_shape :
FROM CURSOR name opt_column_spec
| FROM name opt_column_spec
| FROM ARGUMENTS opt_column_spec
;
insert_stmt :
insert_stmt_type name opt_column_spec select_stmt opt_insert_dummy_spec
| insert_stmt_type name opt_column_spec from_shape opt_insert_dummy_spec
| insert_stmt_type name DEFAULT VALUES
| insert_stmt_type name USING select_stmt
| insert_stmt_type name USING expr_names opt_insert_dummy_spec
;
insert_list :
/* empty */
| expr
| expr ',' insert_list
;
basic_update_stmt :
UPDATE opt_name SET update_list opt_where
;
with_update_stmt :
with_prefix update_stmt
;
update_stmt :
UPDATE name SET update_list opt_where opt_orderby opt_limit
;
update_entry :
name '=' expr
;
update_list :
update_entry
| update_entry ',' update_list
;
with_upsert_stmt :
with_prefix upsert_stmt
;
upsert_stmt :
insert_stmt ON_CONFLICT conflict_target DO NOTHING
| insert_stmt ON_CONFLICT conflict_target DO basic_update_stmt
;
update_cursor_stmt :
UPDATE CURSOR name opt_column_spec FROM VALUES '(' insert_list ')'
| UPDATE CURSOR name opt_column_spec from_shape
| UPDATE CURSOR name USING expr_names
;
conflict_target :
/* empty */
| '(' indexed_columns ')' opt_where
;
function :
FUNC
| FUNCTION
;
declare_out_call_stmt :
DECLARE OUT call_stmt
;
declare_enum_stmt :
DECLARE ENUM name data_type_numeric '(' enum_values ')'
;
enum_values :
enum_value
| enum_value ',' enum_values
;
enum_value :
name
| name '=' expr
;
declare_func_stmt :
DECLARE function name '(' params ')' data_type_with_options
| DECLARE SELECT function name '(' params ')' data_type_with_options
| DECLARE function name '(' params ')' CREATE data_type_with_options
| DECLARE SELECT function name '(' params ')' '(' typed_names ')'
;
procedure :
PROC
| PROCEDURE
;
declare_proc_no_check_stmt :
DECLARE procedure name NO CHECK
;
declare_proc_stmt :
DECLARE procedure name '(' params ')'
| DECLARE procedure name '(' params ')' '(' typed_names ')'
| DECLARE procedure name '(' params ')' USING TRANSACTION
| DECLARE procedure name '(' params ')' OUT '(' typed_names ')'
| DECLARE procedure name '(' params ')' OUT '(' typed_names ')' USING TRANSACTION
| DECLARE procedure name '(' params ')' OUT UNION '(' typed_names ')'
| DECLARE procedure name '(' params ')' OUT UNION '(' typed_names ')' USING TRANSACTION
;
create_proc_stmt :
CREATE procedure name '(' params ')' BEGIN_ opt_stmt_list END
;
inout :
IN
| OUT
| INOUT
;
typed_name :
name data_type_with_options
| shape_def
| name shape_def
;
typed_names :
typed_name
| typed_name ',' typed_names
;
param :
name data_type_with_options
| inout name data_type_with_options
| shape_def
| name shape_def
;
params :
/* empty */
| param
| param ',' params
;
declare_stmt :
DECLARE name_list data_type_with_options
| DECLARE name CURSOR FOR select_stmt
| DECLARE name CURSOR FOR explain_stmt
| DECLARE name CURSOR FOR call_stmt
| DECLARE name CURSOR FETCH FROM call_stmt
| DECLARE name CURSOR shape_def
| DECLARE name CURSOR LIKE select_stmt
| DECLARE name CURSOR FOR name
| DECLARE name TYPE data_type_with_options
;
call_stmt :
CALL name '(' ')'
| CALL name '(' call_expr_list ')'
;
while_stmt :
WHILE expr BEGIN_ opt_stmt_list END
;
switch_stmt :
SWITCH expr switch_case switch_cases
| SWITCH expr ALL VALUES switch_case switch_cases
;
switch_case :
WHEN expr_list THEN stmt_list
| WHEN expr_list THEN NOTHING
;
switch_cases :
switch_case switch_cases
| ELSE stmt_list END
| END
;
loop_stmt :
LOOP fetch_stmt BEGIN_ opt_stmt_list END
;
leave_stmt :
LEAVE
;
return_stmt :
RETURN
;
rollback_return_stmt :
ROLLBACK RETURN
;
commit_return_stmt :
COMMIT RETURN
;
throw_stmt :
THROW
;
trycatch_stmt :
BEGIN_ TRY opt_stmt_list END TRY ';' BEGIN_ CATCH opt_stmt_list END CATCH
;
continue_stmt :
CONTINUE
;
fetch_stmt :
FETCH name INTO name_list
| FETCH name
;
fetch_values_stmt :
FETCH name opt_column_spec FROM VALUES '(' insert_list ')' opt_insert_dummy_spec
| FETCH name opt_column_spec from_shape opt_insert_dummy_spec
| FETCH name USING expr_names opt_insert_dummy_spec
;
expr_names :
expr_name
| expr_name ',' expr_names
;
expr_name :
expr as_alias
;
fetch_call_stmt :
FETCH name opt_column_spec FROM call_stmt
;
open_stmt :
OPEN name
;
close_stmt :
CLOSE name
;
out_stmt :
OUT name
;
out_union_stmt :
OUT UNION name
;
if_stmt :
IF expr THEN opt_stmt_list opt_elseif_list opt_else END IF
;
opt_else :
/* empty */
| ELSE opt_stmt_list
;
elseif_item :
ELSE_IF expr THEN opt_stmt_list
;
elseif_list :
elseif_item
| elseif_item elseif_list
;
opt_elseif_list :
/* empty */
| elseif_list
;
control_stmt :
commit_return_stmt
| continue_stmt
| leave_stmt
| return_stmt
| rollback_return_stmt
| throw_stmt
;
guard_stmt :
IF expr control_stmt
;
transaction_mode :
/* empty */
| DEFERRED
| IMMEDIATE
| EXCLUSIVE
;
begin_trans_stmt :
BEGIN_ transaction_mode TRANSACTION
| BEGIN_ transaction_mode
;
rollback_trans_stmt :
ROLLBACK
| ROLLBACK TRANSACTION
| ROLLBACK TO savepoint_name
| ROLLBACK TRANSACTION TO savepoint_name
| ROLLBACK TO SAVEPOINT savepoint_name
| ROLLBACK TRANSACTION TO SAVEPOINT savepoint_name
;
commit_trans_stmt :
COMMIT TRANSACTION
| COMMIT
;
proc_savepoint_stmt :
procedure SAVEPOINT BEGIN_ opt_stmt_list END
;
savepoint_name :
AT_PROC
| name
;
savepoint_stmt :
SAVEPOINT savepoint_name
;
release_savepoint_stmt :
RELEASE savepoint_name
| RELEASE SAVEPOINT savepoint_name
;
echo_stmt :
AT_ECHO name ',' str_literal
;
alter_table_add_column_stmt :
ALTER TABLE name ADD COLUMN col_def
;
create_trigger_stmt :
CREATE opt_temp TRIGGER opt_if_not_exists trigger_def opt_delete_version_attr
;
trigger_def :
name trigger_condition trigger_operation ON name trigger_action
;
trigger_condition :
/* empty */
| BEFORE
| AFTER
| INSTEAD OF
;
trigger_operation :
DELETE
| INSERT
| UPDATE opt_of
;
opt_of :
/* empty */
| OF name_list
;
trigger_action :
opt_foreachrow opt_when_expr BEGIN_ trigger_stmts END
;
opt_foreachrow :
/* empty */
| FOR_EACH_ROW
;
opt_when_expr :
/* empty */
| WHEN expr
;
trigger_stmts :
trigger_stmt
| trigger_stmt trigger_stmts
;
trigger_stmt :
trigger_update_stmt ';'
| trigger_insert_stmt ';'
| trigger_delete_stmt ';'
| trigger_select_stmt ';'
;
trigger_select_stmt :
select_stmt_no_with
;
trigger_insert_stmt :
insert_stmt
;
trigger_delete_stmt :
delete_stmt
;
trigger_update_stmt :
basic_update_stmt
;
enforcement_options :
FOREIGN KEY ON UPDATE
| FOREIGN KEY ON DELETE
| JOIN
| UPSERT STATEMENT
| WINDOW function
| WITHOUT ROWID
| TRANSACTION
| SELECT IF NOTHING
| INSERT SELECT
| TABLE FUNCTION
| ENCODE CONTEXT_COLUMN
| ENCODE CONTEXT_TYPE INTEGER
| ENCODE CONTEXT_TYPE LONG_INTEGER
| ENCODE CONTEXT_TYPE REAL
| ENCODE CONTEXT_TYPE BOOL_
| ENCODE CONTEXT_TYPE TEXT
| ENCODE CONTEXT_TYPE BLOB
| IS_TRUE
| CAST
| NULL_ CHECK ON NOT NULL_
;
enforce_strict_stmt :
AT_ENFORCE_STRICT enforcement_options
;
enforce_normal_stmt :
AT_ENFORCE_NORMAL enforcement_options
;
enforce_reset_stmt :
AT_ENFORCE_RESET
;
enforce_push_stmt :
AT_ENFORCE_PUSH
;
enforce_pop_stmt :
AT_ENFORCE_POP
;