| statement_list ::=statement:s1
 | 
		 statement_list SEMI_COLON statement:s2
 | 
		 error
 ;
 
 statement ::=
 SELECT 
		 select_union:s
 | 
		 UPDATE update:u
 | 
		 INSERT insert:i
 | 
		 INSERT INTO insert:i
 | 
		 REPLACE insert:i
 | 
		 REPLACE INTO insert:i
 | 
		 CREATE SEQUENCE create_sequence:c
 | 
		 DROP SEQUENCE drop_sequence:d
 | 
		 ALTER SEQUENCE alter_sequence:a
 | 
		 CREATE DATABASE create_database_legacy:db
 | 
		 CREATE DATABASE LEGACY create_database_legacy:db
 | 
		 CREATE DATABASE ENHANCED create_database_enhanced:db
 | 
		 DROP DATABASE drop_database:d
 | 
		 CREATE TABLE create_table:c
 | 
		 CREATE VIEW create_view:c with_check_option:o
 | 
		 CREATE INDEX create_index:c
 | 
		 CREATE FULLTEXT INDEX ON id_list:i2 OPEN_PAREN index_col_list:c 
		 CLOSE_PAREN
 | 
		 CREATE UNIQUE INDEX create_index:c
 | 
		 CREATE PROCEDURE create_procedure:p
 | 
		 ALTER PROCEDURE alter_procedure:p
 | 
		 CREATE TRIGGER create_trigger:t
 | 
		 DELETE del:d
 | 
		 DROP TABLE drop_table:d
 | 
		 DROP PROCEDURE drop_procedure:d
 | 
		 DROP TRIGGER drop_trigger:d
 | 
		 DROP VIEW drop_view:d
 | 
		 DROP INDEX drop_index:d
 | 
		 DROP FULLTEXT INDEX ON id_list:t
 | 
		 RENAME id_list:o TO id:n
 | 
		 GRANT privilege_list:p ON grant_object:o TO user_list:u with_grant_option:w
 | 
		 GRANT privilege_list:p ON grant_object:o TO id_list_for_revoke:role 
		 with_grant_option:w
 | 
		 GRANT id_list_for_revoke:r TO user_list:u with_grant_option:w
 | 
		 REVOKE grant_option_for:g privilege_list:p ON id_list_for_revoke:l 
		 FROM user_list:u revoke_qual:q
 | 
		 REVOKE grant_option_for:g id_list_for_revoke:r FROM user_list:u 
		 revoke_qual:q
 | 
		 REVOKE grant_option_for:g privilege_list:p ON id_list_for_revoke:l 
		 FROM id_list_for_revoke:r revoke_qual:q
 | 
		 CREATE ROLE id_list_for_revoke:l
 | 
		 DROP ROLE id_list_for_revoke:l
 | 
		 ALTER TABLE alter_table:a
 | 
		 ALTER TRIGGER alter_trigger:a
 | 
		 CLONE DATABASE clone_database:c
 | 
		 GET TABLE INFO FOR id_list:i
 | GET TABLE INFO 
		 FOR id_list:i NO ATTRIBUTES
 | 
		 ANALYZE DATABASE
 | 
		 ANALYZE TABLE id_list:i
 | 
		 CALL id_list:p call_params:v
 | 
		 QUESTION EQ CALL id_list:p call_params:v
 | 
		 OPEN_CURLY CALL id_list:p call_params:v CLOSE_CURLY
 | 
		 OPEN_CURLY QUESTION EQ CALL id_list:p call_params:v CLOSE_CURLY
 | 
		 RECOVER id_list:l
 | 
		 BEGIN TRANSACTION
 | 
		 CREATE SAVEPOINT id:i
 | 
		 ROLLBACK id:i
 | 
		 ROLLBACK
 | 
		 COMMIT
 | 
		 SET READ_ONLY boolean_value:b
 | 
		 SET TRANSACTION_ISOLATION isolation:i
 ;
 
 boolean_value ::=
 TRUE
 | FALSE
 ;
 
 isolation ::=
 READ_COMMITTED
 | 
		 READ_UNCOMMITTED
 | 
		 REPEATABLE_READ
 | 
		 SERIALIZABLE
 ;
 
 call_params ::=
 /* 
		 Nothing */
 | OPEN_PAREN value_list:v 
		 CLOSE_PAREN
 ;
 
 
 top ::=
 /* 
		 Nothing */
 | 
		 TOP TYPE_INTEGER:i
 ;
 
 limit_select ::=
 /* 
		 Nothing */
 | 
		 LIMIT TYPE_INTEGER:first COMMA TYPE_INTEGER:count
 ;
 
 alter_table ::=
 id_list:l 
		 ADD COLUMN table_col_list:c
 | 
		 id_list:t ADD INDEX id_list:idx OPEN_PAREN index_col_list:c CLOSE_PAREN
 | 
		 id_list:l ADD COLUMN OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:l ADD table_col_list:c
 | 
		 id_list:l ADD OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:l WITH NOCHECK ADD table_col_list:c
 | 
		 id_list:l WITH NOCHECK ADD OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:l WITH CHECK ADD table_col_list:c
 | 
		 id_list:l WITH CHECK ADD OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:l RENAME COLUMN id:o TO id:n
 | 
		 id_list:l ALTER COLUMN table_col_list:c
 | 
		 id_list:l ALTER COLUMN OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:l ALTER table_col_list:c
 | 
		 id_list:l ALTER OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:l DROP COLUMN col_list:c
 | 
		 id_list:t DROP INDEX id_list:idx
 | 
		 id_list:l DROP col_list:c
 | 
		 id_list:l DROP CONSTRAINT id:i
 ;
 
 alter_table_constraint ::=
 CONSTRAINT 
		 id:i alter_table_constraint_type:t
 | 
		 ADD CONSTRAINT id:i alter_table_constraint_type:t
 ;
 
 alter_table_constraint_type ::=
 PRIMARY 
		 KEY OPEN_PAREN col_list:c CLOSE_PAREN
 | 
		 UNIQUE OPEN_PAREN col_list:c CLOSE_PAREN
 | 
		 FOREIGN KEY OPEN_PAREN col_list:r CLOSE_PAREN REFERENCES id_list:i 
		 references_col_list:l references_match:m references_on_clause:o 
		 deferred:d
 | 
		 FOREIGN KEY col_list:r REFERENCES id_list:i references_col_list:l 
		 references_match:m references_on_clause:o deferred:d
 ;
 
 references_col_list ::=
 | 
		 OPEN_PAREN col_list:c CLOSE_PAREN
 ;
 
 references_match ::=
 | 
		 MATCH FULL
 | 
		 MATCH PARTIAL
 ;
 
 on_update ::=
 ON 
		 UPDATE CASCADE
 | 
		 ON UPDATE SET OP_NULL
 | 
		 ON UPDATE SET DEFAULT
 | 
		 ON UPDATE NO ACTION
 ;
 
 on_delete ::=
 ON 
		 DELETE CASCADE
 | 
		 ON DELETE SET OP_NULL
 | 
		 ON DELETE SET DEFAULT
 | 
		 ON DELETE NO ACTION
 ;
 
 references_on_clause ::=
 | 
		 on_update:u
 | 
		 on_delete:d
 | 
		 on_update:u on_delete:d
 | 
		 on_delete:d on_update:u
 ;
 
 deferred ::=
 | 
		 INITIALLY DEFERRED DEFERRABLE
 | 
		 INITIALLY DEFERRED NOT DEFERRABLE
 | 
		 INITIALLY IMMEDIATE DEFERRABLE
 | 
		 INITIALLY IMMEDIATE NOT DEFERRABLE
 | 
		 NOT DEFERRABLE INITIALLY DEFERRED
 | 
		 DEFERRABLE INITIALLY DEFERRED
 | 
		 NOT DEFERRABLE INITIALLY IMMEDIATE
 | 
		 DEFERRABLE INITIALLY IMMEDIATE
 ;
 
 select_union ::=
 select:s
 | 
		 select:s UNION union_qual:q SELECT select_union:u
 ;
 
 union_qual ::=
 | 
		 ALL
 ;
 
 select ::=
 select_cols:c
 | 
		 select_cols:c FROM table_list:t where:w group_by:g having:h order_by:o 
		 limit_select:l for_update:f
 | 
		 select_cols:c INTO id_list:i FROM table_list:t where:w group_by:g 
		 having:h order_by:o limit_select:l
 ;
 
 update ::=
 id_list_for_update:i 
		 SET set_list:s where:w
 | id_list_for_update:i SET 
		 set_list:s FROM table_list:t where:w
 ;
 
 insert ::=
 id_list:i 
		 OPEN_PAREN col_list:c CLOSE_PAREN VALUES insert_values_list:v
 | 
		 id_list:i OPEN_PAREN col_list:c CLOSE_PAREN insert_values_list:v
 | 
		 id_list:i VALUES insert_values_list:v
 | 
		 id_list:i OPEN_PAREN col_list:c CLOSE_PAREN VALUES OPEN_PAREN 
		 SELECT select_union:s CLOSE_PAREN
 | 
		 id_list:i OPEN_PAREN col_list:c CLOSE_PAREN OPEN_PAREN SELECT 
		 select_union:s CLOSE_PAREN
 | 
		 id_list:i OPEN_PAREN col_list:c CLOSE_PAREN VALUES SELECT select_union:s
 | 
		 id_list:i OPEN_PAREN col_list:c CLOSE_PAREN SELECT select_union:s
 | 
		 id_list:i VALUES OPEN_PAREN SELECT select_union:s CLOSE_PAREN
 | 
		 id_list:i OPEN_PAREN SELECT select_union:s CLOSE_PAREN
 | 
		 id_list:i VALUES SELECT select_union:s
 | 
		 id_list:i SELECT select_union:s
 ;
 
 insert_values_list ::=
 OPEN_PAREN 
		 value_list:v CLOSE_PAREN
 | 
		 insert_values_list:l COMMA OPEN_PAREN value_list:v CLOSE_PAREN
 ;
 
 create_sequence ::=
 id_list:i 
		 cs_increment:inc cs_start_with:start cs_max_value:max cs_min_value:min 
		 cs_cycle:cycle cs_cache:cache
 ;
 
 drop_sequence ::=
 id_list:i
 ;
 
 cs_increment ::=
 /* nothing 
		 */
 | INCREMENT BY TYPE_INTEGER:i
 ;
 
 cs_start_with ::=
 /* nothing 
		 */
 | START WITH TYPE_INTEGER:i
 ;
 
 cs_max_value ::=
 /* nothing 
		 */
 | MAXVALUE TYPE_INTEGER:i
 | NOMAXVALUE
 ;
 
 cs_min_value ::=
 /* nothing 
		 */
 | MINVALUE TYPE_INTEGER:i
 | NOMINVALUE
 ;
 
 cs_cycle ::=
 /* nothing 
		 */
 | CYCLE
 | NOCYCLE
 ;
 
 cs_cache ::=
 /* nothing 
		 */
 | CACHE TYPE_INTEGER:i
 | NOCACHE
 ;
 
 create_table ::=
 id_list:i 
		 OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:i STRING:s OPEN_PAREN table_col_list:c CLOSE_PAREN
 | 
		 id_list:i OPEN_PAREN table_col_list:c CLOSE_PAREN create_table_supplement:supplement
 | 
		 id_list:i STRING:s OPEN_PAREN table_col_list:c CLOSE_PAREN create_table_supplement:supplement
 | 
		 id_list:i OPEN_PAREN table_col_list:c CLOSE_PAREN file_type:create_file_type
 | 
		 id_list:i STRING:s OPEN_PAREN table_col_list:c CLOSE_PAREN file_type:create_file_type
 | 
		 id_list:i OPEN_PAREN table_col_list:c CLOSE_PAREN file_type:create_file_type 
		 boolean_value:err_if_file
 | 
		 id_list:i STRING:s OPEN_PAREN table_col_list:c CLOSE_PAREN file_type:create_file_type 
		 boolean_value:err_if_file
 ;
 
 create_trigger ::=
 ON 
		 id_list:tableName trigger_type:tt STRING:filename CODE_BLOCK:code
 | ON STRING:dataFile 
		 trigger_type:tt STRING:filename CODE_BLOCK:code
 | ON id_list:tableName 
		 trigger_type:tt STRING:filename
 | ON STRING:dataFile 
		 trigger_type:tt STRING:filename
 | ON id_list:tableName 
		 trigger_type:tt CODE_BLOCK:code
 | ON STRING:dataFile 
		 trigger_type:tt CODE_BLOCK:code
 | ON id_list:tableName 
		 trigger_type:tt
 | ON STRING:dataFile 
		 trigger_type:tt
 ;
 
 alter_trigger ::=
 ON 
		 id_list:tableName trigger_type:tt STRING:filename trigger_state:state 
		 CODE_BLOCK:code
 | ON STRING:dataFile 
		 trigger_type:tt STRING:filename trigger_state:state CODE_BLOCK:code
 | ON id_list:tableName 
		 trigger_type:tt STRING:filename trigger_state:state
 | ON STRING:dataFile 
		 trigger_type:tt STRING:filename trigger_state:state
 | ON id_list:tableName 
		 trigger_type:tt trigger_state:state CODE_BLOCK:code
 | ON STRING:dataFile 
		 trigger_type:tt trigger_state:state CODE_BLOCK:code
 | ON id_list:tableName 
		 trigger_type:tt trigger_state:state
 | ON STRING:dataFile 
		 trigger_type:tt trigger_state:state
 | ON id_list:tableName 
		 trigger_state:state
 | ON STRING:dataFile 
		 trigger_state:state
 ;
 
 drop_trigger ::=
 ON 
		 id_list:tableName trigger_type:tt
 | ON STRING:dataFile 
		 trigger_type:tt
 | ON id_list:tableName 
		 trigger_type:tt DELETE
 | ON STRING:dataFile 
		 trigger_type:tt DELETE
 ;
 
 trigger_state ::=
 ENABLED
 | DISABLED
 ;
 
 trigger_type ::=
 BEFORE_READ
 | AFTER_READ
 | INSTEADOF_READ
 | BEFORE_WRITE
 | AFTER_WRITE
 | INSTEADOF_WRITE
 | 
		 BEFORE_KEY
 | AFTER_KEY
 | INSTEADOF_KEY
 | BEFORE_REMOVE
 | AFTER_REMOVE
 | INSTEADOF_REMOVE
 | BEFORE_ERASE
 | AFTER_ERASE
 | INSTEADOF_ERASE
 | BEFORE_OPEN
 | AFTER_OPEN
 | BEFORE_CLOSE
 | AFTER_CLOSE
 ;
 
 create_procedure ::=
 id_list:i 
		 OPEN_PAREN proc_param_list:p CLOSE_PAREN proc_return_type:rt CODE_BLOCK:code
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN STRING:src STRING:cfg proc_return_type:rt 
		 CODE_BLOCK:code
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN STRING:src STRING:cfg proc_return_type:rt
 | id_list:i proc_return_type:rt 
		 CODE_BLOCK:code
 | id_list:i STRING:src 
		 STRING:cfg proc_return_type:rt CODE_BLOCK:code
 | id_list:i STRING:src 
		 STRING:cfg proc_return_type:rt
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN STRING:src STRING:cfg proc_return_type:rt 
		 CODE_BLOCK:code STRING:description
 ;
 
 alter_procedure ::=
 id_list:i 
		 OPEN_PAREN proc_param_list:p CLOSE_PAREN proc_return_type:rt CODE_BLOCK:code 
		 STRING:description
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN STRING:src STRING:cfg proc_return_type:rt 
		 CODE_BLOCK:code STRING:description
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN proc_return_type:rt STRING:description
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN STRING:description
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN
 | id_list:i proc_return_type:rt 
		 STRING:description
 | id_list:i OPEN_PAREN 
		 proc_param_list:p CLOSE_PAREN STRING:src STRING:cfg proc_return_type:rt 
		 STRING:description
 | id_list:i proc_return_type:rt 
		 CODE_BLOCK:code STRING:description
 | id_list:i STRING:src 
		 STRING:cfg proc_return_type:rt CODE_BLOCK:code STRING:description
 | id_list:i STRING:src 
		 STRING:cfg proc_return_type:rt STRING:description
 ;
 
 proc_return_type ::=
 NONE:t
 | RESULT_SET:t
 | col_type:t
 | 
		 col_type:t OPEN_PAREN TYPE_INTEGER:ti CLOSE_PAREN
 | 
		 col_type:t OPEN_PAREN TYPE_INTEGER:t1 COMMA TYPE_INTEGER:t2 CLOSE_PAREN
 ;
 
 proc_param_list ::=
 | 
		 proc_param:p
 | 
		 proc_param_list:l COMMA proc_param:p
 ;
 
 proc_param ::=
 id:i 
		 col_type:t param_dir:d
 | 
		 id:i col_type:t OPEN_PAREN TYPE_INTEGER:ti CLOSE_PAREN param_dir:d
 | 
		 id:i col_type:t OPEN_PAREN TYPE_INTEGER:t1 COMMA TYPE_INTEGER:t2 
		 CLOSE_PAREN param_dir:d
 ;
 
 param_dir ::=
 IN
 | 
		 OUT
 | 
		 IN_OUT
 ;
 
 create_view ::=
 id_list:i 
		 OPEN_PAREN col_list:c CLOSE_PAREN AS SELECT select_union:s
 | 
		 id_list:i AS SELECT select_union:s
 ;
 
 with_check_option ::=
 | 
		 WITH CHECK OPTION
 | 
		 WITH LOCAL CHECK OPTION
 | 
		 WITH CASCADE CHECK OPTION
 ;
 
 create_index ::=
 id_list:i1 
		 ON id_list:i2 OPEN_PAREN index_col_list:c CLOSE_PAREN
 ;
 
 del ::=
 FROM 
		 id_list:l where:w
 ;
 
 drop_table ::=
 id_list:l
 | 
		 id_list:l CASCADE
 | 
		 id_list:l CASCADE CONSTRAINTS
 ;
 
 drop_procedure ::=
 id_list:l
 | 
		 id_list:l DELETE
 ;
 
 clone_database ::=
 id:new_db_name 
		 STRING:db_dir
 ;
 
 drop_database ::=
 STRING:db_name
 | STRING:db_name 
		 DELETE
 ;
 
 create_database_legacy ::=
 STRING:db_name 
		 STRING:data STRING:dictionary
 | STRING:db_name 
		 STRING:data STRING:dictionary STRING:date_format STRING:date_suffix
 | STRING:db_name 
		 STRING:data STRING:dictionary file_type:create_file_type
 | STRING:db_name 
		 STRING:data STRING:dictionary file_type:create_file_type STRING:date_format 
		 STRING:date_suffix
 ;
 
 create_database_enhanced ::=
 STRING:db_name 
		 STRING:data STRING:dictionary
 | 
		 STRING:db_name STRING:data STRING:dictionary STRING:date_format 
		 STRING:date_suffix
 | 
		 STRING:db_name STRING:data STRING:dictionary file_type:create_file_type
 | STRING:db_name 
		 STRING:data STRING:dictionary file_type:create_file_type STRING:date_format 
		 STRING:date_suffix
 ;
 
 create_table_supplement ::=
 AUTO_INCREMENT 
		 EQ TYPE_INTEGER:i
 ;
 
 file_type ::=
 MKEYED
 | XKEYED
 | MKEYED_R
 | XKEYED_R
 | VKEYED
 | ESQL
 | DEFAULT
 ;
 
 drop_view ::=
 id_list:l
 ;
 
 drop_index ::=
 id_list:l
 ;
 
 index_col_list ::=
 index_col:c
 | 
		 index_col_list:l COMMA index_col:c
 ;
 
 index_col ::=
 id_list:i 
		 asc:a
 ;
 
 table_col_list ::=
 table_col:c
 | 
		 table_col_list:l COMMA table_col:c
 ;
 
 table_col ::=
 id:i col_type:t 
		 col_qual:q
 | 
		 id:i ENUM OPEN_PAREN value_list:e CLOSE_PAREN col_qual:q
 | 
		 id:i SET OPEN_PAREN value_list:e CLOSE_PAREN col_qual:q
 | 
		 id:i col_type:t OPEN_PAREN TYPE_INTEGER:ti CLOSE_PAREN col_qual:q
 | 
		 id:i col_type:t OPEN_PAREN TYPE_INTEGER:t1 COMMA TYPE_INTEGER:t2 
		 CLOSE_PAREN col_qual:q
 | 
		 id:i AS expression:e
 | 
		 alter_table_constraint:c
 | 
		 PRIMARY OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 PRIMARY KEY OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 INDEX OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 KEY OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 PRIMARY KEY OPEN_PAREN col_list:l CLOSE_PAREN id_list:name
 | 
		 INDEX OPEN_PAREN col_list:l CLOSE_PAREN id_list:name
 | 
		 KEY OPEN_PAREN col_list:l CLOSE_PAREN id_list:name
 | 
		 KEY id_list:name OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 FULLTEXT KEY OPEN_PAREN col_list:l CLOSE_PAREN id_list:name
 | 
		 FULLTEXT KEY id_list:name OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 UNIQUE INDEX OPEN_PAREN col_list:l CLOSE_PAREN id_list:name
 | 
		 UNIQUE INDEX OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 FOREIGN OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 FOREIGN KEY OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 FOREIGN KEY OPEN_PAREN col_list:r CLOSE_PAREN REFERENCES id_list:i 
		 references_col_list:l references_match:m references_on_clause:o 
		 deferred:d
 | 
		 UNIQUE OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 UNIQUE KEY OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 UNIQUE KEY id_list:name OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 NOT OP_NULL OPEN_PAREN col_list:l CLOSE_PAREN
 | 
		 CHECK OPEN_PAREN boolean_exp:b CLOSE_PAREN
 ;
 
 
 col_type ::=
 CHAR
 | 
		 CHARACTER
 | 
		 CHARACTER VARYING
 | 
		 CHAR VARYING
 | 
		 VARCHAR
 | 
		 TINYTEXT
 | 
		 MEDIUMTEXT
 | 
		 LONGVARCHAR
 | 
		 LONGTEXT
 | 
		 LONG VARCHAR
 | 
		 LONG CHAR VARYING
 | 
		 BINARY
 | 
		 BINARY VARYING
 | 
		 VARBINARY
 | 
		 LONGVARBINARY
 | 
		 BLOB
 | 
		 LONGBLOB
 | 
		 LONG VARBINARY
 | 
		 LONG BINARY VARYING
 | 
		 FLOAT
 | 
		 DOUBLE
 | 
		 REAL
 | 
		 BYTE
 | 
		 TINYINT
 | 
		 SMALLINT
 | 
		 INT
 | 
		 MEDIUMINT
 | 
		 INTEGER
 | 
		 BIGINT
 | 
		 UNSIGNED BYTE
 | 
		 UNSIGNED TINYINT
 | 
		 UNSIGNED SMALLINT
 | 
		 UNSIGNED INT
 | 
		 UNSIGNED INTEGER
 | 
		 UNSIGNED BIGINT
 | 
		 UNSIGNED REAL
 | 
		 UNSIGNED FLOAT
 | 
		 UNSIGNED DOUBLE
 | 
		 UNSIGNED DECIMAL
 | 
		 UNSIGNED NUMERIC
 | 
		 TIMESTAMP
 | 
		 TIME
 | 
		 BIT
 | 
		 BOOLEAN
 | 
		 DECIMAL
 | 
		 NUMERIC
 | 
		 DATE
 | 
		 DATETIME
 ;
 
 col_qual ::=
 /* 
		 EMPTY */
 | 
		 col_val:v col_const_list:l
 | 
		 col_const_list:l col_val:v
 | 
		 col_const_list:l
 | 
		 col_val:v
 ;
 
 col_val ::=
 DEFAULT 
		 OP_NULL
 | 
		 DEFAULT expression:e
 | 
		 AUTO_INCREMENT
 | 
		 AUTO_INCREMENT OPEN_PAREN TYPE_INTEGER:s COMMA TYPE_INTEGER:i 
		 CLOSE_PAREN
 | 
		 IDENTITY
 | 
		 IDENTITY OPEN_PAREN TYPE_INTEGER:s COMMA TYPE_INTEGER:i CLOSE_PAREN
 ;
 
 col_const_list ::=
 col_const:c
 |  col_const_list:l 
		 col_const:c
 | 
		 col_const_list:l CONSTRAINT id:i col_const:c
 ;
 
 col_const ::=
 PRIMARY
 | 
		 PRIMARY KEY
 | 
		 FOREIGN
 | 
		 FOREIGN KEY
 | 
		 INDEX
 | 
		 UNIQUE
 | 
		 UNIQUE KEY
 | 
		 NOT OP_NULL
 | 
		 OP_NULL
 | 
		 CHECK OPEN_PAREN boolean_exp:b CLOSE_PAREN
 | 
		 REFERENCES id_list:i references_col_list:l references_match:m 
		 references_on_clause:o /* deferred:d */
 ;
 
 col_list ::=
 id_list:i
 | 
		 id_list:i OPEN_PAREN TYPE_INTEGER:l CLOSE_PAREN
 | 
		 col_list:c COMMA id_list:i
 ;
 
 set_list ::=
 set:s
 | 
		 set_list:l COMMA set:s
 ;
 
 set ::=
 id_list:i 
		 EQ OP_NULL
 | 
		 id_list:i EQ expression:e
 ;
 
 select_cols ::=
 select_qual:q 
		 top:t select_list:l
 | 
		 select_qual:q top:t ASTERISK
 ;
 
 select_qual ::=
 /* 
		 empty */
 | 
		 ALL
 | 
		 DISTINCT
 ;
 
 select_list ::=
 select_item:i
 | 
		 select_list:l COMMA select_item:i
 ;
 
 select_item ::=
 expression:e
 | 
		 expression:e id_for_select:i
 | 
		 expression:e AS id:i
 | 
		 expression:e AS OPEN_BRACE id:i CLOSE_BRACE
 | 
		 expression:e AS STRING:s
 | 
		 expression:e STRING:s
 ;
 
 expression ::=
 expression:e 
		 PLUS times:t
 | 
		 expression:e MINUS times:t
 | 
		 times:t
 ;
 
 times ::=
 times:t 
		 ASTERISK neg:n
 | 
		 times:t DIV neg:n
 | 
		 neg:n
 ;
 
 neg ::=
 term:t
 | 
		 PLUS term:t
 | 
		 MINUS term:t
 ;
 
 term ::=
 OPEN_PAREN 
		 expression:e CLOSE_PAREN
 | 
		 OPEN_PAREN SELECT select_union:s CLOSE_PAREN
 | 
		 db_item_ref:r
 | 
		 simple_term:t
 | 
		 scalar:s
 ;
 
 db_item_ref ::=
 id_list_for_db_item:l
 | 
		 id_list_for_db_item:l OPEN_BRACE expression:e CLOSE_BRACE
 | 
		 id_for_func:i OPEN_PAREN func_qual:q func_arg:a CLOSE_PAREN
 | 
		 IFF OPEN_PAREN boolean_exp:b COMMA expression:e1 COMMA expression:e2 
		 CLOSE_PAREN
 | 
		 CAST OPEN_PAREN expression:e1 AS id_for_cast:t1 CLOSE_PAREN
 | 
		 CONVERT OPEN_PAREN expression:e1 COMMA id:t1 CLOSE_PAREN
 | 
		 NULLIF OPEN_PAREN expression:e1 COMMA expression:e2 CLOSE_PAREN
 | 
		 COALESCE OPEN_PAREN func_arg:a CLOSE_PAREN
 | 
		 CASE when_list:w END
 | 
		 CASE when_list:w ELSE expression:e END
 | 
		 CASE expression:e1 when_expression_list:w END
 | 
		 CASE expression:e1 when_expression_list:w ELSE expression:e2 END
 ;
 
 when_list ::=
 WHEN 
		 boolean_exp:b THEN expression:e
 | 
		 when_list:w WHEN boolean_exp:b THEN expression:e
 ;
 
 when_expression_list ::=
 WHEN 
		 expression:e1 THEN expression:e2
 | 
		 when_expression_list:w WHEN expression:e1 THEN expression:e2
 ;
 
 func_qual ::=
 /* 
		 empty */
 | 
		 ALL
 | 
		 DISTINCT
 ;
 
 simple_term ::=
 real:r
 | 
		 HEX_VALUE:h
 | 
		 STRING:s
 | 
		 QUESTION
 | 
		 DATABASE OPEN_PAREN CLOSE_PAREN
 | 
		 DATABASE
 | 
		 USER OPEN_PAREN CLOSE_PAREN
 | 
		 USER
 | 
		 TRUE
 | 
		 FALSE
 | 
		 date:d
 ;
 
 real ::=
 TYPE_INTEGER:i
 | 
		 TYPE_FLOAT:f
 | 
		 TYPE_BIG_INT:b
 ;
 
 scalar ::=
 func:f
 ;
 
 func ::=
 OPEN_CURLY 
		 FN fn:f CLOSE_CURLY
 ;
 
 fn ::=
 id:i 
		 OPEN_PAREN func_arg:a CLOSE_PAREN
 ;
 
 func_arg ::=
 /* 
		 empty */
 | 
		 ASTERISK
 | 
		 func_args:a
 ;
 
 func_args ::=
 expression:e
 | 
		 func_args:a COMMA expression:e
 ;
 
 date ::=
 OPEN_CURLY 
		 OP_D STRING:s CLOSE_CURLY
 | 
		 OPEN_CURLY OP_TS STRING:s CLOSE_CURLY
 | 
		 OPEN_CURLY OP_T STRING:s CLOSE_CURLY
 ;
 
 for_update ::=
 /* 
		 empty */
 |        FOR 
		 UPDATE
 | 
		 FOR UPDATE OF for_update_column_list:l
 |        FOR 
		 READ ONLY
 ;
 
 for_update_column_list ::=
 id_list:l
 | for_update_column_list:l1 
		 COMMA id_list:l2
 ;
 
 table_list ::=
 table_list_item:i
 | 
		 table_list:l COMMA table_list_item:i
 ;
 
 table_list_item ::=
 table_ref:r
 | 
		 outer_join:o
 | 
		 oj:o
 | 
		 OPEN_PAREN table_list:o CLOSE_PAREN
 | 
		 OPEN_PAREN SELECT select_union:s CLOSE_PAREN
 | 
		 OPEN_PAREN SELECT select_union:s CLOSE_PAREN id_for_table:i
 | 
		 OPEN_PAREN SELECT select_union:s CLOSE_PAREN OPEN_BRACE id:i CLOSE_BRACE
 | 
		 OPEN_PAREN SELECT select_union:s CLOSE_PAREN AS id_for_table:i
 | 
		 OPEN_PAREN SELECT select_union:s CLOSE_PAREN AS OPEN_BRACE id:i 
		 CLOSE_BRACE
 | 
		 OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN
 | 
		 OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN id_for_table:i
 | 
		 OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN OPEN_BRACE 
		 id_for_table:i CLOSE_BRACE
 | 
		 OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN AS id_for_table:i
 | 
		 OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN AS OPEN_BRACE 
		 id_for_table:i CLOSE_BRACE
 ;
 
 table_ref ::=
 id_list:l
 | 
		 id_list:l id_for_table:i
 | 
		 id_list:l OPEN_BRACE id:i CLOSE_BRACE
 | 
		 id_list:l AS id_for_table:i
 | 
		 id_list:l AS OPEN_BRACE id:i CLOSE_BRACE
 ;
 
 outer_join ::=
 OPEN_CURLY 
		 OJ oj:o CLOSE_CURLY
 ;
 
 oj ::=
 table_list_item:t1 
		 LEFT OUTER JOIN table_list_item:t2 ON boolean_exp:b
 | 
		 table_list_item:t1 RIGHT OUTER JOIN table_list_item:t2 ON boolean_exp:b
 | 
		 table_list_item:t1 LEFT JOIN table_list_item:t2 ON boolean_exp:b
 | 
		 table_list_item:t1 RIGHT JOIN table_list_item:t2 ON boolean_exp:b
 | 
		 table_list_item:t1 FULL OUTER JOIN table_list_item:t2 ON boolean_exp:b
 | 
		 table_list_item:t1 FULL JOIN table_list_item:t2 ON boolean_exp:b
 | 
		 table_list_item:t1 INNER JOIN table_list_item:t2 ON boolean_exp:b
 ;
 
 where ::=
 /* 
		 empty */
 | 
		 WHERE boolean_exp:b
 | 
		 WHERE CURRENT OF id:i
 ;
 
 group_by ::=
 /* 
		 empty */
 | 
		 GROUP BY group_by_list:g
 ;
 
 group_by_list ::=
 expression:e
 | 
		 group_by_list:g COMMA expression:e
 ;
 
 having ::=
 /* 
		 empty */
 | 
		 HAVING boolean_exp:b
 ;
 
 order_by ::=
 /* 
		 empty */
 | 
		 ORDER BY order_by_list:l
 ;
 
 order_by_list ::=
 order_by_item:i
 | 
		 order_by_list:l COMMA order_by_item:i
 ;
 
 order_by_item ::=
 expression:e 
		 asc:a
 ;
 
 asc ::=
 /* 
		 empty */
 | 
		 ASC
 | 
		 DESC
 ;
 
 boolean_exp ::=
 and:a
 | 
		 and:a OR boolean_exp:b
 ;
 
 and ::=
 not:n
 | 
		 not:n AND and:a
 ;
 
 not ::=
 comparison:c
 | 
		 NOT comparison:c
 ;
 
 comparison ::=
 OPEN_PAREN 
		 boolean_exp:b CLOSE_PAREN
 | 
		 db_item_ref:r IS OP_NULL
 | 
		 db_item_ref:r IS NOT OP_NULL
 | 
		 expression:e1 LIKE expression:e2
 | 
		 expression:e1 NOT LIKE expression:e2
 | 
		 expression:e1 REGEXP expression:e2
 | 
		 expression:e1 NOT REGEXP expression:e2
 | 
		 expression:e IN OPEN_PAREN value_list:v CLOSE_PAREN
 | 
		 expression:e NOT IN OPEN_PAREN value_list:v CLOSE_PAREN
 | 
		 expression:e1 op:o expression:e2
 | 
		 expression:e1 op:o OPEN_PAREN boolean_exp:e2 CLOSE_PAREN
 | 
		 OPEN_PAREN boolean_exp:e1 CLOSE_PAREN op:o expression:e2
 | 
		 OPEN_PAREN boolean_exp:e1 CLOSE_PAREN op:o OPEN_PAREN boolean_exp:e2 
		 CLOSE_PAREN
 | 
		 EXISTS OPEN_PAREN SELECT select_union:s CLOSE_PAREN
 | 
		 EXISTS OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN
 | 
		 expression:e op:o1 select_op:o2 OPEN_PAREN SELECT select_union:s 
		 CLOSE_PAREN
 | 
		 expression:e op:o1 select_op:o2 OPEN_PAREN CALL id_list:p call_params:v 
		 CLOSE_PAREN
 | 
		 expression:e IN OPEN_PAREN SELECT select_union:s CLOSE_PAREN
 | 
		 expression:e NOT IN OPEN_PAREN SELECT select_union:s CLOSE_PAREN
 | 
		 expression:e IN OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN
 | 
		 expression:e NOT IN OPEN_PAREN CALL id_list:p call_params:v CLOSE_PAREN
 | 
		 expression:e1 BETWEEN expression:e2 AND expression:e3
 | 
		 expression:e1 NOT BETWEEN expression:e2 AND expression:e3
 ;
 
 select_op ::=
 ALL
 | 
		 SOME
 | 
		 ANY
 ;
 
 op ::=
 GREATER_THAN
 | 
		 GREATER_THAN_EQ
 | 
		 LESS_THAN
 | 
		 LESS_THAN_EQ
 | 
		 EQ
 | 
		 NOT_EQ
 ;
 
 value_list ::=
 OP_NULL
 | 
		 expression:e
 | 
		 value_list:l COMMA OP_NULL
 | 
		 value_list:l COMMA expression:e
 ;
 
 privilege_list ::=
 privilege:p
 | 
		 privilege_list:l COMMA privilege:p
 ;
 
 privilege ::=
 SELECT
 | 
		 UPDATE
 | 
		 INSERT
 | 
		 DELETE
 | 
		 CALL
 | 
		 CREATE TABLE
 | CREATE VIEW
 | CREATE SEQUENCE
 | CREATE PROCEDURE
 | CREATE TRIGGER
 | ALTER TABLE
 | ALTER VIEW
 | ALTER SEQUENCE
 | ALTER PROCEDURE
 | ALTER TRIGGER
 | CREATE ROLE
 | 
		 DROP TABLE
 | DROP VIEW
 | DROP SEQUENCE
 | DROP PROCEDURE
 | DROP TRIGGER
 | DROP ROLE
 | 
		 REFERENCES
 | 
		 USAGE
 | 
		 ALL
 ;
 
 grant_object ::=
 id_list_for_revoke:i
 | 
		 TABLE id_list:i
 | 
		 VIEW id_list:i
 | 
		 PROCEDURE id_list:i
 | 
		 TRIGGER id_list:i
 | 
		 SEQUENCE id_list:i
 | 
		 ROLE id_list:i
 | 
		 DOMAIN id_list:i
 | 
		 CHARACTER SET id_list:i
 | 
		 COLLATION id_list:i
 | 
		 TRANSLATION id_list:i
 | 
		 DATABASE
 ;
 
 grant_option_for ::=
 | 
		 GRANT OPTION FOR
 ;
 
 with_grant_option ::=
 | 
		 WITH GRANT OPTION
 ;
 
 revoke_qual ::=
 | 
		 RESTRICT
 | 
		 CASCADE
 ;
 
 user_list ::=
 STRING:u
 | 
		 user_list:l COMMA STRING:u
 ;
 
 id_common ::=
 ID:i
 | 
		 NO
 | 
		 INFO
 | 
		 GET
 | 
		 RESULT_SET
 | 
		 BY
 | 
		 ASC
 | 
		 MAXVALUE
 | 
		 DESC
 | 
		 OJ
 | 
		 OUTER
 | 
		 JOIN
 | 
		 FN
 | 
		 OR
 | 
		 AND
 | 
		 OP_D
 | 
		 OP_TS
 | OP_T
 | 
		 UPDATE
 | 
		 INSERT
 | 
		 REPLACE
 | 
		 VALUES
 | 
		 CREATE
 | 
		 CHAR
 | 
		 VARYING
 | 
		 VARCHAR
 | 
		 LONGVARCHAR
 | 
		 BINARY
 | 
		 VARBINARY
 | 
		 LONGVARBINARY
 | 
		 BLOB
 | 
		 LONGTEXT
 | 
		 FLOAT
 | 
		 DOUBLE
 | 
		 REAL
 | 
		 BYTE
 | 
		 SMALLINT
 | 
		 INT
 | 
		 INTEGER
 | 
		 UNSIGNED
 | 
		 DATETIME
 | 
		 TIMESTAMP
 | 
		 VIEW
 | 
		 DELETE
 | 
		 DROP
 | 
		 PRIMARY
 | 
		 FOREIGN
 | 
		 UNIQUE
 | 
		 BETWEEN
 | 
		 LONG
 | 
		 THEN
 | 
		 ELSE
 | 
		 END
 | 
		 CURRENT
 | 
		 OF
 | 
		 ACTION
 | 
		 PARTIAL
 | 
		 MATCH
 | 
		 IDENTITY
 | 
		 LEGACY
 | 
		 ENHANCED
 | 
		 AUTO_INCREMENT
 | 
		 BIGINT
 | 
		 TINYINT
 | 
		 BOOLEAN
 | 
		 TIME
 | 
		 READ
 | 
		 ONLY
 | 
		 RECOVER
 | 
		 NOCHECK
 | 
		 CHECK
 | 
		 BEGIN
 | 
		 TRANSACTION
 | 
		 SAVEPOINT
 | 
		 ROLLBACK
 | 
		 COMMIT
 | 
		 READ_ONLY
 | 
		 SEQUENCE
 ;
 
 id_for_func ::=
 id_common:i
 | 
		 DATE
 | 
		 TABLE
 | 
		 AS
 | 
		 FROM
 | 
		 WHERE
 | 
		 HAVING
 | 
		 ORDER
 | 
		 LEFT
 | 
		 RIGHT
 | 
		 INNER
 | 
		 FULL
 | 
		 ON
 | 
		 GROUP
 | 
		 SET
 | 
		 UNION
 | 
		 INTO
 | 
		 KEY
 ;
 
 id_for_db_item ::=
 id_for_func:i
 | 
		 IFF
 | 
		 CONVERT
 | 
		 CAST
 | 
		 NULLIF
 | 
		 COALESCE
 ;
 
 id_for_table ::=
 id_common:i
 | 
		 TABLE
 | 
		 AS
 | 
		 FROM
 | 
		 ALL
 | 
		 SOME
 | 
		 DISTINCT
 | 
		 USER
 | 
		 NOT
 | 
		 IS
 | 
		 LIKE
 | 
		 REGEXP
 | 
		 IN
 | 
		 SELECT
 | 
		 OP_NULL
 | 
		 EXISTS
 | 
		 ANY
 | 
		 SET
 | 
		 INTO
 | TRUE
 | 
		 FALSE
 ;
 
 id_for_select ::=
 id_common:i
 | 
		 TABLE
 | 
		 WHERE
 | 
		 ALL
 | 
		 SOME
 | 
		 DISTINCT
 | 
		 USER
 | 
		 HAVING
 | 
		 ORDER
 | 
		 LEFT
 | 
		 RIGHT
 | 
		 INNER
 | 
		 FULL
 | 
		 ON
 | 
		 GROUP
 | 
		 NOT
 | 
		 IS
 | 
		 LIKE
 | 
		 REGEXP
 | 
		 IN
 | 
		 SELECT
 | 
		 OP_NULL
 | 
		 EXISTS
 | 
		 ANY
 | 
		 SET
 | 
		 IFF
 | 
		 CONVERT
 | 
		 CAST
 | 
		 NULLIF
 | 
		 COALESCE
 | 
		 CASE
 | 
		 WHEN
 | 
		 TRUE
 | 
		 FALSE
 ;
 
 id_for_update ::=
 id_common:i
 | 
		 TABLE
 | 
		 AS
 | 
		 FROM
 | 
		 WHERE
 | 
		 ALL
 | 
		 SOME
 | 
		 DISTINCT
 | 
		 USER
 | 
		 HAVING
 | 
		 ORDER
 | 
		 LEFT
 | 
		 RIGHT
 | 
		 INNER
 | 
		 FULL
 | 
		 ON
 | 
		 GROUP
 | 
		 NOT
 | 
		 IS
 | 
		 LIKE
 | 
		 REGEXP
 | 
		 IN
 | 
		 SELECT
 | 
		 OP_NULL
 | 
		 EXISTS
 | 
		 ANY
 | 
		 UNION
 | 
		 IFF
 | 
		 CONVERT
 | 
		 CAST
 | 
		 NULLIF
 | 
		 COALESCE
 | 
		 CASE
 | 
		 WHEN
 | 
		 INTO
 | 
		 TRUE
 | 
		 FALSE
 ;
 
 id ::=
 id_common:i
 | 
		 TABLE
 | 
		 AS
 | 
		 FROM
 | 
		 WHERE
 | 
		 ALL
 | 
		 SOME
 | 
		 DISTINCT
 | 
		 USER
 | 
		 HAVING
 | 
		 ORDER
 | 
		 LEFT
 | 
		 RIGHT
 | 
		 INNER
 | 
		 FULL
 | 
		 ON
 | 
		 GROUP
 | 
		 NOT
 | 
		 IS
 | 
		 LIKE
 | 
		 REGEXP
 | 
		 IN
 | 
		 OP_NULL
 | 
		 EXISTS
 | 
		 ANY
 | 
		 SET
 | 
		 UNION
 | 
		 IFF
 | 
		 CONVERT
 | 
		 CAST
 | 
		 NULLIF
 | 
		 COALESCE
 | 
		 CASE
 | 
		 WHEN
 | 
		 TRUE
 | 
		 FALSE
 ;
 
 id_for_cast ::=
 id_common:i
 | 
		 NUMERIC
 | 
		 DECIMAL
 | 
		 BIT
 | 
		 INTO
 | 
		 TRUE
 | 
		 FALSE
 ;
 
 id_for_revoke ::=
 id_common:i
 | 
		 INTO
 | 
		 TRUE
 | 
		 FALSE
 ;
 
 id_list ::=
 id:i
 | 
		 OPEN_BRACE id:i CLOSE_BRACE
 | 
		 DATE
 | 
		 OPEN_BRACE DATE CLOSE_BRACE
 | 
		 id_list:l DOT DATE
 | 
		 id_list:l DOT OPEN_BRACE DATE CLOSE_BRACE
 | 
		 id_list:l DOT id:i
 | 
		 id_list:l DOT OPEN_BRACE id:i CLOSE_BRACE
 ;
 
 id_list_for_db_item ::=
 id_for_db_item:i
 | 
		 OPEN_BRACE id:i CLOSE_BRACE
 | 
		 id_list_for_db_item:l DOT id_for_db_item:i
 | 
		 id_list_for_db_item:l DOT OPEN_BRACE id:i CLOSE_BRACE
 | 
		 id_list_for_db_item:l DOT ASTERISK
 ;
 
 id_list_for_update ::=
 id_for_update:i
 | 
		 OPEN_BRACE id:i CLOSE_BRACE
 | 
		 id_list_for_update:l DOT id_for_update:i
 | 
		 id_list_for_update:l DOT OPEN_BRACE id:i CLOSE_BRACE
 ;
 
 id_list_for_revoke ::=
 id_for_revoke:i
 | 
		 OPEN_BRACE id:i CLOSE_BRACE
 | 
		 id_list_for_revoke:l DOT id_for_revoke:i
 | 
		 id_list_for_revoke:l DOT OPEN_BRACE id:i CLOSE_BRACE
 ;
 
 |