Skip to content

Commit 6b977a8

Browse files
Havard Dybvikkahatlen
authored andcommitted
WL#11583: Syntax for secondary engine
- Adds the SECONDARY_ENGINE, SECONDARY_LOAD, SECONDARY_UNLOAD keywords. - Adds a mock storage engine for testing the new syntax without depending on an actual secondary engine. - Adds the test suite "secondary_engine" to the default set of test suites. For example, to define a secondary engine for a table: CREATE TABLE t1 (a INT) SECONDARY_ENGINE <engine_name>; or ALTER TABLE t1 SECONDARY_ENGINE <engine_name>; To load a table into its defined secondary engine: ALTER TABLE t1 SECONDARY_LOAD; To unload a table from its secondary engine: ALTER TABLE t1 SECONDARY_UNLOAD; or ALTER TABLE t1 SECONDARY_ENGINE NULL; Change-Id: Id34dc5736f519f3fa9bca7449a48dd793bf40eeb
1 parent e279bf7 commit 6b977a8

35 files changed

+1137
-5
lines changed

mysql-test/include/plugin.defs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ ha_archive plugin_output_directory ARCHIVE_PLUGIN
3939
ha_blackhole plugin_output_directory BLACKHOLE_PLUGIN
4040
ha_federated plugin_output_directory FEDERATED_PLUGIN
4141
ha_partition plugin_output_directory PARTITION_PLUGIN partition
42+
ha_mock plugin_output_directory MOCK_PLUGIN
4243
mypluglib plugin_output_directory SIMPLE_PARSER
4344
libpluginmecab plugin_output_directory MECAB
4445
adt_null plugin_output_directory AUDIT_NULL

mysql-test/mysql-test-run.pl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@
160160
my $path_vardir_trace; # Unix formatted opt_vardir for trace files
161161

162162
my $DEFAULT_SUITES =
163-
"main,sys_vars,binlog,binlog_gtid,binlog_nogtid,federated,gis,rpl,rpl_gtid,rpl_nogtid,innodb,innodb_gis,innodb_fts,innodb_zip,innodb_undo,perfschema,funcs_1,opt_trace,parts,auth_sec,query_rewrite_plugins,gcol,sysschema,test_service_sql_api,json,connection_control,test_services,collations,service_udf_registration,service_sys_var_registration,service_status_var_registration,x";
163+
"main,sys_vars,binlog,binlog_gtid,binlog_nogtid,federated,gis,rpl,rpl_gtid,rpl_nogtid,innodb,innodb_gis,innodb_fts,innodb_zip,innodb_undo,perfschema,funcs_1,opt_trace,parts,auth_sec,query_rewrite_plugins,gcol,sysschema,test_service_sql_api,json,connection_control,test_services,collations,service_udf_registration,service_sys_var_registration,service_status_var_registration,x,secondary_engine";
164164

165165
my $build_thread = 0;
166166
my $daemonize_mysqld = 0;

mysql-test/r/information_schema_keywords.result

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,9 @@ SCHEMA 1
519519
SCHEMAS 1
520520
SCHEMA_NAME 0
521521
SECOND 0
522+
SECONDARY_ENGINE 0
523+
SECONDARY_LOAD 0
524+
SECONDARY_UNLOAD 0
522525
SECOND_MICROSECOND 1
523526
SECURITY 0
524527
SELECT 1
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#
2+
# Attempt to load table into an undefined secondary engine.
3+
#
4+
CREATE TABLE t1 (a INT);
5+
ALTER TABLE t1 SECONDARY_LOAD;
6+
ERROR HY000: Secondary engine operation failed. No secondary engine defined.
7+
DROP TABLE t1;
8+
#
9+
# Attempt to load table into an unknown storage engine.
10+
#
11+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
12+
ALTER TABLE t1 SECONDARY_LOAD;
13+
ERROR 42000: Unknown storage engine 'NONEXISTENT'
14+
DROP TABLE t1;
15+
#
16+
# Attempt to load table into an unsupported secondary storage engine.
17+
#
18+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE InnoDB;
19+
ALTER TABLE t1 SECONDARY_LOAD;
20+
ERROR HY000: Secondary engine operation failed. Unsupported secondary storage engine.
21+
DROP TABLE t1;
22+
#
23+
# Create a table with a secondary engine defined.
24+
#
25+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
26+
SHOW CREATE TABLE t1;
27+
Table Create Table
28+
t1 CREATE TABLE `t1` (
29+
`a` int(11) DEFAULT NULL
30+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=NONEXISTENT
31+
DROP TABLE t1;
32+
#
33+
# Attempt to redefine the secondary engine.
34+
#
35+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
36+
ALTER TABLE t1 SECONDARY_ENGINE ANOTHER_NONEXISTENT;
37+
ERROR HY000: Secondary engine operation failed. Table already has a secondary engine defined.
38+
DROP TABLE t1;
39+
#
40+
# Define and undefine secondary engine (without loading in-between).
41+
#
42+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
43+
ALTER TABLE t1 SECONDARY_ENGINE NULL;
44+
SHOW CREATE TABLE t1;
45+
Table Create Table
46+
t1 CREATE TABLE `t1` (
47+
`a` int(11) DEFAULT NULL
48+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
49+
DROP TABLE t1;
50+
#
51+
# Attempt to create a temporary table with a secondary engine defined.
52+
#
53+
CREATE TEMPORARY TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
54+
ERROR HY000: Secondary engine operation failed. Temporary tables not supported.
55+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
56+
CREATE TEMPORARY TABLE t2 LIKE t1;
57+
ERROR HY000: Secondary engine operation failed. Temporary tables not supported.
58+
DROP TABLE t1;
59+
#
60+
# Attempt to create a table with a primary engine that does not support
61+
# loading tables into a secondary engine.
62+
CREATE TABLE t1 (a INT) ENGINE MYISAM SECONDARY_ENGINE NONEXISTENT;
63+
ERROR 42000: The storage engine for the table doesn't support SECONDARY_ENGINE
64+
#
65+
# Attempt to change primary storage engine to an engine that does not
66+
# support loading into a secondary engine.
67+
#
68+
CREATE TABLE t1 (a INT) ENGINE InnoDB SECONDARY_ENGINE NONEXISTENT;
69+
ALTER TABLE t1 ENGINE MYISAM;
70+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
71+
SHOW CREATE TABLE t1;
72+
Table Create Table
73+
t1 CREATE TABLE `t1` (
74+
`a` int(11) DEFAULT NULL
75+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=NONEXISTENT
76+
DROP TABLE t1;
77+
#
78+
# Attempt to use SECONDARY_LOAD when creating table.
79+
#
80+
CREATE TABLE t1 (a INT) SECONDARY_LOAD;
81+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SECONDARY_LOAD' at line 1
82+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT, SECONDARY_LOAD;
83+
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SECONDARY_LOAD' at line 1
84+
#
85+
# Attempt to alter a table after a secondary engine has been defined.
86+
#
87+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
88+
ALTER TABLE t1 COMMENT="Test";
89+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
90+
ALTER TABLE t1 COMMENT="Test", ALGORITHM=INPLACE;
91+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
92+
ALTER TABLE t1 COMMENT="Test", ALGORITHM=COPY;
93+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
94+
ALTER TABLE t1 ADD COLUMN (b INT);
95+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
96+
ALTER TABLE t1 ADD COLUMN (b INT), ALGORITHM=INPLACE;
97+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
98+
ALTER TABLE t1 ADD COLUMN (b INT), ALGORITHM=COPY;
99+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
100+
SHOW CREATE TABLE t1;
101+
Table Create Table
102+
t1 CREATE TABLE `t1` (
103+
`a` int(11) DEFAULT NULL
104+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=NONEXISTENT
105+
DROP TABLE t1;
106+
#
107+
# Attempt to alter table after its secondary engine has been removed.
108+
#
109+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
110+
SHOW CREATE TABLE t1;
111+
Table Create Table
112+
t1 CREATE TABLE `t1` (
113+
`a` int(11) DEFAULT NULL
114+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=NONEXISTENT
115+
ALTER TABLE t1 SECONDARY_ENGINE NULL;
116+
ALTER TABLE t1 COMMENT="Test";
117+
ALTER TABLE t1 ADD COLUMN (b INT);
118+
ALTER TABLE t1 SECONDARY_ENGINE NONEXISTENT;
119+
SHOW CREATE TABLE t1;
120+
Table Create Table
121+
t1 CREATE TABLE `t1` (
122+
`a` int(11) DEFAULT NULL,
123+
`b` int(11) DEFAULT NULL
124+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Test' SECONDARY_ENGINE=NONEXISTENT
125+
DROP TABLE t1;
126+
#
127+
# Attempt to rename a table with a secondary engine defined.
128+
#
129+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
130+
RENAME TABLE t1 TO t2;
131+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
132+
DROP TABLE t1;
133+
#
134+
# Attempt to use SECONDARY_LOAD in conjunction with another DDL.
135+
#
136+
CREATE TABLE t1 (i INT);
137+
ALTER TABLE t1 SECONDARY_LOAD, ADD KEY idx(i);
138+
ERROR HY000: Secondary engine operation failed. No secondary engine defined.
139+
ALTER TABLE t1 SECONDARY_ENGINE NONEXISTENT;
140+
ALTER TABLE t1 SECONDARY_LOAD, ADD KEY idx(i);
141+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
142+
DROP TABLE t1;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE
2+
FROM INFORMATION_SCHEMA.PLUGINS
3+
WHERE PLUGIN_NAME="MOCK";
4+
PLUGIN_NAME PLUGIN_STATUS PLUGIN_TYPE
5+
MOCK ACTIVE STORAGE ENGINE
6+
CREATE TABLE t1 (a INT) ENGINE MOCK;
7+
ERROR HY000: Table storage engine for 't1' doesn't have this option
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#
2+
# Load into and unload from secondary engine.
3+
#
4+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE MOCK;
5+
ALTER TABLE t1 SECONDARY_LOAD;
6+
ALTER TABLE t1 SECONDARY_UNLOAD;
7+
SHOW CREATE TABLE t1;
8+
Table Create Table
9+
t1 CREATE TABLE `t1` (
10+
`a` int(11) DEFAULT NULL
11+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=MOCK
12+
DROP TABLE t1;
13+
#
14+
# Attempt to load and unload table with no secondary engine.
15+
#
16+
CREATE TABLE t1 (a INT);
17+
ALTER TABLE t1 SECONDARY_LOAD;
18+
ERROR HY000: Secondary engine operation failed. No secondary engine defined.
19+
ALTER TABLE t1 SECONDARY_UNLOAD;
20+
ERROR HY000: Secondary engine operation failed. No secondary engine defined.
21+
ALTER TABLE t1 SECONDARY_ENGINE NULL;
22+
DROP TABLE t1;
23+
#
24+
# Attempt to unload temporary table with no secondary engine.
25+
#
26+
CREATE TEMPORARY TABLE t1 (a INT);
27+
ALTER TABLE t1 SECONDARY_LOAD;
28+
ERROR HY000: Secondary engine operation failed. No secondary engine defined.
29+
ALTER TABLE t1 SECONDARY_UNLOAD;
30+
ERROR HY000: Secondary engine operation failed. No secondary engine defined.
31+
ALTER TABLE t1 SECONDARY_ENGINE NULL;
32+
DROP TABLE t1;
33+
#
34+
# Attempt to load into secondary engine in conjunction with other DDL
35+
# operations.
36+
#
37+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE MOCK;
38+
ALTER TABLE t1 SECONDARY_LOAD, FORCE;
39+
ERROR HY000: DDLs on a table with a secondary engine defined are not allowed.
40+
DROP TABLE t1;
41+
#
42+
# Perform alterations related to secondary engine using differing
43+
# algorithms.
44+
#
45+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE MOCK;
46+
ALTER TABLE t1 SECONDARY_LOAD, ALGORITHM=INPLACE;
47+
ALTER TABLE t1 SECONDARY_UNLOAD, ALGORITHM=INPLACE;
48+
ALTER TABLE t1 SECONDARY_LOAD, ALGORITHM=COPY;
49+
ALTER TABLE t1 SECONDARY_UNLOAD, ALGORITHM=COPY;
50+
ALTER TABLE t1 SECONDARY_ENGINE NULL, ALGORITHM=INPLACE;
51+
ALTER TABLE t1 SECONDARY_ENGINE MOCK, ALGORITHM=INPLACE;
52+
ALTER TABLE t1 SECONDARY_ENGINE NULL, ALGORITHM=COPY;
53+
ALTER TABLE t1 SECONDARY_ENGINE MOCK, ALGORITHM=COPY;
54+
SHOW CREATE TABLE t1;
55+
Table Create Table
56+
t1 CREATE TABLE `t1` (
57+
`a` int(11) DEFAULT NULL
58+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci SECONDARY_ENGINE=MOCK
59+
DROP TABLE t1;
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# Tests for the SECONDARY_ENGINE table option.
2+
3+
--echo #
4+
--echo # Attempt to load table into an undefined secondary engine.
5+
--echo #
6+
CREATE TABLE t1 (a INT);
7+
--error ER_SECONDARY_ENGINE
8+
ALTER TABLE t1 SECONDARY_LOAD;
9+
DROP TABLE t1;
10+
11+
--echo #
12+
--echo # Attempt to load table into an unknown storage engine.
13+
--echo #
14+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
15+
--error ER_UNKNOWN_STORAGE_ENGINE
16+
ALTER TABLE t1 SECONDARY_LOAD;
17+
DROP TABLE t1;
18+
19+
--echo #
20+
--echo # Attempt to load table into an unsupported secondary storage engine.
21+
--echo #
22+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE InnoDB;
23+
--error ER_SECONDARY_ENGINE
24+
ALTER TABLE t1 SECONDARY_LOAD;
25+
DROP TABLE t1;
26+
27+
--echo #
28+
--echo # Create a table with a secondary engine defined.
29+
--echo #
30+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
31+
SHOW CREATE TABLE t1;
32+
DROP TABLE t1;
33+
34+
--echo #
35+
--echo # Attempt to redefine the secondary engine.
36+
--echo #
37+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
38+
--error ER_SECONDARY_ENGINE
39+
ALTER TABLE t1 SECONDARY_ENGINE ANOTHER_NONEXISTENT;
40+
DROP TABLE t1;
41+
42+
--echo #
43+
--echo # Define and undefine secondary engine (without loading in-between).
44+
--echo #
45+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
46+
ALTER TABLE t1 SECONDARY_ENGINE NULL;
47+
SHOW CREATE TABLE t1;
48+
DROP TABLE t1;
49+
50+
--echo #
51+
--echo # Attempt to create a temporary table with a secondary engine defined.
52+
--echo #
53+
--error ER_SECONDARY_ENGINE
54+
CREATE TEMPORARY TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
55+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
56+
--error ER_SECONDARY_ENGINE
57+
CREATE TEMPORARY TABLE t2 LIKE t1;
58+
DROP TABLE t1;
59+
60+
--echo #
61+
--echo # Attempt to create a table with a primary engine that does not support
62+
--echo # loading tables into a secondary engine.
63+
--error ER_CHECK_NOT_IMPLEMENTED
64+
CREATE TABLE t1 (a INT) ENGINE MYISAM SECONDARY_ENGINE NONEXISTENT;
65+
66+
--echo #
67+
--echo # Attempt to change primary storage engine to an engine that does not
68+
--echo # support loading into a secondary engine.
69+
--echo #
70+
CREATE TABLE t1 (a INT) ENGINE InnoDB SECONDARY_ENGINE NONEXISTENT;
71+
--error ER_SECONDARY_ENGINE_DDL
72+
ALTER TABLE t1 ENGINE MYISAM;
73+
SHOW CREATE TABLE t1;
74+
DROP TABLE t1;
75+
76+
--echo #
77+
--echo # Attempt to use SECONDARY_LOAD when creating table.
78+
--echo #
79+
--error ER_PARSE_ERROR
80+
CREATE TABLE t1 (a INT) SECONDARY_LOAD;
81+
--error ER_PARSE_ERROR
82+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT, SECONDARY_LOAD;
83+
84+
--echo #
85+
--echo # Attempt to alter a table after a secondary engine has been defined.
86+
--echo #
87+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
88+
--error ER_SECONDARY_ENGINE_DDL
89+
ALTER TABLE t1 COMMENT="Test";
90+
--error ER_SECONDARY_ENGINE_DDL
91+
ALTER TABLE t1 COMMENT="Test", ALGORITHM=INPLACE;
92+
--error ER_SECONDARY_ENGINE_DDL
93+
ALTER TABLE t1 COMMENT="Test", ALGORITHM=COPY;
94+
--error ER_SECONDARY_ENGINE_DDL
95+
ALTER TABLE t1 ADD COLUMN (b INT);
96+
--error ER_SECONDARY_ENGINE_DDL
97+
ALTER TABLE t1 ADD COLUMN (b INT), ALGORITHM=INPLACE;
98+
--error ER_SECONDARY_ENGINE_DDL
99+
ALTER TABLE t1 ADD COLUMN (b INT), ALGORITHM=COPY;
100+
SHOW CREATE TABLE t1;
101+
DROP TABLE t1;
102+
103+
--echo #
104+
--echo # Attempt to alter table after its secondary engine has been removed.
105+
--echo #
106+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
107+
SHOW CREATE TABLE t1;
108+
ALTER TABLE t1 SECONDARY_ENGINE NULL;
109+
ALTER TABLE t1 COMMENT="Test";
110+
ALTER TABLE t1 ADD COLUMN (b INT);
111+
ALTER TABLE t1 SECONDARY_ENGINE NONEXISTENT;
112+
SHOW CREATE TABLE t1;
113+
DROP TABLE t1;
114+
115+
--echo #
116+
--echo # Attempt to rename a table with a secondary engine defined.
117+
--echo #
118+
CREATE TABLE t1 (a INT) SECONDARY_ENGINE NONEXISTENT;
119+
--error ER_SECONDARY_ENGINE_DDL
120+
RENAME TABLE t1 TO t2;
121+
DROP TABLE t1;
122+
123+
--echo #
124+
--echo # Attempt to use SECONDARY_LOAD in conjunction with another DDL.
125+
--echo #
126+
CREATE TABLE t1 (i INT);
127+
--error ER_SECONDARY_ENGINE
128+
ALTER TABLE t1 SECONDARY_LOAD, ADD KEY idx(i);
129+
ALTER TABLE t1 SECONDARY_ENGINE NONEXISTENT;
130+
--error ER_SECONDARY_ENGINE_DDL
131+
ALTER TABLE t1 SECONDARY_LOAD, ADD KEY idx(i);
132+
DROP TABLE t1;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--disable_query_log
2+
eval INSTALL PLUGIN mock SONAME '$MOCK_PLUGIN';
3+
--enable_query_log
4+
5+
SELECT PLUGIN_NAME, PLUGIN_STATUS, PLUGIN_TYPE
6+
FROM INFORMATION_SCHEMA.PLUGINS
7+
WHERE PLUGIN_NAME="MOCK";
8+
9+
--error ER_ILLEGAL_HA
10+
CREATE TABLE t1 (a INT) ENGINE MOCK;
11+
12+
--disable_query_log
13+
UNINSTALL PLUGIN mock;
14+
--enable_query_log

0 commit comments

Comments
 (0)