addition:
	where procedure_analyze |
	subquery procedure_analyze |
	join where procedure_analyze |
	procedure_analyze union where;

addition_no_procedure:
	where |
	subquery |
	join where |
	union where;

alter_base_table:
	;

alter_base_temp_table_part:
	COMMENT = 'UPDATED NOW()' |
	ENGINE = engine;

alter_database:
	ALTER database_schema database_name_n database_spec;

alter_event:
	ALTER EVENT event_item_s COMMENT 'UPDATED NOW()';

alter_function:
	ALTER FUNCTION function_item_n COMMENT 'UPDATED NOW()';

alter_merge_table:
	ALTER online ignore TABLE merge_table_item_n COMMENT = 'UPDATED NOW()';

alter_part_table:
	ALTER online ignore TABLE part_table_item_n alter_part_table_part;

alter_part_table_part:
	PARTITION BY LINEAR HASH(pk) PARTITIONS 3 |
	COMMENT = 'UPDATED NOW()';

alter_procedure:
	ALTER PROCEDURE procedure_item_n COMMENT 'UPDATED NOW()';

alter_temp_table:
	ALTER online ignore TABLE temp_table_item_n alter_base_temp_table_part;

alter_view:
	ALTER ALGORITHM = view_algoritm VIEW view_table_item_n AS used_select;

analyze_table:
	ANALYZE not_to_binlog_local TABLE table_list;

as:
	 |
	AS;

avoid_bugs:
	SET GLOBAL optimizer_use_mrr='disable' ; SET SESSION optimizer_use_mrr='disable' ; SET GLOBAL optimizer_switch = 'semijoin=off' ; SET SESSION optimizer_switch = 'semijoin=off';

base_table_ddl:
	$sequence_begin CREATE TABLE IF NOT EXISTS . { $base_table_name_s = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $base_table_name = $base_table_name_s ; $table_name = $base_table_name } { $base_table_item_s = $database_name_s . " . " . $base_table_name_s ; $base_table_item = $base_table_item_s ; return undef } LIKE { $template_table_item = "test.table0_int_autoinc" } ; ALTER TABLE $base_table_item_s ENGINE = MEMORY ; INSERT INTO $base_table_item_s SELECT * FROM $template_table_item ; COMMIT ; ; DROP TABLE $base_table_item_s $sequence_end;

base_table_item:
	base_table_item_s |
	base_table_item_n;

base_table_item_list:
	base_table_item |
	base_table_item , base_table_item;

base_table_item_list_n:
	base_table_item_n |
	base_table_item_n , base_table_item_n;

base_table_item_list_s:
	base_table_item_s |
	base_table_item_s , base_table_item_s;

base_table_item_n:
	;

base_table_item_s:
	. { $base_table_name_s = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $base_table_name = $base_table_name_s ; $table_name = $base_table_name } { $base_table_item_s = $database_name_s . " . " . $base_table_name_s ; $base_table_item = $base_table_item_s ; return undef };

base_table_name:
	base_table_name_s |
	base_table_name_n;

base_table_name_n:
	{ $base_table_name_n = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $normal_piece ; $base_table_name = $base_table_name_n ; $table_name = $base_table_name };

base_table_name_s:
	{ $base_table_name_s = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $base_table_name = $base_table_name_s ; $table_name = $base_table_name };

base_table_sequence:
	$sequence_begin CREATE TABLE IF NOT EXISTS . { $base_table_name_s = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $base_table_name = $base_table_name_s ; $table_name = $base_table_name } { $base_table_item_s = $database_name_s . " . " . $base_table_name_s ; $base_table_item = $base_table_item_s ; return undef } LIKE { $template_table_item = "test.table0_int_autoinc" } ; ALTER TABLE $base_table_item_s ENGINE = MEMORY ; INSERT INTO $base_table_item_s SELECT * FROM $template_table_item ; COMMIT ; ; DROP TABLE $base_table_item_s $sequence_end;

base_temp_view_table_item:
	base_temp_view_table_item_s |
	base_temp_view_table_item;

base_temp_view_table_item_n:
	base_table_item_n |
	temp_table_item_n |
	view_table_item_n |
	part_table_item_n;

base_temp_view_table_item_s:
	base_table_item_s |
	temp_table_item_s |
	view_table_item_s |
	part_table_item_s;

braced_table_field_list:
	( table_field_list ) |
	;

build_partner1:
	CREATE TABLE if_not_exists $mp1 LIKE $template_table_item ; ALTER TABLE $mp1 ENGINE = MyISAM ; INSERT INTO $mp1 SELECT * FROM $template_table_item;

build_partner2:
	CREATE TABLE if_not_exists $mp2 LIKE $template_table_item ; ALTER TABLE $mp2 ENGINE = MyISAM ; INSERT INTO $mp2 SELECT * FROM $template_table_item;

cache_results:
	 |
	sql_no_cache |
	sql_cache;

chain:
	 |
	AND no_or_empty CHAIN;

check_table:
	CHECK TABLE table_list check_table_options;

check_table_options:
	 |
	FOR UPGRADE |
	QUICK |
	FAST |
	MEDIUM |
	EXTENDED |
	CHANGED;

checksum_table:
	CHECKSUM TABLE table_list quick_extended;

column_to_change:
	`col_int` |
	`col_int_key` |
	`pk`;

commit:
	COMMIT work_or_empty chain release;

completion_handling:
	ON COMPLETION not_or_empty PRESERVE;

concurrent:
	 |
	CONCURRENT;

correlated:
	subquery_part1 A.`pk` );

create_base_table:
	CREATE TABLE if_not_exists base_table_item_n create_table_part;

create_database:
	CREATE database_schema if_not_exists database_name_n database_spec;

create_event:
	CREATE EVENT if_not_exists event_item_s ON SCHEDULE EVERY 10 SECOND STARTS NOW() ENDS NOW() + INTERVAL 21 SECOND completion_handling DO SELECT * FROM table_item LIMIT 1;

create_function:
	CREATE FUNCTION function_item_n () RETURNS INTEGER BEGIN func_statement ; func_statement ; RETURN 1 ; END;

create_merge:
	CREATE TABLE if_not_exists $mt LIKE $template_table_item ; ALTER TABLE $mt ENGINE = MERGE UNION ( $mp1 , $mp2 ); COMMIT;

create_merge_table:
	merge_init_n build_partner1 ; build_partner2 ; create_merge;

create_part_table:
	CREATE TABLE if_not_exists part_table_item_n ENGINE = MyISAM PARTITION BY KEY (pk) PARTITIONS 2 AS used_select;

create_procedure:
	CREATE PROCEDURE procedure_item_n () BEGIN proc_stmt ; proc_stmt ; END;

create_table_part:
	LIKE template_table_item ; ALTER TABLE $base_table_item_n ENGINE = engine ; INSERT INTO $base_table_item_n SELECT * FROM $template_table_item |
	AS used_select;

create_temp_table:
	CREATE TEMPORARY TABLE if_not_exists temp_table_item_n create_table_part;

create_trigger:
	CREATE TRIGGER trigger_item_n trigger_time trigger_event ON base_table_name_n FOR EACH ROW BEGIN trigger_action ; END;

create_view:
	CREATE view_replace ALGORITHM = view_algoritm VIEW view_table_item_n AS used_select;

database_ddl:
	create_database |
	drop_database |
	alter_database |
	database_sequence;

database_name:
	database_name_s |
	database_name_n;

database_name_n:
	{ $database_name_n = $database_prefix . $normal_piece ; $database_name = $database_name_n };

database_name_s:
	;

database_schema:
	DATABASE |
	SCHEMA;

database_sequence:
	$sequence_begin CREATE database_schema database_name_s ; wait_till_drop_database ; DROP database_schema $database_name_s $sequence_end;

database_show:
	;

database_spec:
	default_word CHARACTER SET equal utf8 |
	default_word COLLATE equal utf8_bin;

databases_schemas:
	DATABASES |
	SCHEMAS;

ddl:
	$sequence_begin CREATE TABLE IF NOT EXISTS . { $base_table_name_s = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $base_table_name = $base_table_name_s ; $table_name = $base_table_name } { $base_table_item_s = $database_name_s . " . " . $base_table_name_s ; $base_table_item = $base_table_item_s ; return undef } LIKE { $template_table_item = "test.table0_int_autoinc" } ; ALTER TABLE $base_table_item_s ENGINE = MEMORY ; INSERT INTO $base_table_item_s SELECT * FROM $template_table_item ; COMMIT ; ; DROP TABLE $base_table_item_s $sequence_end;

default_word:
	 |
	DEFAULT;

delayed:
	;

delete:
	DELETE A , B FROM table_item_s AS A NATURAL JOIN table_item_s B;

delete_normal:
	DELETE A , B FROM table_item_s AS A NATURAL JOIN table_item_s B;

delete_with_sleep:
	DELETE low_priority quick FROM table_item WHERE `pk` + wait_short = _digit;

digit_or_null:
	_digit |
	NULL;

dml:
	dml2 |
	PREPARE st1 FROM " dml2 " ; EXECUTE st1 ; DEALLOCATE PREPARE st1;

dml2:
	select |
	do |
	insert |
	DELETE A , B FROM table_item_s AS A NATURAL JOIN table_item_s B |
	 |
	show;

do:
	DO 1 |
	DO ( SELECT COUNT(*) FROM table_item WHERE `pk` BETWEEN _digit[invariant] AND _digit[invariant] + 20 ) |
	DO user_lock_action;

drop_base_table:
	DROP TABLE;

drop_database:
	DROP database_schema if_exists database_name_n;

drop_event:
	DROP EVENT if_exists event_item_s;

drop_function:
	DROP FUNCTION if_exists function_item_n;

drop_merge_table:
	DROP TABLE if_exists merge_table_item_n;

drop_part_table:
	DROP TABLE if_exists part_table_item_n;

drop_procedure:
	DROP PROCEDURE if_exists procedure_item_n;

drop_table_list:
	DROP temporary TABLE if_exists table_no_view_item_n , table_no_view_item_n restrict_cascade;

drop_temp_table:
	DROP TEMPORARY TABLE if_exists temp_table_item_n |
	DROP TABLE if_exists temp_table_item_n;

drop_trigger:
	DROP TRIGGER if_exists trigger_item_n;

drop_view:
	DROP VIEW if_exists view_table_item_n restrict_cascade;

dump_load_data_sequence:
	generate_outfile ; LOAD DATA low_priority_concurrent INFILE tmpnam replace_ignore INTO TABLE table_item;

empty_mode:
	;

engine:
	MEMORY;

ensure_all_up:
	AND _thread_count + 3 < (SELECT MAX(id) FROM information_schema.processlist) AND 10 > (SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='Uptime');

equal:
	 |
	=;

event_ddl:
	create_event |
	drop_event |
	alter_event |
	event_scheduler_on |
	event_scheduler_off;

event_item:
	event_item_s |
	event_item_n;

event_item_n:
	database_name . event_name_n { $event_item_n = $database_name . " . " . $event_name_n ; $event_item = $event_item_n ; return undef };

event_item_s:
	database_name_s . event_name_s { $event_item_s = $database_name_s . " . " . $event_name_s ; $event_item = $event_item_s ; return undef };

event_name:
	event_name_s |
	event_name_n;

event_name_n:
	{ $event_name_n = $event_prefix . $prng->int(1,$name_space_width) . $normal_piece ; $event_name = $event_name_n };

event_name_s:
	{ $event_name_s = $event_prefix . $prng->int(1,$name_space_width) . $sequence_piece ; $event_name = $event_name_s };

event_scheduler_off:
	SET GLOBAL EVENT_SCHEDULER = OFF;

event_scheduler_on:
	SET GLOBAL EVENT_SCHEDULER = ON;

extended:
	 |
	EXTENDED;

flush:
	FLUSH TABLE table_item_s;

for_update:
	 |
	FOR UPDATE;

for_update_lock_in_share_mode:
	 |
	for_update |
	lock_share;

from_in:
	FROM |
	IN;

full:
	 |
	FULL;

func_statement:
	SET @my_var = 1 |
	SELECT MAX( random_field_quoted1 ) FROM table_item INTO @my_var |
	insert |
	delete;

function_ddl:
	create_function |
	drop_function |
	alter_function |
	function_sequence;

function_item:
	function_item_s |
	function_item_n;

function_item_n:
	database_name . function_name_n { $function_item_n = $database_name . " . " . $function_name_n ; $function_item = $function_item_n ; return undef };

function_item_s:
	database_name_s . function_name_s { $function_item_s = $database_name_s . " . " . $function_name_s ; $function_item = $function_item_s ; return undef };

function_name:
	function_name_s |
	function_name_n;

function_name_n:
	{ $function_name_n = $function_prefix . $prng->int(1,$name_space_width) . $normal_piece ; $function_name = $function_name_n };

function_name_s:
	{ $function_name_s = $function_prefix . $prng->int(1,$name_space_width) . $sequence_piece ; $function_name = $function_name_s };

function_sequence:
	$sequence_begin CREATE FUNCTION function_item_s () RETURNS INTEGER RETURN ( SELECT MOD( COUNT( DISTINCT random_field_quoted1 ) , 10 ) FROM table_item_s ) ; COMMIT ; SELECT wait_short ; DROP FUNCTION $function_item_s $sequence_end;

generate_outfile:
	SELECT * FROM template_table_item INTO OUTFILE _tmpnam;

grant_revoke:
	GRANT ALL ON table_item TO otto@localhost |
	REVOKE ALL ON table_item FROM otto@localhost |
	SELECT COUNT(*) FROM mysql.tables_priv WHERE user = LOWER('OTTO') |
	DELETE FROM mysql.tables_priv WHERE user = LOWER('OTTO') ; FLUSH PRIVILEGES |
	/* table_item */ INSERT INTO mysql.tables_priv (host,db,user,table_name,grantor,table_priv) VALUES (LOWER('LOCALHOST'),TRIM(' $database '),LOWER('OTTO'),TRIM(' $table_name '),LOWER('ROOT@LOCALHOST'),'Select') ; FLUSH PRIVILEGES |
	SELECT COUNT(*) FROM information_schema.table_privileges WHERE grantee LIKE '%OTTO%' |
	SHOW GRANTS FOR otto@localhost;

handler:
	handler_open |
	handler_read |
	handler_close;

handler_close:
	HANDLER table_no_view_item CLOSE;

handler_open:
	HANDLER table_no_view_item OPEN with_alias;

handler_read:
	HANDLER table_no_view_item READ FIRST handler_read_part;

handler_read_part:
	 |
	where;

have_some_initial_objects:
	some_databases ; some_base_tables ; some_temp_tables ; some_part_tables ; some_view_tables ; some_functions ; some_procedures ; some_trigger ; some_events;

high_priority:
	 |
	HIGH_PRIORITY;

higher_id:
	SELECT MIN(id) INTO @kill_id FROM information_schema.processlist WHERE id > CONNECTION_ID() pick_executors_only ensure_all_up;

if_exists:
	;

if_not_exists:
	IF NOT EXISTS;

ignore:
	 |
	IGNORE;

init_basics:
	{ $life_time_unit = 1 ; $name_space_width = 2 ; if ( $ENV{RQG_THREADS} == 1 ) { $life_time_unit = 0 } ; return undef } avoid_bugs ; nothing_disabled ; system_table_stuff;

init_name_spaces:
	separate_objects ; separate_normal_sequence ; separate_table_types;

insert:
	insert_normal |
	insert_with_sleep;

insert_method:
	 |
	INSERT_METHOD = insert_method_value;

insert_method_value:
	NO |
	FIRST |
	LAST;

insert_normal:
	INSERT low_priority_delayed_high_priority into_word table_item simple_or_complicated on_duplicate_key_update;

insert_with_sleep:
	INSERT INTO table_item ( table_field_list ) SELECT $table_field_list FROM table_item WHERE wait_short = 0 LIMIT 1;

into:
	 |
	INTO into_object;

into_object:
	OUTFILE _tmpnam;

into_word:
	 |
	INTO;

is_columns:
	/* table_item */ SELECT * FROM information_schema . columns WHERE table_schema = TRIM(' $database_name ') AND table_name = TRIM(' $table_name ') AND column_name = random_field_quoted;

is_schemata:
	/* database_name */ SELECT * FROM information_schema . schemata WHERE schema_name = TRIM(' $database_name ');

is_selects:
	is_schemata |
	is_tables |
	is_columns;

is_tables:
	/* table_item */ SELECT * FROM information_schema . tables WHERE table_schema = TRIM(' $database_name ') AND table_name = TRIM(' $table_name ');

isolation_level:
	REPEATABLE-READ |
	READ-COMMITTED |
	SERIALIZABLE;

join:
	NATURAL JOIN table_item_s B;

kill_query_or_session:
	lower_id ; KILL query_or_session @kill_id |
	own_id ; KILL query_or_session @kill_id |
	higher_id ; KILL query_or_session @kill_id;

local_or_empty:
	;

lock:
	LOCK TABLES table_item_s AS _letter lock_type;

lock_item:
	table_item_s AS _letter lock_type;

lock_list:
	table_item_s AS _letter lock_type;

lock_share:
	 |
	LOCK IN SHARE MODE;

lock_type:
	READ;

lock_unlock:
	LOCK TABLES table_item_s AS _letter lock_type;

low_priority:
	;

low_priority_concurrent:
	 |
	low_priority |
	concurrent;

low_priority_delayed:
	 |
	low_priority |
	delayed;

low_priority_delayed_high_priority:
	 |
	low_priority |
	delayed |
	high_priority;

lower_id:
	SELECT MAX(id) INTO @kill_id FROM information_schema.processlist WHERE id < CONNECTION_ID() pick_executors_only ensure_all_up;

merge_init_n:
	/* merge_table_item_n { $mt = $merge_table_item_n ; return undef } consists of ( base_table_item_n { $mp1 = $base_table_item_n ; return undef } , base_table_item_n { $mp2 = $base_table_item_n ; return undef } ) based on template_table_item */;

merge_init_s:
	/* merge_table_item_s { $mt = $merge_table_item_s ; return undef } consists of ( base_table_item_s { $mp1 = $base_table_item_s ; return undef } , base_table_item_s { $mp2 = $base_table_item_s ; return undef } ) based on template_table_item */;

merge_table_ddl:
	create_merge_table |
	drop_merge_table |
	alter_merge_table |
	merge_table_sequence;

merge_table_item:
	merge_table_item_s |
	merge_table_item_n;

merge_table_item_list:
	merge_table_item |
	merge_table_item , merge_table_item;

merge_table_item_list_n:
	merge_table_item_n |
	merge_table_item_n , merge_table_item_n;

merge_table_item_list_s:
	merge_table_item_s |
	merge_table_item_s , merge_table_item_s;

merge_table_item_n:
	database_name . merge_table_name_n { $merge_table_item_n = $database_name . " . " . $merge_table_name_n ; $merge_table_item = $merge_table_item_n ; return undef };

merge_table_item_s:
	database_name_s . merge_table_name_s { $merge_table_item_s = $database_name_s . " . " . $merge_table_name_s ; $merge_table_item = $merge_table_item_s ; return undef };

merge_table_name:
	merge_table_name_s |
	merge_table_name_n;

merge_table_name_n:
	{ $merge_table_name_n = $table_prefix . $merge_piece . $prng->int(1,$name_space_width) . $normal_piece ; $merge_table_name = $merge_table_name_n ; $table_name = $merge_table_name };

merge_table_name_s:
	{ $merge_table_name_s = $table_prefix . $merge_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $merge_table_name = $merge_table_name_s ; $table_name = $merge_table_name };

merge_table_sequence:
	$sequence_begin merge_init_s build_partner1 ; build_partner2 ; create_merge ; wait_till_drop_table ; DROP TABLE $mt $sequence_end;

no_or_empty:
	 |
	NO;

no_separate_normal_sequence:
	{ $sequence_piece="" ; $normal_piece="" ; return undef };

no_separate_objects:
	{ $database_prefix="o1_1" ; $table_prefix="o1_" ; $procedure_prefix="o1_" ; $function_prefix="o1_" ; $trigger_prefix="o1_" ; $event_prefix="o1_" ; return undef };

no_separate_table_types:
	{ $base_piece="" ; $temp_piece="" ; $merge_piece="" ; $part_piece="" ; $view_piece="" ; return undef };

non_correlated:
	subquery_part1 _digit );

not_or_empty:
	 |
	NOT;

not_to_binlog_local:
	 |
	NO_WRITE_TO_BINLOG |
	LOCAL;

nothing_disabled:
	{ $sequence_begin = "/* Sequence start */" ; $sequence_end = "/* Sequence end */" ; return undef };

nowait:
	NOWAIT |
	;

on_duplicate_key_update:
	 |
	ON DUPLICATE KEY UPDATE random_field_quoted1 = _digit;

online:
	 |
	ONLINE;

optimize_table:
	OPTIMIZE not_to_binlog_local TABLE table_list;

own_id:
	SET @kill_id = CONNECTION_ID() ensure_all_up;

part_table_ddl:
	create_part_table |
	drop_part_table |
	alter_part_table |
	part_table_sequence;

part_table_item:
	part_table_item_s |
	part_table_item_n;

part_table_item_list:
	part_table_item |
	part_table_item , part_table_item;

part_table_item_list_n:
	part_table_item_n |
	part_table_item_n , part_table_item_n;

part_table_item_list_s:
	part_table_item_s |
	part_table_item_s , part_table_item_s;

part_table_item_n:
	database_name . part_table_name_n { $part_table_item_n = $database_name . " . " . $part_table_name_n ; $part_table_item = $part_table_item_n ; return undef };

part_table_item_s:
	database_name_s . part_table_name_s { $part_table_item_s = $database_name_s . " . " . $part_table_name_s ; $part_table_item = $part_table_item_s ; return undef };

part_table_name:
	part_table_name_s |
	part_table_name_n;

part_table_name_n:
	{ $part_table_name_n = $table_prefix . $part_piece . $prng->int(1,$name_space_width) . $normal_piece ; $part_table_name = $part_table_name_n ; $table_name = $part_table_name };

part_table_name_s:
	{ $part_table_name_s = $table_prefix . $part_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $part_table_name = $part_table_name_s ; $table_name = $part_table_name };

part_table_sequence:
	$sequence_begin CREATE TABLE if_not_exists part_table_item_s AS SELECT * FROM template_table_item ; COMMIT ; wait_till_drop_table ; DROP TABLE $part_table_item_s $sequence_end;

pick_executors_only:
	AND (INFO LIKE CONCAT('%',TRIM(' database_name_s '),'%') OR INFO LIKE CONCAT('%',TRIM(' database_name_n '),'%'));

proc_stmt:
	select |
	update;

procedure_analyze:
	 |
	PROCEDURE ANALYSE( 10 , 2000 );

procedure_ddl:
	;

procedure_item:
	procedure_item_s |
	procedure_item_n;

procedure_item_n:
	database_name . procedure_name_n { $procedure_item_n = $database_name . " . " . $procedure_name_n ; $procedure_item = $procedure_item_n ; return undef };

procedure_item_s:
	database_name_s . procedure_name_s { $procedure_item_s = $database_name_s . " . " . $procedure_name_s ; $procedure_item = $procedure_item_s ; return undef };

procedure_name:
	procedure_name_s |
	procedure_name_n;

procedure_name_n:
	{ $procedure_name_n = $procedure_prefix . $prng->int(1,$name_space_width) . $normal_piece ; $procedure_name = $procedure_name_n };

procedure_name_s:
	{ $procedure_name_s = $procedure_prefix . $prng->int(1,$name_space_width) . $sequence_piece ; $procedure_name = $procedure_name_s };

procedure_sequence:
	$sequence_begin CREATE PROCEDURE procedure_item_s () BEGIN proc_stmt ; proc_stmt ; END ; COMMIT ; SELECT wait_short ; DROP PROCEDURE $procedure_item_s $sequence_end;

query:
	ddl |
	LOCK TABLES . { $base_table_name_s = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $base_table_name = $base_table_name_s ; $table_name = $base_table_name } { $base_table_item_s = $database_name_s . " . " . $base_table_name_s ; $base_table_item = $base_table_item_s ; return undef } AS _letter READ;

query_init:
	init_basics ; init_name_spaces;

query_or_session:
	QUERY |
	;

quick:
	;

quick_extended:
	 |
	quick |
	extended;

rand_val:
	{ $rand_val = $prng->int(0,100) / 100 };

random_field_quoted:
	'int_key' |
	'int' |
	'pk';

random_field_quoted1:
	`col_int_key` |
	`col_int` |
	`pk`;

release:
	 |
	no_or_empty RELEASE;

rename_column:
	;

rename_item:
	base_table_item_n TO base_table_item_n |
	temp_table_item_n TO temp_table_item_n |
	merge_table_item_n TO merge_table_item_n |
	part_table_item_n TO part_table_item_n;

rename_item_list:
	rename_item |
	rename_item , rename_item;

rename_table:
	RENAME TABLE rename_item_list;

repair_table:
	REPAIR not_to_binlog_local TABLE table_list quick extended;

replace:
	REPLACE low_priority_delayed into_word table_item simple_or_complicated;

replace_ignore:
	 |
	replace_option |
	ignore;

replace_option:
	 |
	REPLACE;

restrict_cascade:
	;

rollback:
	ROLLBACK work_or_empty chain release;

routine_show:
	show_create_function |
	show_function_code |
	show_function_status |
	show_create_procedure |
	show_procedure_code |
	show_procedure_status |
	show_triggers |
	show_create_trigger |
	show_events |
	show_create_event;

savepoint_id:
	A |
	B;

savepoint_or_empty:
	SAVEPOINT |
	;

select:
	select_normal |
	select_with_sleep;

select_normal:
	select_part1 addition into for_update_lock_in_share_mode;

select_part1:
	SELECT high_priority cache_results table_field_list_or_star FROM table_in_select as A;

select_with_sleep:
	SELECT 1 FROM table_item WHERE wait_short = 0 LIMIT 1;

separate_normal_sequence:
	{ $sequence_piece="_S" ; $normal_piece="_N" ; return undef };

separate_objects:
	{ $database_prefix="testdb" ; $table_prefix="t1_" ; $procedure_prefix="p1_" ; $function_prefix="f1_" ; $trigger_prefix="tr1_" ; $event_prefix="e1_" ; return undef };

separate_table_types:
	{ $base_piece="base" ; $temp_piece="temp" ; $merge_piece="merge" ; $part_piece="part" ; $view_piece="view" ; return undef };

set_autocommit:
	SET AUTOCOMMIT = zero_or_one;

set_isolation_level:
	SET SESSION TX_ISOLATION = TRIM(' isolation_level ');

show:
	database_show |
	SHOW STATUS;

show_columns:
	SHOW full COLUMNS from_in table_item show_columns_part;

show_columns_part:
	 |
	LIKE '%INT%';

show_create_database:
	;

show_create_event:
	SHOW CREATE EVENT event_item_s;

show_create_function:
	SHOW CREATE FUNCTION function_item;

show_create_procedure:
	SHOW CREATE PROCEDURE procedure_item;

show_create_table:
	SHOW CREATE TABLE table_item;

show_create_trigger:
	SHOW CREATE TRIGGER trigger_item;

show_create_view:
	SHOW CREATE VIEW view_table_item;

show_databases:
	;

show_events:
	SHOW EVENTS from_in database_name;

show_function_code:
	SHOW FUNCTION CODE function_item;

show_function_status:
	SHOW FUNCTION STATUS;

show_open_tables:
	SHOW OPEN TABLES IN database_name;

show_procedure_code:
	SHOW PROCEDURE CODE procedure_item;

show_procedure_status:
	SHOW PROCEDURE STATUS;

show_table_status:
	SHOW TABLE STATUS;

show_tables:
	SHOW TABLES;

show_triggers:
	SHOW TRIGGERS;

simple_or_complicated:
	( random_field_quoted1 ) VALUES ( digit_or_null ) |
	braced_table_field_list used_select LIMIT 1;

some_base_tables:
	create_base_table ; create_base_table ; create_base_table ; create_base_table;

some_databases:
	create_database ; create_database ; create_database ; create_database;

some_events:
	create_event ; create_event ; create_event ; create_event;

some_functions:
	create_function ; create_function ; create_function ; create_function;

some_merge_tables:
	create_merge_table ; create_merge_table ; create_merge_table ; create_merge_table;

some_part_tables:
	create_part_table ; create_part_table ; create_part_table ; create_part_table;

some_procedures:
	create_procedure ; create_procedure ; create_procedure ; create_procedure;

some_temp_tables:
	create_temp_table ; create_temp_table ; create_temp_table ; create_temp_table;

some_trigger:
	create_trigger ; create_trigger ; create_trigger ; create_trigger;

some_view_tables:
	create_view ; create_view ; create_view ; create_view;

sql_buffer_result:
	 |
	SQL_BUFFER_RESULT;

sql_cache:
	 |
	SQL_CACHE;

sql_mode:
	;

sql_no_cache:
	 |
	SQL_NO_CACHE;

start_transaction:
	START TRANSACTION with_consistent_snapshot;

subquery:
	correlated |
	non_correlated;

subquery_part1:
	WHERE A.`pk` IN ( SELECT `pk` FROM table_item AS B WHERE B.`pk` =;

system_table_stuff:
	CREATE USER otto@localhost;

table_field_list:
	{ $table_field_list = "`col_int_key` , `col_int` , `pk` "} |
	{ $table_field_list = "`col_int_key` , `pk` , `col_int` "} |
	{ $table_field_list = "`col_int` , `pk` , `col_int_key` "} |
	{ $table_field_list = "`col_int` , `col_int_key` , `pk` "} |
	{ $table_field_list = "`pk` , `col_int` , `col_int_key` "} |
	{ $table_field_list = "`pk` , `col_int_key` , `pk` "};

table_field_list_or_star:
	table_field_list |
	{ $table_field_list = "*" };

table_in_select:
	table_item |
	( SELECT table_field_list_or_star FROM table_item );

table_item:
	table_item_s;

table_item_n:
	base_table_item_n |
	temp_table_item_n |
	merge_table_item_n |
	view_table_item_n |
	part_table_item_n;

table_item_s:
	. { $base_table_name_s = $table_prefix . $base_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $base_table_name = $base_table_name_s ; $table_name = $base_table_name } { $base_table_item_s = $database_name_s . " . " . $base_table_name_s ; $base_table_item = $base_table_item_s ; return undef };

table_list:
	table_item_s;

table_maintenance_ddl:
	analyze_table |
	optimize_table |
	checksum_table |
	check_table |
	repair_table;

table_no_view_item:
	table_no_view_item_s |
	table_no_view_item_n;

table_no_view_item_n:
	base_table_item_n |
	temp_table_item_n |
	merge_table_item_n |
	part_table_item_n;

table_no_view_item_s:
	base_table_item_s |
	temp_table_item_s |
	merge_table_item_s |
	part_table_item_s;

table_show:
	show_tables |
	show_table_status |
	show_create_table |
	show_create_view |
	show_open_tables |
	show_columns;

table_word:
	 |
	TABLE;

temp_table_ddl:
	create_temp_table |
	drop_temp_table |
	alter_temp_table;

temp_table_item:
	temp_table_item_s |
	temp_table_item_n;

temp_table_item_list:
	temp_table_item |
	temp_table_item , temp_table_item;

temp_table_item_list_n:
	temp_table_item_n |
	temp_table_item_n , temp_table_item_n;

temp_table_item_list_s:
	temp_table_item_s |
	temp_table_item_s , temp_table_item_s;

temp_table_item_n:
	database_name . temp_table_name_n { $temp_table_item_n = $database_name . " . " . $temp_table_name_n ; $temp_table_item = $temp_table_item_n ; return undef };

temp_table_item_s:
	. { $temp_table_name_s = $table_prefix . $temp_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $temp_table_name = $temp_table_name_s ; $table_name = $temp_table_name } { $temp_table_item_s = $database_name_s . " . " . $temp_table_name_s ; $temp_table_item = $temp_table_item_s ; return undef };

temp_table_name:
	temp_table_name_s |
	temp_table_name_n;

temp_table_name_n:
	{ $temp_table_name_n = $table_prefix . $temp_piece . $prng->int(1,$name_space_width) . $normal_piece ; $temp_table_name = $temp_table_name_n ; $table_name = $temp_table_name };

temp_table_name_s:
	{ $temp_table_name_s = $table_prefix . $temp_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $temp_table_name = $temp_table_name_s ; $table_name = $temp_table_name };

template_table_item:
	{ $template_table_item = "test.table0_int_autoinc" };

temporary:
	 |
	TEMPORARY;

traditional_mode:
	SET SESSION SQL_MODE=LOWER('TRADITIONAL');

transaction:
	start_transaction |
	commit |
	rollback |
	SAVEPOINT savepoint_id |
	RELEASE SAVEPOINT savepoint_id |
	ROLLBACK work_or_empty TO savepoint_or_empty savepoint_id |
	BEGIN work_or_empty |
	set_autocommit |
	kill_query_or_session;

trigger_action:
	insert |
	replace |
	delete |
	update |
	CALL procedure_item;

trigger_ddl:
	create_trigger |
	drop_trigger |
	trigger_sequence;

trigger_event:
	INSERT |
	DELETE;

trigger_item:
	trigger_item_s |
	trigger_item_n;

trigger_item_n:
	database_name . trigger_name_n { $trigger_item_n = $database_name . " . " . $trigger_name_n ; $trigger_item = $trigger_item_n ; return undef };

trigger_item_s:
	database_name_s . trigger_name_s { $trigger_item_s = $database_name_s . " . " . $trigger_name_s ; $trigger_item = $trigger_item_s ; return undef };

trigger_name:
	trigger_name_s |
	trigger_name_n;

trigger_name_n:
	{ $trigger_name_n = $trigger_prefix . $prng->int(1,$name_space_width) . $normal_piece ; $trigger_name = $trigger_name_n };

trigger_name_s:
	{ $trigger_name_s = $trigger_prefix . $prng->int(1,$name_space_width) . $sequence_piece ; $trigger_name = $trigger_name_s };

trigger_sequence:
	$sequence_begin CREATE TRIGGER trigger_item_s trigger_time trigger_event ON table_item_s FOR EACH ROW BEGIN trigger_action ; END ; COMMIT ; SELECT wait_short ; DROP TRIGGER $trigger_item_s $sequence_end;

trigger_time:
	BEFORE |
	AFTER;

truncate_table:
	;

union:
	UNION SELECT * FROM table_in_select as B;

unlock:
	UNLOCK TABLES;

update:
	;

update_normal:
	UPDATE low_priority ignore table_item SET random_field_quoted1 = _digit WHERE `pk` > _digit LIMIT _digit |
	UPDATE low_priority ignore table_item AS A join SET A. random_field_quoted1 = _digit , B. random_field_quoted1 = _digit;

update_with_sleep:
	UPDATE low_priority ignore table_item SET random_field_quoted1 = _digit WHERE wait_short = 0 LIMIT 1;

use_frm:
	 |
	USE_FRM;

used_select:
	select_part1 addition_no_procedure;

user_lock_action:
	IS_FREE_LOCK(TRIM(' _digit ')) |
	IS_USED_LOCK(TRIM(' _digit ')) |
	RELEASE_LOCK(TRIM(' _digit ')) |
	GET_LOCK(TRIM(' _digit '), 0.5 * rand_val * $life_time_unit );

view_algoritm:
	UNDEFINED |
	MERGE |
	TEMPTABLE;

view_ddl:
	create_view |
	drop_view |
	alter_view |
	view_sequence;

view_replace:
	 |
	OR REPLACE;

view_sequence:
	$sequence_begin CREATE ALGORITHM = view_algoritm VIEW view_table_item_s AS used_select ; COMMIT ; SELECT wait_short ; DROP VIEW $view_table_item_s $sequence_end;

view_table_item:
	view_table_item_s |
	view_table_item_n;

view_table_item_list:
	view_table_item |
	view_table_item , view_table_item;

view_table_item_list_n:
	view_table_item_n |
	view_table_item_n , view_table_item_n;

view_table_item_list_s:
	view_table_item_s |
	view_table_item_s , view_table_item_s;

view_table_item_n:
	database_name . view_table_name_n { $view_table_item_n = $database_name . " . " . $view_table_name_n ; $view_table_item = $view_table_item_n ; return undef };

view_table_item_s:
	database_name_s . view_table_name_s { $view_table_item_s = $database_name_s . " . " . $view_table_name_s ; $view_table_item = $view_table_item_s ; return undef };

view_table_name:
	view_table_name_s |
	view_table_name_n;

view_table_name_n:
	{ $view_table_name_n = $table_prefix . $view_piece . $prng->int(1,$name_space_width) . $normal_piece ; $view_table_name = $view_table_name_n ; $table_name = $view_table_name };

view_table_name_s:
	{ $view_table_name_s = $table_prefix . $view_piece . $prng->int(1,$name_space_width) . $sequence_piece ; $view_table_name = $view_table_name_s ; $table_name = $view_table_name };

wait_short:
	SLEEP( 0.5 * rand_val * $life_time_unit );

wait_till_drop_database:
	SELECT SLEEP( 2 * rand_val * $life_time_unit );

wait_till_drop_table:
	;

where:
	;

where_subquery:
	where |
	subquery;

with_alias:
	 |
	as A;

with_consistent_snapshot:
	 |
	WITH CONSISTENT SNAPSHOT;

work_or_empty:
	 |
	WORK;

zero_or_one:
	0 |
	1;