Skip to content

Commit 8249dca

Browse files
committed
MDEV-6858: enforce_storage_engine option
Merge from Percona Server enforced use of a specific storage engine authored by Stewart Smith. Modified to be session variable and modifiable only by SUPER. Use similar implementation as default_storage_engine.
1 parent ba3573c commit 8249dca

16 files changed

+351
-2
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
drop table if exists t1;
2+
SET SESSION enforce_storage_engine=MyISAM;
3+
select @@session.enforce_storage_engine;
4+
@@session.enforce_storage_engine
5+
MyISAM
6+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=Memory;
7+
Warnings:
8+
Note 1266 Using storage engine MyISAM for table 't1'
9+
SHOW CREATE TABLE t1;
10+
Table Create Table
11+
t1 CREATE TABLE `t1` (
12+
`c1` int(11) NOT NULL AUTO_INCREMENT,
13+
`c2` varchar(10) DEFAULT NULL,
14+
PRIMARY KEY (`c1`)
15+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
16+
DROP TABLE t1;
17+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
18+
SHOW CREATE TABLE t1;
19+
Table Create Table
20+
t1 CREATE TABLE `t1` (
21+
`c1` int(11) NOT NULL AUTO_INCREMENT,
22+
`c2` varchar(10) DEFAULT NULL,
23+
PRIMARY KEY (`c1`)
24+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
25+
DROP TABLE t1;
26+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10));
27+
SHOW CREATE TABLE t1;
28+
Table Create Table
29+
t1 CREATE TABLE `t1` (
30+
`c1` int(11) NOT NULL AUTO_INCREMENT,
31+
`c2` varchar(10) DEFAULT NULL,
32+
PRIMARY KEY (`c1`)
33+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
34+
DROP TABLE t1;
35+
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
36+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
37+
SHOW CREATE TABLE t1;
38+
Table Create Table
39+
t1 CREATE TABLE `t1` (
40+
`c1` int(11) NOT NULL AUTO_INCREMENT,
41+
`c2` varchar(10) DEFAULT NULL,
42+
PRIMARY KEY (`c1`)
43+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
44+
INSERT INTO t1 values (1,'abba');
45+
CREATE TABLE t2 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=Memory;
46+
ERROR 42000: Unknown storage engine 'MEMORY'
47+
SET SESSION sql_mode='';
48+
SET SESSION enforce_storage_engine=MyISAM;
49+
select @@session.enforce_storage_engine;
50+
@@session.enforce_storage_engine
51+
MyISAM
52+
select * from t1;
53+
c1 c2
54+
1 abba
55+
drop table t1;
56+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10));
57+
SHOW CREATE TABLE t1;
58+
Table Create Table
59+
t1 CREATE TABLE `t1` (
60+
`c1` int(11) NOT NULL AUTO_INCREMENT,
61+
`c2` varchar(10) DEFAULT NULL,
62+
PRIMARY KEY (`c1`)
63+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
64+
DROP TABLE t1;
65+
SET SESSION enforce_storage_engine=FooBar;
66+
ERROR 42000: Unknown storage engine 'FooBar'
67+
select @@session.enforce_storage_engine;
68+
@@session.enforce_storage_engine
69+
MyISAM
70+
SET SESSION enforce_storage_engine=MyISAM;
71+
ERROR 42000: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
72+
SET SESSION enforce_storage_engine=NULL;
73+
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
74+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=Memory;
75+
SHOW CREATE TABLE t1;
76+
Table Create Table
77+
t1 CREATE TABLE `t1` (
78+
`c1` int(11) NOT NULL AUTO_INCREMENT,
79+
`c2` varchar(10) DEFAULT NULL,
80+
PRIMARY KEY (`c1`)
81+
) ENGINE=MEMORY DEFAULT CHARSET=latin1
82+
DROP TABLE t1;
83+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
84+
SHOW CREATE TABLE t1;
85+
Table Create Table
86+
t1 CREATE TABLE `t1` (
87+
`c1` int(11) NOT NULL AUTO_INCREMENT,
88+
`c2` varchar(10) DEFAULT NULL,
89+
PRIMARY KEY (`c1`)
90+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
91+
DROP TABLE t1;
92+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10));
93+
SHOW CREATE TABLE t1;
94+
Table Create Table
95+
t1 CREATE TABLE `t1` (
96+
`c1` int(11) NOT NULL AUTO_INCREMENT,
97+
`c2` varchar(10) DEFAULT NULL,
98+
PRIMARY KEY (`c1`)
99+
) ENGINE=MyISAM DEFAULT CHARSET=latin1
100+
DROP TABLE t1;
101+
SET GLOBAL enforce_storage_engine=NULL;
102+
ERROR HY000: Variable 'enforce_storage_engine' is a SESSION variable and can't be used with SET GLOBAL

mysql-test/r/mysqld--help.result

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ The following options may be given as the first argument:
169169
Which encryption algorithm to use for table encryption.
170170
aes_cbc is the recommended one.. One of: none, aes_ecb,
171171
aes_cbc, aes_ctr
172+
--enforce-storage-engine=name
173+
Force the use of a storage engine for new tables
172174
--event-scheduler[=name]
173175
Enable the event scheduler. Possible values are ON, OFF,
174176
and DISABLED (keep the event scheduler completely
@@ -1150,6 +1152,7 @@ delayed-queue-size 1000
11501152
div-precision-increment 4
11511153
encrypt-tmp-disk-tables FALSE
11521154
encryption-algorithm none
1155+
enforce-storage-engine (No default value)
11531156
event-scheduler OFF
11541157
expensive-subquery-limit 100
11551158
expire-logs-days 0

mysql-test/suite/sys_vars/r/all_vars.result

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ there should be *no* long test name listed below:
1010
select distinct variable_name as `there should be *no* variables listed below:` from t2
1111
left join t1 on variable_name=test_name where test_name is null;
1212
there should be *no* variables listed below:
13-
innodb_instrument_semaphores
1413
strict_password_validation
1514
drop table t1;
1615
drop table t2;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
SET @start_session_value = @@session.enforce_storage_engine;
2+
SET @@session.enforce_storage_engine = INNODB;
3+
SET @@session.enforce_storage_engine = DEFAULT;
4+
SELECT @@session.enforce_storage_engine;
5+
@@session.enforce_storage_engine
6+
NULL
7+
SET @@session.enforce_storage_engine = MYISAM;
8+
SELECT @@session.enforce_storage_engine;
9+
@@session.enforce_storage_engine
10+
MyISAM
11+
SET @@session.enforce_storage_engine = MERGE;
12+
SELECT @@session.enforce_storage_engine;
13+
@@session.enforce_storage_engine
14+
MRG_MyISAM
15+
SET @@session.enforce_storage_engine = MEMORY;
16+
SELECT @@session.enforce_storage_engine;
17+
@@session.enforce_storage_engine
18+
MEMORY
19+
SET @@session.enforce_storage_engine = INNODB;
20+
SELECT @@session.enforce_storage_engine;
21+
@@session.enforce_storage_engine
22+
InnoDB
23+
SET @@session.enforce_storage_engine = 8199;
24+
ERROR 42000: Incorrect argument type to variable 'enforce_storage_engine'
25+
SET @@session.enforce_storage_engine = 65530.34;
26+
ERROR 42000: Incorrect argument type to variable 'enforce_storage_engine'
27+
SET @@session.enforce_storage_engine = RECORD;
28+
ERROR 42000: Unknown storage engine 'RECORD'
29+
SELECT @@session.enforce_storage_engine =
30+
VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES
31+
WHERE VARIABLE_NAME='enforce_storage_engine';
32+
@@session.enforce_storage_engine =
33+
VARIABLE_VALUE
34+
1
35+
SET @@session.enforce_storage_engine = TRUE;
36+
ERROR 42000: Incorrect argument type to variable 'enforce_storage_engine'
37+
SET @@session.enforce_storage_engine = FALSE;
38+
ERROR 42000: Incorrect argument type to variable 'enforce_storage_engine'
39+
SET @@session.enforce_storage_engine = @start_session_value;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#
2+
# innodb_instrument_semaphores
3+
#
4+
# save the initial value
5+
SET @innodb_instrument_semaphores_global_saved = @@global.innodb_instrument_semaphores;
6+
# default
7+
SELECT @@global.innodb_instrument_semaphores;
8+
@@global.innodb_instrument_semaphores
9+
0
10+
11+
# scope
12+
SELECT @@session.innodb_instrument_semaphores;
13+
ERROR HY000: Variable 'innodb_instrument_semaphores' is a GLOBAL variable
14+
SET @@global.innodb_instrument_semaphores=OFF;
15+
SELECT @@global.innodb_instrument_semaphores;
16+
@@global.innodb_instrument_semaphores
17+
0
18+
SET @@global.innodb_instrument_semaphores=ON;
19+
SELECT @@global.innodb_instrument_semaphores;
20+
@@global.innodb_instrument_semaphores
21+
1
22+
23+
# valid values
24+
SET @@global.innodb_instrument_semaphores='OFF';
25+
SELECT @@global.innodb_instrument_semaphores;
26+
@@global.innodb_instrument_semaphores
27+
0
28+
SET @@global.innodb_instrument_semaphores=ON;
29+
SELECT @@global.innodb_instrument_semaphores;
30+
@@global.innodb_instrument_semaphores
31+
1
32+
SET @@global.innodb_instrument_semaphores=default;
33+
SELECT @@global.innodb_instrument_semaphores;
34+
@@global.innodb_instrument_semaphores
35+
0
36+
37+
# invalid values
38+
SET @@global.innodb_instrument_semaphores=NULL;
39+
ERROR 42000: Variable 'innodb_instrument_semaphores' can't be set to the value of 'NULL'
40+
SET @@global.innodb_instrument_semaphores='junk';
41+
ERROR 42000: Variable 'innodb_instrument_semaphores' can't be set to the value of 'junk'
42+
43+
# restore the initial value
44+
SET @@global.innodb_instrument_semaphores = @innodb_instrument_semaphores_global_saved;
45+
# End of test

mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,20 @@ NUMERIC_BLOCK_SIZE NULL
721721
ENUM_VALUE_LIST OFF,ON
722722
READ_ONLY NO
723723
COMMAND_LINE_ARGUMENT OPTIONAL
724+
VARIABLE_NAME ENFORCE_STORAGE_ENGINE
725+
SESSION_VALUE
726+
GLOBAL_VALUE NULL
727+
GLOBAL_VALUE_ORIGIN COMPILE-TIME
728+
DEFAULT_VALUE NULL
729+
VARIABLE_SCOPE SESSION ONLY
730+
VARIABLE_TYPE VARCHAR
731+
VARIABLE_COMMENT Force the use of a storage engine for new tables
732+
NUMERIC_MIN_VALUE NULL
733+
NUMERIC_MAX_VALUE NULL
734+
NUMERIC_BLOCK_SIZE NULL
735+
ENUM_VALUE_LIST NULL
736+
READ_ONLY NO
737+
COMMAND_LINE_ARGUMENT NULL
724738
VARIABLE_NAME ERROR_COUNT
725739
SESSION_VALUE 0
726740
GLOBAL_VALUE NULL
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
--source include/not_embedded.inc
2+
--source include/have_innodb.inc
3+
--source include/load_sysvars.inc
4+
5+
SET @start_session_value = @@session.enforce_storage_engine;
6+
7+
SET @@session.enforce_storage_engine = INNODB;
8+
SET @@session.enforce_storage_engine = DEFAULT;
9+
10+
SELECT @@session.enforce_storage_engine;
11+
12+
SET @@session.enforce_storage_engine = MYISAM;
13+
SELECT @@session.enforce_storage_engine;
14+
SET @@session.enforce_storage_engine = MERGE;
15+
SELECT @@session.enforce_storage_engine;
16+
SET @@session.enforce_storage_engine = MEMORY;
17+
SELECT @@session.enforce_storage_engine;
18+
SET @@session.enforce_storage_engine = INNODB;
19+
SELECT @@session.enforce_storage_engine;
20+
21+
--Error ER_WRONG_TYPE_FOR_VAR
22+
SET @@session.enforce_storage_engine = 8199;
23+
24+
--Error ER_WRONG_TYPE_FOR_VAR
25+
SET @@session.enforce_storage_engine = 65530.34;
26+
27+
--Error ER_UNKNOWN_STORAGE_ENGINE
28+
SET @@session.enforce_storage_engine = RECORD;
29+
30+
SELECT @@session.enforce_storage_engine =
31+
VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES
32+
WHERE VARIABLE_NAME='enforce_storage_engine';
33+
34+
--Error ER_WRONG_TYPE_FOR_VAR
35+
SET @@session.enforce_storage_engine = TRUE;
36+
37+
--Error ER_WRONG_TYPE_FOR_VAR
38+
SET @@session.enforce_storage_engine = FALSE;
39+
40+
SET @@session.enforce_storage_engine = @start_session_value;
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
-- source include/not_embedded.inc
2+
3+
--disable_warnings
4+
drop table if exists t1;
5+
--enable_warnings
6+
7+
SET SESSION enforce_storage_engine=MyISAM;
8+
select @@session.enforce_storage_engine;
9+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=Memory;
10+
SHOW CREATE TABLE t1;
11+
DROP TABLE t1;
12+
13+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
14+
SHOW CREATE TABLE t1;
15+
DROP TABLE t1;
16+
17+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10));
18+
SHOW CREATE TABLE t1;
19+
DROP TABLE t1;
20+
21+
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
22+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
23+
SHOW CREATE TABLE t1;
24+
INSERT INTO t1 values (1,'abba');
25+
26+
--error 1286
27+
CREATE TABLE t2 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=Memory;
28+
29+
SET SESSION sql_mode='';
30+
31+
SET SESSION enforce_storage_engine=MyISAM;
32+
select @@session.enforce_storage_engine;
33+
select * from t1;
34+
drop table t1;
35+
36+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10));
37+
SHOW CREATE TABLE t1;
38+
DROP TABLE t1;
39+
40+
--error 1286
41+
SET SESSION enforce_storage_engine=FooBar;
42+
43+
select @@session.enforce_storage_engine;
44+
45+
--source include/add_anonymous_users.inc
46+
47+
connect (con1,localhost,user_1,,);
48+
connection con1;
49+
--error 1227
50+
SET SESSION enforce_storage_engine=MyISAM;
51+
disconnect con1;
52+
53+
connection default;
54+
55+
--source include/delete_anonymous_users.inc
56+
57+
SET SESSION enforce_storage_engine=NULL;
58+
59+
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
60+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=Memory;
61+
SHOW CREATE TABLE t1;
62+
DROP TABLE t1;
63+
64+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=MyISAM;
65+
SHOW CREATE TABLE t1;
66+
DROP TABLE t1;
67+
68+
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10));
69+
SHOW CREATE TABLE t1;
70+
DROP TABLE t1;
71+
72+
--error 1228
73+
SET GLOBAL enforce_storage_engine=NULL;

sql/handler.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ static plugin_ref ha_default_tmp_plugin(THD *thd)
117117
return ha_default_plugin(thd);
118118
}
119119

120+
120121
/** @brief
121122
Return the default storage engine handlerton for thread
122123

0 commit comments

Comments
 (0)