#### suite/funcs_1/datadict/datadict_master.inc # --disable_abort_on_error let $message= . . It is intended that the 3 __datadict.test files are named this way to be . sure they are - in a *full run* of the suite - the first tests done for each . storage engine. Using two _ and the order of processing in mysql-test-run.pl . ensures this in an easy way. . . If needed a restart could be implemented later between the storage engines if . values changes in the result depending from the position where the . *__datadict.test are started. This can be a result of showing e.g. maximum . values of the number of rows of tables. . . This .result file has been checked OK with Linux 5.0.23-bk, . ChangeSet@1.2211, 2006-06-28 10:11:43-07:00. .; --source include/show_msg80.inc ################################################################################ # let $message= FIXME: There are subtests that are switched off due to known bugs:; --source include/show_msg.inc #set variable(s) here to be able to switch crashing sub tests with ONE change HERE. #change the variable(s) to enable / disable the crashing parts. # different 'logics' are used because sometimes codelines needs to be switched off # and otherwise some extra statements needs to be executed as long as the bug is not # fixed: let $have_bug_11589= 1; #seems not to work: --vertical_results eval SELECT $have_bug_11589 AS "have_bug_11589"; #seems not to work: --horizontal_results # As long as # Bug#11589: mysqltest, --ps-protocol, strange output, float/double/real with zerofill # is not fixed, we must switch the ps-protocol for some statements off. # If this bug is fixed, please # 1. set the following variable to 0 # 2. check, if the test passes # 3. remove the workarounds if ($have_bug_11589) { let $message= There are some statements where the ps-protocol is switched off. This may come from the bug listed below, ir from other problems. Bug#11589: mysqltest, --ps-protocol, strange output, float/double/real with zerofill; --source include/show_msg80.inc } # ################################################################################ # loading the tables (data is not really needed in this test) is separated to # make it easier in this file to show the message above. --source suite/funcs_1/datadict/datadict_load.inc #FIXME: - check for remaining change of object names to standards: db_, tb_, v_, u_, ... #FIXME: - check warnings when data is loaded (Data truncated for column ...) #FIXME: - change connect() to use less users / connections # #FIXME: - check for additional 'FIXME' here in the script use information_schema; --source suite/funcs_1/include/show_connection.inc ################################################################################ # # Data Dictionary # ################################################################################ let $message= Testcase 3.2.1.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.1: Ensure that every INFORMATION_SCHEMA table can be queried # with a SELECT statement, just as if it were an ordinary # user-defined table. ################################################################################ # create at least one object for all 'tables' to be checked --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; USE db_datadict; CREATE VIEW v1 AS SELECT * FROM information_schema.tables; # try to get the server's name to be able to clean-up the result from machine # specific stuff. CREATE OR REPLACE VIEW db_datadict.vu1 as SELECT grantee AS u FROM information_schema.user_privileges; CREATE OR REPLACE VIEW db_datadict.vu as SELECT DISTINCT u, SUBSTRING( u, LENGTH(SUBSTRING_INDEX(u,_utf8'@',1))+3 ) AS server, SUBSTRING( u, LENGTH(SUBSTRING_INDEX(u,_utf8'@',1))+3, LENGTH( SUBSTRING( u, LENGTH( SUBSTRING_INDEX(u, _utf8'@',1)) +3 )) - 1 ) AS Server_Clean FROM db_datadict.vu1; --replace_result $SERVER_NAME SELECT * FROM db_datadict.vu order by u; delimiter //; CREATE PROCEDURE db_datadict.sp_1() BEGIN SELECT * FROM db_datadict.v1; END// delimiter ;// #FIXME 3.2.1.1: add missing objects of each type to have something to select #FIXME 3.2.1.1: - FUNCTION #FIXME 3.2.1.1: - TRIGGER USE information_schema; SHOW tables; select * from schemata ORDER BY 2 DESC, 1 ASC; if ($have_bug_11589) { --disable_ps_protocol } --vertical_results #SELECT * FROM tables; # #FIXME 3.2.1.1: we split the "SELECT * FROM tables" in two parts until #FIXME 3.2.1.1: Bug #12397: wrong values shown in column CREATE_OPTIONS of #FIXME 3.2.1.1: INFORMATION_SCHEMA.TABLES is solved, one with 'more' and one #FIXME 3.2.1.1: with 'less' replace # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME # 20 CREATE_OPTIONS --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" 20 "#CO#" SELECT * FROM tables WHERE table_schema = 'information_schema'; # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM tables WHERE NOT( table_schema = 'information_schema'); --horizontal_results --enable_ps_protocol select s.catalog_name, s.schema_name, s.default_character_set_name, t.table_type, t.engine from schemata s inner join tables t ORDER BY s.schema_name, s.default_character_set_name, table_type, engine; --source suite/funcs_1/datadict/datadict_bug_12777.inc select * from columns; select * from character_sets; select sum(id) from collations; select collation_name, character_set_name into @x,@y from collation_character_set_applicability limit 1; select @x, @y; --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" select * from routines; select count(*) from routines; select * from statistics; select * from views; --replace_result $SERVER_NAME select * from user_privileges order by grantee, privilege_type; select * from schema_privileges; select * from table_privileges; select * from column_privileges; select * from table_constraints; select * from key_column_usage; select count(*) as max_recs from key_column_usage; select max(cardinality) from statistics; select concat("View '", table_name, "' is associated with the database '", table_schema, "'.") AS "Who is Who for the Views" from views; select concat("Table or view '", table_name, "' is associated with the database '", table_schema, "'.") as "Who is Who" from tables; --replace_result $SERVER_NAME select grantee as "user's having select privilege", substring( grantee, length(SUBSTRING_INDEX(grantee,_utf8'@',1))+2 ) from user_privileges where privilege_type = 'select' order by grantee; select all table_schema from schema_privileges limit 0,5; select distinct(privilege_type) from table_privileges; select * from column_privileges group by table_schema having table_schema = 'db_datadict'; select * from table_constraints limit 0,5; select count(*) as max_recs from key_column_usage limit 0,5; select information_schema.tables.table_name as "table name", count(distinct(column_name)) as "no of columns in the table" from information_schema.tables left outer join information_schema.columns on information_schema.tables.table_name = information_schema.columns.table_name group by information_schema.tables.table_name; # Reference Manual 22.1.16 - we will add more ...: # select * from parameters; # select * from referential_constraints; # select * from triggers; let $message= root: simple select to check all - and never forget some - tables; let $dd_part1= SELECT * FROM; let $dd_part2= LIMIT 1; --source suite/funcs_1/datadict/datadict_tables.inc # check again, but from different database (will fail due to missing database name) use db_datadict; --error 1146 select * from schemata; --error 1146 select * from tables; --error 1146 select s.catalog_name, s.schema_name, s.default_character_set_name, t.table_type, t.engine from schemata s inner join tables t ORDER BY s.catalog_name, s.schema_name, s.default_character_set_name; --error 1146 select * from columns limit 0, 5; --error 1146 select * from character_sets limit 0, 5; --error 1146 select * from collations limit 0, 5; --error 1146 select * from collation_character_set_applicability limit 0, 5; --error 1146 select * from routines limit 0, 5; --error 1146 select * from statistics limit 0, 5; --error 1146 select * from views limit 0, 5; --error 1146 select * from user_privileges limit 0, 5; --error 1146 select * from schema_privileges limit 0, 5; --error 1146 select * from table_privileges limit 0, 5; --error 1146 select * from column_privileges limit 0, 5; --error 1146 select * from table_constraints limit 0, 5; --error 1146 select * from key_column_usage limit 0, 5; # Reference Manual 22.1.16 - we will add more ...: # --error 1146 # select * from parameters; # --error 1146 # select * from referential_constraints; # --error 1146 # select * from triggers; let $message= will fail due to missing database name; let $dd_part1= SELECT * FROM; let $dd_part2=; --source suite/funcs_1/datadict/datadict_tables_error_1146.inc # now check from "other" database, but with database name select * from information_schema.schemata ORDER BY 2 DESC; #SELECT * FROM information_schema.tables; # #FIXME 3.2.1.1: we split the "SELECT * FROM tables" in two parts until #FIXME 3.2.1.1: Bug #12397: wrong values shown in column CREATE_OPTIONS of #FIXME 3.2.1.1: INFORMATION_SCHEMA.TABLES is solved, one with 'more' and one #FIXME 3.2.1.1: with 'less' replace # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHRCK_TIME # 20 CREATE_OPTIONS if ($have_bug_11589) { --disable_ps_protocol } --vertical_results --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" 20 "#CO#" SELECT * FROM information_schema.tables WHERE table_schema = 'information_schema'; # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHRCK_TIME --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.tables WHERE NOT( table_schema = 'information_schema'); --horizontal_results --enable_ps_protocol select s.catalog_name, s.schema_name, s.default_character_set_name, t.table_type, t.engine from information_schema.schemata s inner join information_schema.tables t ORDER BY s.schema_name, s.default_character_set_name, table_type, engine; --source suite/funcs_1/datadict/datadict_bug_12777.inc select * from information_schema.columns limit 0, 5; select * from information_schema.character_sets limit 0, 5; select * from information_schema.collations limit 0, 5; select * from information_schema.collation_character_set_applicability limit 0, 5; --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" select * from information_schema.routines limit 0, 5; select * from information_schema.statistics limit 0, 5; select * from information_schema.views limit 0, 5; --replace_result $SERVER_NAME select * from information_schema.user_privileges limit 0, 5; select * from information_schema.schema_privileges limit 0, 5; select * from information_schema.table_privileges limit 0, 5; select * from information_schema.column_privileges limit 0, 5; select * from information_schema.table_constraints limit 0, 5; select * from information_schema.key_column_usage limit 0, 5; select count(*) as max_recs from information_schema.key_column_usage limit 0, 5; # Reference Manual 22.1.16 - we will add more ...: # select * from information_schema.parameters; # select * from information_schema.referential_constraints; # select * from information_schema.triggers; let $message= root: check with db name; let $dd_part1= SELECT COUNT(*) FROM information_schema.; let $dd_part2=; --source suite/funcs_1/datadict/datadict_tables.inc # cleanup USE db_datadict; DROP VIEW v1, vu1, vu; DROP PROCEDURE db_datadict.sp_1; USE information_schema; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.2:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.2: Ensure that queries on an INFORMATION_SCHEMA table can # accept all SELECT statement options and are always # correctly evaluated. ################################################################################ # currently here only a subset of select statement options is checked, it's still # not possible to check here all possible options select catalog_name, schema_name, default_character_set_name from schemata where schema_name like '%s%'; select count(*) as tot_tabs from tables; select count(*) as the_cols from columns; select max(maxlen) as the_max from character_sets; select * from collations order by id asc limit 0, 5; select * from collation_character_set_applicability order by character_set_name desc, collation_name limit 0, 5; select routine_definition from routines; select * from statistics group by index_name asc limit 0, 5; select concat(table_schema, ', ', table_name, ', ', view_definition) view_info from views; select concat(table_schema, ', ', table_name) "Table_info" from tables ORDER BY 1; --replace_result $SERVER_NAME select distinct grantee from user_privileges order by grantee, privilege_type; select * from schema_privileges where table_catalog is null limit 0, 5; select * from table_privileges where grantee like '%r%' limit 0, 5; select * from column_privileges where table_catalog is not null limit 0, 5; select HIGH_PRIORITY * from table_constraints group by constraint_name desc limit 0, 5; select sum(ordinal_position) from key_column_usage; select * from schemata limit 0,5; select * from schemata limit 0,5; --replace_result $SERVER_NAME select distinct grantee from user_privileges; --replace_result $SERVER_NAME select all grantee from user_privileges order by grantee, privilege_type; select id , character_set_name from collations order by id asc limit 10; select table_catalog from columns union all select table_catalog from tables limit 0,5; select table_catalog from columns union select table_catalog from tables limit 0,5; select all schema_name from information_schema.schemata; # the $ENGINE_TYPE variable is used here ONLY to have 3 different file names in # the three datadict testcases innodb_*, memory_* and myisam_* eval SELECT * INTO OUTFILE '../tmp/out.$ENGINE_TYPE.file' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM schemata LIMIT 0, 5; USE test; eval SELECT * INTO OUTFILE '../tmp/out.$ENGINE_TYPE.db.file' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM information_schema.schemata WHERE schema_name LIKE 'db_%'; # check also with a 'simple' user CREATE USER user_3212@localhost; GRANT ALL ON db_datadict.* TO user_3212@localhost; # OBN: The following line was added following the fix to bug 28181 # where queries to information_schema will fail if exporting to # a file without having the FILE attribute GRANT FILE ON *.* TO user_3212@localhost; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u3212,localhost,user_3212,,db_datadict); --source suite/funcs_1/include/show_connection.inc # no db given --> db_datadict.schema does not exist --error 1146 eval SELECT * INTO OUTFILE '../tmp/out.$ENGINE_TYPE.user.file' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM schemata LIMIT 0, 5; --error 1146 eval SELECT * FROM schemata LIMIT 0, 5; eval SELECT * INTO OUTFILE '../tmp/out.$ENGINE_TYPE.user.db.file' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM information_schema.schemata WHERE schema_name LIKE 'db_%'; eval SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_%'; USE information_schema; eval SELECT * INTO OUTFILE '../tmp/out.$ENGINE_TYPE.user_2.file' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM schemata LIMIT 0, 5; eval SELECT * FROM schemata LIMIT 0, 5; eval SELECT * INTO OUTFILE '../tmp/out.$ENGINE_TYPE.user_2.db.file' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM information_schema.schemata WHERE schema_name LIKE 'db_%'; eval SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_%'; disconnect u3212; connection default; USE information_schema; --source suite/funcs_1/include/show_connection.inc use db_datadict; select table_catalog "1", table_schema "2", table_name "3", column_name "4" from information_schema.columns union select table_catalog, table_schema, table_name, concat( "*** type = ", table_type ) from information_schema.tables order by 3, 4 desc, 1, 2 limit 30; use information_schema; --source suite/funcs_1/datadict/datadict_bug_12777.inc select table_catalog "1", table_schema "2", table_name "3", column_name "4" from columns union select table_catalog, table_schema, table_name, concat( "*** type = ", table_type ) from tables order by 3, 4 desc, 1, 2 limit 30; # cleanup DROP USER user_3212@localhost; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.3: Ensure that no user may execute an INSERT statement on any # INFORMATION_SCHEMA table. ################################################################################ #FIXME: in this block we had --error 1288 until Mid Sep05, check the change! --error 1044 insert into schemata (catalog_name, schema_name, default_character_set_name, sql_path) values ('null', 'db1', 'latin1', 'null'); --error 1044 insert into tables (table_schema, table_name)values('db_datadict', 't1'); --error 1044 insert into columns (table_name, column_name)values('t3', 'f2'); --error 1044 insert into character_sets (character_set_name, default_collate_name, description, maxlen) values('cp1251', 'cp1251_general_ci', 'windows cyrillic', 1); --error 1044 insert into collations ( collation_name, character_set_name, id, is_default, is_compiled, sortlen) values ('cp1251_bin', 'cp1251', 50, '', '', 0); --error 1044 insert into collation_character_set_applicability (collation_name, character_set_name) values (' big5_chinese_ci', 'big6'); --error 1044 insert into routines(routine_name, routine_type ) values ('p2', 'procedure'); --error 1044 insert into statistics(table_schema, table_name, index_name) values ('mysql', 'db', 'primary'); --error 1044 insert into views(table_schema, table_name) values ('db2', 'v2'); --error 1044 insert into user_privileges (privilege_type, is_grantable) values ('select', 'yes'); --error 1044 insert into schema_privileges (table_schema, privilege_type) values('db2', 'insert'); --error 1044 insert into table_privileges (able_schema, table_name, privilege_type) values('db2', 'v2', 'insert'); --error 1044 insert into column_privileges (table_name, column_name, privilege_type) values ('t3', 'f3', 'insert'); --error 1044 insert into table_constraints ( constraint_schema, constraint_name, table_schema) values ('primary', 'mysql', 'user'); --error 1044 insert into key_column_usage (constraint_schema, constraint_name, table_name) values ('mysql', 'primary', 'db'); # insert through a procedure --disable_warnings drop procedure if exists db_datadict.sp_4_1_3; --enable_warnings delimiter //; create procedure db_datadict.sp_4_1_3() begin insert into information_schema.schema_privileges (table_schema,privilege_type) values('db2','insert'); end// delimiter ;// #FIXME: check for the diffs Win ./. Linux SELECT table_schema, privilege_type FROM information_schema.schema_privileges WHERE table_schema LIKE 'db%'; --error 1044 call db_datadict.sp_4_1_3(); #FIXME: check for the diffs Win ./. Linux SELECT table_schema, privilege_type FROM information_schema.schema_privileges WHERE table_schema LIKE 'db%'; # cleanup drop procedure db_datadict.sp_4_1_3; # insert into information_schema as a limited user CREATE USER user_4_1_3@localhost; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u413,localhost,user_4_1_3,,test); --source suite/funcs_1/include/show_connection.inc use information_schema; #FIXME: check later the change from 1288 to 1044 (since Mid Sep05) --error 1044 insert into table_constraints ( constraint_schema, constraint_name, table_schema) values ('primary', 'mysql', 'user'); connection default; --source suite/funcs_1/include/show_connection.inc # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.4:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.4: Ensure that no user may execute an UPDATE statement on any # INFORMATION_SCHEMA table. ################################################################################ use information_schema; --source suite/funcs_1/include/show_connection.inc #FIXME: check later the change from 1288 to 1044 (since Mid Sep05) in the whole next block --error 1044 update schemata set schema_name = 'db5' where default_character_set_name = 'latin1'; --error 1044 update tables set table_schema = 'db_datadict1' where table_name = 't1'; --error 1044 update columns set table_name = 't4' where column_name = 'f2'; --error 1044 update character_sets set character_set_name = 'cp1252' where maxlen = 1; --error 1044 update collations set collation_name = 'cp1253_bin' where character_set_name = 'cp1251'; --error 1044 update collation_character_set_applicability set collation_name = 'big6_chinese_ci' where character_set_name = 'big6'; --error 1044 update routines set routine_name = p2 where routine_body = 'sql'; --error 1044 update statistics set table_schema = 'mysql1' where table_name = 'db'; --error 1044 update views set table_schema = 'db3' where table_name = 'v1'; --error 1044 update user_privileges set privilege_type = 'insert' where is_grantable = 'yes'; --error 1044 update schema_privileges set table_schema = 'db2' where privilege_type = 'select'; --error 1044 update table_privileges set table_name = 'v3' where privilege_type = 'select'; --error 1044 update column_privileges set table_name = 't4' where column_name = 'f3'; --error 1044 update table_constraints set constraint_schema = 'primary' where table_schema = 'proc'; --error 1044 update key_column_usage set table_name = 'db1' where constraint_name = 'primary'; # update through a procedure --disable_warnings drop procedure if exists db_datadict.sp_4_1_4; --enable_warnings delimiter //; create procedure db_datadict.sp_4_1_4() begin update information_schema.routines set routine_name = 'p2' where routine_name = 'sp_4_1_4'; end// delimiter ;// #FIXME: check for the diffs Win ./. Linux --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" select * from information_schema.routines; --error 1044 call db_datadict.sp_4_1_4(); #FIXME: check for the diffs Win ./. Linux --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" select * from information_schema.routines; # cleanup drop procedure db_datadict.sp_4_1_4; # update information_schema as a limited user connection u413; use information_schema; --source suite/funcs_1/include/show_connection.inc #FIXME: check later the change from 1288 to 1044 (since Mid Sep05) --error 1044 update user_privileges set privilege_type = 'insert' where is_grantable = 'yes'; connection default; --source suite/funcs_1/include/show_connection.inc # # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.5:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.5: Ensure that no user may execute a DELETE statement on any # INFORMATION_SCHEMA table. ################################################################################ use information_schema; let $message= root: DELETE FROM any table in IS; let $dd_part1= DELETE FROM; let $dd_part2=; --source suite/funcs_1/datadict/datadict_tables_error_1044.inc #FIXME: check later the change from 1288 to 1044 (since Mid Sep05) in the whole next block --error 1044 delete from schemata where schema_name = 'mysql'; --error 1044 delete from tables where table_name = 'abc'; --error 1044 delete from columns; --error 1044 delete from character_sets; --error 1044 delete from collations; --error 1044 delete from collation_character_set_applicability; --error 1044 delete from routines; --error 1044 delete from statistics; --error 1044 delete from views; --error 1044 delete from user_privileges; --error 1044 delete from schema_privileges; --error 1044 delete from table_privileges; --error 1044 delete from column_privileges; --error 1044 delete from table_constraints; --error 1044 delete from key_column_usage; # delete through a procedure --disable_warnings drop procedure if exists db_datadict.sp_4_1_5; --enable_warnings delimiter //; create procedure db_datadict.sp_4_1_5() begin delete from information_schema.column_privileges; end// delimiter ;// --error 1044 call db_datadict.sp_4_1_5(); # cleanup drop procedure db_datadict.sp_4_1_5; # delete from information_schema as a limited user connection u413; use information_schema; --source suite/funcs_1/include/show_connection.inc #FIXME: check later the change from 1288 to 1044 (since Mid Sep05) --error 1044 delete from tables where table_name = 'abc'; disconnect u413; connection default; --source suite/funcs_1/include/show_connection.inc # cleanup DROP USER user_4_1_3@localhost; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.6:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.6: Ensure that no user may create an INFORMATION_SCHEMA base # table. ################################################################################ use information_schema; let $message= root: create a table with a name of an IS table directly in IS; let $dd_part1= CREATE TABLE; let $dd_part2= ( c1 INT ); --source suite/funcs_1/datadict/datadict_tables_error_1044.inc #FIXME solved - 3.2.1.6: check for better error message - 42S02: Unknown table '' in ? --error 1109 create table t1 (f1 int, f2 int, f3 int); use db_datadict; #FIXME: check correct error message - HY000 Can't create/write to file '.\information_schema\columns.frm' (Errcode: 2) let $message= root: create a table with a name of an IS table from other db; let $dd_part1= CREATE TABLE information_schema.; let $dd_part2= ( c1 INT ); --source suite/funcs_1/datadict/datadict_tables_error_1044.inc #FIXME solved - 3.2.1.6: check for better error message - 42S02: Unknown table '' in ? --error 1109 create table information_schema.t1 (f1 int, f2 int, f3 int); # create a table in information_schema as a limited user with sufficient permissions CREATE USER user_4_1_6@localhost; grant all on *.* to user_4_1_6@localhost; FLUSH PRIVILEGES; SHOW GRANTS FOR user_4_1_6@localhost; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u2, localhost, user_4_1_6, , information_schema); --source suite/funcs_1/include/show_connection.inc use information_schema; let $message= user: create a table with a name of an IS table directly in IS; let $dd_part1= CREATE TABLE; let $dd_part2= ( c1 INT ); --source suite/funcs_1/datadict/datadict_tables_error_1044.inc #FIXME solved - 3.2.1.6: check for better error message - 42S02: Unknown table '' in ? --error 1109 create table t1 (f1 int, f2 int, f3 int); use test; #FIXME 3.2.1.6: check correct error message - HY000 Can't create/write to file '.\information_schema\columns.frm' (Errcode: 2) let $message= user: create a table with a name of an IS table from other db; let $dd_part1= CREATE TABLE information_schema.; let $dd_part2= ( c1 INT ); --source suite/funcs_1/datadict/datadict_tables_error_1044.inc #FIXME solved - 3.2.1.6: check for better error message - 42S02: Unknown table '' in ? --error 1109 create table information_schema.t1 (f1 int, f2 int, f3 int); #cleanup connection default; --source suite/funcs_1/include/show_connection.inc disconnect u2; DROP USER user_4_1_6@localhost; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.7:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.7: Ensure that no user may create an INFORMATION_SCHEMA view. ################################################################################ use information_schema; let $message= root: create a view with a name of an IS table directly in IS; let $dd_part1= CREATE VIEW ; let $dd_part2= AS SELECT * FROM mysql.time_zone; #FIXME: check change from error 1 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc --error 1109 CREATE VIEW v1 AS SELECT * FROM information_schema.schemata; USE db_datadict; let $message= root: create a view with a name of an IS table from other db; let $dd_part1= CREATE VIEW information_schema.; let $dd_part2= AS SELECT * FROM mysql.time_zone; #FIXME: check change from error 1 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc # ... but creating a view that 'uses' the information_schema is allowed: CREATE VIEW v1 AS SELECT * FROM information_schema.columns; SELECT * FROM v1 LIMIT 5; # create a view in information_schema as a limited user with sufficient permissions CREATE USER user_4_1_7@localhost; GRANT ALL ON db_datadict.* TO user_4_1_7@localhost; #FIXME: check that GRANT ON i_s is no longer allowed --error 1044 GRANT ALL ON information_schema.* TO user_4_1_7@localhost; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u3, localhost, user_4_1_7, , db_datadict); use information_schema; --source suite/funcs_1/include/show_connection.inc let $message= user: create a view with a name of an IS table directly in IS; let $dd_part1= CREATE VIEW ; let $dd_part2= AS SELECT * FROM db_datadict.v1; #FIXME: check change from error 1 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc --error 1109 create view v1 as select * from table_privileges; use db_datadict; let $message= user: create a view with a name of an IS table from other db; let $dd_part1= CREATE VIEW information_schema.; let $dd_part2= AS SELECT * FROM db_datadict.v1; #FIXME: check change from error 1 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc disconnect u3; # cleanup connection default; --source suite/funcs_1/include/show_connection.inc DROP USER user_4_1_7@localhost; DROP VIEW db_datadict.v1; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.8:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.8: Ensure that no user may create an index on an # INFORMATION_SCHEMA table. ################################################################################ use information_schema; #FIXME: check later the change from 1288 to 1044 (since Mid Sep05) --error 1044 create index i1 on schemata(schema_name); --error 1044 create index i2 on tables(table_schema); --error 1044 create index i3 on columns(table_name); --error 1044 create index i4 on character_sets(character_set_name); --error 1044 create index i5 on collations( collation_name); --error 1044 create index i6 on collation_character_set_applicability(collation_name); --error 1044 create index i7 on routines(routine_name); --error 1044 create index i8 on statistics(table_schema); --error 1044 create index i9 on views(table_schema); --error 1044 create index i10 on user_privileges(privilege_type); --error 1044 create index i11 on schema_privileges(table_schema); --error 1044 create index i12 on table_privileges(able_schema); --error 1044 create index i13 on column_privileges(table_name); --error 1044 create index i14 on table_constraints(constraint_schema); --error 1044 create index i15 on key_column_usage(constraint_schema); --error 1044 create index i16 on triggers(trigger_name); use db_datadict; --error 1044 create index i15 on information_schema.key_column_usage(constraint_schema); use information_schema; # create an index on an information_schema table as a limited user with sufficient permissions CREATE USER user_4_1_8@localhost; grant select, index on *.* to user_4_1_8@localhost; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u4, localhost, user_4_1_8, , test); --source suite/funcs_1/include/show_connection.inc use information_schema; --error 1044 create index i1 on schemata(schema_name); --error 1044 create index i2 on tables(table_schema); --error 1044 create index i3 on columns(table_name); --error 1044 create index i4 on character_sets(character_set_name); --error 1044 create index i5 on collations( collation_name); --error 1044 create index i6 on collation_character_set_applicability(collation_name); --error 1044 create index i7 on routines(routine_name); --error 1044 create index i8 on statistics(table_schema); --error 1044 create index i9 on views(table_schema); --error 1044 create index i10 on user_privileges(privilege_type); --error 1044 create index i11 on schema_privileges(table_schema); --error 1044 create index i12 on table_privileges(able_schema); --error 1044 create index i13 on column_privileges(table_name); --error 1044 create index i14 on table_constraints(constraint_schema); --error 1044 create index i15 on key_column_usage(constraint_schema); --error 1044 create index i16 on triggers(trigger_name); use db_datadict; --error 1044 create index i15 on information_schema.key_column_usage(constraint_schema); disconnect u4; connection default; --source suite/funcs_1/include/show_connection.inc # cleanup DROP USER user_4_1_8@localhost; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.9:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.9: Ensure that no user may alter the definition of an # INFORMATION_SCHEMA table. ################################################################################ #FIXME: 3.2.1.9 check for better error message than ERROR 42S02: Table 'information_schema.schemata' doesn't exist # first simple check all known - so we never forget one ... let $message= root: alter a table from other db; let $dd_part1= ALTER TABLE information_schema.; let $dd_part2= ADD f1 INT; #FIXME: check change from error 1146 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc use information_schema; let $message= root: alter a table from directly; let $dd_part1= ALTER TABLE ; let $dd_part2= ADD f1 INT; #FIXME: check change from error 1146 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc # now more detailed checks --error 1044 alter table schemata add f1 int; --error 1044 alter table tables drop primary key; --error 1044 alter table columns add f1 int; --error 1044 alter table character_sets disable keys; --error 1044 alter table collations enable keys; --error 1044 alter table collation_character_set_applicability add f1 int; --error 1044 alter table routines discard tablespace; --error 1044 alter table statistics import tablespace; --error 1044 alter table views drop column table_name; --error 1044 alter table user_privileges drop index privilege_type; --error 1044 alter table schema_privileges drop column is_grantable; --error 1044 alter table table_privileges order by constraint_type; --error 1044 alter table column_privileges rename to aaxyz; --error 1044 alter table table_constraints order by schema_name; --error 1044 alter table key_column_usage rename to information_schema.aabxyz; --error 1044 alter table triggers rename to information_schema.sql_mode; # Alter an information_schema table as a limited user with sufficient permissions CREATE USER user_4_1_9@localhost; grant select, alter, create, insert on *.* to user_4_1_9@localhost; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u5, localhost, user_4_1_9, , db_datadict); --source suite/funcs_1/include/show_connection.inc use db_datadict; let $message= user: alter a table from other db; let $dd_part1= ALTER TABLE information_schema.; let $dd_part2= ADD f1 INT; #FIXME: check change from error 1146 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc use information_schema; let $message= user: alter a table from directly; let $dd_part1= ALTER TABLE ; let $dd_part2= ADD f1 INT; #FIXME: check change from error 1146 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc disconnect u5; # cleanup connection default; --source suite/funcs_1/include/show_connection.inc DROP USER user_4_1_9@localhost; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.10:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.10: Ensure that no user may drop an INFORMATION_SCHEMA table. ################################################################################ use information_schema; let $message= root: drop a table from IS; let $dd_part1= DROP TABLE ; let $dd_part2=; #FIXME: check change from error 1051 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc use db_datadict; let $message= root: drop a table from other db; let $dd_part1= DROP TABLE information_schema.; let $dd_part2=; #FIXME: check change from error 1051 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc use information_schema; # drop an information_schema table as a limited user with sufficient permissions CREATE USER user_4_1_10@localhost; GRANT SELECT, DROP ON *.* TO user_4_1_10@localhost; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u6,localhost,user_4_1_10,,db_datadict); use information_schema; --source suite/funcs_1/include/show_connection.inc let $message= user: drop a table from IS; let $dd_part1= DROP TABLE ; let $dd_part2=; #FIXME: check change from error 1051 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc use db_datadict; let $message= user: drop a table from other db; let $dd_part1= DROP TABLE information_schema.; let $dd_part2=; #FIXME: check change from error 1051 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc disconnect u6; connection default; --source suite/funcs_1/include/show_connection.inc # cleanup DROP USER user_4_1_10@localhost; # Try to carry out information_schema modification operations with a user other than root having SUPER privileges CREATE USER user_4_1_11@localhost; GRANT SUPER ON *.* TO user_4_1_11@localhost; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u7,localhost,user_4_1_11, ,test); use information_schema; --source suite/funcs_1/include/show_connection.inc --error 1044 drop table routines; --error 1044 alter table collations enable keys; --error 1044 create index i5 on collations( collation_name ); --error 1109 create view v1 as select * from schemata; --error 1044 delete from columns; --error 1044 update columns set table_name = 't4' where column_name = 'f2'; --error 1044 insert into collations ( collation_name, character_set_name, id, is_default, is_compiled, sortlen) values ('cp1251_bin', 'cp1251', 50, '', '', 0); disconnect u7; connection default; --source suite/funcs_1/include/show_connection.inc DROP USER user_4_1_11@localhost; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.11:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.11: Ensure that no user may move an INFORMATION_SCHEMA table # to any other database. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; CREATE USER 'u_6_401011'@'localhost'; #FIXME: check that GRANT ON i_s is no longer allowed --error 1044 GRANT ALL ON information_schema.* TO 'u_6_401011'@'localhost'; GRANT ALL ON db_datadict.* TO 'u_6_401011'@'localhost'; FLUSH PRIVILEGES; --error 1044 ALTER TABLE information_schema.schemata RENAME db_datadict.schemata; let $message= root: move table to other DB; let $dd_part1= ALTER TABLE information_schema.; let $dd_part2= RENAME db_datadict.tb_01; #FIXME: check change from error 1146 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401011, localhost, u_6_401011, , db_datadict); USE information_schema; --source suite/funcs_1/include/show_connection.inc --error 1044 ALTER TABLE information_schema.schemata RENAME db_datadict.schemata; let $message= user: move table to other DB; let $dd_part1= ALTER TABLE information_schema.; let $dd_part2= RENAME db_datadict.tb_01; #FIXME: check change from error 1146 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc disconnect u_6_401011; connection default; --source suite/funcs_1/include/show_connection.inc #cleanup --disable_warnings #DROP DATABASE db_datadict; DROP TABLE IF EXISTS db_datadict.schemata; DROP USER 'u_6_401011'@'localhost'; --enable_warnings # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.12:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.12: Ensure that no user may directly add to, alter, or delete # any data in an INFORMATION_SCHEMA table. ################################################################################ # first as root a DELETE check on all tables let $message= root: delete from IS tables; let $dd_part1= DELETE FROM information_schema.; let $dd_part2=; #FIXME: check change from error 1288 to 1044 --source suite/funcs_1/datadict/datadict_tables_error_1044.inc # check UPDATE for all ... --error 1044 UPDATE information_schema.tables SET table_name = 't_4711'; --error 1044 UPDATE information_schema.columns SET table_name = 't_4711'; --error 1044 UPDATE information_schema.statistics SET table_name = 't_4711'; --error 1044 UPDATE information_schema.views SET table_name = 't_4711'; --error 1044 UPDATE information_schema.table_privileges SET table_name = 't_4711'; --error 1044 UPDATE information_schema.column_privileges SET table_name = 't_4711'; --error 1044 UPDATE information_schema.table_constraints SET table_name = 't_4711'; --error 1044 UPDATE information_schema.key_column_usage SET table_name = 't_4711'; --error 1044 UPDATE information_schema.schemata SET catalog_name = 't_4711'; --error 1044 UPDATE information_schema.character_sets SET description = 't_4711'; --error 1044 UPDATE information_schema.collations SET character_set_name = 't_4711'; --error 1044 UPDATE information_schema.collation_character_set_applicability SET character_set_name = 't_4711'; --error 1044 UPDATE information_schema.routines SET routine_type = 't_4711'; --error 1044 UPDATE information_schema.user_privileges SET grantee = 't_4711'; --error 1044 UPDATE information_schema.schema_privileges SET grantee = 't_4711'; --error 1044 UPDATE information_schema.triggers SET sql_mode = 't_4711'; CREATE USER 'u_6_401012'@'localhost'; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401012, localhost, u_6_401012, , test); use information_schema; --error 1044 insert into information_schema.schemata (catalog_name, schema_name, default_character_set_name, sql_path) values (null, information_schema1, utf16, null); #FIXME: check later the change from 1142 to 1044 (since Mid Sep05) --error 1044 alter table information_schema.schemata rename db_datadict1.schemata; #FIXME: check later the change from 1146 to 1044 (since Mid Sep05) --error 1044 alter table information_schema.tables drop column checksum; --error 1044 alter table information_schema.statistics modify packed int; --error 1044 alter table information_schema.routines modify created int not null; --error 1044 alter table information_schema.key_column_usage drop column ordinal_position; --error 1044 alter table information_schema.table_privileges change privilege_type rights_approved varchar(32); --error 1044 update columns set table_name = 't4' where column_name = 'f2'; --error 1044 delete from information_schema.collations; disconnect u_6_401012; # cleanup connection default; --source suite/funcs_1/include/show_connection.inc --disable_warnings drop table if exists db_datadict1.schemata; DROP USER 'u_6_401012'@'localhost'; --enable_warnings #------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.1.13:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.13: Ensure that the creation of any new database object # (e.g. table or column) automatically inserts all relevant # information on that object into every appropriate # INFORMATION_SCHEMA table. ################################################################################ use information_schema; let $dbname=db_datadict; let $message= first check status >before< creating the objects ...; --source suite/funcs_1/datadict/datadict_show_schema.inc --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; USE db_datadict; eval create table res_t_401013(f1 char(10), f2 char(25), f3 int) engine = $ENGINE_TYPE; create view res_v_401013 as select * from res_t_401013; CREATE USER u_6_401013@localhost; create procedure sp_6_401013() select 'db_datadict'; create function fn_6_401013() returns int return 0; create index i_6_401013 on res_t_401013(f3); use information_schema; let $message= now check whether all new objects exists in IS ...; --source suite/funcs_1/datadict/datadict_show_schema.inc # cleanup objects use db_datadict; drop index i_6_401013 on res_t_401013; drop table db_datadict.res_t_401013; drop view db_datadict.res_v_401013; DROP USER u_6_401013@localhost; drop procedure sp_6_401013; drop function fn_6_401013; drop database db_datadict; use information_schema; let $message= and now check whether all objects are removed from IS ...; --source suite/funcs_1/datadict/datadict_show_schema.inc # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.14:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.14: Ensure that the alteration of any existing database object # automatically updates all relevant information on that # object in every appropriate INFORMATION_SCHEMA table. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; USE db_datadict; create table res_t_401014(f1 char(10), f2 text(25), f3 int); create view res_v_401014 as select * from res_t_401014; create procedure sp_6_401014() select 'db_datadict'; create function fn_6_401014() returns int return 0; # check current information in information_schema let $dbname=db_datadict; let $message= show existing objects >before< changing them ...; --source suite/funcs_1/datadict/datadict_show_schema.inc # alter objects use db_datadict; alter table res_t_401014 change f1 ff1 int; alter table res_t_401014 engine = innodb; alter table res_t_401014 change f3 f3_new bigint; alter view res_v_401014 as select ff1 from res_t_401014; alter procedure sp_6_401014 sql security invoker; alter function fn_6_401014 comment 'updated comments'; alter database db_datadict character set utf8; # check updated information in information_schema let $message= now check whether the changes are visible in IS ...; --source suite/funcs_1/datadict/datadict_show_schema.inc # cleanup use db_datadict; drop table db_datadict.res_t_401014; drop view db_datadict.res_v_401014; drop procedure sp_6_401014; drop function fn_6_401014; drop database db_datadict; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.15:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.15: Ensure that the dropping of any existing database object # automatically deletes all relevant information on that # object from every appropriate INFORMATION_SCHEMA table. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; USE db_datadict; create table res_t_401015(f1 char(10), f2 text(25), f3 int); create view res_v_401015 as select * from res_t_401015; CREATE USER u_6_401015@localhost; create procedure sp_6_401015() select 'test'; create function fn_6_401015() returns int return 0; create index i_6_401015 on res_t_401015(f3); let $dbname=db_datadict; let $message= show existing objects >before< dropping them ...; --source suite/funcs_1/datadict/datadict_show_schema.inc use db_datadict; drop index i_6_401015 on res_t_401015; drop table db_datadict.res_t_401015; drop view db_datadict.res_v_401015; DROP USER u_6_401015@localhost; drop procedure sp_6_401015; drop function fn_6_401015; #drop database db_datadict; let $message= now check they are really gone ...; --source suite/funcs_1/datadict/datadict_show_schema.inc # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.16:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.16: Ensure that no user may use any INFORMATION_SCHEMA table to # determine any information on a database and/or its # structure unless authorized to get that information. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; CREATE DATABASE db_hidden; USE db_hidden; CREATE TABLE tb_hidden ( c1 TEXT ); USE db_datadict; CREATE TABLE res_t_401016(f1 char(10),f2 text(25),f3 int); CREATE TABLE res_t_401016_1(f1 char(10),f2 text(25),f3 int); CREATE USER 'u_6_401016'@'localhost'; GRANT SELECT ON db_datadict.res_t_401016 TO 'u_6_401016'@'localhost'; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401016, localhost, u_6_401016, , test); USE information_schema; SELECT table_schema, table_name, engine FROM TABLES; # WHERE table_name LIKE 'res_t_401016%'; SHOW TABLES; SELECT * FROM schemata; disconnect u_6_401016; connection default; --source suite/funcs_1/include/show_connection.inc #FIXME: check that GRANT ON i_s is no longer allowed --error 1044 grant usage on information_schema.* to 'u_6_401016'@'localhost'; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401016_1, localhost, u_6_401016, , db_datadict); USE information_schema; SHOW TABLES; SELECT * FROM schemata; disconnect u_6_401016_1; # all tables are checked again later with permission tests # cleanup connection default; use db_datadict; --source suite/funcs_1/include/show_connection.inc DROP USER 'u_6_401016'@'localhost'; drop table res_t_401016; drop table res_t_401016_1; DROP DATABASE db_hidden; #drop database db_datadict; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.17:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.17: Ensure that the SELECT privilege is granted TO PUBLIC WITH # GRANT OPTION on every INFORMATION_SCHEMA table. ################################################################################ CREATE USER 'u_6_401017'@'localhost'; #FIXME: check that GRANT ON i_s is no longer allowed --error 1044 grant select on information_schema.* to u_6_401017@localhost; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401017, localhost, u_6_401017, , test); use information_schema; select * from collation_character_set_applicability; select * from schemata; select table_name from tables; --source suite/funcs_1/datadict/datadict_bug_12777.inc select table_name, column_name, column_type from columns; select character_set_name from character_sets; select collation_name from collations; select routine_name, routine_type from routines; select table_name, index_name from statistics; select table_name from views; select privilege_type from user_privileges; select grantee, privilege_type from schema_privileges; select * from table_privileges; select column_name, privilege_type from column_privileges; select table_name,constraint_type from table_constraints; select table_schema, table_name, column_name from key_column_usage; disconnect u_6_401017; # cleanup connection default; --source suite/funcs_1/include/show_connection.inc DROP USER 'u_6_401017'@'localhost'; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.18:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.18: Ensure that the CREATE VIEW privilege on an # INFORMATION_SCHEMA table may be granted to any user. ################################################################################ CREATE USER 'u_6_401018'@'localhost'; #FIXME: check GRANT on IS --error 1044 GRANT CREATE VIEW ON information_schema.* TO 'u_6_401018'@'localhost'; GRANT ALL ON db_datadict.* TO 'u_6_401018'@'localhost'; SHOW GRANTS FOR 'u_6_401018'@'localhost'; FLUSH PRIVILEGES; --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401018, localhost, u_6_401018, , test); USE db_datadict; create view db_datadict.v_401018 as select * from information_schema.schemata; SELECT * FROM v_401018 ORDER BY 2 DESC; disconnect u_6_401018; #cleanup connection default; --source suite/funcs_1/include/show_connection.inc DROP USER 'u_6_401018'@'localhost'; DROP DATABASE db_datadict; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.19:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.19: Ensure that no other privilege on an INFORMATION_SCHEMA # table is granted, or may be granted, to any user. ################################################################################ CREATE USER 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant alter on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant alter routine on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant create on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant create routine on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant create temporary tables on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant delete on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant drop on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant execute on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant index on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant insert on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant lock tables on information_schema.* to 'u_6_401019'@'localhost'; #FIXME: check GRANT on IS --error 1044 grant update on information_schema.* to 'u_6_401019'@'localhost'; SELECT * FROM information_schema.table_privileges WHERE table_schema = "information_schema"; SELECT * FROM information_schema.column_privileges WHERE table_schema = "information_schema"; # cleanup DROP USER 'u_6_401019'@'localhost'; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.1.20:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.1.20: Ensure that USE INFORMATION_SCHEMA allows the user to # switch to the INFORMATION_SCHEMA database, for query # purposes only. ################################################################################ CREATE USER 'u_6_401020'@'localhost'; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401020, localhost, u_6_401020, , test); USE information_schema; SELECT * FROM schemata; --error 1109 CREATE TABLE tb_not_allowed ( col TEXT ); #FIXME 3.2.1.20: bad message: ERROR 42S02: Unknown table 'tb_not_allowed' in information_schema #FIXME 3.2.1.20: better: ERROR 42000: Access denied for user 'u_6_401020'@'localhost' to database 'information_schema' --error 1109 create view res_v1 as select * from information_schema.schemata; --error 1044 alter table schemata modify catalog_name varchar(255); --error 1044 update schemata set catalog_name = 'abc' where schema_name = 'information_schema'; delimiter //; --error ER_BAD_DB_ERROR CREATE PROCEDURE sp_3_2_1_20() BEGIN INSERT INTO information_schema.schema_privileges (table_schema,privilege_type) VALUES('db2','insert'); END// delimiter ;// --error 1044 DELETE FROM schemata WHERE schema_name = 'information_schema'; disconnect u_6_401020; # cleanup connection default; --source suite/funcs_1/include/show_connection.inc DROP USER 'u_6_401020'@'localhost'; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.2.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.2.1: Ensure that the INFORMATION_SCHEMA.CHARACTER_SETS # table has the following columns, in the following order: # # CHARACTER_SET_NAME (shows a character set name), # DEFAULT_COLLATE_NAME (shows the name of the default # collation for that character set), # DESCRIPTION (shows a descriptive name for that character # set), # MAXLEN (shows the number of bytes used to store each # character supported by that character set). ################################################################################ let $is_table= character_sets; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------ let $message= Testcase 3.2.2.2:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.2.2: Ensure that the table shows the relevant information on # every character set for which the current user or PUBLIC # have the USAGE privilege. ################################################################################ --source suite/funcs_1/include/show_connection.inc SELECT * FROM information_schema.character_sets; # ------------------------------------------------------------------------------ let $message= Testcase 3.2.2.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.2.3: Ensure that the table shows the relevant information on # every character set for which the current user or PUBLIC # have the USAGE privilege. ################################################################################ # Test requirement is erroneous... we cannot grant / revoke privilege for using # a character set. # ------------------------------------------------------------------------------ let $message= Testcase 3.2.3.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.3.1: Ensure that the INFORMATION_SCHEMA.COLLATIONS # table has the following columns, in the following order: # # COLLATION_NAME (shows a collation name), # CHARACTER_SET_NAME (shows the name of the character set to # which the collation applies), # ID (shows a numeric identifier for that collation/character # set combination), # IS_DEFAULT (shows whether the collation is the default # collation for the character set shown), # IS_COMPILED (indicates whether the collation is compiled # into the MySQL server), # SORTLEN (shows a value related to the amount of memory # required to sort strings using this # collation/character set combination). ################################################################################ let $is_table= collations; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.3.2:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.3.2: Ensure that the table shows the relevant information on # every collation for which the current user or PUBLIC have # the USAGE privilege. ################################################################################ SELECT * FROM collations; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.3.3:; --source include/show_msg80.inc ############################################################################### # Testcase 3.2.3.3: Ensure that the table does not show any information on any # collations for which the current user and PUBLIC have no # USAGE privilege. ################################################################################ # Test requirement is erroneous... we cannot grant / revoke privilege for using # a collation. # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.4.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.4.1: Ensure that the # INFORMATION_SCHEMA.COLLATION_CHARACTER_SET_APPLICABILITY # table has the following columns, in the following order: # # COLLATION_NAME (shows the name of a collation), # CHARACTER_SET_NAME (shows the name of a character set to # which that collation applies). ################################################################################ let $is_table= collation_character_set_applicability; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.4.2:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.4.2: Ensure that the table shows the relevant information on # every collation/character set combination for which the # current user or PUBLIC have the USAGE privilege. ################################################################################ SELECT * FROM collation_character_set_applicability; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.4.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.4.3: Ensure that the table does not show any information on any # collation/character set combinations for which the current # user and PUBLIC have no USAGE privilege. ################################################################################ # Test requirement is erroneous... we cannot grant / revoke privilege for using a collation. # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.5.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.5.1: Ensure that the INFORMATION_SCHEMA.COLUMN_PRIVILEGES # table has the following columns, in the following order: # # GRANTEE (shows the name of a user who has either granted, # or been granted a column privilege), # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the name of the schema, or database, # in which the table for which a column privilege has # been granted resides), # TABLE_NAME (shows the name of the table), # COLUMN_NAME (shows the name of the column on which a # column privilege has been granted), # PRIVILEGE_TYPE (shows the type of privilege that was # granted; must be either SELECT, INSERT, UPDATE, or # REFERENCES), # IS_GRANTABLE (shows whether that privilege was granted # WITH GRANT OPTION). ################################################################################ let $is_table= column_privileges; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.5.2 + 3.2.5.3 + 3.2.5.4:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.5.2: Ensure that the table shows the relevant information on # every column privilege which has been granted to the # current user or PUBLIC, or which was granted by the current # user. ################################################################################ # Testcase 3.2.5.3: Ensure that the table does not show any information on any # column privilege which was granted to any user other than # the current user or PUBLIC, or which was granted by any # user other than the current user. ################################################################################ # Testcase 3.2.5.4: Ensure that the table does not show any information on any # privileges that are not column privileges for the current # user. ################################################################################ CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; CREATE USER 'user_3'@'localhost'; --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; USE db_datadict; CREATE TABLE db_datadict.res_t40502 (f1 INT, f2 DECIMAL, f3 TEXT); GRANT SELECT(f1, f3) ON db_datadict.res_t40502 TO 'user_1'@'localhost'; GRANT INSERT(f1) ON db_datadict.res_t40502 TO 'user_1'@'localhost'; GRANT UPDATE(f2) ON db_datadict.res_t40502 TO 'user_1'@'localhost'; GRANT SELECT(f2) ON db_datadict.res_t40502 TO 'user_2'@'localhost'; GRANT INSERT, SELECT ON db_datadict.res_t40502 TO 'user_3'@'localhost'; GRANT SELECT(f3) ON db_datadict.res_t40502 TO 'user_3'@'localhost'; GRANT INSERT, SELECT ON db_datadict.res_t40502 TO 'user_3'@'localhost' WITH GRANT OPTION; GRANT ALL ON db_datadict.* TO 'user_3'@'localhost'; let $select= SELECT * FROM information_schema.column_privileges WHERE grantee LIKE "'user%" ORDER BY grantee, table_name, column_name, privilege_type; eval $select; let $message= FIXME: Check it is correct that the following GRANT changes ALL privs that user_1 has; --source include/show_msg.inc GRANT UPDATE(f3) ON db_datadict.res_t40502 TO 'user_1'@'localhost' WITH GRANT OPTION; eval $select; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_5_1, localhost, user_1, , db_datadict); eval $select; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_5_2, localhost, user_2, , db_datadict); eval $select; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_5_3, localhost, user_3, , db_datadict); let $message= FIXME: check it is correct that granted TABLES doesn_t occur in COLUMN_PRIVILEGES; --source include/show_msg.inc SELECT * FROM information_schema.table_privileges WHERE grantee LIKE "'user%"; SELECT * FROM information_schema.schema_privileges WHERE grantee LIKE "'user%"; eval $select; GRANT SELECT(f1, f3) ON db_datadict.res_t40502 TO 'user_2'@'localhost'; let $message= FIXME: check whether it is intended that *my* grants to others are *NOT* shown here; --source include/show_msg.inc eval $select; connection user_5_2; --source suite/funcs_1/include/show_connection.inc eval $select; disconnect user_5_1; disconnect user_5_2; disconnect user_5_3; #cleanup connection default; --source suite/funcs_1/include/show_connection.inc --disable_warnings DROP TABLE IF EXISTS db_datadict.res_t40502; DROP DATABASE IF EXISTS db_datadict; --enable_warnings DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP USER 'user_3'@'localhost'; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.6.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.6.1: Ensure that the INFORMATION_SCHEMA.COLUMNS table has the # following columns, in the following order: # # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the name of the database, or schema, # in which an accessible table resides), # TABLE_NAME (shows the name of an accessible table), # COLUMN_NAME (shows the name of a column within that # table), # ORDINAL_POSITION (shows the ordinal position of that # column in that table), # COLUMN_DEFAULT (shows the column's default value), # IS_NULLABLE (shows whether the column may accept NULL # values), # DATA_TYPE (shows the column's defined data type; keyword # only), # CHARACTER_MAXIMUM_LENGTH (shows, for a string column, the # column's defined maximum length in characters; # otherwise NULL), # CHARACTER_OCTET_LENGTH (shows, for a string column, the # column's defined maximum length in octets; # otherwise NULL), # NUMERIC_PRECISION (shows, for a numeric column, the # column's or data type's defined precision; # otherwise NULL), # NUMERIC_SCALE (shows, for a numeric column, the column's # or data type's defined scale; otherwise NULL), # CHARACTER_SET_NAME (shows, for a character string column, # the column's default character set; otherwise NULL), # COLLATION_NAME (shows, for a character string column, the # column's default collation; otherwise NULL), # COLUMN_TYPE (shows the column's complete, defined data # type), # COLUMN_KEY (shows whether the column is indexed; possible # values are PRI if the column is part of a PRIMARY # KEY, UNI if the column is part of a UNIQUE key, MUL # if the column is part of an index key that allows # duplicates), # EXTRA (shows any additional column definition information, # e.g. whether the column was defined with the # AUTO_INCREMENT attribute), # PRIVILEGES (shows the privileges available to the user on # the column), # COLUMN_COMMENT (shows the comment, if any, defined for the # comment; otherwise NULL). ################################################################################ let $is_table= columns; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.6.2 + 3.2.6.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.6.2: Ensure that the table shows the relevant information on the # columns of every table that is accessible to the current # user or to PUBLIC. ################################################################################ # Testcase 3.2.6.3: Ensure that the table does not show any information on the # columns of any table which is not accessible to the current # user or PUBLIC. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; USE db_datadict; create table t_6_406001(f1 char(10), f2 text, f3 date, f4 int); grant select(f1, f2) on db_datadict.t_6_406001 to 'user_1'@'localhost'; create table t_6_406002(f1 char(10), f2 text, f3 date, f4 int); GRANT INSERT(f1, f2) ON db_datadict.t_6_406002 TO 'user_2'@'localhost'; FLUSH PRIVILEGES; let $select= SELECT * FROM information_schema.columns ORDER BY table_schema, table_name, ordinal_position; # show view of user root --source suite/funcs_1/datadict/datadict_bug_12777.inc eval $select; # reconnect to mysql with user credential of user u_6_406002_1. --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_6_1, localhost, user_1, , db_datadict); --source suite/funcs_1/datadict/datadict_bug_12777.inc eval $select; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_6_2, localhost, user_2, , db_datadict); --source suite/funcs_1/datadict/datadict_bug_12777.inc eval $select; disconnect user_6_1; disconnect user_6_2; connection default; --source suite/funcs_1/include/show_connection.inc let $message= Show the quotient of COL and CML for all COLUMNS; --source include/show_msg.inc SELECT DISTINCT CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH AS COL_CML, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.columns WHERE CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH = 1 ORDER BY CHARACTER_SET_NAME, COLLATION_NAME, COL_CML; #FIXME 3.2.6.2: check the value 2.0079 tinytext ucs2 ucs2_general_ci SELECT DISTINCT CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH AS COL_CML, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.columns WHERE CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH <> 1 ORDER BY CHARACTER_SET_NAME, COLLATION_NAME, COL_CML; SELECT DISTINCT CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH AS COL_CML, DATA_TYPE, CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.columns WHERE CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH IS NULL ORDER BY CHARACTER_SET_NAME, COLLATION_NAME, COL_CML; echo --> CHAR(0) is allowed (see manual), and here both CHARACHTER_* values; echo --> are 0, which is intended behavior, and the result of 0 / 0 IS NULL; --source suite/funcs_1/datadict/datadict_bug_12777.inc SELECT CHARACTER_OCTET_LENGTH / CHARACTER_MAXIMUM_LENGTH AS COL_CML, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE FROM information_schema.columns ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION; #cleanup DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP TABLE IF EXISTS t_6_406001; DROP TABLE IF EXISTS t_6_406002; DROP DATABASE IF EXISTS db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.7.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.7.1: Ensure that the INFORMATION_SCHEMA.KEY_COLUMN_USAGE # table has the following columns, in the following order: # # CONSTRAINT_CATALOG (always shows NULL), # CONSTRAINT_SCHEMA (shows the database, or schema, in which # an accessible constraint, or index, resides), # CONSTRAINT_NAME (shows the name of the accessible # constraint), # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the database, or schema, in which the # table constrained by that constraint resides), # TABLE_NAME (shows the name of the table constrained by the # constraint), # COLUMN_NAME (shows the name of a column that is the index # key, or part of the index key), # ORDINAL_POSITION (shows the ordinal position of the column # within the constraint index), # POSITION_IN_UNIQUE_CONSTRAINT (shows, for a foreign key # column, the ordinal position of the referenced # column within the referenced unique index; # otherwise NULL). # added with 5.0.6: REFERENCED_TABLE_SCHEMA, # REFERENCED_TABLE_NAME, # REFERENCED_COLUMN_NAME ################################################################################ let $is_table= key_column_usage; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.7.2 + 3.2.7.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.7.2: Ensure that the table shows the relevant information on # every column, defined to be part of an index key, which is # accessible to the current user or to PUBLIC. ################################################################################ # Testcase 3.2.7.3: Ensure that the table does not show any information on any # indexed column that is not accessible to the current user # or PUBLIC. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; USE db_datadict; CREATE TABLE t_40701 ( f1 INT NOT NULL, PRIMARY KEY(f1), f2 INT, INDEX f2_ind(f2) ); GRANT SELECT ON t_40701 to 'user_1'@'localhost'; CREATE TABLE t_40702 ( f1 INT NOT NULL, PRIMARY KEY(f1), f2 INT, INDEX f2_ind(f2) ); GRANT SELECT ON t_40702 to 'user_2'@'localhost'; #FIXME: add foreign keys FLUSH PRIVILEGES; let $select= SELECT * FROM information_schema.key_column_usage ORDER BY constraint_catalog, constraint_schema, constraint_name, table_catalog, table_schema, table_name, ordinal_position; # show view of user root eval $select; # reconnect to mysql with user credential of user u_6_406002_1. --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_7_1, localhost, user_1, , db_datadict); eval $select; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_7_2, localhost, user_2, , db_datadict); eval $select; disconnect user_7_1; disconnect user_7_2; #cleanup connection default; --source suite/funcs_1/include/show_connection.inc DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP TABLE t_40701; DROP TABLE t_40702; DROP DATABASE IF EXISTS db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.8.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.8.1: Ensure that the INFORMATION_SCHEMA.ROUTINES # table has the following columns, in the following order: # # SPECIFIC_NAME (shows the name of an accessible stored # procedure, or routine), # ROUTINE_CATALOG (always shows NULL), # ROUTINE_SCHEMA (shows the database, or schema, in which # the routine resides), # ROUTINE_NAME (shows the same stored procedure name), # ROUTINE_TYPE (shows whether the stored procedure is a # procedure or a function), # DTD_IDENTIFIER (shows, for a function, the complete # data type definition of the value the function will # return; otherwise NULL), # ROUTINE_BODY (shows the language in which the stored # procedure is written; currently always SQL), # ROUTINE_DEFINITION (shows as much of the routine body as # is possible in the allotted space), # EXTERNAL_NAME (always shows NULL), # EXTERNAL_LANGUAGE (always shows NULL), # PARAMETER_STYLE (shows the routine's parameter style; # always SQL), # IS_DETERMINISTIC (shows whether the routine is # deterministic), # SQL_DATA_ACCESS (shows the routine's defined # sql-data-access clause value), # SQL_PATH (always shows NULL), # SECURITY_TYPE (shows whether the routine's defined # security_type is 'definer' or 'invoker'), # CREATED (shows the timestamp of the time the routine was # created), # LAST_ALTERED (shows the timestamp of the time the routine # was last altered), # SQL_MODE (shows the sql_mode setting at the time the # routine was created), # ROUTINE_COMMENT (shows the comment, if any, defined for # the routine; otherwise NULL), # DEFINER (shows the user who created the routine). ################################################################################ let $is_table= routines; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.8.2 + 3.2.8.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.8.2: Ensure that the table shows the relevant information on # every SQL-invoked routine (i.e. stored procedure) which is # accessible to the current user or to PUBLIC. ################################################################################ # Testcase 3.2.8.3: Ensure that the table does not show any information on any # stored procedure that is not accessible to the current user # or PUBLIC.; ############################################################################## --disable_warnings DROP DATABASE IF EXISTS db_datadict; DROP DATABASE IF EXISTS db_datadict_2; --enable_warnings CREATE DATABASE db_datadict; USE db_datadict; CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; CREATE USER 'user_3'@'localhost'; CREATE TABLE res_6_408002_1(f1 CHAR(3), f2 TEXT(25), f3 DATE, f4 INT); INSERT INTO res_6_408002_1(f1, f2, f3, f4) VALUES('abc', 'xyz', '1989-11-09', 0815); --disable_warnings DROP PROCEDURE IF EXISTS sp_6_408002_1; --enable_warnings delimiter //; CREATE PROCEDURE sp_6_408002_1() BEGIN SELECT * FROM db_datadict.res_6_408002_1; END// delimiter ;// CREATE DATABASE db_datadict_2; USE db_datadict_2; CREATE TABLE res_6_408002_2(f1 CHAR(3), f2 TEXT(25), f3 DATE, f4 INT); INSERT INTO res_6_408002_2(f1, f2, f3, f4) VALUES('abc', 'xyz', '1990-10-03', 4711); --disable_warnings DROP PROCEDURE IF EXISTS sp_6_408002_2; --enable_warnings delimiter //; CREATE PROCEDURE sp_6_408002_2() BEGIN SELECT * FROM db_datadict_2.res_6_408002_2; END// delimiter ;// GRANT SELECT ON db_datadict_2.* TO 'user_1'@'localhost'; GRANT EXECUTE ON db_datadict_2.* TO 'user_1'@'localhost'; GRANT EXECUTE ON db_datadict.* TO 'user_1'@'localhost'; GRANT SELECT ON db_datadict.* TO 'user_2'@'localhost'; GRANT EXECUTE ON PROCEDURE db_datadict_2.sp_6_408002_2 TO 'user_2'@'localhost'; GRANT EXECUTE ON db_datadict_2.* TO 'user_2'@'localhost'; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_8_1, localhost, user_1, , db_datadict); --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.routines; disconnect user_8_1; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_8_2, localhost, user_2, , db_datadict); --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.routines; disconnect user_8_2; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_8_3, localhost, user_3, , test); --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.routines; disconnect user_8_3; # clean-up connection default; --source suite/funcs_1/include/show_connection.inc DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP USER 'user_3'@'localhost'; use db_datadict; DROP TABLE res_6_408002_1; DROP PROCEDURE sp_6_408002_1; USE db_datadict_2; DROP TABLE res_6_408002_2; DROP PROCEDURE sp_6_408002_2; USE test; DROP DATABASE db_datadict; DROP DATABASE db_datadict_2; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.8.4:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.8.4: Ensure that a stored procedure with a routine body that is # too large to fit into the # INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION column # correctly shows as much of the information as is possible # within the allotted size. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; USE db_datadict; create table res_6_408004_1(f1 longtext , f2 mediumint , f3 longblob , f4 real , f5 year); insert into res_6_408004_1 values ('abc', 98765 , 99999999 , 98765, 10); --disable_warnings drop procedure if exists sp_6_408004; --enable_warnings create table res_6_408004_2(f1 longtext , f2 mediumint , f3 longblob , f4 real , f5 year); insert into res_6_408004_2 values ('abc', 98765 , 99999999 , 98765, 10); let $message= Checking the max. possible length of (currently) 4 GByte is not possible in this environment here.; --source include/show_msg.inc delimiter //; create procedure sp_6_408004 () begin declare done integer default 0; declare variable_number_1 longtext; declare variable_number_2 mediumint; declare variable_number_3 longblob; declare variable_number_4 real; declare variable_number_5 year; declare cursor_number_1 cursor for select * from res_6_408004_1 limit 0, 10; declare cursor_number_2 cursor for select * from res_6_408004_1 limit 0, 10; declare cursor_number_3 cursor for select * from res_6_408004_1 limit 0, 10; declare cursor_number_4 cursor for select * from res_6_408004_1 limit 0, 10; declare cursor_number_5 cursor for select * from res_6_408004_1 limit 0, 10; declare continue handler for sqlstate '02000' set done = 1; begin open cursor_number_1; while done <> 1 do fetch cursor_number_1 into variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5; if done <> 0 then insert into res_6_408004_2 values (variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5); end if; end while; begin begin set done = 0; open cursor_number_2; while done <> 1 do fetch cursor_number_2 into variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5; if done <> 0 then insert into res_6_408004_2 values(variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5); end if; end while; end; set done = 0; open cursor_number_3; while done <> 1 do fetch cursor_number_3 into variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5; if done <> 0 then insert into res_6_408004_2 values(variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5); end if; end while; end; end; begin set done = 0; open cursor_number_4; while done <> 1 do fetch cursor_number_4 into variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5; if done <> 0 then insert into res_6_408004_2 values (variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5); end if; end while; end; begin set @a='test row'; select @a; select @a; select @a; end; begin set done = 0; open cursor_number_5; while done <> 1 do fetch cursor_number_5 into variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5; if done <> 0 then insert into res_6_408004_2 values (variable_number_1, variable_number_2, variable_number_3, variable_number_4, variable_number_5); end if; end while; end; begin set @a='test row'; select @a; select @a; select @a; end; end// delimiter ;// call sp_6_408004 (); select * from res_6_408004_2; --vertical_results --replace_column 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT *, LENGTH(routine_definition) FROM information_schema.routines WHERE routine_schema = 'db_datadict'; --horizontal_results # clean-up use db_datadict; drop procedure sp_6_408004; drop table res_6_408004_1; drop table res_6_408004_2; use test; drop database db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.9.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.9.1: Ensure that the INFORMATION_SCHEMA.SCHEMATA # table has the following columns, in the following order: # # CATALOG_NAME (always shows NULL), # SCHEMA_NAME (shows the name of a database, or schema, on # which the current user or PUBLIC has privileges), # DEFAULT_CHARACTER_SET_NAME (shows the name of that # database's default character set), # DEFAULT_COLLATION_NAME (shows the database default # collation) # SQL_PATH (always shows NULL). ################################################################################ let $is_table= schemata; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.9.2 + 3.2.9.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.9.2: Ensure that the table shows the relevant information for # every database on which the current user or PUBLIC have # privileges. ################################################################################ # Testcase 3.2.9.3: Ensure that the table does not show any information on any # databases on which the current user and PUBLIC have no # privileges. ################################################################################ CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; CREATE USER 'user_3'@'localhost'; --disable_warnings DROP DATABASE IF EXISTS db_datadict_1; DROP DATABASE IF EXISTS db_datadict_2; --enable_warnings CREATE DATABASE db_datadict_1; CREATE DATABASE db_datadict_2; GRANT SELECT ON db_datadict_1.* to 'user_1'@'localhost'; GRANT SELECT ON db_datadict_2.* to 'user_2'@'localhost'; FLUSH PRIVILEGES; # shows db_1 --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_9_1, localhost, user_1, , db_datadict_1); SELECT COUNT(*) FROM information_schema.schemata; SELECT * FROM information_schema.schemata; disconnect user_9_1; # shows db_2 --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_9_2, localhost, user_2, , db_datadict_2); SELECT COUNT(*) FROM information_schema.schemata; SELECT * FROM information_schema.schemata; disconnect user_9_2; # shows neither db_1 nor db_2 --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_9_3, localhost, user_3, , test); SELECT COUNT(*) FROM information_schema.schemata; SELECT * FROM information_schema.schemata; disconnect user_9_3; # clean-up connection default; --source suite/funcs_1/include/show_connection.inc DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP USER 'user_3'@'localhost'; DROP DATABASE db_datadict_1; DROP DATABASE db_datadict_2; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.10.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.10.1: Ensure that the INFORMATION_SCHEMA.TABLE_CONSTRAINTS # table has the following columns, in the following order: # # CONSTRAINT_CATALOG (always shows NULL), # CONSTRAINT_SCHEMA (shows the database, or schema, in which # a constraint an accessible table resides), # CONSTRAINT_NAME (shows the name of a constraint defined on # an accessible table), # TABLE_SCHEMA (shows the database, or schema, in which the # table resides), # TABLE_NAME (shows the name of the table), # CONSTRAINT_TYPE (shows the type of the constraint; either # 'primary key', 'foreign key', 'unique', 'check'). ################################################################################ let $is_table= table_constraints; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.10.2 + 3.2.10.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.10.2: Ensure that the table shows the relevant information on all # constraints defined on every table for which the current # user or PUBLIC have privileges. ################################################################################ # Testcase 3.2.10.3: Ensure that the table does not show any information on # constraints defined on any table for which the current user # and PUBLIC have no privileges. ################################################################################ CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; --disable_warnings DROP DATABASE IF EXISTS db_datadict; DROP DATABASE IF EXISTS db_datadict_2; --enable_warnings CREATE DATABASE db_datadict; CREATE DATABASE db_datadict_2; USE db_datadict; CREATE TABLE res_6_401003_1(f1 INT NOT NULL, PRIMARY KEY(f1), f2 INT, INDEX f2_ind(f2)); USE db_datadict_2; CREATE TABLE res_6_401003_2(f1 INT NOT NULL, PRIMARY KEY(f1), f2 INT, INDEX f2_ind(f2)); GRANT SELECT ON db_datadict.res_6_401003_1 TO 'user_1'@'localhost'; GRANT SELECT ON db_datadict_2.res_6_401003_2 TO 'user_2'@'localhost'; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_10_1, localhost, user_1, , db_datadict); SELECT * FROM information_schema.table_constraints; SELECT COUNT(*) FROM information_schema.table_constraints; disconnect user_10_1; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_10_2, localhost, user_2, , db_datadict_2); SELECT * FROM information_schema.table_constraints; SELECT COUNT(*) FROM information_schema.table_constraints; disconnect user_10_2; # clean-up connection default; use db_datadict; --source suite/funcs_1/include/show_connection.inc DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP TABLE res_6_401003_1; USE db_datadict_2; DROP TABLE res_6_401003_2; USE test; DROP DATABASE db_datadict; DROP DATABASE db_datadict_2; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.11.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.11.1: Ensure that the INFORMATION_SCHEMA.TABLE_PRIVILEGES # table has the following columns, in the following order: # # GRANTEE (shows the name of a user who has either granted, # or been granted a table privilege), # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the name of the schema, or database, # in which the table for which a privilege has been # granted resides), # TABLE_NAME (shows the name of the table), # PRIVILEGE_TYPE (shows the type of privilege that was # granted; must be either SELECT, INSERT, UPDATE, # DELETE, REFERENCES, ALTER, INDEX, DROP, or CREATE # VIEW), # IS_GRANTABLE (shows whether that privilege was granted # WITH GRANT OPTION). ################################################################################ let $is_table= table_privileges; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.11.2 + 3.2.11.3 + 3.2.11.4:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.11.2: Ensure that the table shows the relevant information on # every table privilege which has been granted to the current # user or PUBLIC, or which was granted by the current user. ################################################################################ # Testcase 3.2.11.3: Ensure that the table does not show any information on any # table privilege which was granted to any user other than # the current user or PUBLIC, or which was granted by any # user other than the current user. ################################################################################ # Testcase 3.2.11.4: Ensure that the table does not show any information on any # privileges that are not table privileges for the current # user. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings create database db_datadict; CREATE USER 'user_1'@'localhost'; GRANT CREATE, SELECT ON db_datadict.* TO 'user_1'@'localhost' WITH GRANT OPTION; CREATE USER 'user_2'@'localhost'; CREATE USER 'user_3'@'localhost'; use db_datadict; create table tb1(f1 int, f2 int, f3 int); grant select on db_datadict.tb1 to 'user_1'@'localhost'; GRANT ALL on db_datadict.tb1 to 'user_2'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_11_1, localhost, user_1, , db_datadict); CREATE TABLE tb3 (f1 TEXT); GRANT SELECT ON db_datadict.tb3 to 'user_3'@'localhost'; SELECT * FROM information_schema.table_privileges WHERE table_name LIKE 'tb%'; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_11_2, localhost, user_2, , db_datadict); # we see only table privileges for this user, and not any other privileges SELECT * FROM information_schema.table_privileges; SELECT USER(), COUNT(*) FROM information_schema.table_privileges WHERE grantee = USER(); SELECT USER(), COUNT(*) FROM information_schema.table_privileges WHERE grantee = "'user_2'@'localhost'"; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_11_3, localhost, user_3, , db_datadict); # we see only table privileges for this user, and not any other privileges SELECT * FROM information_schema.table_privileges; connection default; --source suite/funcs_1/include/show_connection.inc # we see only 'public' table privileges SELECT * FROM information_schema.table_privileges; # clean-up connection default; --source suite/funcs_1/include/show_connection.inc disconnect user_11_1; disconnect user_11_2; disconnect user_11_3; DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP USER 'user_3'@'localhost'; drop table db_datadict.tb1; drop table db_datadict.tb3; use test; drop database db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.12.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.12.1: Ensure that the INFORMATION_SCHEMA.TABLES # table has the following columns, in the following order: # # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the name of the database, or schema, # in which an accessible table resides), # TABLE_NAME (shows the name of a table which the current # user may access), # TABLE_TYPE (shows whether the table is a BASE TABLE, a # TEMPORARY table, or a VIEW), # ENGINE (shows the storage engine used for the table), # VERSION (shows the version number of the table's .frm # file), # ROW_FORMAT (shows the table's row storage format; either # FIXED, DYNAMIC or COMPRESSED), # TABLE_ROWS (shows the number of rows in the table), # AVG_ROW_LENGTH (shows the average length of the table's # rows), # DATA_LENGTH (shows the length of the table's data file), # MAX_DATA_LENGTH (shows the maximum length of the table's # data file), # INDEX_LENGTH (shows the length of the index file # associated with the table), # DATA_FREE (shows the number of allocated, unused bytes), # AUTO_INCREMENT (shows the next AUTO_INCREMENT value, where # applicable), # CREATE_TIME (shows the timestamp of the time the table was # created), # UPDATE_TIME (shows the timestamp of the time the table's # data file was last updated), # CHECK_TIME (shows the timestamp of the time the table was # last checked), # TABLE_COLLATION (shows the table's default collation), # CHECKSUM (shows the live checksum value for the table, if # any; otherwise NULL), # CREATE_OPTIONS (shows any additional options used in the # table's definition; otherwise NULL), # TABLE_COMMENT (shows the comment added to the table's # definition; otherwise NULL). ################################################################################ let $is_table= tables; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.12.2 + 3.2.12.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.12.2: Ensure that the table shows the relevant information on # every base table and view on which the current user or # PUBLIC has privileges. ################################################################################ # Testcase 3.2.12.3: Ensure that the table does not show any information on any # tables on which the current user and public have no # privileges. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings create database db_datadict; CREATE USER 'user_1'@'localhost'; GRANT CREATE, CREATE VIEW, INSERT, SELECT ON db_datadict.* TO 'user_1'@'localhost' WITH GRANT OPTION; CREATE USER 'user_2'@'localhost'; CREATE USER 'user_3'@'localhost'; use db_datadict; create table tb1(f1 int, f2 int, f3 int); grant select on db_datadict.tb1 to 'user_1'@'localhost'; GRANT ALL on db_datadict.tb1 to 'user_2'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_12_1, localhost, user_1, , db_datadict); # tb2 is not granted to anyone CREATE TABLE tb2 (f1 DECIMAL); CREATE TABLE tb3 (f1 TEXT); GRANT SELECT ON db_datadict.tb3 to 'user_3'@'localhost'; GRANT INSERT ON db_datadict.tb3 to 'user_2'@'localhost'; CREATE VIEW v3 AS SELECT * FROM tb3; GRANT SELECT ON db_datadict.v3 to 'user_3'@'localhost'; #FIXME 3.2.12: we split the "SELECT * FROM tables" in two parts until #FIXME 3.2.12: Bug #12397: wrong values shown in column CREATE_OPTIONS of #FIXME 3.2.12: INFORMATION_SCHEMA.TABLES is solved, one with 'more' and one #FIXME 3.2.12: with 'less' replace # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME # 20 CREATE_OPTIONS if ($have_bug_11589) { --disable_ps_protocol } --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" 20 "#CO#" SELECT * FROM information_schema.tables WHERE table_schema = 'information_schema'; # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.tables WHERE NOT( table_schema = 'information_schema'); --enable_ps_protocol --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_12_2, localhost, user_2, , db_datadict); # we see only tables for this user, and not any other #FIXME 3.2.12: we split the "SELECT * FROM tables" in two parts until #FIXME 3.2.12: Bug #12397: wrong values shown in column CREATE_OPTIONS of #FIXME 3.2.12: INFORMATION_SCHEMA.TABLES is solved, one with 'more' and one #FIXME 3.2.12: with 'less' replace # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME # 20 CREATE_OPTIONS if ($have_bug_11589) { --disable_ps_protocol } --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" 20 "#CO#" SELECT * FROM information_schema.tables WHERE table_schema = 'information_schema'; # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.tables WHERE NOT( table_schema = 'information_schema'); --enable_ps_protocol --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_12_3, localhost, user_3, , db_datadict); # we see only tables for this user, and not any other # #FIXME 3.2.12: we split the "SELECT * FROM tables" in two parts until #FIXME 3.2.12: Bug #12397: wrong values shown in column CREATE_OPTIONS of #FIXME 3.2.12: INFORMATION_SCHEMA.TABLES is solved, one with 'more' and one #FIXME 3.2.12: with 'less' replace # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME # 20 CREATE_OPTIONS if ($have_bug_11589) { --disable_ps_protocol } --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" 20 "#CO#" SELECT * FROM information_schema.tables WHERE table_schema = 'information_schema'; # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.tables WHERE NOT( table_schema = 'information_schema'); --enable_ps_protocol connection default; --source suite/funcs_1/include/show_connection.inc # we see only 'public' tables # #FIXME 3.2.12: we split the "SELECT * FROM tables" in two parts until #FIXME 3.2.12: Bug #12397: wrong values shown in column CREATE_OPTIONS of #FIXME 3.2.12: INFORMATION_SCHEMA.TABLES is solved, one with 'more' and one #FIXME 3.2.12: with 'less' replace # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME # 20 CREATE_OPTIONS if ($have_bug_11589) { --disable_ps_protocol } --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" 20 "#CO#" SELECT * FROM information_schema.tables WHERE table_schema = 'information_schema'; # 9 AVG_ROW_LENGTH # 10 DATA_LENGTH # 11 MAX_DATA_LENGTH # 12 INDEX_LENGTH # 13 DATA_FREE # 15 CREATE_TIME # 16 UPDATE_TIME # 17 CHECK_TIME --replace_column 9 "#ARL#" 10 "#DL#" 11 "#MDL#" 12 "#IL#" 13 "#DF#" 15 "YYYY-MM-DD hh:mm:ss" 16 "YYYY-MM-DD hh:mm:ss" 17 "YYYY-MM-DD hh:mm:ss" SELECT * FROM information_schema.tables WHERE NOT( table_schema = 'information_schema'); --enable_ps_protocol # clean-up disconnect user_12_1; disconnect user_12_2; disconnect user_12_3; DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP USER 'user_3'@'localhost'; DROP TABLE db_datadict.tb1; DROP TABLE db_datadict.tb3; DROP VIEW db_datadict.v3; USE test; DROP DATABASE db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.13.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.13.1: Ensure that the INFORMATION_SCHEMA.VIEWS # table has the following columns, in the following order: # # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the database, or schema, in which an # accessible view resides), # TABLE_NAME (shows the name of a view accessible to the # current user), # VIEW_DEFINITION (shows the SELECT statement that makes # up the view's definition), # CHECK_OPTION (shows the value of the WITH CHECK OPTION # clause used to define the view, either NONE, LOCAL # or CASCADED), # IS_UPDATABLE (shows whether the view is an updatable # view), # DEFINER (added with 5.0.14), # SECURITY_TYPE (added with 5.0.14). ################################################################################ let $is_table= views; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.13.2 + 3.2.13.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.13.2: Ensure that the table shows the relevant information on # every view for which the current user or PUBLIC has the # SHOW CREATE VIEW privilege. ################################################################################ # Testcase 3.2.13.3: Ensure that the table does not show any information on any # views for which the current user and PUBLIC have no SHOW # CREATE VIEW privilege. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings CREATE DATABASE db_datadict; CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; CREATE USER 'user_no_views'@'localhost'; USE db_datadict; CREATE TABLE tb_401302(f1 INT, f2 INT, f3 INT); CREATE VIEW v_granted_to_1 AS SELECT * FROM tb_401302; CREATE VIEW v_granted_glob AS SELECT f2, f3 FROM tb_401302; GRANT SELECT ON db_datadict.tb_401302 TO 'user_1'@'localhost'; GRANT SELECT ON db_datadict.v_granted_to_1 TO 'user_1'@'localhost'; GRANT SHOW VIEW, CREATE VIEW ON db_datadict.* TO 'user_2'@'localhost'; FLUSH PRIVILEGES; SELECT * FROM information_schema.views; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_13_1, localhost, user_1, , test); SELECT * FROM information_schema.views; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_13_2, localhost, user_2, , test); SELECT * FROM information_schema.views; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_no_views, localhost, user_no_views, , test); SELECT * FROM information_schema.views; # clean-up connection default; --source suite/funcs_1/include/show_connection.inc disconnect user_13_1; disconnect user_13_2; disconnect user_no_views; USE db_datadict; DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP USER 'user_no_views'@'localhost'; DROP VIEW v_granted_to_1; DROP TABLE tb_401302; DROP VIEW v_granted_glob; USE test; DROP DATABASE db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.14.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.14.1: Ensure that the INFORMATION_SCHEMA.STATISTICS # table has the following columns, in the following order: # # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the database, or schema, in which a # table indexed by an accessible index resides), # TABLE_NAME (shows the name of the indexed table), # NON_UNIQUE (shows whether the index may contain duplicate # values; 0 if it cannot, 1 if it can), # INDEX_SCHEMA (shows the database, or schema, in which an # accessible index resides), # INDEX_NAME (shows the name of an index which the current # user may access), # SEQ_IN_INDEX (shows the ordinal position of an indexed # column within the index), # COLUMN_NAME (shows the name of a column that comprises # some, or all, of an index key), # COLLATION (shows how the column is sorted in the index; # either A for ascending or NULL for unsorted # columns), # CARDINALITY (shows the number of unique values in the # index), # SUB_PART (shows the number of indexed characters if the # index is a prefix index), # PACKED (shows how the index key is packed), # NULLABLE (shows whether the index column may contain NULL # values), # INDEX_TYPE (shows the index type; either BTREE, FULLTEXT, # HASH or RTREE), # COMMENT (shows a comment on the index, if any). ################################################################################ let $is_table= statistics; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.14.2 + 3.2.14.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.14.2: Ensure that the table shows the relevant information on # every index which the current user or PUBLIC may access # (usually because privileges on the indexed table have been # granted). ################################################################################ # Testcase 3.2.14.3: Ensure that the table does not show any information on any # indexes which the current user and PUBLIC may not access. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; DROP DATABASE IF EXISTS db_datadict_2; --enable_warnings CREATE DATABASE db_datadict; CREATE DATABASE db_datadict_2; CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; USE db_datadict; create table tb_6_401402_1(f1 int not null, primary key(f1), f2 int, index f2_ind(f2)); create table tb_6_401402_2(f1 int not null, primary key(f1), f2 int, index f2_ind(f2)); grant select on db_datadict.tb_6_401402_1 to 'user_1'@'localhost' WITH GRANT OPTION; USE db_datadict_2; create table tb_2_1(f1 int not null, primary key(f1), f2 int, index f2_ind(f2)); create table tb_2_2(f1 int not null, primary key(f1), f2 int, index f2_ind(f2)); grant select on db_datadict_2.tb_2_1 to 'user_1'@'localhost'; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_14_1, localhost, user_1, , test); SELECT * FROM information_schema.statistics; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_14_2, localhost, user_2, , test); SELECT * FROM information_schema.statistics; connection default; --source suite/funcs_1/include/show_connection.inc REVOKE SELECT ON db_datadict.tb_6_401402_1 FROM 'user_1'@'localhost'; SELECT * FROM information_schema.statistics; # nothing visible for user_1 connection user_14_1; --source suite/funcs_1/include/show_connection.inc SELECT * FROM information_schema.statistics; # no changes visible for user_2 connection user_14_2; --source suite/funcs_1/include/show_connection.inc SELECT * FROM information_schema.statistics; # cleanup connection default; --source suite/funcs_1/include/show_connection.inc disconnect user_14_1; disconnect user_14_2; USE db_datadict; DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP TABLE tb_6_401402_1; DROP TABLE tb_6_401402_2; USE test; DROP DATABASE db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.15.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.15.1: Ensure that the INFORMATION_SCHEMA.SCHEMA_PRIVILEGES # table has the following columns, in the following order: # # GRANTEE (shows a user to whom a schema privilege has been # granted), # TABLE_CATALOG (always shows NULL), # TABLE_SCHEMA (shows the name of the database, or schema, # on which the privilege has been granted), # PRIVILEGE_TYPE (shows the granted privilege), # IS_GRANTABLE (shows whether the privilege was granted WITH # GRANT OPTION). ################################################################################ let $is_table= schema_privileges; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.15.2:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.15.2: Ensure that the table shows the relevant information on # every schema-level privilege which has been granted to the # current user or to PUBLIC, or has been granted by the # current user. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; DROP DATABASE IF EXISTS db_datadict_2; --enable_warnings create database db_datadict; create database db_datadict_2; CREATE USER 'u_6_401502'@'localhost'; use db_datadict; create table res_6_401502(f1 int, f2 int, f3 int); grant insert on db_datadict.* to 'u_6_401502'@'localhost'; FLUSH PRIVILEGES; SELECT * FROM information_schema.schema_privileges; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401502, localhost, u_6_401502, , test); SELECT * FROM information_schema.schema_privileges; disconnect u_6_401502; # clean-up connection default; use db_datadict; --source suite/funcs_1/include/show_connection.inc DROP USER 'u_6_401502'@'localhost'; drop table res_6_401502; use test; drop database db_datadict; drop database db_datadict_2; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.15.3 + 3.2.15.4:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.15.3: Ensure that the table does not show any information on any # schema-level privileges which have been granted to users # other than the current user or to PUBLIC, or that have been # granted by any user other than the current user. ################################################################################ # Testcase 3.2.15.4: Ensure that the table does not show any information on any # privileges that are not schema-level privileges for the # current user. ################################################################################ --disable_warnings DROP DATABASE IF EXISTS db_datadict; DROP DATABASE IF EXISTS db_datadict_2; --enable_warnings create database db_datadict; create database db_datadict_2; CREATE USER 'u_6_401503_1'@'localhost'; CREATE USER 'u_6_401503_2'@'localhost'; CREATE USER 'u_6_401503_3'@'localhost'; use db_datadict; create table res_6_401503_1(f1 int, f2 int, f3 int); use db_datadict_2; create table res_6_401503_2(f1 int, f2 int, f3 int); grant update on db_datadict.* to 'u_6_401503_1'@'localhost'; grant delete on db_datadict_2.* to 'u_6_401503_2'@'localhost'; FLUSH PRIVILEGES; SELECT * FROM information_schema.schema_privileges; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401503_1, localhost, u_6_401503_1, , test); SELECT * FROM information_schema.schema_privileges; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401503_2, localhost, u_6_401503_2, , test); SELECT * FROM information_schema.schema_privileges; # should not show anything --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (u_6_401503_3, localhost, u_6_401503_3, , test); SELECT * FROM information_schema.schema_privileges; # clean-up connection default; --source suite/funcs_1/include/show_connection.inc disconnect u_6_401503_1; disconnect u_6_401503_2; disconnect u_6_401503_3; use db_datadict; DROP USER 'u_6_401503_1'@'localhost'; DROP USER 'u_6_401503_2'@'localhost'; DROP USER 'u_6_401503_3'@'localhost'; drop table res_6_401503_1; use db_datadict_2; drop table res_6_401503_2; use test; drop database db_datadict; drop database db_datadict_2; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.16.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.16.1: Ensure that the INFORMATION_SCHEMA.USER_PRIVILEGES # table has the following columns, in the following order: # # GRANTEE (shows a user to whom a user privilege has been # granted), # TABLE_CATALOG (always shows NULL), # PRIVILEGE_TYPE (shows the granted privilege), # IS_GRANTABLE (shows whether the privilege was granted WITH # GRANT OPTION). ################################################################################ #----------- # Bug #12063 column 'TABLE_SCHEMA' is missing in table # INFORMATION_SCHEMA.USER_PRIVILEGE # ... is not a bug, it has been added by mistake in the TP requirement document. #----------- let $is_table= user_privileges; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.16.2 + 3.2.16.3 + 3.2.16.4:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.16.2: Ensure that the table shows the relevant information on # every user privilege which has been granted to the current # user or to PUBLIC, or has been granted by the current user. ################################################################################ # Testcase 3.2.16.3: Ensure that the table does not show any information on any # user privileges which have been granted to users other than # the current user or have been granted by any user other # than the current user. ################################################################################ # Testcase 3.2.16.4: Ensure that the table does not show any information on any # privileges that are not user privileges for the current # user. ################################################################################ #FIXME 3.2.16: - when Bug #12269 is fixed a some of the outputs here may be #FIXME 3.2.16: deleted as I added them for checking where / which information #FIXME 3.2.16: is shown. --disable_warnings DROP DATABASE IF EXISTS db_datadict; --enable_warnings let $cmd1= SELECT * FROM information_schema.user_privileges WHERE grantee LIKE "%user%" ORDER BY grantee, table_catalog, privilege_type; let $cmd2= SELECT * FROM mysql.user WHERE user LIKE "%user%" ORDER BY host, user; let $cmd3= SHOW GRANTS; CREATE DATABASE db_datadict; CREATE USER 'user_1'@'localhost'; CREATE USER 'user_2'@'localhost'; CREATE USER 'user_3'@'localhost'; GRANT SELECT ON db_datadict.* TO 'user_1'@'localhost'; GRANT SELECT ON mysql.user TO 'user_1'@'localhost'; GRANT INSERT ON *.* TO 'user_2'@'localhost'; GRANT UPDATE ON *.* TO 'user_2'@'localhost'; FLUSH PRIVILEGES; let $message= FIXME (see Bug 12269) Here we expect more than only for user_1; --source include/show_msg.inc eval $cmd1; eval $cmd2; eval $cmd3; let $message= add GRANT OPTION db_datadict.* to user_1; --source include/show_msg.inc GRANT UPDATE ON db_datadict.* TO 'user_1'@'localhost' WITH GRANT OPTION; let $message= FIXME (see Bug 12269) Here the is missing for the GRANT OPTION for user_1; --source include/show_msg.inc eval $cmd1; eval $cmd2; eval $cmd3; FLUSH PRIVILEGES; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_16_1, localhost, user_1, , db_datadict); eval $cmd1; eval $cmd2; eval $cmd3; # add SELECT on *.* to user_1 let $message= Now add SELECT on *.* to user_1; --source include/show_msg.inc connection default; --source suite/funcs_1/include/show_connection.inc GRANT SELECT ON *.* TO 'user_1'@'localhost'; let $message= Here is shown correctly for user_1; --source include/show_msg.inc eval $cmd1; eval $cmd2; eval $cmd3; FLUSH PRIVILEGES; eval $cmd1; eval $cmd2; eval $cmd3; # check that this appears connection user_16_1; --source suite/funcs_1/include/show_connection.inc eval $cmd1; eval $cmd2; eval $cmd3; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_16_2, localhost, user_2, , db_datadict); eval $cmd1; --error 1142 eval $cmd2; eval $cmd3; --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK connect (user_16_3, localhost, user_3, , test); eval $cmd1; --error 1142 eval $cmd2; eval $cmd3; let $message= revoke privileges from user_1; --source include/show_msg.inc connection default; --source suite/funcs_1/include/show_connection.inc REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user_1'@'localhost'; eval $cmd1; eval $cmd2; eval $cmd3; # check for changes connection user_16_1; --source suite/funcs_1/include/show_connection.inc eval $cmd1; --error 1142 eval $cmd2; eval $cmd3; --source suite/funcs_1/include/show_connection.inc # checks entered before bug #12269 was reported # OK, user_1 has no privs here --error 1142 CREATE TABLE db_datadict.tb_55 ( c1 TEXT ); --source suite/funcs_1/include/show_connection.inc eval $cmd1; --error 1142 eval $cmd2; eval $cmd3; # OK, user_1 has no privs here --error 1142 CREATE TABLE db_datadict.tb_66 ( c1 TEXT ); let $message= add ALL on db_datadict.* (and select on mysql.user) to user_1; --source include/show_msg.inc connection default; --source suite/funcs_1/include/show_connection.inc GRANT ALL ON db_datadict.* TO 'user_1'@'localhost' WITH GRANT OPTION; GRANT SELECT ON mysql.user TO 'user_1'@'localhost'; eval $cmd1; eval $cmd2; eval $cmd3; # check for changes connection user_16_1; --source suite/funcs_1/include/show_connection.inc eval $cmd1; eval $cmd2; eval $cmd3; # OK, user_1 has no privs here --error 1142 CREATE TABLE db_datadict.tb_56 ( c1 TEXT ); # using 'USE' lets the server read the privileges new, so now the CREATE works USE db_datadict; --source suite/funcs_1/include/show_connection.inc eval $cmd1; eval $cmd2; eval $cmd3; CREATE TABLE tb_57 ( c1 TEXT ); let $message= revoke privileges from user_1; --source include/show_msg.inc connection default; --source suite/funcs_1/include/show_connection.inc REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'user_1'@'localhost'; FLUSH PRIVILEGES; eval $cmd1; eval $cmd2; eval $cmd3; # check for changes connection user_16_1; --source suite/funcs_1/include/show_connection.inc eval $cmd1; --error 1142 eval $cmd2; eval $cmd3; # WORKS, as the existing old privileges are used! CREATE TABLE db_datadict.tb_58 ( c1 TEXT ); # existing privileges are "read" new when USE is called, user has no priviliges --error 1044 USE db_datadict; #FIXME 3.2.16: check that it is correct that this now 'works': --error 1142 CREATE TABLE db_datadict.tb_59 ( c1 TEXT ); # clean-up connection default; --source suite/funcs_1/include/show_connection.inc disconnect user_16_1; disconnect user_16_2; disconnect user_16_3; DROP USER 'user_1'@'localhost'; DROP USER 'user_2'@'localhost'; DROP USER 'user_3'@'localhost'; DROP DATABASE IF EXISTS db_datadict; # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.17: Checks on Performance - not here in this script!; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.17.1: Ensure that every INFORMATION_SCHEMA table shows all the # correct information, and no incorrect information, for a # database to which 100 different users, each of which has a # randomly issued set of privileges and access to a # randomly chosen set of database objects, have access. # The database should contain a mixture of all types of # database objects (i.e. tables, views, stored procedures, # triggers). ################################################################################ ################################################################################ # Testcase 3.2.17.2: Ensure that every INFORMATION_SCHEMA table shows all the # correct information, and no incorrect information, for 10 # different databases to which 50 different users, each of # which has a randomly issued set of privileges and access # to a randomly chosen set of database objects in two or # more of the databases, have access. The databases should # each contain a mixture of all types of database objects # (i.e. tables, views, stored procedures, triggers). ################################################################################ # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.18.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.18.1: Ensure that the INFORMATION_SCHEMA.TRIGGERS # table has the following columns, in the following order: # # # (FIXME - list copied from WL#1996) # # TRIGGER_CATALOG NULL # TRIGGER_SCHEMA # TRIGGER_NAME # EVENT_MANIPULATION # EVENT_OBJECT_CATALOG NULL # EVENT_OBJECT_SCHEMA # EVENT_OBJECT_TABLE # ACTION_ORDER NULL # ACTION_CONDITION NULL # ACTION_STATEMENT # ACTION_ORIENTATION # ACTION_TIMING # ACTION_REFERENCE_OLD_TABLE NULL # ACTION_REFERENCE_NEW_TABLE NULL # ACTION_REFERENCE_OLD_ROW # ACTION_REFERENCE_NEW_ROW # CREATED # SQL_MODE # ################################################################################ let $is_table= triggers; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.18.2 + 3.2.18.3:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.18.2: Ensure that the table shows the relevant information on # every trigger on which the current user or PUBLIC has # privileges. ################################################################################ # Testcase 3.2.18.3: Ensure that the table does not show any information on any # trigger on which the current user and public have no # privileges. ################################################################################ #FIXME 3.2.18.2: to be added. #FIXME 3.2.18.2: don't forget to add the test description to QATestPlanV50func # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.19.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.19.1: Ensure that the INFORMATION_SCHEMA.PARAMETERS # table has the following columns, in the following order: # ################################################################################ let $is_table= parameters; # when table is implemented remove this and the next 4 lines and "enable" 5th line: # and don't forget to add the test description to QATestPlanV50func let $message= checking a table that will be implemented later; --source include/show_msg.inc --error 1109 eval DESC $is_table; #--source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- let $message= Testcase 3.2.20.1:; --source include/show_msg80.inc ################################################################################ # Testcase 3.2.20.1: Ensure that the INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS # table has the following columns, in the following order: # ################################################################################ let $is_table= referential_constraints; # when table is implemented remove this and the next 4 lines and "enable" 5th line: # and don't forget to add the test description to QATestPlanV50func #let $message= checking a table that will be implemented later; #--source include/show_msg.inc #--error 1109 eval DESC $is_table; --source suite/funcs_1/datadict/datadict_show_table_design.inc # ------------------------------------------------------------------------------------------------------- ################################################################################ # let $message= *** End of Data Dictionary Tests ***; --source include/show_msg80.inc # ################################################################################ # some cleanup to be sure nothing remains --disable_warnings DROP TABLE IF EXISTS test.tb1; DROP TABLE IF EXISTS test.tb2; DROP TABLE IF EXISTS test.tb3; DROP TABLE IF EXISTS test.tb4; DROP TABLE IF EXISTS test.t1; DROP TABLE IF EXISTS test.t2; DROP TABLE IF EXISTS test.t3; DROP TABLE IF EXISTS test.t4; DROP TABLE IF EXISTS test.t7; DROP TABLE IF EXISTS test.t8; DROP TABLE IF EXISTS test.t9; DROP TABLE IF EXISTS test.t10; DROP TABLE IF EXISTS test.t11; DROP DATABASE IF EXISTS test1; DROP DATABASE IF EXISTS test4; DROP DATABASE IF EXISTS db_datadict; DROP DATABASE IF EXISTS db_datadict_1; DROP DATABASE IF EXISTS db_datadict_2; --enable_warnings