196 lines
6.4 KiB
Plaintext
196 lines
6.4 KiB
Plaintext
if (!$TABLE)
|
|
{
|
|
--echo #
|
|
--echo # WL#6391: Hide DD tables.
|
|
--echo #
|
|
--echo # Prohibit access to the DD tables from user submitted
|
|
--echo # SQL statements, but allow DD initialization to execute
|
|
--echo # such statements.
|
|
--echo #
|
|
|
|
--source include/have_debug.inc
|
|
|
|
--echo # DD schema DDL
|
|
--error ER_NO_SYSTEM_SCHEMA_ACCESS
|
|
DROP SCHEMA mysql;
|
|
--error ER_NO_SYSTEM_SCHEMA_ACCESS
|
|
CREATE SCHEMA mysql;
|
|
--error ER_NO_SYSTEM_SCHEMA_ACCESS
|
|
ALTER SCHEMA mysql DEFAULT COLLATE utf8_general_ci;
|
|
|
|
--echo # DD tablespace DDL
|
|
--error ER_WRONG_TABLESPACE_NAME
|
|
DROP TABLESPACE mysql;
|
|
--error ER_WRONG_TABLESPACE_NAME
|
|
CREATE TABLESPACE mysql ADD DATAFILE 'new_file.ibd';
|
|
--error ER_ALTER_FILEGROUP_FAILED
|
|
ALTER TABLESPACE mysql ADD DATAFILE 'new_file.ibd';
|
|
|
|
--echo # Create a non- white listed table in the DD tablespace
|
|
--error ER_RESERVED_TABLESPACE_NAME
|
|
CREATE TABLE table_not_white_listed (pk INTEGER PRIMARY KEY) TABLESPACE mysql;
|
|
|
|
USE mysql;
|
|
CREATE TABLE t (pk BIGINT UNSIGNED PRIMARY KEY);
|
|
|
|
--let $TABLE= mysql.dd_properties
|
|
--source dd_table_access.test
|
|
|
|
--let $TABLE= dd_properties
|
|
--source dd_table_access.test
|
|
|
|
--let $TABLE= mysql.indexes
|
|
--source dd_table_access.test
|
|
|
|
--let $TABLE= indexes
|
|
--source dd_table_access.test
|
|
|
|
--echo # Turn off innodb_stats_auto_recalc to avoid conflicting updates.
|
|
SET @@global.innodb_stats_auto_recalc= OFF;
|
|
|
|
--echo # Check that we may query and update mysql.innodb_index_stats.
|
|
SELECT @old_description:= stat_description FROM mysql.innodb_index_stats
|
|
WHERE database_name= 'mysql' AND table_name= 't' AND
|
|
index_name= 'PRIMARY' AND stat_name= 'size';
|
|
UPDATE mysql.innodb_index_stats SET stat_description= 'Updated'
|
|
WHERE database_name= 'mysql' AND table_name= 't' AND
|
|
index_name= 'PRIMARY' AND stat_name= 'size';
|
|
SELECT stat_description FROM mysql.innodb_index_stats
|
|
WHERE database_name= 'mysql' AND table_name= 't' AND
|
|
index_name= 'PRIMARY' AND stat_name= 'size';
|
|
UPDATE mysql.innodb_index_stats SET stat_description= @old_description
|
|
WHERE database_name= 'mysql' AND table_name= 't' AND
|
|
index_name= 'PRIMARY' AND stat_name= 'size';
|
|
|
|
--echo # Check that we may not DROP or CREATE mysql.innodb_index_stats.
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
DROP TABLE mysql.innodb_index_stats;
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
CREATE TABLE mysql.innodb_index_stats(i INTEGER);
|
|
|
|
--echo # Check that we may CREATE FROM mysql.innodb_index_stats.
|
|
CREATE TABLE t1 SELECT * FROM mysql.innodb_index_stats;
|
|
DROP TABLE t1;
|
|
|
|
--echo # Check that we may not CREATE LIKE mysql.innodb_index_stats
|
|
--echo # due to restricted tablespace.
|
|
--error ER_RESERVED_TABLESPACE_NAME
|
|
CREATE TABLE t1 LIKE mysql.innodb_index_stats;
|
|
|
|
--echo # Check access from stored programs.
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
CREATE PROCEDURE ddse_access() CREATE TABLE mysql.innodb_index_stats(i INTEGER);
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
CREATE PROCEDURE ddse_access() DROP TABLE mysql.innodb_index_stats(i INTEGER);
|
|
|
|
--echo # Check access from prepared statements.
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval PREPARE ps FROM 'CREATE TABLE mysql.innodb_index_stats(i INTEGER)';
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval PREPARE ps FROM 'DROP TABLE mysql.innodb_index_stats';
|
|
|
|
--echo # But ALTER and CHECK is allowed.
|
|
ALTER TABLE mysql.innodb_index_stats COMMENT 'Altered';
|
|
SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='innodb_index_stats';
|
|
|
|
--echo # Test CHECK TABLE mysql.innodb_index_stats.
|
|
CHECK TABLE mysql.innodb_index_stats;
|
|
|
|
--echo # Reset innodb_stats_auto_recalc.
|
|
SET @@global.innodb_stats_auto_recalc= default;
|
|
|
|
DROP TABLE t;
|
|
|
|
--exit
|
|
}
|
|
|
|
|
|
--echo #
|
|
--echo # DD table access in LOAD statements.
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval LOAD DATA INFILE 'no_such_file' INTO TABLE $TABLE
|
|
|
|
--echo #
|
|
--echo # DD table access in HANDLER statements.
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval HANDLER $TABLE OPEN
|
|
|
|
--echo #
|
|
--echo # DD table visibility in I_S.
|
|
--echo #
|
|
--echo # A SELECT statement will not fail, since the table names are submitted as strings in WHERE clauses.
|
|
--eval SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '$TABLE' AND TABLE_SCHEMA = 'mysql'
|
|
--echo # A SHOW statement will fail because the table name is interpreted as a table name, not as a string.
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval SHOW CREATE TABLE $TABLE
|
|
|
|
--echo #
|
|
--echo # DD table access in DDL.
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval DROP TABLE $TABLE
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval CREATE TABLE $TABLE (i INTEGER)
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval CREATE TABLE new_tab LIKE $TABLE
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval CREATE TABLE new_tab SELECT * FROM $TABLE
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval ALTER TABLE $TABLE ADD COLUMN (new_col INTEGER)
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval TRUNCATE TABLE $TABLE
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval RENAME TABLE $TABLE TO new_tab
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval RENAME TABLE t TO $TABLE
|
|
|
|
--echo #
|
|
--echo # DD table access in DML.
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval SELECT * from $TABLE
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval SELECT * from t WHERE t.pk = (SELECT COUNT(*) FROM $TABLE)
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval DELETE FROM $TABLE
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval UPDATE $TABLE SET id= 0 WHERE ID= 1
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval INSERT INTO $TABLE VALUES (1)
|
|
|
|
--echo #
|
|
--echo # DD table access from views.
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval CREATE VIEW new_view AS SELECT * FROM $TABLE
|
|
|
|
--echo #
|
|
--echo # DD table access from stored programs.
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval CREATE PROCEDURE dd_access() SELECT * FROM $TABLE
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval CREATE FUNCTION dd_access() RETURNS INTEGER RETURN (SELECT COUNT(*) FROM $TABLE)
|
|
|
|
--echo #
|
|
--echo # DD table access from prepared statements (the '?' placeholders cannot be used for meta data).
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval PREPARE ps FROM 'DROP TABLE $TABLE';
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval PREPARE ps FROM 'SELECT * FROM $TABLE';
|
|
|
|
--echo #
|
|
--echo # DD table access from triggers
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval CREATE TRIGGER trg BEFORE INSERT ON $TABLE FOR EACH ROW SET @count = @count + 1;
|
|
|
|
--echo #
|
|
--echo # DD table access from foreign keys
|
|
--echo #
|
|
--error ER_NO_SYSTEM_TABLE_ACCESS
|
|
--eval ALTER TABLE t ADD CONSTRAINT FOREIGN KEY (pk) REFERENCES $TABLE (id);
|