File: dd_table_access.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (198 lines) | stat: -rw-r--r-- 6,677 bytes parent folder | download
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);