KonnexionsGmbH / sqlparse

LALR grammar based SQL Parser
Other
43 stars 15 forks source link

Grammar railroad diagram #186

Open mingodad opened 1 year ago

mingodad commented 1 year ago

After manually massage sqlparse.yrl with some search and replace we can have a nice navigable railroad diagram.

Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui on the tab Edit Grammar the click on the tab View Diagram to see/download a navigable railroad diagram.

//From: https://github.com/KonnexionsGmbH/sqlparse/blob/master/src/sqlparse.yrl
//%%-----------------------------------------------------------------------------
//%%
//%%sqlparse.yrl
//%%
//%%Copyright (c) 2012-20 Konnexions GmbH.  All Rights Reserved.
//%%
//%%-----------------------------------------------------------------------------

//Rootsymbol plsql_block_sql_list.

plsql_block_sql_list ::= plsql_block
plsql_block_sql_list ::= sql_list

plsql_block ::= plsql_body

sql_list ::=          sql ';'
sql_list ::=          sql ';' extra
sql_list ::= sql_list sql ';'
sql_list ::= sql_list sql ';' extra

extra ::= NAME  ';'

//%%=============================================================================
//%%Helper definitions - test purposes.
//%%-----------------------------------------------------------------------------
//%sql ::= table_ref
//%%=============================================================================

sql ::= manipulative_statement
sql ::= schema

plsql_body ::= BEGIN statement_pragma_list END ';'

statement_pragma_list ::=                       statement_pragma ';'
statement_pragma_list ::= statement_pragma_list statement_pragma ';'

statement_pragma ::= assignment_statement
statement_pragma ::= close_statement
statement_pragma ::= commit_statement
statement_pragma ::= cursor_def
statement_pragma ::= delete_statement_positioned
statement_pragma ::= delete_statement_searched
statement_pragma ::= fetch_statement
statement_pragma ::= function_ref
statement_pragma ::= insert_statement
statement_pragma ::= open_statement
statement_pragma ::= procedure_call
statement_pragma ::= rollback_statement
statement_pragma ::= select_statement
statement_pragma ::= update_statement_positioned
statement_pragma ::= update_statement_searched
statement_pragma ::= WHENEVER NOT FOUND when_action
statement_pragma ::= WHENEVER SQLERROR  when_action

assignment_statement ::= parameter ':=' scalar_opt_as_exp_1

procedure_call ::= CALL function_ref

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%schema definition language
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

schema ::= CREATE SCHEMA AUTHORIZATION identifier
schema ::= CREATE SCHEMA AUTHORIZATION identifier schema_element_list

schema_element_list ::=                     schema_element
schema_element_list ::= schema_element_list schema_element

schema_element ::= create_table_def
schema_element ::= view_def
schema_element ::= grant_def

create_role_def ::= CREATE ROLE identifier

create_table_def ::= CREATE             TABLE table '('                              ')'
create_table_def ::= CREATE             TABLE table '(' base_table_element_commalist ')'
create_table_def ::= CREATE create_opts TABLE table '('                              ')'
create_table_def ::= CREATE create_opts TABLE table '(' base_table_element_commalist ')'

create_user_def ::= CREATE USER identifier identified
create_user_def ::= CREATE USER identifier identified user_opts_list

create_index_def ::= CREATE                   INDEX            ON table_alias
create_index_def ::= CREATE                   INDEX            ON table_alias                                     create_index_filter
create_index_def ::= CREATE                   INDEX            ON table_alias                   create_index_norm
create_index_def ::= CREATE                   INDEX            ON table_alias                   create_index_norm create_index_filter
create_index_def ::= CREATE                   INDEX            ON table_alias create_index_spec
create_index_def ::= CREATE                   INDEX            ON table_alias create_index_spec                   create_index_filter
create_index_def ::= CREATE                   INDEX            ON table_alias create_index_spec create_index_norm
create_index_def ::= CREATE                   INDEX            ON table_alias create_index_spec create_index_norm create_index_filter
create_index_def ::= CREATE                   INDEX index_name ON table_alias
create_index_def ::= CREATE                   INDEX index_name ON table_alias                                     create_index_filter
create_index_def ::= CREATE                   INDEX index_name ON table_alias                   create_index_norm
create_index_def ::= CREATE                   INDEX index_name ON table_alias                   create_index_norm create_index_filter
create_index_def ::= CREATE                   INDEX index_name ON table_alias create_index_spec
create_index_def ::= CREATE                   INDEX index_name ON table_alias create_index_spec                   create_index_filter
create_index_def ::= CREATE                   INDEX index_name ON table_alias create_index_spec create_index_norm create_index_filter
create_index_def ::= CREATE                   INDEX index_name ON table_alias create_index_spec create_index_norm
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias                                     create_index_filter
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias                   create_index_norm
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias                   create_index_norm create_index_filter
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias create_index_spec
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias create_index_spec                   create_index_filter
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias create_index_spec create_index_norm
create_index_def ::= CREATE create_index_opts INDEX            ON table_alias create_index_spec create_index_norm create_index_filter
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias                                     create_index_filter
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias                   create_index_norm
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias                   create_index_norm create_index_filter
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias create_index_spec
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias create_index_spec                   create_index_filter
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias create_index_spec create_index_norm
create_index_def ::= CREATE create_index_opts INDEX index_name ON table_alias create_index_spec create_index_norm create_index_filter

create_index_opts ::= BITMAP
create_index_opts ::= KEYLIST
create_index_opts ::= HASHMAP
create_index_opts ::= UNIQUE

index_name ::=                identifier
index_name ::= identifier '.' identifier

create_index_spec ::= '(' create_index_spec_items ')'

create_index_spec_items ::= create_index_spec_column
create_index_spec_items ::= create_index_spec_column ',' create_index_spec_items

create_index_spec_column ::= identifier
create_index_spec_column ::= identifier JSON

create_index_norm ::= NORM_WITH STRING

create_index_filter ::= FILTER_WITH STRING

create_opts ::=           tbl_type
create_opts ::= tbl_scope
create_opts ::= tbl_scope tbl_type

tbl_scope ::= LOCAL
tbl_scope ::= CLUSTER
tbl_scope ::= SCHEMA

tbl_type ::= SET
tbl_type ::= ORDERED_SET
tbl_type ::= BAG
tbl_type ::= NAME

alter_user_def ::= ALTER USER user_list  proxy_clause
alter_user_def ::= ALTER USER identifier spec_list
alter_user_def ::= ALTER USER identifier NAME         NAME

user_list ::= identifier
user_list ::= identifier ',' user_list

proxy_clause ::= GRANT  CONNECT THROUGH ENTERPRISE USERS
proxy_clause ::= GRANT  CONNECT THROUGH db_user_proxy
proxy_clause ::= REVOKE CONNECT THROUGH ENTERPRISE USERS
proxy_clause ::= REVOKE CONNECT THROUGH db_user_proxy

db_user_proxy ::= proxy_with
db_user_proxy ::=            proxy_auth_req
db_user_proxy ::= proxy_with proxy_auth_req

proxy_with ::= WITH NO ROLES
proxy_with ::= WITH ROLE            role_list
proxy_with ::= WITH ROLE ALL EXCEPT role_list

proxy_auth_req ::= AUTHENTICATION REQUIRED

spec_list ::= spec_item
spec_list ::= spec_item spec_list

spec_item ::= identified
spec_item ::= user_opt
spec_item ::= user_role

user_role ::= DEFAULT ROLE ALL
user_role ::= DEFAULT ROLE ALL EXCEPT role_list
user_role ::= DEFAULT ROLE NONE
user_role ::= DEFAULT ROLE            role_list

role_list ::= NAME
role_list ::= NAME ',' role_list

identified ::= IDENTIFIED            BY identifier
identified ::= IDENTIFIED EXTERNALLY
identified ::= IDENTIFIED EXTERNALLY AS identifier
identified ::= IDENTIFIED GLOBALLY
identified ::= IDENTIFIED GLOBALLY   AS identifier

user_opts_list ::= user_opt
user_opts_list ::= user_opt user_opts_list

user_opt ::= DEFAULT   TABLESPACE identifier
user_opt ::= TEMPORARY TABLESPACE identifier
user_opt ::= quota_list
user_opt ::= PROFILE              identifier

quota_list ::= quota
quota_list ::= quota quota_list

quota ::= QUOTA UNLIMITED         ON identifier
quota ::= QUOTA INTNUM            ON identifier
quota ::= QUOTA INTNUM identifier ON identifier

table_list ::=                table
table_list ::= table_list ',' table

exists ::= IF EXISTS

base_table_element_commalist ::=                                  base_table_element
base_table_element_commalist ::= base_table_element_commalist ',' base_table_element

base_table_element ::= column_def
base_table_element ::= table_constraint_def

column_def ::= column data_type
column_def ::= column data_type column_def_list

column_def_list ::=                 column_def_opt
column_def_list ::= column_def_list column_def_opt

column_def_opt ::= NOT NULLX
column_def_opt ::= NOT NULLX UNIQUE
column_def_opt ::= NOT NULLX PRIMARY KEY
column_def_opt ::= DEFAULT function_ref
column_def_opt ::= DEFAULT identifier
column_def_opt ::= DEFAULT literal
column_def_opt ::= DEFAULT NULLX
column_def_opt ::= DEFAULT USER
column_def_opt ::= CHECK '(' search_condition ')'
column_def_opt ::= REFERENCES table
column_def_opt ::= REFERENCES table '(' column_commalist ')'

table_constraint_def ::=                       UNIQUE      '(' column_commalist ')'
table_constraint_def ::=                       PRIMARY KEY '(' column_commalist ')'
table_constraint_def ::=                       FOREIGN KEY '(' column_commalist ')' REFERENCES table
table_constraint_def ::=                       FOREIGN KEY '(' column_commalist ')' REFERENCES table '(' column_commalist ')'
table_constraint_def ::=                       CHECK '(' search_condition ')'
table_constraint_def ::= CONSTRAINT identifier UNIQUE      '(' column_commalist ')'
table_constraint_def ::= CONSTRAINT identifier PRIMARY KEY '(' column_commalist ')'
table_constraint_def ::= CONSTRAINT identifier FOREIGN KEY '(' column_commalist ')' REFERENCES table
table_constraint_def ::= CONSTRAINT identifier FOREIGN KEY '(' column_commalist ')' REFERENCES table '(' column_commalist ')'
table_constraint_def ::= CONSTRAINT identifier CHECK '(' search_condition ')'

column_commalist ::= column
column_commalist ::= column ',' column_commalist

view_def ::= CREATE VIEW table                          AS query_spec
view_def ::= CREATE VIEW table                          AS query_spec WITH CHECK OPTION
view_def ::= CREATE VIEW table '(' column_commalist ')' AS query_spec
view_def ::= CREATE VIEW table '(' column_commalist ')' AS query_spec WITH CHECK OPTION

grant_def ::= GRANT ALL PRIVILEGES        on_obj_clause TO grantee_revokee_commalist
grant_def ::= GRANT object_privilege_list on_obj_clause TO grantee_revokee_commalist
grant_def ::= GRANT ALL PRIVILEGES        on_obj_clause TO grantee_identified_by
grant_def ::= GRANT object_privilege_list on_obj_clause TO grantee_identified_by
grant_def ::= GRANT ALL PRIVILEGES        on_obj_clause TO grantee_revokee_commalist object_with_grant_option
grant_def ::= GRANT object_privilege_list on_obj_clause TO grantee_revokee_commalist object_with_grant_option
grant_def ::= GRANT ALL PRIVILEGES        on_obj_clause TO grantee_identified_by     object_with_grant_option
grant_def ::= GRANT object_privilege_list on_obj_clause TO grantee_identified_by     object_with_grant_option
grant_def ::= GRANT ALL PRIVILEGES                      TO grantee_revokee_commalist
grant_def ::= GRANT system_privilege_list               TO grantee_revokee_commalist
grant_def ::= GRANT ALL PRIVILEGES                      TO grantee_identified_by
grant_def ::= GRANT system_privilege_list               TO grantee_identified_by
grant_def ::= GRANT ALL PRIVILEGES                      TO grantee_revokee_commalist system_with_grant_option
grant_def ::= GRANT system_privilege_list               TO grantee_revokee_commalist system_with_grant_option
grant_def ::= GRANT ALL PRIVILEGES                      TO grantee_identified_by     system_with_grant_option
grant_def ::= GRANT system_privilege_list               TO grantee_identified_by     system_with_grant_option

revoke_def ::= REVOKE ALL PRIVILEGES        on_obj_clause FROM grantee_revokee_commalist
revoke_def ::= REVOKE object_privilege_list on_obj_clause FROM grantee_revokee_commalist
revoke_def ::= REVOKE ALL PRIVILEGES        on_obj_clause FROM grantee_revokee_commalist object_with_revoke_option
revoke_def ::= REVOKE object_privilege_list on_obj_clause FROM grantee_revokee_commalist object_with_revoke_option
revoke_def ::= REVOKE ALL PRIVILEGES                      FROM grantee_revokee_commalist
revoke_def ::= REVOKE system_privilege_list               FROM grantee_revokee_commalist

grantee_identified_by ::= identifier IDENTIFIED BY STRING

grantee_revokee ::= identifier
grantee_revokee ::= PUBLIC

grantee_revokee_commalist ::=                               grantee_revokee
grantee_revokee_commalist ::= grantee_revokee_commalist ',' grantee_revokee

object_privilege ::= ALL
object_privilege ::= ALTER
object_privilege ::= DELETE
object_privilege ::= EXECUTE
object_privilege ::= INDEX
object_privilege ::= INSERT
object_privilege ::= REFERENCES
object_privilege ::= SELECT
object_privilege ::= UPDATE

object_privilege_list ::= object_privilege
object_privilege_list ::= object_privilege ',' object_privilege_list

object_with_grant_option ::= WITH GRANT     OPTION
object_with_grant_option ::= WITH HIERARCHY OPTION

object_with_revoke_option ::= CASCADE CONSTRAINTS
object_with_revoke_option ::= FORCE

on_obj_clause ::= ON DIRECTORY identifier
on_obj_clause ::= ON table

system_privilege ::= ADMIN
system_privilege ::= ALTER ANY INDEX
system_privilege ::= ALTER ANY MATERIALIZED VIEW
system_privilege ::= ALTER ANY TABLE
system_privilege ::= ALTER ANY VIEW
system_privilege ::= CREATE ANY INDEX
system_privilege ::= CREATE ANY MATERIALIZED VIEW
system_privilege ::= CREATE ANY TABLE
system_privilege ::= CREATE ANY VIEW
system_privilege ::= CREATE MATERIALIZED VIEW
system_privilege ::= CREATE TABLE
system_privilege ::= CREATE VIEW
system_privilege ::= DELETE ANY TABLE
system_privilege ::= DROP ANY INDEX
system_privilege ::= DROP ANY MATERIALIZED VIEW
system_privilege ::= DROP ANY TABLE
system_privilege ::= DROP ANY VIEW
system_privilege ::= INSERT ANY TABLE
system_privilege ::= SELECT ANY TABLE
system_privilege ::= UPDATE ANY TABLE
system_privilege ::= NAME

system_privilege_list ::= system_privilege
system_privilege_list ::= system_privilege ',' system_privilege_list

system_with_grant_option ::= WITH ADMIN    OPTION
system_with_grant_option ::= WITH DELEGATE OPTION

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%cursor definition
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

cursor_def ::= CURSOR cursor IS query_exp

order_by_clause ::= ORDER BY ordering_spec_commalist

ordering_spec_commalist ::=                             ordering_spec
ordering_spec_commalist ::= ordering_spec_commalist ',' ordering_spec

ordering_spec ::= scalar_exp
ordering_spec ::= scalar_exp asc_desc

asc_desc ::= ASC
asc_desc ::= DESC

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%manipulative statements
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

manipulative_statement ::= alter_user_def
manipulative_statement ::= create_index_def
manipulative_statement ::= create_role_def
manipulative_statement ::= create_table_def
manipulative_statement ::= create_user_def
manipulative_statement ::= delete_statement_positioned
manipulative_statement ::= delete_statement_searched
manipulative_statement ::= drop_context_def
manipulative_statement ::= drop_database_def
manipulative_statement ::= drop_database_link_def
manipulative_statement ::= drop_directory_def
manipulative_statement ::= drop_function_def
manipulative_statement ::= drop_index_def
manipulative_statement ::= drop_materialized_view_def
manipulative_statement ::= drop_package_def
manipulative_statement ::= drop_procedure_def
manipulative_statement ::= drop_profile_def
manipulative_statement ::= drop_role_def
manipulative_statement ::= drop_sequence_def
manipulative_statement ::= drop_synonym_def
manipulative_statement ::= drop_table_def
manipulative_statement ::= drop_tablespace_def
manipulative_statement ::= drop_trigger_def
manipulative_statement ::= drop_type_def
manipulative_statement ::= drop_type_body_def
manipulative_statement ::= drop_user_def
manipulative_statement ::= drop_view_def
manipulative_statement ::= grant_def
manipulative_statement ::= insert_statement
manipulative_statement ::= revoke_def
manipulative_statement ::= select_statement
manipulative_statement ::= truncate_table
manipulative_statement ::= update_statement_positioned
manipulative_statement ::= update_statement_searched
manipulative_statement ::= view_def

close_statement ::= CLOSE cursor

commit_statement ::= COMMIT
commit_statement ::= COMMIT WORK

delete_statement_positioned ::= DELETE FROM table_dblink WHERE CURRENT OF cursor
delete_statement_positioned ::= DELETE FROM table_dblink WHERE CURRENT OF cursor returning

delete_statement_searched ::= DELETE FROM table_dblink
delete_statement_searched ::= DELETE FROM table_dblink              returning
delete_statement_searched ::= DELETE FROM table_dblink where_clause
delete_statement_searched ::= DELETE FROM table_dblink where_clause returning

drop_context_def ::= DROP CONTEXT identifier

drop_database_def ::= DROP DATABASE

drop_database_link_def ::= DROP        DATABASE LINK DBLINK
drop_database_link_def ::= DROP PUBLIC DATABASE LINK DBLINK

drop_directory_def ::= DROP DIRECTORY identifier

drop_function_def ::= DROP FUNCTION function_name

function_name ::=                NAME
function_name ::= identifier '.' NAME

drop_index_def ::= DROP INDEX            FROM table
drop_index_def ::= DROP INDEX            FROM table drop_index_extensions
drop_index_def ::= DROP INDEX index_name
drop_index_def ::= DROP INDEX index_name            drop_index_extensions
drop_index_def ::= DROP INDEX index_name FROM table
drop_index_def ::= DROP INDEX index_name FROM table drop_index_extensions

drop_index_extensions ::=              DEFERRED  INVALIDATION
drop_index_extensions ::=              IMMEDIATE INVALIDATION
drop_index_extensions ::=        FORCE
drop_index_extensions ::=        FORCE DEFERRED  INVALIDATION
drop_index_extensions ::=        FORCE IMMEDIATE INVALIDATION
drop_index_extensions ::= ONLINE
drop_index_extensions ::= ONLINE       DEFERRED  INVALIDATION
drop_index_extensions ::= ONLINE       IMMEDIATE INVALIDATION
drop_index_extensions ::= ONLINE FORCE
drop_index_extensions ::= ONLINE FORCE DEFERRED  INVALIDATION
drop_index_extensions ::= ONLINE FORCE IMMEDIATE INVALIDATION

drop_materialized_view_def ::= DROP MATERIALIZED VIEW materialized_view_name
drop_materialized_view_def ::= DROP MATERIALIZED VIEW materialized_view_name PRESERVE TABLE

materialized_view_name ::=                identifier
materialized_view_name ::= identifier '.' identifier

drop_package_def ::= DROP PACKAGE      package_name
drop_package_def ::= DROP PACKAGE BODY package_name

package_name ::=                identifier
package_name ::= identifier '.' identifier

drop_procedure_def ::= DROP PROCEDURE procedure_name

procedure_name ::=                identifier
procedure_name ::= identifier '.' identifier

drop_profile_def ::= DROP PROFILE identifier
drop_profile_def ::= DROP PROFILE identifier CASCADE

drop_role_def ::= DROP ROLE identifier

drop_sequence_def ::= DROP SEQUENCE sequence_name

sequence_name ::=                identifier
sequence_name ::= identifier '.' identifier

drop_synonym_def ::= DROP        SYNONYM synonym_name
drop_synonym_def ::= DROP        SYNONYM synonym_name FORCE
drop_synonym_def ::= DROP PUBLIC SYNONYM synonym_name
drop_synonym_def ::= DROP PUBLIC SYNONYM synonym_name FORCE

synonym_name ::=                identifier
synonym_name ::= identifier '.' identifier

drop_table_def ::= DROP             TABLE        table_list
drop_table_def ::= DROP             TABLE        table_list drop_table_extensions
drop_table_def ::= DROP             TABLE exists table_list
drop_table_def ::= DROP             TABLE exists table_list drop_table_extensions
drop_table_def ::= DROP create_opts TABLE        table_list
drop_table_def ::= DROP create_opts TABLE        table_list drop_table_extensions
drop_table_def ::= DROP create_opts TABLE exists table_list
drop_table_def ::= DROP create_opts TABLE exists table_list drop_table_extensions

drop_table_extensions ::=                     PURGE
drop_table_extensions ::= CASCADE CONSTRAINTS
drop_table_extensions ::= CASCADE CONSTRAINTS PURGE

drop_tablespace_def ::= DROP TABLESPACE identifier
drop_tablespace_def ::= DROP TABLESPACE identifier drop_tablespace_extensions

drop_tablespace_extensions ::=            INCLUDING CONTENTS
drop_tablespace_extensions ::=            INCLUDING CONTENTS                CASCADE CONSTRAINTS
drop_tablespace_extensions ::=            INCLUDING CONTENTS AND  DATAFILES CASCADE CONSTRAINTS
drop_tablespace_extensions ::=            INCLUDING CONTENTS KEEP DATAFILES CASCADE CONSTRAINTS
drop_tablespace_extensions ::= DROP QUOTA
drop_tablespace_extensions ::= DROP QUOTA INCLUDING CONTENTS
drop_tablespace_extensions ::= DROP QUOTA INCLUDING CONTENTS                CASCADE CONSTRAINTS
drop_tablespace_extensions ::= DROP QUOTA INCLUDING CONTENTS AND  DATAFILES CASCADE CONSTRAINTS
drop_tablespace_extensions ::= DROP QUOTA INCLUDING CONTENTS KEEP DATAFILES CASCADE CONSTRAINTS
drop_tablespace_extensions ::= KEEP QUOTA
drop_tablespace_extensions ::= KEEP QUOTA INCLUDING CONTENTS
drop_tablespace_extensions ::= KEEP QUOTA INCLUDING CONTENTS                CASCADE CONSTRAINTS
drop_tablespace_extensions ::= KEEP QUOTA INCLUDING CONTENTS AND  DATAFILES CASCADE CONSTRAINTS
drop_tablespace_extensions ::= KEEP QUOTA INCLUDING CONTENTS KEEP DATAFILES CASCADE CONSTRAINTS

drop_trigger_def ::= DROP TRIGGER trigger_name

trigger_name ::=                identifier
trigger_name ::= identifier '.' identifier

drop_type_def ::= DROP TYPE type_name
drop_type_def ::= DROP TYPE type_name FORCE
drop_type_def ::= DROP TYPE type_name VALIDATE

type_name ::=                identifier
type_name ::= identifier '.' identifier

drop_type_body_def ::= DROP TYPE BODY type_name

drop_user_def ::= DROP USER identifier
drop_user_def ::= DROP USER identifier CASCADE

drop_view_def ::= DROP VIEW table
drop_view_def ::= DROP VIEW table CASCADE CONSTRAINTS

fetch_statement ::= FETCH cursor INTO target_commalist

insert_statement ::= INSERT INTO table_dblink
insert_statement ::= INSERT INTO table_dblink                                               returning
insert_statement ::= INSERT INTO table_dblink                          values_or_query_spec
insert_statement ::= INSERT INTO table_dblink                          values_or_query_spec returning
insert_statement ::= INSERT INTO table_dblink '(' column_commalist ')' values_or_query_spec
insert_statement ::= INSERT INTO table_dblink '(' column_commalist ')' values_or_query_spec returning

values_or_query_spec ::= VALUES '(' insert_atom_commalist ')'
values_or_query_spec ::=     query_spec
values_or_query_spec ::= '(' query_spec ')'

insert_atom_commalist ::=                           insert_atom
insert_atom_commalist ::= insert_atom_commalist ',' insert_atom

insert_atom ::= scalar_opt_as_exp

open_statement ::= OPEN cursor

rollback_statement ::= ROLLBACK
rollback_statement ::= ROLLBACK WORK

select_statement ::= query_exp

hint ::= HINT

all_distinct ::= ALL
all_distinct ::= DISTINCT

truncate_table ::= TRUNCATE TABLE table
truncate_table ::= TRUNCATE TABLE table                      CASCADE
truncate_table ::= TRUNCATE TABLE table              storage
truncate_table ::= TRUNCATE TABLE table              storage CASCADE
truncate_table ::= TRUNCATE TABLE table materialized
truncate_table ::= TRUNCATE TABLE table materialized         CASCADE
truncate_table ::= TRUNCATE TABLE table materialized storage
truncate_table ::= TRUNCATE TABLE table materialized storage CASCADE

materialized ::= PRESERVE MATERIALIZED VIEW LOG
materialized ::= PURGE    MATERIALIZED VIEW LOG

storage ::=  DROP      STORAGE
storage ::=  DROP  ALL STORAGE
storage ::=  REUSE     STORAGE

update_statement_positioned ::= UPDATE table_dblink SET assignment_commalist WHERE CURRENT OF cursor
update_statement_positioned ::= UPDATE table_dblink SET assignment_commalist WHERE CURRENT OF cursor returning

assignment_commalist ::=                          assignment
assignment_commalist ::= assignment_commalist ',' assignment

assignment ::= column '=' scalar_opt_as_exp

update_statement_searched ::= UPDATE table_dblink SET assignment_commalist
update_statement_searched ::= UPDATE table_dblink SET assignment_commalist              returning
update_statement_searched ::= UPDATE table_dblink SET assignment_commalist where_clause
update_statement_searched ::= UPDATE table_dblink SET assignment_commalist where_clause returning

target_commalist ::=                      target
target_commalist ::= target_commalist ',' target

target ::= identifier
target ::= parameter_ref

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%query expressions
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

query_exp ::=                     query_term
query_exp ::= query_exp UNION     query_term
query_exp ::= query_exp UNION ALL query_term
query_exp ::= query_exp INTERSECT query_term
query_exp ::= query_exp MINUS     query_term

returning ::= RETURNING selection INTO selection
returning ::= RETURN    selection INTO selection

query_term ::=     query_spec
query_term ::= '(' query_exp  ')'
query_term ::= '(' query_exp  ')' JSON

query_spec ::= SELECT                   selection      table_exp
query_spec ::= SELECT                   selection into table_exp
query_spec ::= SELECT      all_distinct selection      table_exp
query_spec ::= SELECT      all_distinct selection into table_exp
query_spec ::= SELECT hint              selection      table_exp
query_spec ::= SELECT hint              selection into table_exp
query_spec ::= SELECT hint all_distinct selection      table_exp
query_spec ::= SELECT hint all_distinct selection into table_exp

into ::= INTO target_commalist

selection ::= select_field_commalist

select_field ::= case_when_opt_as_exp
select_field ::= scalar_opt_as_exp
select_field ::= '*'

select_field_commalist ::=                            select_field
select_field_commalist ::= select_field_commalist ',' select_field

case_when_opt_as_exp ::= case_when_exp
case_when_opt_as_exp ::= case_when_exp    NAME
case_when_opt_as_exp ::= case_when_exp AS NAME

case_when_exp ::= CASE                   case_when_then_list      END
case_when_exp ::= CASE                   case_when_then_list else END
case_when_exp ::= CASE scalar_opt_as_exp case_when_then_list      END
case_when_exp ::= CASE scalar_opt_as_exp case_when_then_list else END
case_when_exp ::= '(' case_when_exp ')'

case_when_then_list ::= case_when_then
case_when_then_list ::= case_when_then case_when_then_list

case_when_then ::= WHEN search_condition THEN scalar_opt_as_exp

else ::= ELSE scalar_opt_as_exp

table_exp ::= from_clause
table_exp ::= from_clause                                                                      order_by_clause
table_exp ::= from_clause                                                        having_clause
table_exp ::= from_clause                                                        having_clause order_by_clause
table_exp ::= from_clause                                        group_by_clause
table_exp ::= from_clause                                        group_by_clause               order_by_clause
table_exp ::= from_clause                                        group_by_clause having_clause
table_exp ::= from_clause                                        group_by_clause having_clause order_by_clause
table_exp ::= from_clause              hierarchical_query_clause
table_exp ::= from_clause              hierarchical_query_clause                               order_by_clause
table_exp ::= from_clause              hierarchical_query_clause                 having_clause
table_exp ::= from_clause              hierarchical_query_clause                 having_clause order_by_clause
table_exp ::= from_clause              hierarchical_query_clause group_by_clause
table_exp ::= from_clause              hierarchical_query_clause group_by_clause               order_by_clause
table_exp ::= from_clause              hierarchical_query_clause group_by_clause having_clause
table_exp ::= from_clause              hierarchical_query_clause group_by_clause having_clause order_by_clause
table_exp ::= from_clause where_clause
table_exp ::= from_clause where_clause                                                         order_by_clause
table_exp ::= from_clause where_clause                                           having_clause
table_exp ::= from_clause where_clause                                           having_clause order_by_clause
table_exp ::= from_clause where_clause                           group_by_clause
table_exp ::= from_clause where_clause                           group_by_clause               order_by_clause
table_exp ::= from_clause where_clause                           group_by_clause having_clause
table_exp ::= from_clause where_clause                           group_by_clause having_clause order_by_clause
table_exp ::= from_clause where_clause hierarchical_query_clause
table_exp ::= from_clause where_clause hierarchical_query_clause                               order_by_clause
table_exp ::= from_clause where_clause hierarchical_query_clause                 having_clause
table_exp ::= from_clause where_clause hierarchical_query_clause                 having_clause order_by_clause
table_exp ::= from_clause where_clause hierarchical_query_clause group_by_clause
table_exp ::= from_clause where_clause hierarchical_query_clause group_by_clause               order_by_clause
table_exp ::= from_clause where_clause hierarchical_query_clause group_by_clause having_clause
table_exp ::= from_clause where_clause hierarchical_query_clause group_by_clause having_clause order_by_clause

from_clause ::= FROM from_column_commalist

from_column ::= table_ref
from_column ::= '(' join_clause ')'
from_column ::=     join_clause

from_column_commalist ::=                           from_column
from_column_commalist ::= from_column_commalist ',' from_column

join_clause ::= table_ref join_list

join ::= inner_cross_join
join ::= outer_join

join_list ::=           join
join_list ::= join_list join

inner_cross_join ::=               JOIN join_ref join_on_or_using_clause
inner_cross_join ::= CROSS         JOIN join_ref
inner_cross_join ::= INNER         JOIN join_ref join_on_or_using_clause
inner_cross_join ::= NATURAL       JOIN join_ref
inner_cross_join ::= NATURAL INNER JOIN join_ref

join_on_or_using_clause ::= ON search_condition
join_on_or_using_clause ::= USING '(' select_field_commalist ')'

//%----------------------------------------------------------------------------------------------- {{join_type, partition, opt_natural} ... }
outer_join ::=                                outer_join_type JOIN join_ref                        join_on_or_using_clause
outer_join ::=                                outer_join_type JOIN join_ref
outer_join ::=                                outer_join_type JOIN join_ref query_partition_clause
outer_join ::=                                outer_join_type JOIN join_ref query_partition_clause join_on_or_using_clause
outer_join ::= NATURAL                        outer_join_type JOIN join_ref                        join_on_or_using_clause
outer_join ::= NATURAL                        outer_join_type JOIN join_ref
outer_join ::= NATURAL                        outer_join_type JOIN join_ref query_partition_clause
outer_join ::= NATURAL                        outer_join_type JOIN join_ref query_partition_clause join_on_or_using_clause
outer_join ::= query_partition_clause         outer_join_type JOIN join_ref                        join_on_or_using_clause
outer_join ::= query_partition_clause         outer_join_type JOIN join_ref
outer_join ::= query_partition_clause         outer_join_type JOIN join_ref query_partition_clause
outer_join ::= query_partition_clause         outer_join_type JOIN join_ref query_partition_clause join_on_or_using_clause
outer_join ::= query_partition_clause NATURAL outer_join_type JOIN join_ref                        join_on_or_using_clause
outer_join ::= query_partition_clause NATURAL outer_join_type JOIN join_ref
outer_join ::= query_partition_clause NATURAL outer_join_type JOIN join_ref query_partition_clause
outer_join ::= query_partition_clause NATURAL outer_join_type JOIN join_ref query_partition_clause join_on_or_using_clause
//%-----------------------------------------------------------------------------------------------

query_partition_clause ::= PARTITION BY     scalar_exp_commalist
query_partition_clause ::= PARTITION BY '(' scalar_exp_commalist ')'

outer_join_type ::= FULL
outer_join_type ::= FULL  OUTER
outer_join_type ::= LEFT
outer_join_type ::= LEFT  OUTER
outer_join_type ::= RIGHT
outer_join_type ::= RIGHT OUTER

table_ref ::= table_dblink
table_ref ::= query_term
table_ref ::= query_term   NAME

join_ref ::= table_dblink
join_ref ::= query_term
join_ref ::= query_term   NAME

hierarchical_query_clause ::= START WITH         search_condition CONNECT BY         search_condition
hierarchical_query_clause ::= START WITH         search_condition CONNECT BY nocycle search_condition
hierarchical_query_clause ::= CONNECT BY         search_condition START WITH         search_condition
hierarchical_query_clause ::= CONNECT BY nocycle search_condition START WITH         search_condition

nocycle ::= NOCYCLE

where_clause ::= WHERE search_condition

group_by_clause ::= GROUP BY column_ref_commalist

column_ref_commalist ::=                          column_ref
column_ref_commalist ::=                          function_ref
column_ref_commalist ::= column_ref_commalist ',' column_ref
column_ref_commalist ::= column_ref_commalist ',' function_ref

having_clause ::= HAVING search_condition

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%search conditions
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

search_condition ::= search_condition OR  search_condition
search_condition ::= search_condition AND search_condition
search_condition ::= NOT search_condition
search_condition ::= '(' search_condition ')'
search_condition ::= predicate

predicate ::= comparison_predicate
predicate ::= between_predicate
predicate ::= like_predicate
predicate ::= test_for_null
predicate ::= in_predicate
predicate ::= all_or_any_predicate
predicate ::= existence_test

comparison_predicate ::= scalar_opt_as_exp
comparison_predicate ::=       scalar_exp '='        PRIOR scalar_exp
comparison_predicate ::=       scalar_exp COMPARISON PRIOR scalar_exp
comparison_predicate ::= PRIOR scalar_exp '='              scalar_exp
comparison_predicate ::= PRIOR scalar_exp COMPARISON       scalar_exp

between_predicate ::= scalar_exp     BETWEEN scalar_exp AND scalar_exp
between_predicate ::= scalar_exp not_between scalar_exp AND scalar_exp

not_between ::= NOT BETWEEN

like_predicate ::= scalar_exp     LIKE scalar_exp
like_predicate ::= scalar_exp     LIKE scalar_exp escape
like_predicate ::= scalar_exp not_like scalar_exp
like_predicate ::= scalar_exp not_like scalar_exp escape

not_like ::= NOT LIKE

escape ::= ESCAPE atom

test_for_null ::= scalar_exp is_null
test_for_null ::= scalar_exp is_not_null

is_not_null ::= IS NOT NULLX

is_null ::= IS NULLX

in_predicate ::= scalar_exp     IN '(' scalar_exp_commalist ')'
in_predicate ::= scalar_exp     IN '(' subquery ')'
in_predicate ::= scalar_exp not_in '(' scalar_exp_commalist ')'
in_predicate ::= scalar_exp not_in '(' subquery ')'

not_in ::= NOT IN

all_or_any_predicate ::= scalar_exp '='        any_all_some subquery
all_or_any_predicate ::= scalar_exp COMPARISON any_all_some subquery

any_all_some ::= ANY
any_all_some ::= ALL
any_all_some ::= SOME

existence_test ::= EXISTS subquery

//%Optional plus (+) is not supported in table_collection_expression:
//%
//%The optional plus (+) is relevant if you are joining the TABLE collection expression with
//%the parent table. The + creates an outer join of the two, so that the query returns rows
//%from the outer table even if the collection expression is null.

table_coll_expr ::= TABLE '(' column_ref   ')'
table_coll_expr ::= TABLE '(' function_ref ')'
table_coll_expr ::= TABLE '(' subquery     ')'

subquery ::= query_exp

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%scalar expressions
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

scalar_opt_as_exp_1 ::= scalar_exp
scalar_opt_as_exp_1 ::= scalar_exp '='        scalar_exp
scalar_opt_as_exp_1 ::= scalar_exp COMPARISON scalar_exp

scalar_opt_as_exp_2 ::= scalar_exp    NAME
scalar_opt_as_exp_2 ::= scalar_exp AS NAME

scalar_opt_as_exp ::= scalar_opt_as_exp_1
scalar_opt_as_exp ::= scalar_opt_as_exp_2

scalar_exp ::= scalar_sub_exp '||' scalar_exp
scalar_exp ::= scalar_sub_exp

scalar_sub_exp ::= scalar_sub_exp '+'    scalar_sub_exp
scalar_sub_exp ::= scalar_sub_exp '-'    scalar_sub_exp
scalar_sub_exp ::= scalar_sub_exp '*'    scalar_sub_exp
scalar_sub_exp ::= scalar_sub_exp '/'    scalar_sub_exp
scalar_sub_exp ::= scalar_sub_exp 'div'  scalar_sub_exp
scalar_sub_exp ::= unary_add_or_subtract scalar_sub_exp
scalar_sub_exp ::= NULLX
scalar_sub_exp ::= atom
scalar_sub_exp ::= subquery
scalar_sub_exp ::= column_ref
scalar_sub_exp ::= function_ref
scalar_sub_exp ::= '(' scalar_sub_exp ')'
scalar_sub_exp ::= '(' scalar_sub_exp ')' JSON

unary_add_or_subtract ::= '+'
unary_add_or_subtract ::= '-'

scalar_exp_commalist ::=                          scalar_opt_as_exp
scalar_exp_commalist ::= scalar_exp_commalist ',' scalar_opt_as_exp

atom ::= parameter_ref
atom ::= literal
atom ::= USER

parameter_ref ::= parameter
parameter_ref ::= parameter           parameter
parameter_ref ::= parameter INDICATOR parameter

function_ref ::= function_ref JSON
function_ref ::= FUNS
function_ref ::= FUNS '('                     ')'
function_ref ::= FUNS '(' '*'                 ')'
function_ref ::= FUNS '(' ALL      scalar_exp ')'
function_ref ::= FUNS '(' DISTINCT column_ref ')'
function_ref ::= FUNS '(' fun_args            ')'
function_ref ::= FUNS '(' fun_args_named      ')'
function_ref ::= identifier                               '('                ')'
function_ref ::= identifier                               '(' fun_args       ')'
function_ref ::= identifier                               '(' fun_args_named ')'
function_ref ::= identifier '.' identifier                '('                ')'
function_ref ::= identifier '.' identifier                '(' fun_args       ')'
function_ref ::= identifier '.' identifier                '(' fun_args_named ')'
function_ref ::= identifier '.' identifier '.' identifier '('                ')'
function_ref ::= identifier '.' identifier '.' identifier '(' fun_args       ')'
function_ref ::= identifier '.' identifier '.' identifier '(' fun_args_named ')'

fun_args ::= fun_arg
fun_args ::= fun_arg ',' fun_args

fun_arg ::= '(' fun_arg ')'
fun_arg ::= atom
fun_arg ::= case_when_exp
fun_arg ::= column_ref
fun_arg ::= fun_arg       NAME
fun_arg ::= fun_arg '*'   fun_arg
fun_arg ::= fun_arg '+'   fun_arg
fun_arg ::= fun_arg '-'   fun_arg
fun_arg ::= fun_arg '/'   fun_arg
fun_arg ::= fun_arg '='   fun_arg
fun_arg ::= fun_arg 'div' fun_arg
fun_arg ::= fun_arg '||'  fun_arg
fun_arg ::= fun_arg AS    NAME
fun_arg ::= fun_arg COMPARISON fun_arg
fun_arg ::= function_ref
fun_arg ::= NULLX
fun_arg ::= subquery
fun_arg ::= unary_add_or_subtract fun_arg

fun_args_named ::= fun_arg_named
fun_args_named ::= fun_arg_named ',' fun_args_named

fun_arg_named ::= identifier '=>' identifier
fun_arg_named ::= identifier '=>' literal
fun_arg_named ::= identifier '=>' parameter

literal ::= STRING
literal ::= INTNUM
literal ::= APPROXNUM

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%miscellaneous
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

table ::= identifier
table ::= identifier '.' identifier
table ::= parameter

table_alias ::= identifier                NAME
table_alias ::= identifier '.' identifier NAME
table_alias ::= parameter                 NAME
table_alias ::= table

table_dblink ::= identifier          DBLINK
table_dblink ::= identifier          DBLINK            NAME
table_dblink ::= identifier      '.' identifier DBLINK
table_dblink ::= identifier      '.' identifier DBLINK NAME
table_dblink ::= parameter           DBLINK
table_dblink ::= parameter           DBLINK            NAME
table_dblink ::= table_alias
table_dblink ::= table_coll_expr

column_ref ::=                               identifier
column_ref ::=                               identifier '(' '+' ')'
column_ref ::=                               identifier JSON
column_ref ::=                               identifier '.' '*'
column_ref ::=                identifier '.' identifier
column_ref ::=                identifier '.' identifier '(' '+' ')'
column_ref ::=                identifier '.' identifier JSON
column_ref ::=                identifier '.' identifier '.' '*'
column_ref ::= identifier '.' identifier '.' identifier
column_ref ::= identifier '.' identifier '.' identifier '(' '+' ')'
column_ref ::= identifier '.' identifier '.' identifier JSON

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%data types
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

data_type ::= BFILE
data_type ::= BINARY_DOUBLE
data_type ::= BINARY_FLOAT
data_type ::= BLOB
data_type ::= CHAR
data_type ::= CLOB
data_type ::= DATE
data_type ::= FLOAT
data_type ::= LONG
data_type ::= LONG RAW
data_type ::= NAME
data_type ::= identifier '.' NAME
data_type ::= NCLOB
data_type ::= NUMBER
data_type ::= RAW
data_type ::= ROWID
data_type ::= STRING
data_type ::= TIMESTAMP
data_type ::= UROWID
data_type ::= VARCHAR2
data_type ::= XMLTYPE
data_type ::= CHAR      '(' sgn_num ')'
data_type ::= FLOAT     '(' sgn_num ')'
data_type ::= NAME      '(' sgn_num ')'
data_type ::= NCHAR     '(' sgn_num ')'
data_type ::= NUMBER    '(' sgn_num ')'
data_type ::= NVARCHAR2 '(' sgn_num ')'
data_type ::= RAW       '(' sgn_num ')'
data_type ::= TIMESTAMP '(' sgn_num ')'
data_type ::= UROWID    '(' sgn_num ')'
data_type ::= VARCHAR2  '(' sgn_num ')'
data_type ::= NAME      '(' sgn_num ',' sgn_num ')'
data_type ::= NUMBER    '(' sgn_num ',' sgn_num ')'

sgn_num ::=     INTNUM
sgn_num ::= '-' INTNUM

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%the various things you can name
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

column ::= identifier

cursor ::= identifier

parameter ::= PARAMETER

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%identifier
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

identifier ::= NAME

identifier ::= ADMIN
//%identifier ::= ALL
//%identifier ::= ALTER
//%identifier ::= AND
//%identifier ::= ANY
//%identifier ::= APPROXNUM
//%identifier ::= AS
//%identifier ::= ASC
identifier ::= AUTHENTICATION
identifier ::= AUTHORIZATION
identifier ::= BAG
identifier ::= BEGIN
//%identifier ::= BETWEEN
identifier ::= BFILE
identifier ::= BINARY_DOUBLE
identifier ::= BINARY_FLOAT
identifier ::= BITMAP
identifier ::= BLOB
identifier ::= BODY
//%identifier ::= BY
identifier ::= CALL
identifier ::= CASCADE
//%identifier ::= CASE
//%identifier ::= CHAR
//%identifier ::= CHECK
identifier ::= CLOB
identifier ::= CLOSE
//%identifier ::= CLUSTER
identifier ::= COMMIT
//%identifier ::= CONNECT
identifier ::= COMPARISON
//%identifier ::= CONSTRAINT
identifier ::= CONSTRAINTS
identifier ::= CONTENTS
identifier ::= CONTEXT
identifier ::= CONTINUE
//%identifier ::= CREATE
identifier ::= CROSS
identifier ::= CURRENT
identifier ::= CURSOR
identifier ::= DATABASE
identifier ::= DATAFILES
//%identifier ::= DATE
identifier ::= DBLINK
//%identifier ::= DEFAULT
identifier ::= DEFERRED
identifier ::= DELEGATE
//%identifier ::= DELETE
//%identifier ::= DESC
identifier ::= DIRECTORY
//%identifier ::= DISTINCT
//%identifier ::= DROP
//%identifier ::= ELSE
identifier ::= END
identifier ::= ENTERPRISE
identifier ::= ESCAPE
identifier ::= EXCEPT
identifier ::= EXECUTE
//%identifier ::= EXISTS
identifier ::= EXTERNALLY
identifier ::= FETCH
identifier ::= FILTER_WITH
//%identifier ::= FLOAT
identifier ::= FORCE
identifier ::= FOREIGN
identifier ::= FOUND
//%identifier ::= FROM
identifier ::= FULL
identifier ::= FUNCTION
//%identifier ::= FUNS
identifier ::= GLOBALLY
identifier ::= GOTO
//%identifier ::= GRANT
//%identifier ::= GROUP
identifier ::= HASHMAP
//%identifier ::= HAVING
identifier ::= HIERARCHY
//%identifier ::= HINT
//%identifier ::= IDENTIFIED
identifier ::= IF
identifier ::= IMMEDIATE
//%identifier ::= IN
identifier ::= INCLUDING
//%identifier ::= INDEX
identifier ::= INDICATOR
identifier ::= INNER
//%identifier ::= INSERT
//%identifier ::= INTERSECT
//%identifier ::= INTNUM
//%identifier ::= INTO
identifier ::= INVALIDATION
//%identifier ::= IS
identifier ::= JOIN
identifier ::= JSON
identifier ::= KEEP
identifier ::= KEY
identifier ::= KEYLIST
identifier ::= LEFT
//%identifier ::= LIKE
identifier ::= LINK
identifier ::= LOCAL
identifier ::= LOG
//%identifier ::= LONG
identifier ::= MATERIALIZED
//%identifier ::= MINUS
identifier ::= NATURAL
identifier ::= NCHAR
identifier ::= NCLOB
identifier ::= NO
//%identifier ::= NOCYCLE
identifier ::= NONE
identifier ::= NORM_WITH
//%identifier ::= NOT
//%identifier ::= NULLX
//%identifier ::= NUMBER
identifier ::= NVARCHAR2
//%identifier ::= OF
//%identifier ::= ON
identifier ::= ONLINE
identifier ::= OPEN
//%identifier ::= OPTION
//%identifier ::= OR
//%identifier ::= ORDER
identifier ::= ORDERED_SET
identifier ::= OUTER
identifier ::= PACKAGE
//%identifier ::= PARAMETER
identifier ::= PARTITION
identifier ::= PRESERVE
identifier ::= PRIMARY
//%identifier ::= PRIO
identifier ::= PRIVILEGES
identifier ::= PROCEDURE
identifier ::= PROFILE
//%identifier ::= PUBLIC
identifier ::= PURGE
//%identifier ::= RAW
identifier ::= ROWID
identifier ::= QUOTA
identifier ::= REFERENCES
identifier ::= REQUIRED
identifier ::= RETURN
identifier ::= RETURNING
identifier ::= REUSE
//%identifier ::= REVOKE
identifier ::= RIGHT
identifier ::= ROLE
identifier ::= ROLES
identifier ::= ROLLBACK
identifier ::= SCHEMA
//%identifier ::= SELECT
identifier ::= SEQUENCE
//%identifier ::= SET
//%identifier ::= SOME
identifier ::= SQLERROR
//%identifier ::= START
identifier ::= STORAGE
//%identifier ::= STRING
//%identifier ::= SYNONYM
//%identifier ::= TABLE
//%identifier ::= TABLESPACE
//%identifier ::= TEMPORARY
//%identifier ::= THEN
//%identifier ::= THROUGH
identifier ::= TIMESTAMP
//%identifier ::= TO
//%identifier ::= TRIGGER
//%identifier ::= TRUNCATE
identifier ::= TYPE
//%identifier ::= UNION
//%identifier ::= UNIQUE
identifier ::= UNLIMITED
//%identifier ::= UPDATE
identifier ::= UROWID
//%identifier ::= USER
identifier ::= USERS
identifier ::= USING
identifier ::= VALIDATE
//%identifier ::= VALUES
//%identifier ::= VARCHAR2
//%identifier ::= VIEW
//%identifier ::= WHEN
identifier ::= WHENEVER
//%identifier ::= WHERE
//%identifier ::= WITH
identifier ::= WORK
identifier ::= XMLTYPE

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%embedded condition things
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

when_action ::= GOTO identifier
when_action ::= CONTINUE