335 lines
8.3 KiB
Plaintext
335 lines
8.3 KiB
Plaintext
# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software Foundation,
|
|
# 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
|
|
|
# Last Modification to Grammar : Sandeep D (Bug #11766276)
|
|
# The joins on information schema tables resulted in high usage of temp space (> 350G) . The space consumtion is basically due to sorting temp table created during order by on
|
|
# joins involving tables like INNODB_BUFFER_PAGE . The current modification eliminates the order by on Joins and preserves sorting on projection queries with single table
|
|
|
|
query_init:
|
|
SELECT _field FROM _table ; # Populate the RQG metadata caches from the start of the start of the test
|
|
|
|
thread1:
|
|
modify ; # Issue DDL that are reflected in INFORMATION_SCHEMA
|
|
|
|
query:
|
|
{ @nonaggregates = () ; @table_names = () ; @database_names = () ; $tables = 0 ; $fields = 0 ; "" } select |
|
|
{ @nonaggregates = () ; @table_names = () ; @database_names = () ; $tables = 0 ; $fields = 0 ; "" } select |
|
|
{ @nonaggregates = () ; @table_names = () ; @database_names = () ; $tables = 0 ; $fields = 0 ; "" } select |
|
|
{ @nonaggregates = () ; @table_names = () ; @database_names = () ; $tables = 0 ; $fields = 0 ; "" } select_join |
|
|
{ @nonaggregates = () ; @table_names = () ; @database_names = () ; $tables = 0 ; $fields = 0 ; "" } select_join |
|
|
{ @nonaggregates = () ; @table_names = () ; @database_names = () ; $tables = 0 ; $fields = 0 ; "" } select_join |
|
|
show ;
|
|
|
|
show:
|
|
# SHOW BINARY LOGS |
|
|
SHOW BINLOG EVENTS |
|
|
SHOW CHARACTER SET |
|
|
SHOW COLLATION |
|
|
SHOW COLUMNS FROM _table |
|
|
SHOW CREATE DATABASE _letter |
|
|
SHOW CREATE FUNCTION _letter |
|
|
SHOW CREATE PROCEDURE _letter |
|
|
SHOW CREATE TABLE _letter |
|
|
SHOW CREATE VIEW _letter |
|
|
SHOW DATABASES |
|
|
# SHOW ENGINE |
|
|
SHOW ENGINES |
|
|
SHOW ERRORS |
|
|
SHOW FUNCTION CODE _letter |
|
|
SHOW FUNCTION STATUS |
|
|
SHOW GRANTS |
|
|
SHOW INDEX FROM _table |
|
|
# SHOW INNODB STATUS |
|
|
# SHOW LOGS |
|
|
SHOW MASTER STATUS |
|
|
# SHOW MUTEX STATUS |
|
|
SHOW OPEN TABLES |
|
|
SHOW PRIVILEGES |
|
|
SHOW PROCEDURE CODE _letter |
|
|
SHOW PROCEDURE STATUS |
|
|
SHOW PROCESSLIST |
|
|
SHOW PROFILE |
|
|
SHOW PROFILES |
|
|
SHOW SLAVE HOSTS |
|
|
SHOW SLAVE STATUS |
|
|
SHOW STATUS |
|
|
SHOW TABLE STATUS |
|
|
SHOW TABLES |
|
|
SHOW TRIGGERS |
|
|
SHOW VARIABLES |
|
|
SHOW WARNINGS ;
|
|
|
|
modify:
|
|
# character_sets |
|
|
# collations |
|
|
# collation_character_set_applicability |
|
|
columns |
|
|
column_privileges |
|
|
# engines |
|
|
events |
|
|
# files |
|
|
# global_status |
|
|
# global_variables |
|
|
key_column_usage |
|
|
parameters |
|
|
partitions |
|
|
# plugins |
|
|
# processlist |
|
|
# profiling |
|
|
# referential_constraints |
|
|
# routines | # same as parameters
|
|
schemata |
|
|
schema_privileges |
|
|
# session_status |
|
|
# session_variables |
|
|
# statistics |
|
|
tables |
|
|
# tablespaces |
|
|
table_constraints |
|
|
table_privileges |
|
|
triggers |
|
|
user_privileges |
|
|
views ;
|
|
|
|
columns:
|
|
ALTER TABLE _table ADD COLUMN _letter INTEGER |
|
|
ALTER TABLE _table DROP COLUMN _letter ;
|
|
|
|
column_privileges:
|
|
GRANT privilege_list ON _table TO 'someuser'@'somehost';
|
|
|
|
events:
|
|
CREATE EVENT _letter ON SCHEDULE AT NOW() DO SET @a=@a |
|
|
DROP EVENT _letter ;
|
|
|
|
key_column_usage:
|
|
ALTER TABLE _table ADD KEY ( _letter ) |
|
|
ALTER TABLE _table DROP KEY _letter ;
|
|
|
|
parameters:
|
|
CREATE PROCEDURE _letter ( procedure_parameter_list ) BEGIN SELECT COUNT(*) INTO @a FROM _table; END ; |
|
|
DROP PROCEDURE IF EXISTS _letter |
|
|
CREATE FUNCTION _letter ( function_parameter_list ) RETURNS INTEGER RETURN 1 |
|
|
DROP FUNCTION IF EXISTS _letter ;
|
|
|
|
partitions:
|
|
ALTER TABLE _table PARTITION BY KEY() PARTITIONS _digit |
|
|
ALTER TABLE _table REMOVE PARTITIONING ;
|
|
|
|
schemata:
|
|
CREATE DATABASE IF NOT EXISTS _letter |
|
|
DROP DATABASE IF EXISTS _letter ;
|
|
|
|
schema_privileges:
|
|
GRANT ALL PRIVILEGES ON _letter . * TO 'someuser'@'somehost' |
|
|
REVOKE ALL PRIVILEGES ON _letter . * FROM 'someuser'@'somehost' ;
|
|
|
|
tables:
|
|
CREATE TABLE _letter LIKE _table |
|
|
DROP TABLE _letter ;
|
|
|
|
table_constraints:
|
|
ALTER TABLE _table DROP PRIMARY KEY |
|
|
ALTER TABLE _table ADD PRIMARY KEY (`pk`) ;
|
|
|
|
table_privileges:
|
|
GRANT ALL PRIVILEGES ON test . _letter TO 'someuser'@'somehost' |
|
|
REVOKE ALL PRIVILEGES ON test . _letter FROM 'someuser'@'somehost' ;
|
|
|
|
triggers:
|
|
CREATE TRIGGER _letter BEFORE INSERT ON _table FOR EACH ROW BEGIN INSERT INTO _table SELECT * FROM _table LIMIT 0 ; END ; |
|
|
DROP TRIGGER IF EXISTS _letter;
|
|
|
|
user_privileges:
|
|
GRANT admin_privilege_list ON * . * to 'someuser'@'somehost' |
|
|
REVOKE admin_privilege_list ON * . * FROM 'someuser'@'somehost' ;
|
|
|
|
admin_privilege_list:
|
|
admin_privilege |
|
|
admin_privilege , admin_privilege_list ;
|
|
|
|
admin_privilege:
|
|
CREATE USER |
|
|
PROCESS |
|
|
RELOAD |
|
|
REPLICATION CLIENT |
|
|
REPLICATION SLAVE |
|
|
SHOW DATABASES |
|
|
SHUTDOWN |
|
|
SUPER |
|
|
# ALL PRIVILEGES |
|
|
USAGE ;
|
|
|
|
views:
|
|
CREATE OR REPLACE VIEW _letter AS SELECT * FROM _table |
|
|
DROP VIEW IF EXISTS _letter ;
|
|
|
|
function_parameter_list:
|
|
_letter INTEGER , _letter INTEGER ;
|
|
|
|
procedure_parameter_list:
|
|
parameter |
|
|
parameter , procedure_parameter_list ;
|
|
|
|
parameter:
|
|
in_out _letter INT ;
|
|
|
|
in_out:
|
|
IN | OUT ;
|
|
|
|
|
|
privilege_list:
|
|
privilege_item |
|
|
privilege_item , privilege_list ;
|
|
|
|
privilege_item:
|
|
privilege ( field_list );
|
|
|
|
privilege:
|
|
INSERT | SELECT | UPDATE ;
|
|
|
|
field_list:
|
|
_field |
|
|
_field , field_list ;
|
|
|
|
|
|
|
|
select:
|
|
SELECT *
|
|
FROM new_table_item
|
|
where
|
|
group_by
|
|
having
|
|
order_by_limit
|
|
;
|
|
|
|
select_join :
|
|
SELECT *
|
|
FROM join_list
|
|
where
|
|
group_by
|
|
having
|
|
LIMIT _digit
|
|
;
|
|
|
|
|
|
select_list:
|
|
new_select_item |
|
|
new_select_item , select_list ;
|
|
|
|
join_list:
|
|
new_table_item |
|
|
(new_table_item join_type new_table_item ON ( current_table_item . _field = previous_table_item . _field ) ) ;
|
|
|
|
join_type:
|
|
INNER JOIN | left_right outer JOIN | STRAIGHT_JOIN ;
|
|
|
|
left_right:
|
|
LEFT | RIGHT ;
|
|
|
|
outer:
|
|
| OUTER ;
|
|
where:
|
|
WHERE where_list ;
|
|
|
|
where_list:
|
|
not where_item |
|
|
not (where_list AND where_item) |
|
|
not (where_list OR where_item) ;
|
|
|
|
not:
|
|
| | | NOT;
|
|
|
|
where_item:
|
|
existing_table_item . _field sign value |
|
|
existing_table_item . _field sign existing_table_item . _field ;
|
|
|
|
group_by:
|
|
{ scalar(@nonaggregates) > 0 ? " GROUP BY ".join (', ' , @nonaggregates ) : "" };
|
|
|
|
having:
|
|
| HAVING having_list;
|
|
|
|
having_list:
|
|
not having_item |
|
|
not (having_list AND having_item) |
|
|
not (having_list OR having_item) |
|
|
having_item IS not NULL ;
|
|
|
|
having_item:
|
|
existing_table_item . _field sign value ;
|
|
|
|
order_by_limit:
|
|
|
|
|
ORDER BY order_by_list |
|
|
ORDER BY order_by_list LIMIT _digit ;
|
|
|
|
total_order_by:
|
|
{ join(', ', map { "field".$_ } (1..$fields) ) };
|
|
|
|
order_by_list:
|
|
order_by_item |
|
|
order_by_item , order_by_list ;
|
|
|
|
order_by_item:
|
|
existing_table_item . _field ;
|
|
|
|
limit:
|
|
| LIMIT _digit | LIMIT _digit OFFSET _digit;
|
|
|
|
new_select_item:
|
|
nonaggregate_select_item |
|
|
nonaggregate_select_item |
|
|
aggregate_select_item;
|
|
|
|
nonaggregate_select_item:
|
|
table_one_two . _field AS { my $f = "field".++$fields ; push @nonaggregates , $f ; $f} ;
|
|
|
|
aggregate_select_item:
|
|
aggregate table_one_two . _field ) AS { "field".++$fields };
|
|
|
|
# Only 20% table2, since sometimes table2 is not present at all
|
|
|
|
table_one_two:
|
|
table1 { $last_table = $tables[1] } |
|
|
table2 { $last_table = $tables[2] } ;
|
|
|
|
aggregate:
|
|
COUNT( | SUM( | MIN( | MAX( ;
|
|
|
|
new_table_item:
|
|
database . _table AS { $database_names[++$tables] = $last_database ; $table_names[$tables] = $last_table ; "table".$tables };
|
|
|
|
database:
|
|
{ $last_database = $prng->arrayElement(['mysql','INFORMATION_SCHEMA','test']); return $last_database };
|
|
|
|
current_table_item:
|
|
{ $last_database = $database_names[$tables] ; $last_table = $table_names[$tables] ; "table".$tables };
|
|
|
|
previous_table_item:
|
|
{ $last_database = $database_names[$tables-1] ; $last_table = $table_names[$tables-1] ; "table".($tables - 1) };
|
|
|
|
existing_table_item:
|
|
{ my $i = $prng->int(1,$tables) ; $last_database = $database_names[$i]; $last_table = $table_names[$i] ; "table".$i };
|
|
|
|
existing_select_item:
|
|
{ "field".$prng->int(1,$fields) };
|
|
|
|
sign:
|
|
= | > | < | != | <> | <= | >= ;
|
|
|
|
value:
|
|
_digit | _char(2) | _datetime ;
|