polardbxengine/mysql-test/t/dd_table_access.test

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);