1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
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_index_stats
ALTER TABLE mysql.innodb_index_stats COMMENT '';
--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);
|