summaryrefslogtreecommitdiff
path: root/storage/myisammrg/mysql-test
diff options
context:
space:
mode:
Diffstat (limited to 'storage/myisammrg/mysql-test')
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/alter_table.inc116
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/alter_table.rdiff68
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff27
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/analyze_table.rdiff22
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/autoincrement.rdiff34
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/cache_index.rdiff46
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/char_indexes.rdiff0
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/checksum_table_live.rdiff6
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/cleanup_engine.inc16
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/create_table.inc208
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/create_table.rdiff37
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/define_engine.inc49
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/disabled.def2
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/foreign_keys.rdiff138
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff142
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/handler.rdiff79
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/index.rdiff6
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff17
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/index_type_btree.rdiff6
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/index_type_hash.rdiff34
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/insert_delayed.rdiff14
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/lock.rdiff62
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/optimize_table.rdiff24
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/alter_table.rdiff63
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/analyze_table.rdiff83
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/check_table.rdiff172
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/checksum_table.rdiff81
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/create_table.rdiff156
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/optimize_table.rdiff91
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff295
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff100
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff103
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/show_engine.rdiff2
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_ai.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_avg_row_length.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_checksum.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_connection.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_delay_key_write.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_insert_method.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_key_block_size.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_max_rows.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_min_rows.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_pack_keys.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_password.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_opt_union.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_standard_opts.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/tbl_temporary.rdiff4
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff35
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_repeatable_read.rdiff9
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_serializable.rdiff9
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/delete.rdiff34
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/insert.rdiff32
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/level_read_committed.rdiff44
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/level_read_uncommitted.rdiff7
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/level_repeatable_read.rdiff53
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/level_serializable.rdiff69
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/select_for_update.rdiff40
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/select_lock_in_share_mode.rdiff26
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/update.rdiff41
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/xa.rdiff34
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/trx/xa_recovery.rdiff22
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/type_char_indexes.rdiff8
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/type_float_indexes.rdiff4
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff706
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff1412
-rw-r--r--storage/myisammrg/mysql-test/storage_engine/vcol.rdiff79
68 files changed, 5087 insertions, 0 deletions
diff --git a/storage/myisammrg/mysql-test/storage_engine/alter_table.inc b/storage/myisammrg/mysql-test/storage_engine/alter_table.inc
new file mode 100644
index 00000000000..a978ade4f75
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/alter_table.inc
@@ -0,0 +1,116 @@
+##################################
+#
+# This include file will be used for all ALTER TABLE statements in the suite.
+# If you need to add additional steps or change the logic, copy the file
+# to storage/<engine>/mysql-test/storage_engine/ folder and modify it there.
+#
+##################
+#
+# Parameters:
+#
+# --let $alter_definition = <alter definition> # mandatory, everything that goes after the table name in ALTER statement
+# --let $table_name = <table name> # optional, default t1
+# --let $error_codes = <expected error codes, as in --error> # optional, default 0
+# --let $online = [0|1] # optional, default 0 (1 adds ONLINE)
+# --let $rename_to = <new table name> # optional, default empty.
+# # If set, means we are running RENAME TO, then alter definition is ignored
+#
+# Usage examples:
+#
+# --let $alter_definition = ADD COLUMN b $char_col DEFAULT ''
+#
+
+--let $child_alter_definition = $alter_definition
+
+if ($rename_to)
+{
+ --let $alter_definition = RENAME TO $rename_to
+ --let $child_alter_definition = RENAME TO mrg.$rename_to
+}
+
+if (!$alter_definition)
+{
+ --die # The ALTER statement is empty
+}
+
+--let $alter_statement = ALTER
+
+if ($online)
+{
+ --let $alter_statement = $alter_statement ONLINE
+}
+
+if (!$table_name)
+{
+ --let $table_name = t1
+}
+
+--let $alter_statement = $alter_statement TABLE $table_name $alter_definition
+# We don't want to do ONLINE on underlying tables, we are not testing MyISAM
+--let $child_statement = ALTER TABLE mrg.$table_name $child_alter_definition
+
+
+
+# We now have the complete ALTER statement in $alter_statement.
+# If your ALTER statement should be composed differently,
+# modify the logic above.
+
+#####################
+# Here you can add logic needed BEFORE the main statement
+# (e.g. base tables need to be altered, etc.).
+# Surround it by --disable_query_log/--enable_query_log
+# if you don't want it to appear in the result output.
+#####################
+
+--source obfuscate.inc
+
+eval $alter_statement;
+--source check_errors.inc
+
+# Make sure you don't add any statements between the main ALTER (above)
+# and saving mysql_errno and mysql_errname (below)
+# They are saved in case you want to add more logic after the main ALTER,
+# because we need the result code of the statement.
+# Also, do not change $alter_statement after it is executed!
+
+--let $my_errno = $mysql_errno
+--let $my_errname = $mysql_errname
+
+#####################
+# Here you can add logic needed AFTER the main statement.
+# Surround it by --disable_query_log/--enable_query_log
+# if you don't want it to appear in the result output.
+#####################
+--disable_query_log
+--disable_warnings
+--disable_result_log
+# We will only try to alter the underlying table if the main alter was successful
+if (!$my_errno)
+{
+ if ($rename_to)
+ {
+ eval ALTER TABLE $rename_to UNION(mrg.$rename_to);
+ }
+ # In the same section, the manual says that FLUSH TABLES should be performed before altering
+ # the underlying table, and later also says that it should be done after. We'll do both
+ FLUSH TABLES;
+ eval $child_statement;
+ FLUSH TABLES;
+}
+--enable_result_log
+--enable_warnings
+--enable_query_log
+
+# Unset the parameters, we don't want them to be accidentally reused later
+--let $alter_definition =
+--let $table_name =
+--let $error_codes =
+--let $online = 0
+--let $rename_to =
+
+# Restore the error codes of the main statement
+--let $mysql_errno = $my_errno
+--let $mysql_errname = $my_errname
+# Make sure you don't add any SQL statements after restoring
+# mysql_errno and mysql_errname (above)
+
diff --git a/storage/myisammrg/mysql-test/storage_engine/alter_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/alter_table.rdiff
new file mode 100644
index 00000000000..447a38a5b2b
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/alter_table.rdiff
@@ -0,0 +1,68 @@
+11c11
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+19c19
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+27c27
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+35c35
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+43c43
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+51c51
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+59c59
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+67c67
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+75c75
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+82c82
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+91c91
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t2`)
+100c100
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+107c107
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+122c122
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+130c130
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=utf8
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+138c138
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+146c146
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff b/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff
new file mode 100644
index 00000000000..cfc821582ed
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/alter_tablespace.rdiff
@@ -0,0 +1,27 @@
+4,18c4,13
+< DROP TABLE t1;
+< CREATE TABLE t1 (a <INT_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< INSERT INTO t1 (a) VALUES (1),(2);
+< SELECT * FROM t1;
+< a
+< 1
+< 2
+< ALTER TABLE t1 DISCARD TABLESPACE;
+< SELECT * FROM t1;
+< ERROR HY000: Got error -1 from storage engine
+< ALTER TABLE t1 IMPORT TABLESPACE;
+< SELECT * FROM t1;
+< a
+< 1
+< 2
+---
+> ERROR HY000: 'test.t1' is not BASE TABLE
+> # ERROR: Statement ended with errno 1347, errname ER_WRONG_OBJECT (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ ALTER TABLE t1 DISCARD TABLESPACE ]
+> # The statement|command finished with ER_WRONG_OBJECT.
+> # Tablespace operations or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/analyze_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/analyze_table.rdiff
new file mode 100644
index 00000000000..139bcc00a81
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/analyze_table.rdiff
@@ -0,0 +1,22 @@
+8c8
+< test.t1 analyze status OK
+---
+> test.t1 analyze note The storage engine for the table doesn't support analyze
+12c12
+< test.t2 analyze status OK
+---
+> test.t2 analyze note The storage engine for the table doesn't support analyze
+17,18c17,18
+< test.t1 analyze status OK
+< test.t2 analyze status OK
+---
+> test.t1 analyze note The storage engine for the table doesn't support analyze
+> test.t2 analyze note The storage engine for the table doesn't support analyze
+24c24
+< test.t1 analyze status OK
+---
+> test.t1 analyze note The storage engine for the table doesn't support analyze
+28c28
+< test.t1 analyze status OK
+---
+> test.t1 analyze note The storage engine for the table doesn't support analyze
diff --git a/storage/myisammrg/mysql-test/storage_engine/autoincrement.rdiff b/storage/myisammrg/mysql-test/storage_engine/autoincrement.rdiff
new file mode 100644
index 00000000000..e9095aa3944
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/autoincrement.rdiff
@@ -0,0 +1,34 @@
+9c9
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+55c55
+< t1 <STORAGE_ENGINE> # # # # # # # # 6 # # # # # # #
+---
+> t1 <STORAGE_ENGINE> # # # # # # # # 0 # # # # # # #
+62c62
+< t1 # # # # # # # # # 8 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+81c81
+< t1 # # # # # # # # # 10 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+85c85
+< t1 # # # # # # # # # 21 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+106c106
+< t1 # # # # # # # # # 22 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+128,129c128,129
+< 100 a
+< 101 b
+---
+> 1 a
+> 2 b
+132c132
+< 100
+---
+> 1
diff --git a/storage/myisammrg/mysql-test/storage_engine/cache_index.rdiff b/storage/myisammrg/mysql-test/storage_engine/cache_index.rdiff
new file mode 100644
index 00000000000..e10b22a8e66
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/cache_index.rdiff
@@ -0,0 +1,46 @@
+15,16c15,16
+< test.t1 assign_to_keycache status OK
+< test.t2 assign_to_keycache status OK
+---
+> test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache
+> test.t2 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache
+19,20c19,20
+< test.t1 preload_keys status OK
+< test.t2 preload_keys status OK
+---
+> test.t1 preload_keys note The storage engine for the table doesn't support preload_keys
+> test.t2 preload_keys note The storage engine for the table doesn't support preload_keys
+25,26c25,26
+< test.t1 preload_keys status OK
+< test.t2 preload_keys status OK
+---
+> test.t1 preload_keys note The storage engine for the table doesn't support preload_keys
+> test.t2 preload_keys note The storage engine for the table doesn't support preload_keys
+31c31
+< test.t1 preload_keys status OK
+---
+> test.t1 preload_keys note The storage engine for the table doesn't support preload_keys
+35c35
+< test.t1 assign_to_keycache status OK
+---
+> test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache
+39c39
+< test.t1 preload_keys status OK
+---
+> test.t1 preload_keys note The storage engine for the table doesn't support preload_keys
+50c50
+< test.t1 assign_to_keycache status OK
+---
+> test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache
+54c54
+< test.t1 preload_keys status OK
+---
+> test.t1 preload_keys note The storage engine for the table doesn't support preload_keys
+62c62
+< test.t1 assign_to_keycache status OK
+---
+> test.t1 assign_to_keycache note The storage engine for the table doesn't support assign_to_keycache
+66c66
+< test.t1 preload_keys status OK
+---
+> test.t1 preload_keys note The storage engine for the table doesn't support preload_keys
diff --git a/storage/myisammrg/mysql-test/storage_engine/char_indexes.rdiff b/storage/myisammrg/mysql-test/storage_engine/char_indexes.rdiff
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/char_indexes.rdiff
diff --git a/storage/myisammrg/mysql-test/storage_engine/checksum_table_live.rdiff b/storage/myisammrg/mysql-test/storage_engine/checksum_table_live.rdiff
new file mode 100644
index 00000000000..1710cc18fea
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/checksum_table_live.rdiff
@@ -0,0 +1,6 @@
+14,15c14,15
+< test.t1 4272806499
+< test.t2 0
+---
+> test.t1 NULL
+> test.t2 NULL
diff --git a/storage/myisammrg/mysql-test/storage_engine/cleanup_engine.inc b/storage/myisammrg/mysql-test/storage_engine/cleanup_engine.inc
new file mode 100644
index 00000000000..b8f84110c76
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/cleanup_engine.inc
@@ -0,0 +1,16 @@
+###########################################
+#
+# This is a stub of the include file cleanup_engine.inc which
+# should be placed in storage/<engine>/mysql-test/storage_engine folder.
+#
+################################
+#
+# Here you can add whatever is needed to cleanup
+# in case your define_engine.inc created any artefacts,
+# e.g. an additional schema and/or tables.
+--disable_query_log
+--disable_warnings
+DROP DATABASE IF EXISTS mrg;
+--enable_warnings
+--enable_query_log
+
diff --git a/storage/myisammrg/mysql-test/storage_engine/create_table.inc b/storage/myisammrg/mysql-test/storage_engine/create_table.inc
new file mode 100644
index 00000000000..c74460d42fb
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/create_table.inc
@@ -0,0 +1,208 @@
+##################################
+#
+# This include file will be used for all CREATE TABLE statements in the suite.
+# If you need to add additional steps or change the logic, copy the file
+# to storage/<engine>/mysql-test/storage_engine/ folder and modify it there.
+#
+##################
+#
+# Parameters:
+#
+# --let $create_definition = <column names, types, indexes) # optional, default a $int_col, b $char_col (based on defaults)
+# --let $table_name = <table name> # optional, default t1
+# --let $table_options = <table options> # optional, default based on define_engine.inc
+# --let $partition_options = <partitioning definition> # optional, default none
+# --let $as_select = <SELECT statement> # optional, default empty
+# --let $error_codes = <expected error codes, as in --error> # optional, default 0
+# --let $if_not_exists = [0|1] # optional, default 0 (1 adds IF NOT EXISTS clause)
+# --let $default_engine = [0|1] # optional, default 0 (with 1 will rely on default engine, no ENGINE=)
+# --let $temporary = [0|1] # optional, default 0 (1 adds TEMPORARY)
+# --let $disable_query_log = [0|1] # optional, default 0 (1 disables logging of CREATE)
+#
+# Usage examples:
+#
+# --source create_table.inc -- creates a default table
+#
+# --let $create_definition = a INT NOT NULL, b CHAR(1) PRIMARY KEY, INDEX(a)
+# --let $table_options = AUTO_INCREMENT = 100
+# --let $partition_options = PARTITION BY HASH(a) PARTITIONS 2
+# --let $as_select = SELECT 1, 'a'
+# --source create_table.inc
+#
+# Additionally, a test can define $extra_tbl_options. The difference with $table_options
+# is that its value is persistent and will be used until it is unset explicitly, or
+# until the test ends. The purpose of it is to allow one test to call another test,
+# when the called test does not know about specific options the calling test might require,
+# and thus cannot set them on per-create basis.
+
+--let $create_statement = CREATE
+
+if ($temporary)
+{
+ --let $create_statement = $create_statement TEMPORARY
+}
+
+--let $create_statement = $create_statement TABLE
+
+if ($if_not_exists)
+{
+ --let $create_statement = $create_statement IF NOT EXISTS
+}
+
+if (!$table_name)
+{
+ --let $table_name = t1
+}
+
+# Child statement is a statement that will create an underlying table.
+# From this point, it will deviate from the main statement, that's why
+# we start creating it here in parallel with the main one.
+# For underlying tables, we will create a table in mrg schema, e.g.
+# for table t1 the underlying table will be mrg.t1, etc.
+# Since we will only create one child here, it should be enough. If we want more,
+# we can always add a suffix, e.g. mrg.t1_child1, mrg.t1_child2, etc.
+
+--let $child_statement = $create_statement mrg.$table_name
+--let $create_statement = $create_statement $table_name
+
+if (!$create_definition)
+{
+ # If $create_definition is not defined, and AS SELECT is requested,
+ # we should not set $create_definition to the default value,
+ # because it might be inconsistent with the SELECT.
+ if (!$as_select)
+ {
+ --let $create_definition = a $int_col, b $char_col
+ }
+}
+
+if ($create_definition)
+{
+ --let $create_statement = $create_statement ($create_definition)
+ # Table definition for the underlying table should be the same
+ # as for the MERGE table
+ --let $child_statement = $child_statement ($create_definition)
+}
+
+# If $default_engine is set, we will rely on the default storage engine
+
+if (!$default_engine)
+{
+ --let $create_statement = $create_statement ENGINE=$storage_engine
+}
+# Engine for an underlying table differs
+--let $child_statement = $child_statement ENGINE=MyISAM
+
+# Save default table options, we will want to restore them later
+--let $default_tbl_opts_saved = $default_tbl_opts
+--let $default_tbl_opts = $default_tbl_opts UNION(mrg.$table_name) INSERT_METHOD=LAST
+
+# Default table options from define_engine.inc
+--let $create_statement = $create_statement $default_tbl_opts
+
+# The calling script could request additional table options
+if ($table_options)
+{
+ --let $create_statement = $create_statement $table_options
+ --let $child_statement = $child_statement $table_options
+}
+
+# The difference between $extra_tbl_opts and $table_options
+# is that its $extra_tbl_opts is persistent -- it will not be unset at the end of this file,
+# and will be used until it is unset explicitly by the calling test,
+# or until the test ends. The purpose of it is to allow one test to call another test,
+# when the called test does not know about specific options the calling test might require,
+# and thus cannot set them on per-create basis.
+
+if ($extra_tbl_opts)
+{
+ --let $create_statement = $create_statement $extra_tbl_opts
+ --let $child_statement = $child_statement $extra_tbl_opts
+}
+
+if ($as_select)
+{
+ --let $create_statement = $create_statement AS $as_select
+ --let $child_statement = $child_statement AS $as_select
+}
+
+if ($partition_options)
+{
+ --let $create_statement = $create_statement $partition_options
+ --let $child_statement = $child_statement $partition_options
+}
+
+# We now have the complete CREATE statement in $create_statement.
+# If your CREATE statement should be composed differently,
+# modify the logic above.
+
+#####################
+# Here you can add logic needed BEFORE the main table creation
+# (e.g. the table needs a base table, a reference table, etc.).
+# Surround it by --disable_query_log/--enable_query_log
+# if you don't want it to appear in the result output.
+#####################
+--disable_warnings
+--disable_query_log
+--disable_result_log
+eval DROP TABLE IF EXISTS mrg.$table_name;
+eval $child_statement;
+--enable_result_log
+--enable_query_log
+--enable_warnings
+
+if ($disable_query_log)
+{
+ --disable_query_log
+}
+
+--source obfuscate.inc
+
+eval $create_statement;
+--source strict_check_errors.inc
+
+# Make sure you don't add any statements between the main CREATE (above)
+# and saving mysql_errno and mysql_errname (below)
+# They are saved in case you want to add more logic after the main CREATE,
+# because we need the result code of the table creation.
+# Also, do not change $create_statement after it is executed!
+
+--let $my_errno = $mysql_errno
+--let $my_errname = $mysql_errname
+
+
+if ($disable_query_log)
+{
+ --enable_query_log
+}
+
+#####################
+# Here you can add logic needed AFTER the main table creation,
+# e.g. triggers creation.
+# Surround it by --disable_query_log/--enable_query_log
+# if you don't want it to appear in the result output.
+#####################
+
+
+# Unset the parameters, we don't want them to be accidentally reused later
+--let $create_definition =
+--let $table_name = t1
+--let $table_options =
+--let $partition_options =
+--let $as_select = 0
+--let $error_codes =
+--let $if_not_exists = 0
+--let $default_engine = 0
+--let $temporary = 0
+--let $disable_query_log = 0
+
+# Restore default table options now
+--let $default_tbl_opts = $default_tbl_opts_saved
+
+
+# Restore the error codes of the main statement
+--let $mysql_errno = $my_errno
+--let $mysql_errname = $my_errname
+# Make sure you don't add any SQL statements after restoring
+# mysql_errno and mysql_errname (above)
+
diff --git a/storage/myisammrg/mysql-test/storage_engine/create_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/create_table.rdiff
new file mode 100644
index 00000000000..5d3578ad3cd
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/create_table.rdiff
@@ -0,0 +1,37 @@
+7c7
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+16c16
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+22c22
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+27,36c27,35
+< SHOW CREATE TABLE t1;
+< Table Create Table
+< t1 CREATE TABLE `t1` (
+< `1` bigint(20) NOT NULL DEFAULT '0'
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+< SELECT * FROM t1;
+< 1
+< 1
+< 2
+< DROP TABLE t1;
+---
+> ERROR HY000: 'test.t1' is not BASE TABLE
+> # ERROR: Statement ended with errno 1347, errname ER_WRONG_OBJECT (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_WRONG_OBJECT.
+> # CREATE TABLE .. AS SELECT or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+43c42
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/define_engine.inc b/storage/myisammrg/mysql-test/storage_engine/define_engine.inc
new file mode 100644
index 00000000000..aabd1747737
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/define_engine.inc
@@ -0,0 +1,49 @@
+###########################################
+#
+# This is a template of the include file define_engine.inc which
+# should be placed in storage/<engine>/mysql-test/storage_engine folder.
+#
+################################
+#
+# The name of the engine under test must be defined in $ENGINE variable.
+# You can set it either here (uncomment and edit) or in your environment.
+#
+let $ENGINE = MRG_MYISAM;
+#
+################################
+#
+# The following three variables define specific options for columns and tables.
+# Normally there should be none needed, but for some engines it can be different.
+# If the engine requires specific column option for all or indexed columns,
+# set them inside the comment, e.g. /*!NOT NULL*/.
+# Do the same for table options if needed, e.g. /*!INSERT_METHOD=LAST*/
+
+let $default_col_opts = /*!*/;
+let $default_col_indexed_opts = /*!*/;
+let $default_tbl_opts = /*!*/;
+
+# INDEX, UNIQUE INDEX, PRIMARY KEY, special index type - choose the fist that the engine allows,
+# or set it to /*!*/ if none is supported
+
+let $default_index = /*!INDEX*/;
+
+# If the engine does not support the following types, replace them with the closest possible
+
+let $default_int_type = INT(11);
+let $default_char_type = CHAR(8);
+
+################################
+
+--disable_query_log
+--disable_result_log
+
+# Here you can place your custom MTR code which needs to be executed before each test,
+# e.g. creation of an additional schema or table, etc.
+# The cleanup part should be defined in cleanup_engine.inc
+--disable_warnings
+DROP DATABASE IF EXISTS mrg;
+--enable_warnings
+CREATE DATABASE mrg;
+
+--enable_query_log
+--enable_result_log
diff --git a/storage/myisammrg/mysql-test/storage_engine/disabled.def b/storage/myisammrg/mysql-test/storage_engine/disabled.def
new file mode 100644
index 00000000000..9f7569a2d24
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/disabled.def
@@ -0,0 +1,2 @@
+alter_table_online : MySQL:57657 (Temporary MERGE table with temporary underlying is broken by ALTER)
+
diff --git a/storage/myisammrg/mysql-test/storage_engine/foreign_keys.rdiff b/storage/myisammrg/mysql-test/storage_engine/foreign_keys.rdiff
new file mode 100644
index 00000000000..7362bd282a5
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/foreign_keys.rdiff
@@ -0,0 +1,138 @@
+15,17c15,16
+< KEY `a` (`a`),
+< CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`)
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> KEY `a` (`a`)
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t2`)
+19c18,25
+< ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))
+---
+> # ERROR: Statement succeeded (expected results: ER_NO_REFERENCED_ROW_2)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command succeeded unexpectedly.
+> # Foreign keys or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+23c29,36
+< ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))
+---
+> # ERROR: Statement succeeded (expected results: ER_NO_REFERENCED_ROW_2)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command succeeded unexpectedly.
+> # Foreign keys or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+25c38
+< ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))
+---
+> # ERROR: Statement succeeded (expected results: ER_ROW_IS_REFERENCED_2)
+27c40,47
+< ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`))
+---
+> # ERROR: Statement succeeded (expected results: ER_ROW_IS_REFERENCED_2)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command succeeded unexpectedly.
+> # Foreign keys or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+32c52
+< 2 d
+---
+> 3 d
+35c55,56
+< 1 a
+---
+> 3 b
+> 3 b
+37c58,65
+< ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails
+---
+> # ERROR: Statement succeeded (expected results: ER_ROW_IS_REFERENCED)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command succeeded unexpectedly.
+> # Foreign keys or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+49,51c77,78
+< KEY `a` (`a`),
+< CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`) ON DELETE CASCADE ON UPDATE CASCADE
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> KEY `a` (`a`)
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t2`)
+53c80
+< ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`) ON DELETE CASCADE ON UPDATE CASCADE)
+---
+> # ERROR: Statement succeeded (expected results: ER_NO_REFERENCED_ROW_2)
+54a82
+> ERROR 42S02: Table 'test.t1' doesn't exist
+56a85,92
+> ERROR 42S02: Table 'test.t1' doesn't exist
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_NO_SUCH_TABLE.
+> # UPDATE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+59,64c95,104
+< 5 a
+< 5 a
+< 5 b
+< 5 c
+< 5 d
+< 5 e
+---
+> 1 a
+> 1 a
+> 2 b
+> 2 b
+> 3 a
+> 3 c
+> 3 c
+> 4 d
+> 4 d
+> 4 e
+65a106,113
+> ERROR 42S02: Table 'test.t1' doesn't exist
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_NO_SUCH_TABLE.
+> # DELETE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+67a116,125
+> 1 a
+> 1 a
+> 2 b
+> 2 b
+> 3 a
+> 3 c
+> 3 c
+> 4 d
+> 4 d
+> 4 e
+69c127,135
+< ERROR 42000: Cannot truncate a table referenced in a foreign key constraint (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `test`.`t1` (`a`))
+---
+> ERROR 42S02: Table 'test.t1' doesn't exist
+> # ERROR: Statement ended with errno 1146, errname ER_NO_SUCH_TABLE (expected results: ER_TRUNCATE_ILLEGAL_FK)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_NO_SUCH_TABLE.
+> # Foreign keys or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+71a138
+> ERROR 42S02: Unknown table 't1'
diff --git a/storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff b/storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff
new file mode 100644
index 00000000000..262370f01ed
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/fulltext_search.rdiff
@@ -0,0 +1,142 @@
+7,64c7,15
+< SHOW INDEXES IN t1;
+< Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+< t1 1 v1 1 v1 # # NULL NULL YES FULLTEXT
+< INSERT INTO t1 (v0,v1,v2) VALUES ('text1','Here is a list of recommended books on MariaDB and MySQL. We\'ve provided links to Amazon.com here for convenience, but they can be found at many other bookstores, both online and off.
+< If you want to have your favorite MySQL / MariaDB book listed here, please leave a comment.
+< For developers who want to code on MariaDB or MySQL
+< * Understanding MySQL Internals by Sasha Pachev, former MySQL developer at MySQL AB.
+< o This is the only book we know about that describes the internals of MariaDB / MySQL. A must have for anyone who wants to understand and develop on MariaDB!
+< o Not all topics are covered and some parts are slightly outdated, but still the best book on this topic.
+< * MySQL 5.1 Plugin Development by Sergei Golubchik and Andrew Hutchings
+< o A must read for anyone wanting to write a plugin for MariaDB, written by the Sergei who designed the plugin interface for MySQL and MariaDB!
+< For MariaDB / MySQL end users
+< * MariaDB Crash Course by Ben Forta
+< o First MariaDB book!
+< o For people who want to learn SQL and the basics of MariaDB.
+< o Now shipping. Purchase at Amazon.com or your favorite bookseller.
+< * SQL-99 Complete, Really by Peter Gulutzan & Trudy Pelzer.
+< o Everything you wanted to know about the SQL 99 standard. Excellent reference book!
+< o Free to read in the Knowledgebase!
+< * MySQL (4th Edition) by Paul DuBois
+< o The \'default\' book to read if you wont to learn to use MySQL / MariaDB.
+< * MySQL Cookbook by Paul DuBois
+< o A lot of examples of how to use MySQL. As with all of Paul\'s books, it\'s worth its weight in gold and even enjoyable reading for such a \'dry\' subject.
+< * High Performance MySQL, Second Edition, By Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy D. Zawodny, Arjen Lentz, Derek J. Balling, et al.
+< o \"High Performance MySQL is the definitive guide to building fast, reliable systems with MySQL. Written by noted experts with years of real-world experience building very large systems, this book covers every aspect of MySQL performance in detail, and focuses on robustness, security, and data integrity. Learn advanced techniques in depth so you can bring out MySQL\'s full power.\" (From the book description at O\'Reilly)
+<
+< * MySQL Admin Cookbook
+< o A quick step-by-step guide for MySQL users and database administrators to tackle real-world challenges with MySQL configuration and administration
+<
+< * MySQL 5.0 Certification Study Guide, By Paul DuBois, Stefan Hinz, Carsten Pedersen
+< o This is the official guide to cover the passing of the two MySQL Certification examinations. It is valid till version 5.0 of the server, so while it misses all the features available in MySQL 5.1 and greater (including MariaDB 5.1 and greater), it provides a good basic understanding of MySQL for the end-user. ',
+< 'There are several reasons why contributing code is one of the easiest and most rewarding ways to contribute to MariaDB:
+<
+< 1. We are very responsive toward reviews of submitted code and as soon as the review is done, the submitted code is merged into an existing MariaDB tree and made available to everyone, not just select customers.
+< 2. Code reviews are performed by the MariaDB core development team and the quality, detail, and timeliness of our reviews are better than you will find elsewhere.
+< 3. With MariaDB everyone has access to the latest code.
+< 4. If a patch is very safe and/or very useful we are willing to push it into the stable code (as long as it can\'t break any existing applications). We are willing to do this to ensure the freedom to add small, needed fixes on a stable release so users don\'t have to wait a year for something to be added which is critical to their business.
+< 5. If you are an active contributor, you can become a member of maria-captains, even if you aren\'t working for Monty Program Ab. All captains have the same rights as any other captain to accept and reject patches. Our development model is truly open for everyone.
+< The Contributing Code page details many of the actual steps involved in working with the MariaDB source code. It\'s important that you use the same tools and submit patches in the same way as other developers to keep development running smoothly.'
+< ), ('text2','test1','test2');
+< SELECT v0 FROM t1 WHERE MATCH(v1) AGAINST ('contributing' IN NATURAL LANGUAGE MODE);
+< v0
+< INSERT INTO t1 (v0,v1,v2) VALUES ('text3','test','test');
+< SELECT v0, MATCH(v1) AGAINST('contributing' IN NATURAL LANGUAGE MODE) AS rating FROM t1 WHERE MATCH(v1) AGAINST ('contributing' IN NATURAL LANGUAGE MODE);
+< v0 rating
+< INSERT INTO t1 (v0,v1,v2) VALUES ('text4','Contributing more...','...is a good idea'),('text5','test','test');
+< SELECT v0, MATCH(v1) AGAINST('contributing') AS rating FROM t1 WHERE MATCH(v1) AGAINST ('contributing');
+< v0 rating
+< text4 1.3705332279205322
+< SELECT v0 FROM t1 WHERE MATCH(v1,v2) AGAINST ('-test1 +critical +Cook*' IN BOOLEAN MODE);
+< v0
+< text1
+< SELECT v0 FROM t1 WHERE MATCH(v1,v2) AGAINST ('-patch +critical +Cook*' IN BOOLEAN MODE);
+< v0
+< SELECT v0, MATCH(v1) AGAINST('database' WITH QUERY EXPANSION) AS rating FROM t1 WHERE MATCH(v1) AGAINST ('database' WITH QUERY EXPANSION);
+< v0 rating
+< text1 178.11756896972656
+< DROP TABLE t1;
+---
+> ERROR HY000: The used table type doesn't support FULLTEXT indexes
+> # ERROR: Statement ended with errno 1214, errname ER_TABLE_CANT_HANDLE_FT (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_TABLE_CANT_HANDLE_FT.
+> # FULLTEXT indexes or VARCHAR|TEXT data types or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+71,132c22,30
+< SHOW INDEXES IN t1;
+< Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+< t1 1 v1 1 v1 # # NULL NULL YES FULLTEXT
+< t1 1 v1_v2 1 v1 # # NULL NULL YES FULLTEXT
+< t1 1 v1_v2 2 v2 # # NULL NULL YES FULLTEXT
+< INSERT INTO t1 (v0,v1,v2) VALUES ('text1','Here is a list of recommended books on MariaDB and MySQL. We\'ve provided links to Amazon.com here for convenience, but they can be found at many other bookstores, both online and off.
+< If you want to have your favorite MySQL / MariaDB book listed here, please leave a comment.
+< For developers who want to code on MariaDB or MySQL
+< * Understanding MySQL Internals by Sasha Pachev, former MySQL developer at MySQL AB.
+< o This is the only book we know about that describes the internals of MariaDB / MySQL. A must have for anyone who wants to understand and develop on MariaDB!
+< o Not all topics are covered and some parts are slightly outdated, but still the best book on this topic.
+< * MySQL 5.1 Plugin Development by Sergei Golubchik and Andrew Hutchings
+< o A must read for anyone wanting to write a plugin for MariaDB, written by the Sergei who designed the plugin interface for MySQL and MariaDB!
+< For MariaDB / MySQL end users
+< * MariaDB Crash Course by Ben Forta
+< o First MariaDB book!
+< o For people who want to learn SQL and the basics of MariaDB.
+< o Now shipping. Purchase at Amazon.com or your favorite bookseller.
+< * SQL-99 Complete, Really by Peter Gulutzan & Trudy Pelzer.
+< o Everything you wanted to know about the SQL 99 standard. Excellent reference book!
+< o Free to read in the Knowledgebase!
+< * MySQL (4th Edition) by Paul DuBois
+< o The \'default\' book to read if you wont to learn to use MySQL / MariaDB.
+< * MySQL Cookbook by Paul DuBois
+< o A lot of examples of how to use MySQL. As with all of Paul\'s books, it\'s worth its weight in gold and even enjoyable reading for such a \'dry\' subject.
+< * High Performance MySQL, Second Edition, By Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy D. Zawodny, Arjen Lentz, Derek J. Balling, et al.
+< o \"High Performance MySQL is the definitive guide to building fast, reliable systems with MySQL. Written by noted experts with years of real-world experience building very large systems, this book covers every aspect of MySQL performance in detail, and focuses on robustness, security, and data integrity. Learn advanced techniques in depth so you can bring out MySQL\'s full power.\" (From the book description at O\'Reilly)
+<
+< * MySQL Admin Cookbook
+< o A quick step-by-step guide for MySQL users and database administrators to tackle real-world challenges with MySQL configuration and administration
+<
+< * MySQL 5.0 Certification Study Guide, By Paul DuBois, Stefan Hinz, Carsten Pedersen
+< o This is the official guide to cover the passing of the two MySQL Certification examinations. It is valid till version 5.0 of the server, so while it misses all the features available in MySQL 5.1 and greater (including MariaDB 5.1 and greater), it provides a good basic understanding of MySQL for the end-user. ',
+< 'There are several reasons why contributing code is one of the easiest and most rewarding ways to contribute to MariaDB:
+<
+< 1. We are very responsive toward reviews of submitted code and as soon as the review is done, the submitted code is merged into an existing MariaDB tree and made available to everyone, not just select customers.
+< 2. Code reviews are performed by the MariaDB core development team and the quality, detail, and timeliness of our reviews are better than you will find elsewhere.
+< 3. With MariaDB everyone has access to the latest code.
+< 4. If a patch is very safe and/or very useful we are willing to push it into the stable code (as long as it can\'t break any existing applications). We are willing to do this to ensure the freedom to add small, needed fixes on a stable release so users don\'t have to wait a year for something to be added which is critical to their business.
+< 5. If you are an active contributor, you can become a member of maria-captains, even if you aren\'t working for Monty Program Ab. All captains have the same rights as any other captain to accept and reject patches. Our development model is truly open for everyone.
+< The Contributing Code page details many of the actual steps involved in working with the MariaDB source code. It\'s important that you use the same tools and submit patches in the same way as other developers to keep development running smoothly.'
+< ), ('text2','test1','test2');
+< SELECT v0 FROM t1 WHERE MATCH(v1,v2) AGAINST ('contributing' IN NATURAL LANGUAGE MODE);
+< v0
+< INSERT INTO t1 (v0,v1,v2) VALUES ('text3','test','test');
+< SELECT v0, MATCH(v1,v2) AGAINST('contributing' IN NATURAL LANGUAGE MODE) AS rating FROM t1 WHERE MATCH(v1,v2) AGAINST ('contributing' IN NATURAL LANGUAGE MODE);
+< v0 rating
+< text1 0.2809644043445587
+< INSERT INTO t1 (v0,v1,v2) VALUES ('text4','Contributing more...','...is a good idea'),('text5','test','test');
+< SELECT v0, MATCH(v1) AGAINST('contributing') AS rating FROM t1 WHERE MATCH(v1) AGAINST ('contributing');
+< v0 rating
+< text4 1.3705332279205322
+< SELECT v0 FROM t1 WHERE MATCH(v1,v2) AGAINST ('-test1 +critical +Cook*' IN BOOLEAN MODE);
+< v0
+< text1
+< SELECT v0 FROM t1 WHERE MATCH(v1,v2) AGAINST ('-patch +critical +Cook*' IN BOOLEAN MODE);
+< v0
+< SELECT v0, MATCH(v1,v2) AGAINST('database' WITH QUERY EXPANSION) AS rating FROM t1 WHERE MATCH(v1,v2) AGAINST ('database' WITH QUERY EXPANSION);
+< v0 rating
+< text1 190.56150817871094
+< text4 1.1758291721343994
+< DROP TABLE t1;
+---
+> ERROR HY000: The used table type doesn't support FULLTEXT indexes
+> # ERROR: Statement ended with errno 1214, errname ER_TABLE_CANT_HANDLE_FT (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_TABLE_CANT_HANDLE_FT.
+> # FULLTEXT indexes or multiple keys or VARCHAR|TEXT data types or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/handler.rdiff b/storage/myisammrg/mysql-test/storage_engine/handler.rdiff
new file mode 100644
index 00000000000..f0c01085ad9
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/handler.rdiff
@@ -0,0 +1,79 @@
+5,47c5,12
+< HANDLER t1 READ FIRST;
+< ERROR 42S02: Unknown table 't1' in HANDLER
+< HANDLER h1 READ FIRST;
+< a b
+< foobar 1000
+< HANDLER h1 READ NEXT;
+< a b
+< a 1
+< HANDLER h1 READ FIRST WHERE a < 'foo';
+< a b
+< a 1
+< HANDLER h1 READ NEXT;
+< a b
+< bar 200
+< HANDLER h1 READ NEXT;
+< a b
+< foo 100
+< HANDLER h1 READ NEXT;
+< a b
+< HANDLER h1 READ FIRST LIMIT 2;
+< a b
+< foobar 1000
+< a 1
+< HANDLER h1 READ NEXT;
+< a b
+< bar 200
+< HANDLER h1 READ NEXT WHERE b>500 LIMIT 2;
+< a b
+< HANDLER t1 OPEN;
+< HANDLER h1 READ FIRST WHERE b>500 LIMIT 5;
+< a b
+< foobar 1000
+< HANDLER t1 READ NEXT;
+< a b
+< foobar 1000
+< HANDLER h1 READ NEXT WHERE b<100;
+< a b
+< HANDLER t1 CLOSE;
+< HANDLER h1 READ FIRST;
+< a b
+< foobar 1000
+< HANDLER t1 CLOSE;
+< ERROR 42S02: Unknown table 't1' in HANDLER
+---
+> ERROR HY000: Table storage engine for 'h1' doesn't have this option
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_ILLEGAL_HA.
+> # Functionality or the syntax or the mix could be unsupported.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+54,76c19
+< HANDLER h1 READ a = (100);
+< a b
+< 100 f
+< HANDLER h1 READ a <= (100) WHERE b < 'f';
+< a b
+< 2 c
+< HANDLER h1 READ a > (2) WHERE b IS NOT NULL LIMIT 2;
+< a b
+< 100 f
+< 101 b
+< HANDLER h1 READ a FIRST;
+< a b
+< 1 a
+< HANDLER h1 READ a LAST;
+< a b
+< 200 b
+< HANDLER h1 READ a PREV;
+< a b
+< 101 b
+< HANDLER h1 READ a NEXT;
+< a b
+< 200 b
+< HANDLER h1 CLOSE;
+---
+> ERROR HY000: Table storage engine for 'h1' doesn't have this option
diff --git a/storage/myisammrg/mysql-test/storage_engine/index.rdiff b/storage/myisammrg/mysql-test/storage_engine/index.rdiff
new file mode 100644
index 00000000000..6e6f18e39bc
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/index.rdiff
@@ -0,0 +1,6 @@
+64,66c64
+< ERROR 23000: Duplicate entry '1' for key 'a'
+< # Statement ended with one of expected results (ER_DUP_ENTRY,ER_DUP_KEY).
+< # If you got a difference in error message, just add it to rdiff file
+---
+> # ERROR: Statement succeeded (expected results: ER_DUP_ENTRY,ER_DUP_KEY)
diff --git a/storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff b/storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff
new file mode 100644
index 00000000000..8913f17a2a6
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/index_enable_disable.rdiff
@@ -0,0 +1,17 @@
+13a14,15
+> Warnings:
+> Note 1031 Table storage engine for 't1' doesn't have this option
+16c18
+< t1 1 a 1 a # # NULL NULL YES BTREE disabled
+---
+> t1 1 a 1 a # # NULL NULL YES BTREE
+19c21
+< 1 SIMPLE t1 ALL NULL NULL NULL NULL 19 Using filesort
+---
+> 1 SIMPLE t1 index NULL a 5 NULL 19 Using index
+22a25,26
+> Warnings:
+> Note 1031 Table storage engine for 't1' doesn't have this option
+34a39,40
+> Warnings:
+> Note 1031 Table storage engine for 't1' doesn't have this option
diff --git a/storage/myisammrg/mysql-test/storage_engine/index_type_btree.rdiff b/storage/myisammrg/mysql-test/storage_engine/index_type_btree.rdiff
new file mode 100644
index 00000000000..6e6f18e39bc
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/index_type_btree.rdiff
@@ -0,0 +1,6 @@
+64,66c64
+< ERROR 23000: Duplicate entry '1' for key 'a'
+< # Statement ended with one of expected results (ER_DUP_ENTRY,ER_DUP_KEY).
+< # If you got a difference in error message, just add it to rdiff file
+---
+> # ERROR: Statement succeeded (expected results: ER_DUP_ENTRY,ER_DUP_KEY)
diff --git a/storage/myisammrg/mysql-test/storage_engine/index_type_hash.rdiff b/storage/myisammrg/mysql-test/storage_engine/index_type_hash.rdiff
new file mode 100644
index 00000000000..1b57afe5b64
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/index_type_hash.rdiff
@@ -0,0 +1,34 @@
+7c7
+< t1 1 a 1 a # # NULL NULL # HASH
+---
+> t1 1 a 1 a # # NULL NULL # BTREE
+15,16c15,16
+< t1 1 a_b 1 a # # NULL NULL # HASH a_b index
+< t1 1 a_b 2 b # # NULL NULL # HASH a_b index
+---
+> t1 1 a_b 1 a # # NULL NULL # BTREE a_b index
+> t1 1 a_b 2 b # # NULL NULL # BTREE a_b index
+25,26c25,26
+< t1 1 a 1 a # # NULL NULL # HASH
+< t1 1 b 1 b # # NULL NULL # HASH
+---
+> t1 1 a 1 a # # NULL NULL # BTREE
+> t1 1 b 1 b # # NULL NULL # BTREE
+34c34
+< t1 0 a 1 a # # NULL NULL # HASH
+---
+> t1 0 a 1 a # # NULL NULL # BTREE
+46c46
+< t1 1 a 1 a # # NULL NULL # HASH simple index on a
+---
+> t1 1 a 1 a # # NULL NULL # BTREE simple index on a
+55c55
+< t1 0 a 1 a # # NULL NULL # HASH
+---
+> t1 0 a 1 a # # NULL NULL # BTREE
+64,66c64
+< ERROR 23000: Duplicate entry '1' for key 'a'
+< # Statement ended with one of expected results (ER_DUP_ENTRY,ER_DUP_KEY).
+< # If you got a difference in error message, just add it to rdiff file
+---
+> # ERROR: Statement succeeded (expected results: ER_DUP_ENTRY,ER_DUP_KEY)
diff --git a/storage/myisammrg/mysql-test/storage_engine/insert_delayed.rdiff b/storage/myisammrg/mysql-test/storage_engine/insert_delayed.rdiff
new file mode 100644
index 00000000000..e0d0eefabe4
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/insert_delayed.rdiff
@@ -0,0 +1,14 @@
+7a8,15
+> ERROR HY000: DELAYED option not supported for table 't1'
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_DELAYED_NOT_SUPPORTED.
+> # INSERT DELAYED or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+8a17
+> ERROR HY000: DELAYED option not supported for table 't1'
+23,24d31
+< 3 c
+< 4 d
diff --git a/storage/myisammrg/mysql-test/storage_engine/lock.rdiff b/storage/myisammrg/mysql-test/storage_engine/lock.rdiff
new file mode 100644
index 00000000000..d035648551a
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/lock.rdiff
@@ -0,0 +1,62 @@
+44a45,46
+> ERROR HY000: Table 't1' was not locked with LOCK TABLES
+> # ERROR: Statement ended with errno 1100, errname ER_TABLE_NOT_LOCKED (expected to succeed)
+45a48,49
+> ERROR HY000: Table 't2' was not locked with LOCK TABLES
+> # ERROR: Statement ended with errno 1100, errname ER_TABLE_NOT_LOCKED (expected to succeed)
+46a51
+> ERROR HY000: Table 't2' was not locked with LOCK TABLES
+47a53
+> ERROR HY000: Table 't2' was not locked with LOCK TABLES
+48a55
+> ERROR 42S02: Table 'test.t1' doesn't exist
+49a57
+> ERROR 42S02: Table 'test.t1' doesn't exist
+50a59
+> ERROR 42S02: Table 'test.t1' doesn't exist
+52a62
+> ERROR 42S02: Table 'test.t1' doesn't exist
+54c64,65
+< ERROR HY000: Table 't1' was not locked with LOCK TABLES
+---
+> ERROR 42S02: Table 'test.t1' doesn't exist
+> # ERROR: Statement ended with errno 1146, errname ER_NO_SUCH_TABLE (expected results: ER_TABLE_NOT_LOCKED)
+56a68
+> ERROR 42S02: Table 'test.t1' doesn't exist
+57a70
+> ERROR 42S02: Table 'test.t1' doesn't exist
+59c72,73
+< ERROR HY000: Table 't2' was not locked with LOCK TABLES
+---
+> ERROR 42S02: Unknown table 't1,t2'
+> # ERROR: Statement ended with errno 1051, errname ER_BAD_TABLE_ERROR (expected results: ER_TABLE_NOT_LOCKED)
+61a76
+> ERROR 42S02: Unknown table 't1,t2'
+67a83,84
+> ERROR HY000: Table 't1' was not locked with LOCK TABLES
+> # ERROR: Statement ended with errno 1100, errname ER_TABLE_NOT_LOCKED (expected to succeed)
+68a86,87
+> ERROR HY000: Table 't2' was not locked with LOCK TABLES
+> # ERROR: Statement ended with errno 1100, errname ER_TABLE_NOT_LOCKED (expected to succeed)
+69a89,90
+> ERROR HY000: Table 't3' was not locked with LOCK TABLES
+> # ERROR: Statement ended with errno 1100, errname ER_TABLE_NOT_LOCKED (expected to succeed)
+70a92
+> ERROR 42S02: Table 'test.t1' doesn't exist
+71a94,103
+> ERROR 42S02: Table 'test.t2' doesn't exist
+> # ERROR: Statement ended with errno 1146, errname ER_NO_SUCH_TABLE (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ ALTER TABLE t2 ADD COLUMN c2 INT(11) /*!*/ /*Custom column options*/ ]
+> # The statement|command finished with ER_NO_SUCH_TABLE.
+> # ALTER TABLE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+72a105
+> ERROR 42S02: Unknown table 't1,t2,t3'
+109c142
+< a b
+---
+> ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
diff --git a/storage/myisammrg/mysql-test/storage_engine/optimize_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/optimize_table.rdiff
new file mode 100644
index 00000000000..f74c49cedea
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/optimize_table.rdiff
@@ -0,0 +1,24 @@
+8c8
+< test.t1 optimize status OK
+---
+> test.t1 optimize note The storage engine for the table doesn't support optimize
+12c12
+< test.t2 optimize status OK
+---
+> test.t2 optimize note The storage engine for the table doesn't support optimize
+17,18c17,18
+< test.t1 optimize status OK
+< test.t2 optimize status OK
+---
+> test.t1 optimize note The storage engine for the table doesn't support optimize
+> test.t2 optimize note The storage engine for the table doesn't support optimize
+21,22c21,22
+< test.t1 optimize status Table is already up to date
+< test.t2 optimize status Table is already up to date
+---
+> test.t1 optimize note The storage engine for the table doesn't support optimize
+> test.t2 optimize note The storage engine for the table doesn't support optimize
+28c28
+< test.t1 optimize status OK
+---
+> test.t1 optimize note The storage engine for the table doesn't support optimize
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/alter_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/alter_table.rdiff
new file mode 100644
index 00000000000..a2cb0c1dcb1
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/alter_table.rdiff
@@ -0,0 +1,63 @@
+3,36c3,12
+< INSERT INTO t1 (a) VALUES (1),(2),(2),(3),(4);
+< ALTER TABLE t1 ADD PARTITION PARTITIONS 2;
+< EXPLAIN PARTiTIONS SELECT a FROM t1 WHERE a = 3;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p3 # # # # # # #
+< ALTER TABLE t1 COALESCE PARTITION 1;
+< EXPLAIN PARTiTIONS SELECT a FROM t1 WHERE a = 3;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0 # # # # # # #
+< ALTER TABLE t1 REORGANIZE PARTITION;
+< EXPLAIN PARTiTIONS SELECT a FROM t1 WHERE a = 2;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0 # # # # # # #
+< ALTER TABLE t1 REBUILD PARTITION p0;
+< EXPLAIN PARTiTIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0 # # # # # # #
+< ALTER TABLE t1 REMOVE PARTITIONING;
+< EXPLAIN PARTiTIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 NULL # # # # # # #
+< ALTER TABLE t1 PARTITION BY LIST(a) (PARTITION p0 VALUES IN (1,2,3), PARTITION p1 VALUES IN (101,102));
+< ERROR HY000: Table has no partition for value 4
+< ALTER TABLE t1 PARTITION BY LIST(a) (PARTITION p0 VALUES IN (1,2,3,4), PARTITION p1 VALUES IN (101,102));
+< INSERT INTO t1 (a) VALUES (50);
+< ERROR HY000: Table has no partition for value 50
+< ALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES IN (50,51));
+< INSERT INTO t1 (a) VALUES (50);
+< ALTER TABLE t1 DROP PARTITION p1;
+< ALTER TABLE t1 REORGANIZE PARTITION p0, p2 INTO (PARTITION p0 VALUES IN (1,2,3), PARTITION p1 VALUES IN (4), PARTITION p2 VALUES IN (50,51), PARTITION p3 VALUES IN (101,102));
+< EXPLAIN PARTiTIONS SELECT a FROM t1 WHERE a = 2;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0 # # # # # # #
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+41,42c17,29
+< ALTER TABLE t1 DROP PARTITION abc;
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b INT(11) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY LIST(a) SUBPARTITION by HASH(b) (
+> PARTITION abc VALUES IN (1,2,3),
+> PARTITION def VALUES IN (100,101,102)
+> ) ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or subpartitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/analyze_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/analyze_table.rdiff
new file mode 100644
index 00000000000..ce29f3dcf52
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/analyze_table.rdiff
@@ -0,0 +1,83 @@
+3,18c3,12
+< INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'),(3,'c'),(2,'d'),(4,'e'),(100,'f'),(101,'g');
+< CREATE TABLE t2 (a <INT_COLUMN>, b <CHAR_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< INSERT INTO t2 (a,b) SELECT a,b FROM t1;
+< INSERT INTO t1 (a,b) VALUES (3,'c');
+< ALTER TABLE t1 ANALYZE PARTITION p0;
+< Table Op Msg_type Msg_text
+< test.t1 analyze status OK
+< INSERT INTO t2 (a,b) VALUES (4,'d'), (1000,'e');
+< ALTER TABLE t1 ANALYZE PARTITION LOCAL ALL;
+< Table Op Msg_type Msg_text
+< test.t1 analyze status OK
+< INSERT INTO t1 (a,b) VALUES (5,'f'),(50,'g');
+< ALTER TABLE t1 ANALYZE PARTITION NO_WRITE_TO_BINLOG p1,p0;
+< Table Op Msg_type Msg_text
+< test.t1 analyze status OK
+< DROP TABLE t1, t2;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+20a15,16
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+21a18
+> ERROR 42S02: Table 'test.t1' doesn't exist
+22a20,21
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+23a23
+> ERROR 42S02: Table 'test.t1' doesn't exist
+26c26,27
+< test.t1 analyze status OK
+---
+> test.t1 analyze Error Table 'test.t1' doesn't exist
+> test.t1 analyze status Operation failed
+27a29
+> ERROR 42S02: Table 'test.t2' doesn't exist
+30c32,33
+< test.t2 analyze status OK
+---
+> test.t2 analyze Error Table 'test.t2' doesn't exist
+> test.t2 analyze status Operation failed
+31a35
+> ERROR 42S02: Table 'test.t1' doesn't exist
+32a37
+> ERROR 42S02: Table 'test.t2' doesn't exist
+35,36c40,43
+< test.t1 analyze status OK
+< test.t2 analyze status OK
+---
+> test.t1 analyze Error Table 'test.t1' doesn't exist
+> test.t1 analyze status Operation failed
+> test.t2 analyze Error Table 'test.t2' doesn't exist
+> test.t2 analyze status Operation failed
+37a45
+> ERROR 42S02: Unknown table 't1,t2'
+38a47,48
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+39a50
+> ERROR 42S02: Table 'test.t1' doesn't exist
+42c53,54
+< test.t1 analyze status OK
+---
+> test.t1 analyze Error Table 'test.t1' doesn't exist
+> test.t1 analyze status Operation failed
+43a56
+> ERROR 42S02: Table 'test.t1' doesn't exist
+46c59,60
+< test.t1 analyze status OK
+---
+> test.t1 analyze Error Table 'test.t1' doesn't exist
+> test.t1 analyze status Operation failed
+47a62
+> ERROR 42S02: Unknown table 't1'
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/check_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/check_table.rdiff
new file mode 100644
index 00000000000..3f3db85a23e
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/check_table.rdiff
@@ -0,0 +1,172 @@
+3,36c3,12
+< INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'),(3,'c'),(2,'d'),(4,'e'),(100,'f'),(101,'g');
+< CREATE TABLE t2 (a <INT_COLUMN>, b <CHAR_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> PARTITION BY RANGE(a) (
+< PARTITION p0 VALUES LESS THAN (100),
+< PARTITION p1 VALUES LESS THAN MAXVALUE
+< );
+< INSERT INTO t2 (a,b) SELECT a, b FROM t1;
+< ALTER TABLE t1 CHECK PARTITION p0;
+< Table Op Msg_type Msg_text
+< test.t1 check status OK
+< INSERT INTO t1 (a,b) VALUES (3,'c');
+< ALTER TABLE t1 CHECK PARTITION p0, p1 FOR UPGRADE;
+< Table Op Msg_type Msg_text
+< test.t1 check status OK
+< INSERT INTO t2 (a,b) VALUES (10000,'e');
+< ALTER TABLE t2 CHECK PARTITION p0 QUICK;
+< Table Op Msg_type Msg_text
+< test.t2 check status OK
+< INSERT INTO t1 (a,b) VALUES (6,'f');
+< ALTER TABLE t1 CHECK PARTITION p1 FAST;
+< Table Op Msg_type Msg_text
+< test.t1 check status OK
+< INSERT INTO t2 (a,b) VALUES (8,'h');
+< ALTER TABLE t2 CHECK PARTITION p1 MEDIUM;
+< Table Op Msg_type Msg_text
+< test.t2 check status OK
+< INSERT INTO t1 (a,b) VALUES (9,'i');
+< ALTER TABLE t1 CHECK PARTITION ALL EXTENDED;
+< Table Op Msg_type Msg_text
+< test.t1 check status OK
+< INSERT INTO t1 (a,b) VALUES (11,'k');
+< ALTER TABLE t1 CHECK PARTITION p0 CHANGED;
+< Table Op Msg_type Msg_text
+< test.t1 check status OK
+< DROP TABLE t1, t2;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+38a15,16
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+39a18
+> ERROR 42S02: Table 'test.t1' doesn't exist
+40a20,21
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+43c24,25
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+44a27
+> ERROR 42S02: Table 'test.t1' doesn't exist
+45a29
+> ERROR 42S02: Table 'test.t2' doesn't exist
+48,49c32,35
+< test.t1 check status OK
+< test.t2 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+> test.t2 check Error Table 'test.t2' doesn't exist
+> test.t2 check status Operation failed
+50a37
+> ERROR 42S02: Table 'test.t2' doesn't exist
+53c40,41
+< test.t2 check status OK
+---
+> test.t2 check Error Table 'test.t2' doesn't exist
+> test.t2 check status Operation failed
+54a43
+> ERROR 42S02: Table 'test.t1' doesn't exist
+57c46,47
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+58a49
+> ERROR 42S02: Table 'test.t1' doesn't exist
+59a51
+> ERROR 42S02: Table 'test.t2' doesn't exist
+62,63c54,57
+< test.t2 check status OK
+< test.t1 check status OK
+---
+> test.t2 check Error Table 'test.t2' doesn't exist
+> test.t2 check status Operation failed
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+64a59
+> ERROR 42S02: Table 'test.t1' doesn't exist
+65a61
+> ERROR 42S02: Table 'test.t2' doesn't exist
+68,69c64,67
+< test.t1 check status OK
+< test.t2 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+> test.t2 check Error Table 'test.t2' doesn't exist
+> test.t2 check status Operation failed
+70a69
+> ERROR 42S02: Table 'test.t1' doesn't exist
+73c72,73
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+74a75
+> ERROR 42S02: Unknown table 't1,t2'
+75a77,78
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+76a80
+> ERROR 42S02: Table 'test.t1' doesn't exist
+79c83,84
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+80a86
+> ERROR 42S02: Table 'test.t1' doesn't exist
+83c89,90
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+84a92
+> ERROR 42S02: Table 'test.t1' doesn't exist
+87c95,96
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+88a98
+> ERROR 42S02: Table 'test.t1' doesn't exist
+91c101,102
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+92a104
+> ERROR 42S02: Table 'test.t1' doesn't exist
+95c107,108
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+96a110
+> ERROR 42S02: Table 'test.t1' doesn't exist
+99c113,114
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+100a116
+> ERROR 42S02: Table 'test.t1' doesn't exist
+103c119,120
+< test.t1 check status OK
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+104a122
+> ERROR 42S02: Unknown table 't1'
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/checksum_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/checksum_table.rdiff
new file mode 100644
index 00000000000..bc5b07686bf
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/checksum_table.rdiff
@@ -0,0 +1,81 @@
+2a3,4
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+3a6
+> ERROR 42S02: Table 'test.t1' doesn't exist
+4a8,9
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+7c12,14
+< test.t1 4272806499
+---
+> test.t1 NULL
+> Warnings:
+> Error 1146 Table 'test.t1' doesn't exist
+10,11c17,21
+< test.t2 0
+< test.t1 4272806499
+---
+> test.t2 NULL
+> test.t1 NULL
+> Warnings:
+> Error 1146 Table 'test.t2' doesn't exist
+> Error 1146 Table 'test.t1' doesn't exist
+15a26,28
+> Warnings:
+> Error 1146 Table 'test.t1' doesn't exist
+> Error 1146 Table 'test.t2' doesn't exist
+18,19c31,35
+< test.t1 4272806499
+< test.t2 0
+---
+> test.t1 NULL
+> test.t2 NULL
+> Warnings:
+> Error 1146 Table 'test.t1' doesn't exist
+> Error 1146 Table 'test.t2' doesn't exist
+20a37
+> ERROR 42S02: Unknown table 't1,t2'
+22a40,41
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+23a43
+> ERROR 42S02: Table 'test.t1' doesn't exist
+24a45,46
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+27c49,51
+< test.t1 0
+---
+> test.t1 NULL
+> Warnings:
+> Error 1146 Table 'test.t1' doesn't exist
+30,31c54,58
+< test.t2 0
+< test.t1 0
+---
+> test.t2 NULL
+> test.t1 NULL
+> Warnings:
+> Error 1146 Table 'test.t2' doesn't exist
+> Error 1146 Table 'test.t1' doesn't exist
+34,35c61,65
+< test.t1 0
+< test.t2 0
+---
+> test.t1 NULL
+> test.t2 NULL
+> Warnings:
+> Error 1146 Table 'test.t1' doesn't exist
+> Error 1146 Table 'test.t2' doesn't exist
+38,39c68,72
+< test.t1 4272806499
+< test.t2 0
+---
+> test.t1 NULL
+> test.t2 NULL
+> Warnings:
+> Error 1146 Table 'test.t1' doesn't exist
+> Error 1146 Table 'test.t2' doesn't exist
+40a74
+> ERROR 42S02: Unknown table 't1,t2'
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/create_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/create_table.rdiff
new file mode 100644
index 00000000000..11fbc4812dc
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/create_table.rdiff
@@ -0,0 +1,156 @@
+3,10c3,12
+< INSERT INTO t1 (a) VALUES (1),(2),(3),(2);
+< EXPLAIN PARTITIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0,p1 # # # # # # #
+< EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a=2;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0 # # # # # # #
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+12,19c14,23
+< INSERT INTO t1 (a) VALUES ('a'),('b'),('c');
+< EXPLAIN PARTITIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0,p1 # # # # # # #
+< EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a = 'b';
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p1 # # # # # # #
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY KEY(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or CHAR types or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+21,31c25,34
+< SHOW INDEX IN t1;
+< Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+< t1 1 a 1 a # # NULL NULL # #
+< INSERT INTO t1 (a) VALUES (1),(2),(3),(5);
+< EXPLAIN PARTITIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0,p1 # # # # # # #
+< EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a IN (1,3);
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0 # # # # # # #
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom indexed column options*/, /*!INDEX*/ /*Custom index*/ (a)) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY KEY(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or indexes or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+33,43c36,45
+< SHOW INDEX IN t1;
+< Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+< t1 0 PRIMARY 1 a # # NULL NULL # #
+< INSERT INTO t1 (a) VALUES (1),(200),(3),(2);
+< EXPLAIN PARTITIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0,p1 # # # # # # #
+< EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a=2;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p1 # # # # # # #
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom indexed column options*/ PRIMARY KEY) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY KEY() PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # PK or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+48,58c50,63
+< INSERT INTO t1 (a) VALUES (1),(2),(400);
+< EXPLAIN PARTITIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0,p1 # # # # # # #
+< EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a = 2;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0 # # # # # # #
+< INSERT INTO t1 (a) VALUES (10000);
+< ERROR HY000: Table has no partition for value 10000
+< DROP TABLE t1;
+< CREATE TABLE t1 (a <INT_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> PARTITION BY LIST(a) (
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY RANGE(a) (
+> PARTITION p0 VALUES LESS THAN (10),
+> PARTITION p1 VALUES LESS THAN (1000)
+> ) ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+> CREATE TABLE t1 (a <INT_COLUMN>, b <INT_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> PARTITION BY LIST(a) SUBPARTITION by HASH(b) (
+62,72c67,70
+< INSERT INTO t1 (a) VALUES (1),(101),(1);
+< EXPLAIN PARTITIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 abc,def # # # # # # #
+< EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a = 100;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE NULL NULL # # # # # # #
+< INSERT INTO t1 (a) VALUES (50);
+< ERROR HY000: Table has no partition for value 50
+< DROP TABLE t1;
+< CREATE TABLE t1 (a <INT_COLUMN>, b <INT_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> PARTITION BY LIST(a) SUBPARTITION by HASH(b) (
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b INT(11) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY LIST(a) SUBPARTITION by HASH(b) (
+75,91c73,79
+< );
+< SHOW INDEX IN t1;
+< Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
+< INSERT INTO t1 (a,b) VALUES (1,1),(101,2),(1,3);
+< EXPLAIN PARTITIONS SELECT a FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 abc_abcsp0,def_defsp0 # # # # # # #
+< EXPLAIN PARTITIONS SELECT a FROM t1 WHERE a = 100;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE NULL NULL # # # # # # #
+< SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, SUBPARTITION_NAME, PARTITION_METHOD, SUBPARTITION_METHOD
+< FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't1';
+< TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_METHOD SUBPARTITION_METHOD
+< test t1 abc abcsp0 LIST HASH
+< test t1 def defsp0 LIST HASH
+< SELECT * FROM INFORMATION_SCHEMA.PARTITIONS;
+< DROP TABLE t1;
+---
+> ) ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or subpartitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/optimize_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/optimize_table.rdiff
new file mode 100644
index 00000000000..350d93fe91f
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/optimize_table.rdiff
@@ -0,0 +1,91 @@
+3,25c3,12
+< INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'),(3,'c'),(2,'d'),(4,'e'),(100,'f'),(101,'g');
+< CREATE TABLE t2 (a <INT_COLUMN>, b <CHAR_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> PARTITION BY RANGE(a) (
+< PARTITION p0 VALUES LESS THAN (100),
+< PARTITION p1 VALUES LESS THAN MAXVALUE
+< );
+< INSERT INTO t2 (a,b) SELECT a, b FROM t1;
+< INSERT INTO t1 (a,b) VALUES (3,'c'),(4,'d');
+< ALTER TABLE t1 OPTIMIZE PARTITION p1;
+< Table Op Msg_type Msg_text
+< test.t1 optimize status OK
+< INSERT INTO t2 (a,b) VALUES (4,'d');
+< ALTER TABLE t2 OPTIMIZE PARTITION p0 NO_WRITE_TO_BINLOG;
+< Table Op Msg_type Msg_text
+< test.t2 optimize status OK
+< INSERT INTO t1 (a,b) VALUES (6,'f');
+< ALTER TABLE t1 OPTIMIZE PARTITION ALL LOCAL;
+< Table Op Msg_type Msg_text
+< test.t1 optimize status OK
+< INSERT INTO t2 (a,b) VALUES (5,'e');
+< ALTER TABLE t2 OPTIMIZE PARTITION p1,p0;
+< Table Op Msg_type Msg_text
+< test.t2 optimize status OK
+< DROP TABLE t1, t2;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+27a15,16
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+28a18
+> ERROR 42S02: Table 'test.t1' doesn't exist
+29a20,21
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+30a23
+> ERROR 42S02: Table 'test.t1' doesn't exist
+33c26,27
+< test.t1 optimize status OK
+---
+> test.t1 optimize Error Table 'test.t1' doesn't exist
+> test.t1 optimize status Operation failed
+34a29
+> ERROR 42S02: Table 'test.t2' doesn't exist
+37c32,33
+< test.t2 optimize status OK
+---
+> test.t2 optimize Error Table 'test.t2' doesn't exist
+> test.t2 optimize status Operation failed
+38a35
+> ERROR 42S02: Table 'test.t2' doesn't exist
+39a37
+> ERROR 42S02: Table 'test.t1' doesn't exist
+42,43c40,43
+< test.t1 optimize status OK
+< test.t2 optimize status OK
+---
+> test.t1 optimize Error Table 'test.t1' doesn't exist
+> test.t1 optimize status Operation failed
+> test.t2 optimize Error Table 'test.t2' doesn't exist
+> test.t2 optimize status Operation failed
+46,47c46,49
+< test.t1 optimize status OK
+< test.t2 optimize status OK
+---
+> test.t1 optimize Error Table 'test.t1' doesn't exist
+> test.t1 optimize status Operation failed
+> test.t2 optimize Error Table 'test.t2' doesn't exist
+> test.t2 optimize status Operation failed
+48a51
+> ERROR 42S02: Unknown table 't1,t2'
+49a53,54
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+50a56
+> ERROR 42S02: Table 'test.t1' doesn't exist
+53c59,60
+< test.t1 optimize status OK
+---
+> test.t1 optimize Error Table 'test.t1' doesn't exist
+> test.t1 optimize status Operation failed
+54a62
+> ERROR 42S02: Unknown table 't1'
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff
new file mode 100644
index 00000000000..4c39421261c
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/repair_table.rdiff
@@ -0,0 +1,295 @@
+4,33c4,13
+< INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'),(3,'c'),(2,'d'),(4,'e'),(100,'f'),(101,'g');
+< CREATE TABLE t2 (a <INT_COLUMN>, b <CHAR_COLUMN>) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS> PARTITION BY RANGE(a) (
+< PARTITION p0 VALUES LESS THAN (100),
+< PARTITION p1 VALUES LESS THAN MAXVALUE
+< );
+< INSERT INTO t2 (a,b) SELECT a, b FROM t1;
+< ALTER TABLE t1 REPAIR PARTITION p0;
+< Table Op Msg_type Msg_text
+< test.t1 repair status OK
+< INSERT INTO t1 VALUES (3,'c');
+< ALTER TABLE t1 REPAIR PARTITION NO_WRITE_TO_BINLOG p0, p1;
+< Table Op Msg_type Msg_text
+< test.t1 repair status OK
+< INSERT INTO t2 (a,b) VALUES (5,'e'),(6,'f');
+< ALTER TABLE t2 REPAIR PARTITION LOCAL p1;
+< Table Op Msg_type Msg_text
+< test.t2 repair status OK
+< INSERT INTO t1 (a,b) VALUES (7,'g'),(8,'h');
+< ALTER TABLE t1 REPAIR PARTITION LOCAL ALL EXTENDED;
+< Table Op Msg_type Msg_text
+< test.t1 repair status OK
+< INSERT INTO t1 VALUES (10,'j');
+< ALTER TABLE t1 REPAIR PARTITION p1 QUICK USE_FRM;
+< Table Op Msg_type Msg_text
+< test.t1 repair status OK
+< INSERT INTO t2 (a,b) VALUES (12,'l');
+< ALTER TABLE t2 REPAIR PARTITION NO_WRITE_TO_BINLOG ALL QUICK EXTENDED USE_FRM;
+< Table Op Msg_type Msg_text
+< test.t2 repair status OK
+< DROP TABLE t1, t2;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+35a16,17
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+36a19
+> ERROR 42S02: Table 'test.t1' doesn't exist
+37a21,22
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+40c25,26
+< test.t1 repair status OK
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+41a28
+> ERROR 42S02: Table 'test.t1' doesn't exist
+42a30
+> ERROR 42S02: Table 'test.t2' doesn't exist
+45,46c33,36
+< test.t1 repair status OK
+< test.t2 repair status OK
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+> test.t2 repair Error Table 'test.t2' doesn't exist
+> test.t2 repair status Operation failed
+47a38
+> ERROR 42S02: Table 'test.t2' doesn't exist
+50c41,42
+< test.t2 repair status OK
+---
+> test.t2 repair Error Table 'test.t2' doesn't exist
+> test.t2 repair status Operation failed
+51a44
+> ERROR 42S02: Table 'test.t1' doesn't exist
+52a46
+> ERROR 42S02: Table 'test.t2' doesn't exist
+55,56c49,52
+< test.t2 repair status OK
+< test.t1 repair status OK
+---
+> test.t2 repair Error Table 'test.t2' doesn't exist
+> test.t2 repair status Operation failed
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+57a54
+> ERROR 42S02: Table 'test.t1' doesn't exist
+58a56
+> ERROR 42S02: Table 'test.t2' doesn't exist
+61,62c59,62
+< test.t1 repair status OK
+< test.t2 repair status OK
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+> test.t2 repair Error Table 'test.t2' doesn't exist
+> test.t2 repair status Operation failed
+63a64
+> ERROR 42S02: Table 'test.t1' doesn't exist
+64a66
+> ERROR 42S02: Table 'test.t2' doesn't exist
+67,68c69,72
+< test.t1 repair status OK
+< test.t2 repair status OK
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+> test.t2 repair Error Table 'test.t2' doesn't exist
+> test.t2 repair status Operation failed
+71,73c75,76
+< ERROR HY000: Failed to read from the .par file
+< # Statement ended with one of expected results (0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY).
+< # If you got a difference in error message, just add it to rdiff file
+---
+> ERROR 42S02: Table 'test.t1' doesn't exist
+> # ERROR: Statement ended with errno 1146, errname ER_NO_SUCH_TABLE (expected results: 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY)
+76,78c79,80
+< test.t1 check Error Failed to read from the .par file
+< test.t1 check Error Incorrect information in file: './test/t1.frm'
+< test.t1 check error Corrupt
+---
+> test.t1 check Error Table 'test.t1' doesn't exist
+> test.t1 check status Operation failed
+80,82c82,83
+< ERROR HY000: Failed to read from the .par file
+< # Statement ended with one of expected results (0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY).
+< # If you got a difference in error message, just add it to rdiff file
+---
+> ERROR 42S02: Table 'test.t1' doesn't exist
+> # ERROR: Statement ended with errno 1146, errname ER_NO_SUCH_TABLE (expected results: 0,130,ER_FAILED_READ_FROM_PAR_FILE,ER_OPEN_AS_READONLY)
+85,87c86,87
+< test.t1 repair Error Failed to read from the .par file
+< test.t1 repair Error Incorrect information in file: './test/t1.frm'
+< test.t1 repair error Corrupt
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+88a89
+> ERROR 42S02: Unknown table 't1,t2'
+93a95,96
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+96c99,100
+< test.t1 repair status OK
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+97a102
+> ERROR 42S02: Table 'test.t1' doesn't exist
+100c105,106
+< test.t1 repair status OK
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+101a108
+> ERROR 42S02: Table 'test.t1' doesn't exist
+104,235c111,112
+< test.t1 repair status OK
+< t1#P#p0.MYD
+< t1#P#p0.MYI
+< t1#P#p1.MYD
+< t1#P#p1.MYI
+< t1.frm
+< t1.par
+< INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
+< # Statement ended with one of expected results (0,144).
+< # If you got a difference in error message, just add it to rdiff file
+< FLUSH TABLE t1;
+< Restoring <DATADIR>/test/t1#P#p0.MYD
+< CHECK TABLE t1;
+< Table Op Msg_type Msg_text
+< test.t1 check error Size of datafile is: 26 Should be: 39
+< test.t1 check error Partition p0 returned error
+< test.t1 check error Corrupt
+< SELECT * FROM t1;
+< a b
+< 8 h
+< 10 j
+< 7 g
+< 15 o
+< Warnings:
+< Error 145 Table './test/t1#P#p0' is marked as crashed and should be repaired
+< Error 1194 Table 't1' is marked as crashed and should be repaired
+< Error 1034 Number of rows changed from 3 to 2
+< # Statement ended with one of expected results (0,ER_NOT_KEYFILE,144).
+< # If you got a difference in error message, just add it to rdiff file
+< INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
+< # Statement ended with one of expected results (0,144).
+< # If you got a difference in error message, just add it to rdiff file
+< FLUSH TABLE t1;
+< Restoring <DATADIR>/test/t1#P#p0.MYI
+< CHECK TABLE t1;
+< Table Op Msg_type Msg_text
+< test.t1 check warning Size of datafile is: 39 Should be: 26
+< test.t1 check error Record-count is not ok; is 3 Should be: 2
+< test.t1 check warning Found 3 key parts. Should be: 2
+< test.t1 check error Partition p0 returned error
+< test.t1 check error Corrupt
+< SELECT * FROM t1;
+< a b
+< 8 h
+< 10 j
+< 14 n
+< 7 g
+< 15 o
+< 15 o
+< Warnings:
+< Error 145 Table './test/t1#P#p0' is marked as crashed and should be repaired
+< Error 1194 Table 't1' is marked as crashed and should be repaired
+< Error 1034 Number of rows changed from 2 to 3
+< # Statement ended with one of expected results (0,ER_NOT_KEYFILE,144).
+< # If you got a difference in error message, just add it to rdiff file
+< INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
+< # Statement ended with one of expected results (0,144).
+< # If you got a difference in error message, just add it to rdiff file
+< FLUSH TABLE t1;
+< Restoring <DATADIR>/test/t1#P#p1.MYD
+< CHECK TABLE t1;
+< Table Op Msg_type Msg_text
+< test.t1 check error Size of datafile is: 39 Should be: 52
+< test.t1 check error Partition p1 returned error
+< test.t1 check error Corrupt
+< SELECT * FROM t1;
+< a b
+< 8 h
+< 10 j
+< 14 n
+< 14 n
+< 7 g
+< 15 o
+< 15 o
+< Warnings:
+< Error 145 Table './test/t1#P#p1' is marked as crashed and should be repaired
+< Error 1194 Table 't1' is marked as crashed and should be repaired
+< Error 1034 Number of rows changed from 4 to 3
+< # Statement ended with one of expected results (0,ER_NOT_KEYFILE,144).
+< # If you got a difference in error message, just add it to rdiff file
+< INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
+< # Statement ended with one of expected results (0,144).
+< # If you got a difference in error message, just add it to rdiff file
+< FLUSH TABLE t1;
+< Restoring <DATADIR>/test/t1#P#p1.MYI
+< CHECK TABLE t1;
+< Table Op Msg_type Msg_text
+< test.t1 check warning Size of datafile is: 52 Should be: 39
+< test.t1 check error Record-count is not ok; is 4 Should be: 3
+< test.t1 check warning Found 4 key parts. Should be: 3
+< test.t1 check error Partition p1 returned error
+< test.t1 check error Corrupt
+< SELECT * FROM t1;
+< a b
+< 8 h
+< 10 j
+< 14 n
+< 14 n
+< 14 n
+< 7 g
+< 15 o
+< 15 o
+< 15 o
+< Warnings:
+< Error 145 Table './test/t1#P#p1' is marked as crashed and should be repaired
+< Error 1194 Table 't1' is marked as crashed and should be repaired
+< Error 1034 Number of rows changed from 3 to 4
+< # Statement ended with one of expected results (0,ER_NOT_KEYFILE,144).
+< # If you got a difference in error message, just add it to rdiff file
+< INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
+< # Statement ended with one of expected results (0,144).
+< # If you got a difference in error message, just add it to rdiff file
+< FLUSH TABLE t1;
+< Restoring <DATADIR>/test/t1.par
+< CHECK TABLE t1;
+< Table Op Msg_type Msg_text
+< test.t1 check status OK
+< SELECT * FROM t1;
+< a b
+< 8 h
+< 10 j
+< 14 n
+< 14 n
+< 14 n
+< 14 n
+< 7 g
+< 15 o
+< 15 o
+< 15 o
+< 15 o
+< # Statement ended with one of expected results (0,ER_NOT_KEYFILE,144).
+< # If you got a difference in error message, just add it to rdiff file
+---
+> test.t1 repair Error Table 'test.t1' doesn't exist
+> test.t1 repair status Operation failed
+236a114
+> ERROR 42S02: Unknown table 't1'
diff --git a/storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff
new file mode 100644
index 00000000000..2c1364d52e1
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/parts/truncate_table.rdiff
@@ -0,0 +1,100 @@
+3,8c3,12
+< TRUNCATE TABLE t1;
+< INSERT INTO t1 (a,b) VALUES (1,'a'), (2,'b'), (3,'c');
+< TRUNCATE TABLE t1;
+< SELECT * FROM t1;
+< a b
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+10,52c14,23
+< SHOW CREATE TABLE t1;
+< Table Create Table
+< t1 CREATE TABLE `t1` (
+< `a` int(11) NOT NULL AUTO_INCREMENT,
+< `c` char(8) DEFAULT NULL,
+< PRIMARY KEY (`a`)
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+< /*!50100 PARTITION BY HASH (a)
+< PARTITIONS 2 */
+< INSERT INTO t1 (c) VALUES ('a'),('b'),('c');
+< SHOW CREATE TABLE t1;
+< Table Create Table
+< t1 CREATE TABLE `t1` (
+< `a` int(11) NOT NULL AUTO_INCREMENT,
+< `c` char(8) DEFAULT NULL,
+< PRIMARY KEY (`a`)
+< ) ENGINE=<STORAGE_ENGINE> AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
+< /*!50100 PARTITION BY HASH (a)
+< PARTITIONS 2 */
+< TRUNCATE TABLE t1;
+< SHOW CREATE TABLE t1;
+< Table Create Table
+< t1 CREATE TABLE `t1` (
+< `a` int(11) NOT NULL AUTO_INCREMENT,
+< `c` char(8) DEFAULT NULL,
+< PRIMARY KEY (`a`)
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+< /*!50100 PARTITION BY HASH (a)
+< PARTITIONS 2 */
+< INSERT INTO t1 (c) VALUES ('d');
+< SHOW CREATE TABLE t1;
+< Table Create Table
+< t1 CREATE TABLE `t1` (
+< `a` int(11) NOT NULL AUTO_INCREMENT,
+< `c` char(8) DEFAULT NULL,
+< PRIMARY KEY (`a`)
+< ) ENGINE=<STORAGE_ENGINE> AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
+< /*!50100 PARTITION BY HASH (a)
+< PARTITIONS 2 */
+< SELECT * FROM t1;
+< a c
+< 1 d
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom indexed column options*/ KEY AUTO_INCREMENT, c CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or PK or auto-increment or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+54,68c25,34
+< INSERT INTO t1 (a,b) VALUES (1,'a'),(2,'b'),(3,'c'),(2,'d'),(4,'e'),(100,'f'),(101,'g');
+< ALTER TABLE t1 TRUNCATE PARTITION p0;
+< SELECT * FROM t1;
+< a b
+< 1 a
+< 101 g
+< 3 c
+< EXPLAIN PARTITIONS SELECT * FROM t1;
+< id select_type table partitions type possible_keys key key_len ref rows Extra
+< 1 SIMPLE t1 p0,p1 # # # # # #
+< INSERT INTO t1 (a,b) VALUES (1,'a'), (2,'b'), (3,'c');
+< ALTER TABLE t1 TRUNCATE PARTITION ALL;
+< SELECT * FROM t1;
+< a b
+< DROP TABLE t1;
+---
+> ERROR HY000: Engine cannot be used in partitioned tables
+> # ERROR: Statement ended with errno 1572, errname ER_PARTITION_MERGE_ERROR (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b CHAR(8) /*!*/ /*Custom column options*/) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST PARTITION BY HASH(a) PARTITIONS 2 ]
+> # The statement|command finished with ER_PARTITION_MERGE_ERROR.
+> # Partitions or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff
new file mode 100644
index 00000000000..180647323bc
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/repair_table.rdiff
@@ -0,0 +1,103 @@
+7c7
+< test.t1 repair status OK
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+12,13c12,13
+< test.t1 repair status OK
+< test.t2 repair status OK
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+> test.t2 repair note The storage engine for the table doesn't support repair
+17c17
+< test.t2 repair status OK
+---
+> test.t2 repair note The storage engine for the table doesn't support repair
+22,23c22,23
+< test.t2 repair status OK
+< test.t1 repair status OK
+---
+> test.t2 repair note The storage engine for the table doesn't support repair
+> test.t1 repair note The storage engine for the table doesn't support repair
+28,31c28,29
+< test.t1 repair warning Number of rows changed from 0 to 6
+< test.t1 repair status OK
+< test.t2 repair warning Number of rows changed from 0 to 5
+< test.t2 repair status OK
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+> test.t2 repair note The storage engine for the table doesn't support repair
+36,39c34,35
+< test.t1 repair warning Number of rows changed from 0 to 7
+< test.t1 repair status OK
+< test.t2 repair warning Number of rows changed from 0 to 6
+< test.t2 repair status OK
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+> test.t2 repair note The storage engine for the table doesn't support repair
+42c38
+< ERROR HY000: Incorrect file format 't1'
+---
+> ERROR HY000: Table 't1' is read only
+47,48c43
+< test.t1 check Error Incorrect file format 't1'
+< test.t1 check error Corrupt
+---
+> test.t1 check status OK
+50c45
+< ERROR HY000: Incorrect file format 't1'
+---
+> a b
+55,56c50
+< test.t1 repair Error Incorrect file format 't1'
+< test.t1 repair error Corrupt
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+65c59
+< test.t1 repair status OK
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+69c63
+< test.t1 repair status OK
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+73,76c67,68
+< test.t1 repair warning Number of rows changed from 0 to 3
+< test.t1 repair status OK
+< t1.MYD
+< t1.MYI
+---
+> test.t1 repair note The storage engine for the table doesn't support repair
+> t1.MRG
+82c74
+< Restoring <DATADIR>/test/t1.MYD
+---
+> Restoring <DATADIR>/test/t1.MRG
+85,86c77
+< test.t1 check error Size of datafile is: 39 Should be: 65
+< test.t1 check error Corrupt
+---
+> test.t1 check status OK
+88,103c79,84
+< ERROR HY000: Incorrect key file for table 't1'; try to repair it
+< # Statement ended with one of expected results (0,ER_NOT_KEYFILE,144).
+< # If you got a difference in error message, just add it to rdiff file
+< INSERT INTO t1 (a,b) VALUES (14,'n'),(15,'o');
+< ERROR HY000: Table './test/t1' is marked as crashed and last (automatic?) repair failed
+< # Statement ended with one of expected results (0,144).
+< # If you got a difference in error message, just add it to rdiff file
+< FLUSH TABLE t1;
+< Restoring <DATADIR>/test/t1.MYI
+< CHECK TABLE t1;
+< Table Op Msg_type Msg_text
+< test.t1 check warning Table is marked as crashed and last repair failed
+< test.t1 check error Size of datafile is: 39 Should be: 65
+< test.t1 check error Corrupt
+< SELECT * FROM t1;
+< ERROR HY000: Table './test/t1' is marked as crashed and last (automatic?) repair failed
+---
+> a b
+> 7 g
+> 8 h
+> 10 j
+> 14 n
+> 15 o
diff --git a/storage/myisammrg/mysql-test/storage_engine/show_engine.rdiff b/storage/myisammrg/mysql-test/storage_engine/show_engine.rdiff
new file mode 100644
index 00000000000..e7c9b0176b6
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/show_engine.rdiff
@@ -0,0 +1,2 @@
+7d6
+< <STORAGE_ENGINE> ### Engine status, can be long and changeable ###
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_ai.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_ai.rdiff
new file mode 100644
index 00000000000..bca6fa60d13
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_ai.rdiff
@@ -0,0 +1,8 @@
+7c7
+< ) ENGINE=<STORAGE_ENGINE> AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+13c13
+< ) ENGINE=<STORAGE_ENGINE> AUTO_INCREMENT=100 DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_avg_row_length.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_avg_row_length.rdiff
new file mode 100644
index 00000000000..7a3ac54fd3e
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_avg_row_length.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=300
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=300 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=30000000
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 AVG_ROW_LENGTH=30000000 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_checksum.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_checksum.rdiff
new file mode 100644
index 00000000000..ecb3fadb479
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_checksum.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 CHECKSUM=1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 CHECKSUM=1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_connection.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_connection.rdiff
new file mode 100644
index 00000000000..d3ebd87ad1e
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_connection.rdiff
@@ -0,0 +1,8 @@
+13c13
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 CONNECTION='test_connection'
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) CONNECTION='test_connection'
+20c20
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 CONNECTION='test_connection2'
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) CONNECTION='test_connection2'
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff
new file mode 100644
index 00000000000..3c15e10d1f1
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_data_index_dir.rdiff
@@ -0,0 +1,8 @@
+7c7
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 DATA DIRECTORY='<DATA_DIR>' INDEX DIRECTORY='<INDEX_DIR>'
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 DATA DIRECTORY='<DATA_DIR>' INDEX DIRECTORY='<INDEX_DIR>'
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_delay_key_write.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_delay_key_write.rdiff
new file mode 100644
index 00000000000..5723e425b4d
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_delay_key_write.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 DELAY_KEY_WRITE=1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 DELAY_KEY_WRITE=1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_insert_method.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_insert_method.rdiff
new file mode 100644
index 00000000000..2ced7647483
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_insert_method.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=FIRST
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=FIRST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_key_block_size.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_key_block_size.rdiff
new file mode 100644
index 00000000000..8378f04ebcb
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_key_block_size.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=8
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=8 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_max_rows.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_max_rows.rdiff
new file mode 100644
index 00000000000..f89147826c6
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_max_rows.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MAX_ROWS=10000000
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MAX_ROWS=10000000 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MAX_ROWS=30000000
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MAX_ROWS=30000000 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_min_rows.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_min_rows.rdiff
new file mode 100644
index 00000000000..3ce28480dcf
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_min_rows.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MIN_ROWS=1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MIN_ROWS=1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MIN_ROWS=10000
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 MIN_ROWS=10000 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_pack_keys.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_pack_keys.rdiff
new file mode 100644
index 00000000000..246c7397a96
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_pack_keys.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 PACK_KEYS=1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 PACK_KEYS=1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 PACK_KEYS=0
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 PACK_KEYS=0 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_password.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_password.rdiff
new file mode 100644
index 00000000000..b1ef20c6f30
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_password.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff
new file mode 100644
index 00000000000..9c72c7c06ba
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_row_format.rdiff
@@ -0,0 +1,8 @@
+8c8
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
+15c15
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_opt_union.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_union.rdiff
new file mode 100644
index 00000000000..f77753f4d6b
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_opt_union.rdiff
@@ -0,0 +1,8 @@
+7c7
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 UNION=(`child1`)
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`child1`)
+13c13
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 UNION=(`child1`,`child2`)
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`child1`,`child2`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_standard_opts.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_standard_opts.rdiff
new file mode 100644
index 00000000000..9b7ffc6af76
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_standard_opts.rdiff
@@ -0,0 +1,8 @@
+11c11
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=utf8 COMMENT='standard table options'
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) COMMENT='standard table options'
+18c18
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=utf8 COMMENT='table altered'
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`mrg`.`t1`) COMMENT='table altered'
diff --git a/storage/myisammrg/mysql-test/storage_engine/tbl_temporary.rdiff b/storage/myisammrg/mysql-test/storage_engine/tbl_temporary.rdiff
new file mode 100644
index 00000000000..45a229c98eb
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/tbl_temporary.rdiff
@@ -0,0 +1,4 @@
+9c9
+< ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1
+---
+> ) ENGINE=<STORAGE_ENGINE> DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(`mrg`.`t1`)
diff --git a/storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff b/storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff
new file mode 100644
index 00000000000..3a89f730540
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/truncate_table.rdiff
@@ -0,0 +1,35 @@
+12c12
+< t1 # # # # # # # # # 1 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+16c16
+< t1 # # # # # # # # # 4 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+20c20
+< t1 # # # # # # # # # 1 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+24c24
+< t1 # # # # # # # # # 2 # # # # # # #
+---
+> t1 # # # # # # # # # 0 # # # # # # #
+32,40c32,39
+< HANDLER h1 READ FIRST;
+< a b
+< 1 a
+< TRUNCATE TABLE t1;
+< HANDLER h1 READ NEXT;
+< ERROR 42S02: Unknown table 'h1' in HANDLER
+< HANDLER t1 OPEN AS h2;
+< HANDLER h2 READ FIRST;
+< a b
+---
+> ERROR HY000: Table storage engine for 'h1' doesn't have this option
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command finished with ER_ILLEGAL_HA.
+> # HANDLER or the syntax or the mix could be unsupported.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_repeatable_read.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_repeatable_read.rdiff
new file mode 100644
index 00000000000..018b28bd24c
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_repeatable_read.rdiff
@@ -0,0 +1,9 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+13a20
+> 1
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_serializable.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_serializable.rdiff
new file mode 100644
index 00000000000..018b28bd24c
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/cons_snapshot_serializable.rdiff
@@ -0,0 +1,9 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+13a20
+> 1
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/delete.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/delete.rdiff
new file mode 100644
index 00000000000..45a3e5fb52d
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/delete.rdiff
@@ -0,0 +1,34 @@
+0a1,12
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support savepoints.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file (recommended), or add the test to disabled.def.
+> # If savepoints should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+48a61,62
+> Warnings:
+> Warning 1196 Some non-transactional changed tables couldn't be rolled back
+51,64d64
+< 10000 foobar
+< 10000 foobar
+< 2 b
+< 2 b
+< 4 d
+< 4 d
+< 5 e
+< 5 e
+< 6 f
+< 6 f
+< 7 g
+< 7 g
+< 8 h
+< 8 h
+70a71,72
+> Warnings:
+> Warning 1196 Some non-transactional changed tables couldn't be rolled back
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/insert.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/insert.rdiff
new file mode 100644
index 00000000000..69981f90e13
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/insert.rdiff
@@ -0,0 +1,32 @@
+0a1,12
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support savepoints.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file (recommended), or add the test to disabled.def.
+> # If savepoints should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+23a36,37
+> Warnings:
+> Warning 1196 Some non-transactional changed tables couldn't be rolled back
+25a40
+> 0 test
+33a49,50
+> NULL NULL
+> NULL NULL
+39a57,58
+> Warnings:
+> Warning 1196 Some non-transactional changed tables couldn't be rolled back
+43a63
+> 0 test
+49a70
+> 11 f
+54a76,78
+> NULL NULL
+> NULL NULL
+> NULL NULL
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/level_read_committed.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/level_read_committed.rdiff
new file mode 100644
index 00000000000..0837c74f5ff
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/level_read_committed.rdiff
@@ -0,0 +1,44 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+18a25
+> 1
+25a33,34
+> 1
+> 2
+30a40,43
+> 1
+> 101
+> 102
+> 2
+34a48,49
+> 101
+> 102
+39a55,56
+> 101
+> 102
+44a62,63
+> 101
+> 102
+51a71,72
+> 101
+> 102
+54a76,77
+> 301
+> 302
+58a82,83
+> 101
+> 102
+61a87,88
+> 301
+> 302
+65a93,94
+> 101
+> 102
+68a98,99
+> 301
+> 302
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/level_read_uncommitted.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/level_read_uncommitted.rdiff
new file mode 100644
index 00000000000..bd9569267e5
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/level_read_uncommitted.rdiff
@@ -0,0 +1,7 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/level_repeatable_read.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/level_repeatable_read.rdiff
new file mode 100644
index 00000000000..82f7c5c5ba6
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/level_repeatable_read.rdiff
@@ -0,0 +1,53 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+18a25
+> 1
+25a33,34
+> 1
+> 2
+27,28c36
+< ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+< # WARNING: Statement ended with errno 1205, errname 'ER_LOCK_WAIT_TIMEOUT'.
+---
+> # WARNING: Statement ended with errno 0, errname ''.
+31a40,43
+> 1
+> 101
+> 102
+> 2
+35a48,49
+> 101
+> 102
+40a55,56
+> 101
+> 102
+44a61,64
+> 1
+> 101
+> 102
+> 2
+49a70,73
+> 1
+> 101
+> 102
+> 2
+51a76,77
+> 301
+> 302
+55a82,83
+> 101
+> 102
+58a87,88
+> 301
+> 302
+62a93,94
+> 101
+> 102
+65a98,99
+> 301
+> 302
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/level_serializable.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/level_serializable.rdiff
new file mode 100644
index 00000000000..3924b3784a9
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/level_serializable.rdiff
@@ -0,0 +1,69 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+14,15c20
+< ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+< # WARNING: Statement ended with errno 1205, errname 'ER_LOCK_WAIT_TIMEOUT'.
+---
+> # WARNING: Statement ended with errno 0, errname ''.
+19a25
+> 1
+22,23c28
+< ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+< # WARNING: Statement ended with errno 1205, errname 'ER_LOCK_WAIT_TIMEOUT'.
+---
+> # WARNING: Statement ended with errno 0, errname ''.
+27a33,34
+> 1
+> 2
+32a40,43
+> 1
+> 101
+> 102
+> 2
+35a47,50
+> 1
+> 101
+> 102
+> 2
+38a54,57
+> 1
+> 101
+> 102
+> 2
+41a61,64
+> 1
+> 101
+> 102
+> 2
+46a70,77
+> 1
+> 101
+> 102
+> 2
+> 201
+> 202
+> 301
+> 302
+49a81,88
+> 1
+> 101
+> 102
+> 2
+> 201
+> 202
+> 301
+> 302
+52a92,99
+> 1
+> 101
+> 102
+> 2
+> 201
+> 202
+> 301
+> 302
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/select_for_update.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/select_for_update.rdiff
new file mode 100644
index 00000000000..f8ffe67586d
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/select_for_update.rdiff
@@ -0,0 +1,40 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+17c23,33
+< ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+---
+> a b
+> 1 a
+> 3 a
+> # ERROR: Statement succeeded (expected results: ER_LOCK_WAIT_TIMEOUT)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command succeeded unexpectedly.
+> # SELECT .. FOR UPDATE or LOCK IN SHARE MODE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+19c35,42
+< ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+---
+> # ERROR: Statement succeeded (expected results: ER_LOCK_WAIT_TIMEOUT)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command succeeded unexpectedly.
+> # UPDATE or SELECT .. FOR UPDATE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+24c47
+< 1 a
+---
+> 1 c
+26c49
+< 3 a
+---
+> 3 c
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/select_lock_in_share_mode.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/select_lock_in_share_mode.rdiff
new file mode 100644
index 00000000000..e316993830a
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/select_lock_in_share_mode.rdiff
@@ -0,0 +1,26 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+21c27,34
+< ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+---
+> # ERROR: Statement succeeded (expected results: ER_LOCK_WAIT_TIMEOUT)
+> # ------------ UNEXPECTED RESULT ------------
+> # The statement|command succeeded unexpectedly.
+> # LOCK IN SHARE MODE or UPDATE or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+26c39
+< 1 a
+---
+> 1 c
+28c41
+< 3 a
+---
+> 3 c
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/update.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/update.rdiff
new file mode 100644
index 00000000000..7ad463053eb
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/update.rdiff
@@ -0,0 +1,41 @@
+0a1,12
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support transactions.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If transactions should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support savepoints.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file (recommended), or add the test to disabled.def.
+> # If savepoints should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+26a39,40
+> Warnings:
+> Warning 1196 Some non-transactional changed tables couldn't be rolled back
+31a46,47
+> Warnings:
+> Warning 1196 Some non-transactional changed tables couldn't be rolled back
+38,47c54,63
+< 51 update2
+< 51 update2
+< 52 update2
+< 52 update2
+< 53 update2
+< 53 update2
+< 54 update2
+< 54 update2
+< 55 update2
+< 55 update2
+---
+> 51
+> 51
+> 52
+> 52
+> 53
+> 53
+> 54
+> 54
+> 55
+> 55
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/xa.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/xa.rdiff
new file mode 100644
index 00000000000..ee7c2a984be
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/xa.rdiff
@@ -0,0 +1,34 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support XA.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If XA should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+11a18
+> 1
+17a25,26
+> 1
+> 2
+22a32,33
+> 1
+> 2
+40a52
+> 3
+48a61,62
+> 3
+> 4
+67a82
+> 5
+77a93,94
+> 5
+> 6
+86a104,105
+> 5
+> 6
+88a108,109
+> Warnings:
+> Warning 1196 Some non-transactional changed tables couldn't be rolled back
+95a117,118
+> 5
+> 6
diff --git a/storage/myisammrg/mysql-test/storage_engine/trx/xa_recovery.rdiff b/storage/myisammrg/mysql-test/storage_engine/trx/xa_recovery.rdiff
new file mode 100644
index 00000000000..362e3a8914a
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/trx/xa_recovery.rdiff
@@ -0,0 +1,22 @@
+0a1,6
+> # -- WARNING ----------------------------------------------------------------
+> # According to I_S.ENGINES, MRG_MYISAM does not support XA.
+> # If it is true, the test will most likely fail; you can
+> # either create an rdiff file, or add the test to disabled.def.
+> # If XA should be supported, check the data in Information Schema.
+> # ---------------------------------------------------------------------------
+21,22d26
+< 1 3 0 xa1
+< 1 3 0 xa2
+23a28
+> ERROR XAE04: XAER_NOTA: Unknown XID
+24a30
+> ERROR XAE04: XAER_NOTA: Unknown XID
+26a33,34
+> 1
+> 2
+28a37,40
+> Warnings:
+> Error 145 Table './mrg/t1' is marked as crashed and should be repaired
+> Error 1194 Table 't1' is marked as crashed and should be repaired
+> Error 1034 1 client is using or hasn't closed the table properly
diff --git a/storage/myisammrg/mysql-test/storage_engine/type_char_indexes.rdiff b/storage/myisammrg/mysql-test/storage_engine/type_char_indexes.rdiff
new file mode 100644
index 00000000000..a0a418e0bcc
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/type_char_indexes.rdiff
@@ -0,0 +1,8 @@
+101c101
+< # # # range c_v c_v # # # Using index condition
+---
+> # # # ALL c_v NULL # # # Using where
+138c138
+< # # # range # v16 # # # #
+---
+> # # # ALL # NULL # # # #
diff --git a/storage/myisammrg/mysql-test/storage_engine/type_float_indexes.rdiff b/storage/myisammrg/mysql-test/storage_engine/type_float_indexes.rdiff
new file mode 100644
index 00000000000..640e1050a99
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/type_float_indexes.rdiff
@@ -0,0 +1,4 @@
+63c63
+< # # # # # d # # # #
+---
+> # # # # # NULL # # # #
diff --git a/storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff b/storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff
new file mode 100644
index 00000000000..a4d7d4390b8
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/type_spatial.rdiff
@@ -0,0 +1,706 @@
+5,698c5,14
+< CREATE TABLE gis_line (fid <INT_COLUMN>, g LINESTRING) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_polygon (fid <INT_COLUMN>, g POLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_point (fid <INT_COLUMN>, g MULTIPOINT) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_line (fid <INT_COLUMN>, g MULTILINESTRING) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_polygon (fid <INT_COLUMN>, g MULTIPOLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_geometrycollection (fid <INT_COLUMN>, g GEOMETRYCOLLECTION) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_geometry (fid <INT_COLUMN>, g GEOMETRY) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< USE gis_ogs;
+< CREATE TABLE lakes (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< shore POLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE road_segments (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< aliases CHAR(64) <CUSTOM_COL_OPTIONS>,
+< num_lanes INT <CUSTOM_COL_OPTIONS>,
+< centerline LINESTRING) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE divided_routes (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< num_lanes INT <CUSTOM_COL_OPTIONS>,
+< centerlines MULTILINESTRING) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE forests (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< boundary MULTIPOLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE bridges (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< position POINT) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE streams (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< centerline LINESTRING) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE buildings (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< position POINT,
+< footprint POLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE ponds (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< type CHAR(64) <CUSTOM_COL_OPTIONS>,
+< shores MULTIPOLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE named_places (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< boundary POLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE map_neatlines (fid INT <CUSTOM_COL_OPTIONS>,
+< neatline POLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< USE test;
+< SHOW FIELDS FROM gis_point;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g point YES NULL
+< SHOW FIELDS FROM gis_line;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g linestring YES NULL
+< SHOW FIELDS FROM gis_polygon;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g polygon YES NULL
+< SHOW FIELDS FROM gis_multi_point;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multipoint YES NULL
+< SHOW FIELDS FROM gis_multi_line;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multilinestring YES NULL
+< SHOW FIELDS FROM gis_multi_polygon;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multipolygon YES NULL
+< SHOW FIELDS FROM gis_geometrycollection;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g geometrycollection YES NULL
+< SHOW FIELDS FROM gis_geometry;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g geometry YES NULL
+< INSERT INTO gis_point VALUES
+< (101, PointFromText('POINT(10 10)')),
+< (102, PointFromText('POINT(20 10)')),
+< (103, PointFromText('POINT(20 20)')),
+< (104, PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
+< INSERT INTO gis_line VALUES
+< (105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
+< (106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+< (107, LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10)))));
+< INSERT INTO gis_polygon VALUES
+< (108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+< (109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+< (110, PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))))));
+< INSERT INTO gis_multi_point VALUES
+< (111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+< (112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+< (113, MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));
+< INSERT INTO gis_multi_line VALUES
+< (114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+< (115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+< (116, MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))))));
+< INSERT INTO gis_multi_polygon VALUES
+< (117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+< (118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+< (119, MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
+< INSERT INTO gis_geometrycollection VALUES
+< (120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+< (121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))),
+< (122, GeomFromText('GeometryCollection()')),
+< (123, GeomFromText('GeometryCollection EMPTY'));
+< INSERT into gis_geometry SELECT * FROM gis_point;
+< INSERT into gis_geometry SELECT * FROM gis_line;
+< INSERT into gis_geometry SELECT * FROM gis_polygon;
+< INSERT into gis_geometry SELECT * FROM gis_multi_point;
+< INSERT into gis_geometry SELECT * FROM gis_multi_line;
+< INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+< INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+< SELECT fid, AsText(g) FROM gis_point;
+< fid AsText(g)
+< 101 POINT(10 10)
+< 102 POINT(20 10)
+< 103 POINT(20 20)
+< 104 POINT(10 20)
+< SELECT fid, AsText(g) FROM gis_line;
+< fid AsText(g)
+< 105 LINESTRING(0 0,0 10,10 0)
+< 106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 107 LINESTRING(10 10,40 10)
+< SELECT fid, AsText(g) FROM gis_polygon;
+< fid AsText(g)
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+< 110 POLYGON((0 0,30 0,30 30,0 0))
+< SELECT fid, AsText(g) FROM gis_multi_point;
+< fid AsText(g)
+< 111 MULTIPOINT(0 0,10 10,10 20,20 20)
+< 112 MULTIPOINT(1 1,11 11,11 21,21 21)
+< 113 MULTIPOINT(3 6,4 10)
+< SELECT fid, AsText(g) FROM gis_multi_line;
+< fid AsText(g)
+< 114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+< 115 MULTILINESTRING((10 48,10 21,10 0))
+< 116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+< SELECT fid, AsText(g) FROM gis_multi_polygon;
+< fid AsText(g)
+< 117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+< SELECT fid, AsText(g) FROM gis_geometrycollection;
+< fid AsText(g)
+< 120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+< 121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, AsText(g) FROM gis_geometry;
+< fid AsText(g)
+< 101 POINT(10 10)
+< 102 POINT(20 10)
+< 103 POINT(20 20)
+< 104 POINT(10 20)
+< 105 LINESTRING(0 0,0 10,10 0)
+< 106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 107 LINESTRING(10 10,40 10)
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+< 110 POLYGON((0 0,30 0,30 30,0 0))
+< 111 MULTIPOINT(0 0,10 10,10 20,20 20)
+< 112 MULTIPOINT(1 1,11 11,11 21,21 21)
+< 113 MULTIPOINT(3 6,4 10)
+< 114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+< 115 MULTILINESTRING((10 48,10 21,10 0))
+< 116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+< 117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+< 120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+< 121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, Dimension(g) FROM gis_geometry;
+< fid Dimension(g)
+< 101 0
+< 102 0
+< 103 0
+< 104 0
+< 105 1
+< 106 1
+< 107 1
+< 108 2
+< 109 2
+< 110 2
+< 111 0
+< 112 0
+< 113 0
+< 114 1
+< 115 1
+< 116 1
+< 117 2
+< 118 2
+< 119 2
+< 120 1
+< 121 1
+< 122 0
+< 123 0
+< SELECT fid, GeometryType(g) FROM gis_geometry;
+< fid GeometryType(g)
+< 101 POINT
+< 102 POINT
+< 103 POINT
+< 104 POINT
+< 105 LINESTRING
+< 106 LINESTRING
+< 107 LINESTRING
+< 108 POLYGON
+< 109 POLYGON
+< 110 POLYGON
+< 111 MULTIPOINT
+< 112 MULTIPOINT
+< 113 MULTIPOINT
+< 114 MULTILINESTRING
+< 115 MULTILINESTRING
+< 116 MULTILINESTRING
+< 117 MULTIPOLYGON
+< 118 MULTIPOLYGON
+< 119 MULTIPOLYGON
+< 120 GEOMETRYCOLLECTION
+< 121 GEOMETRYCOLLECTION
+< 122 GEOMETRYCOLLECTION
+< 123 GEOMETRYCOLLECTION
+< SELECT fid, IsEmpty(g) FROM gis_geometry;
+< fid IsEmpty(g)
+< 101 0
+< 102 0
+< 103 0
+< 104 0
+< 105 0
+< 106 0
+< 107 0
+< 108 0
+< 109 0
+< 110 0
+< 111 0
+< 112 0
+< 113 0
+< 114 0
+< 115 0
+< 116 0
+< 117 0
+< 118 0
+< 119 0
+< 120 0
+< 121 0
+< 122 0
+< 123 0
+< SELECT fid, AsText(Envelope(g)) FROM gis_geometry;
+< fid AsText(Envelope(g))
+< 101 POLYGON((10 10,10 10,10 10,10 10,10 10))
+< 102 POLYGON((20 10,20 10,20 10,20 10,20 10))
+< 103 POLYGON((20 20,20 20,20 20,20 20,20 20))
+< 104 POLYGON((10 20,10 20,10 20,10 20,10 20))
+< 105 POLYGON((0 0,10 0,10 10,0 10,0 0))
+< 106 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 107 POLYGON((10 10,40 10,40 10,10 10,10 10))
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0))
+< 110 POLYGON((0 0,30 0,30 30,0 30,0 0))
+< 111 POLYGON((0 0,20 0,20 20,0 20,0 0))
+< 112 POLYGON((1 1,21 1,21 21,1 21,1 1))
+< 113 POLYGON((3 6,4 6,4 10,3 10,3 6))
+< 114 POLYGON((10 0,16 0,16 48,10 48,10 0))
+< 115 POLYGON((10 0,10 0,10 48,10 48,10 0))
+< 116 POLYGON((1 2,21 2,21 8,1 8,1 2))
+< 117 POLYGON((28 0,84 0,84 42,28 42,28 0))
+< 118 POLYGON((28 0,84 0,84 42,28 42,28 0))
+< 119 POLYGON((0 0,3 0,3 3,0 3,0 0))
+< 120 POLYGON((0 0,10 0,10 10,0 10,0 0))
+< 121 POLYGON((3 6,44 6,44 9,3 9,3 6))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, X(g) FROM gis_point;
+< fid X(g)
+< 101 10
+< 102 20
+< 103 20
+< 104 10
+< SELECT fid, Y(g) FROM gis_point;
+< fid Y(g)
+< 101 10
+< 102 10
+< 103 20
+< 104 20
+< SELECT fid, AsText(StartPoint(g)) FROM gis_line;
+< fid AsText(StartPoint(g))
+< 105 POINT(0 0)
+< 106 POINT(10 10)
+< 107 POINT(10 10)
+< SELECT fid, AsText(EndPoint(g)) FROM gis_line;
+< fid AsText(EndPoint(g))
+< 105 POINT(10 0)
+< 106 POINT(10 10)
+< 107 POINT(40 10)
+< SELECT fid, GLength(g) FROM gis_line;
+< fid GLength(g)
+< 105 24.14213562373095
+< 106 40
+< 107 30
+< SELECT fid, NumPoints(g) FROM gis_line;
+< fid NumPoints(g)
+< 105 3
+< 106 5
+< 107 2
+< SELECT fid, AsText(PointN(g, 2)) FROM gis_line;
+< fid AsText(PointN(g, 2))
+< 105 POINT(0 10)
+< 106 POINT(20 10)
+< 107 POINT(40 10)
+< SELECT fid, IsClosed(g) FROM gis_line;
+< fid IsClosed(g)
+< 105 0
+< 106 1
+< 107 0
+< SELECT fid, AsText(Centroid(g)) FROM gis_polygon;
+< fid AsText(Centroid(g))
+< 108 POINT(15 15)
+< 109 POINT(25.416666666666668 25.416666666666668)
+< 110 POINT(20 10)
+< SELECT fid, Area(g) FROM gis_polygon;
+< fid Area(g)
+< 108 100
+< 109 2400
+< 110 450
+< SELECT fid, AsText(ExteriorRing(g)) FROM gis_polygon;
+< fid AsText(ExteriorRing(g))
+< 108 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 109 LINESTRING(0 0,50 0,50 50,0 50,0 0)
+< 110 LINESTRING(0 0,30 0,30 30,0 0)
+< SELECT fid, NumInteriorRings(g) FROM gis_polygon;
+< fid NumInteriorRings(g)
+< 108 0
+< 109 1
+< 110 0
+< SELECT fid, AsText(InteriorRingN(g, 1)) FROM gis_polygon;
+< fid AsText(InteriorRingN(g, 1))
+< 108 NULL
+< 109 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 110 NULL
+< SELECT fid, IsClosed(g) FROM gis_multi_line;
+< fid IsClosed(g)
+< 114 0
+< 115 0
+< 116 0
+< SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon;
+< fid AsText(Centroid(g))
+< 117 POINT(55.58852775304245 17.426536064113982)
+< 118 POINT(55.58852775304245 17.426536064113982)
+< 119 POINT(2 2)
+< SELECT fid, Area(g) FROM gis_multi_polygon;
+< fid Area(g)
+< 117 1684.5
+< 118 1684.5
+< 119 4.5
+< SELECT fid, NumGeometries(g) from gis_multi_point;
+< fid NumGeometries(g)
+< 111 4
+< 112 4
+< 113 2
+< SELECT fid, NumGeometries(g) from gis_multi_line;
+< fid NumGeometries(g)
+< 114 2
+< 115 1
+< 116 2
+< SELECT fid, NumGeometries(g) from gis_multi_polygon;
+< fid NumGeometries(g)
+< 117 2
+< 118 2
+< 119 1
+< SELECT fid, NumGeometries(g) from gis_geometrycollection;
+< fid NumGeometries(g)
+< 120 2
+< 121 2
+< 122 0
+< 123 0
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_point;
+< fid AsText(GeometryN(g, 2))
+< 111 POINT(10 10)
+< 112 POINT(11 11)
+< 113 POINT(4 10)
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_line;
+< fid AsText(GeometryN(g, 2))
+< 114 LINESTRING(16 0,16 23,16 48)
+< 115 NULL
+< 116 LINESTRING(2 5,5 8,21 7)
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_polygon;
+< fid AsText(GeometryN(g, 2))
+< 117 POLYGON((59 18,67 18,67 13,59 13,59 18))
+< 118 POLYGON((59 18,67 18,67 13,59 13,59 18))
+< 119 NULL
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_geometrycollection;
+< fid AsText(GeometryN(g, 2))
+< 120 LINESTRING(0 0,10 10)
+< 121 LINESTRING(3 6,7 9)
+< 122 NULL
+< 123 NULL
+< SELECT fid, AsText(GeometryN(g, 1)) from gis_geometrycollection;
+< fid AsText(GeometryN(g, 1))
+< 120 POINT(0 0)
+< 121 POINT(44 6)
+< 122 NULL
+< 123 NULL
+< SELECT g1.fid as first, g2.fid as second,
+< Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o,
+< Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t,
+< Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r
+< FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+< first second w c o e d t i r
+< 120 120 1 1 0 1 0 1 1 0
+< 120 121 0 0 1 0 0 0 1 0
+< 120 122 0 1 NULL 0 NULL 0 NULL 0
+< 120 123 0 1 NULL 0 NULL 0 NULL 0
+< 121 120 0 0 1 0 0 0 1 0
+< 121 121 1 1 0 1 0 1 1 0
+< 121 122 0 1 NULL 0 NULL 0 NULL 0
+< 121 123 0 1 NULL 0 NULL 0 NULL 0
+< 122 120 1 0 NULL 0 NULL 0 NULL 0
+< 122 121 1 0 NULL 0 NULL 0 NULL 0
+< 122 122 1 1 NULL 1 NULL 0 NULL 0
+< 122 123 1 1 NULL 1 NULL 0 NULL 0
+< 123 120 1 0 NULL 0 NULL 0 NULL 0
+< 123 121 1 0 NULL 0 NULL 0 NULL 0
+< 123 122 1 1 NULL 1 NULL 0 NULL 0
+< 123 123 1 1 NULL 1 NULL 0 NULL 0
+< DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+< USE gis_ogs;
+< # Lakes
+< INSERT INTO lakes VALUES (
+< 101, 'BLUE LAKE',
+< PolyFromText(
+< 'POLYGON(
+< (52 18,66 23,73 9,48 6,52 18),
+< (59 18,67 18,67 13,59 13,59 18)
+< )',
+< 101));
+< # Road Segments
+< INSERT INTO road_segments VALUES(102, 'Route 5', NULL, 2,
+< LineFromText(
+< 'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
+< INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
+< LineFromText(
+< 'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
+< INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
+< LineFromText(
+< 'LINESTRING( 70 38, 72 48 )' ,101));
+< INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
+< LineFromText(
+< 'LINESTRING( 70 38, 84 42 )' ,101));
+< INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
+< 1,
+< LineFromText(
+< 'LINESTRING( 28 26, 28 0 )',101));
+< # DividedRoutes
+< INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
+< MLineFromText(
+< 'MULTILINESTRING((10 48,10 21,10 0),
+< (16 0,16 23,16 48))', 101));
+< # Forests
+< INSERT INTO forests VALUES(109, 'Green Forest',
+< MPolyFromText(
+< 'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),
+< (52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))',
+< 101));
+< # Bridges
+< INSERT INTO bridges VALUES(110, 'Cam Bridge', PointFromText(
+< 'POINT( 44 31 )', 101));
+< # Streams
+< INSERT INTO streams VALUES(111, 'Cam Stream',
+< LineFromText(
+< 'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
+< INSERT INTO streams VALUES(112, NULL,
+< LineFromText(
+< 'LINESTRING( 76 0, 78 4, 73 9 )', 101));
+< # Buildings
+< INSERT INTO buildings VALUES(113, '123 Main Street',
+< PointFromText(
+< 'POINT( 52 30 )', 101),
+< PolyFromText(
+< 'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
+< INSERT INTO buildings VALUES(114, '215 Main Street',
+< PointFromText(
+< 'POINT( 64 33 )', 101),
+< PolyFromText(
+< 'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
+< # Ponds
+< INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
+< MPolyFromText(
+< 'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ),
+< ( ( 26 44, 26 40, 28 42, 26 44) ) )', 101));
+< # Named Places
+< INSERT INTO named_places VALUES(117, 'Ashton',
+< PolyFromText(
+< 'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
+< INSERT INTO named_places VALUES(118, 'Goose Island',
+< PolyFromText(
+< 'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
+< # Map Neatlines
+< INSERT INTO map_neatlines VALUES(115,
+< PolyFromText(
+< 'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101));
+< SELECT Dimension(shore)
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< Dimension(shore)
+< 2
+< SELECT GeometryType(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< GeometryType(centerlines)
+< MULTILINESTRING
+< SELECT AsText(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(boundary)
+< POLYGON((67 13,67 18,59 18,59 13,67 13))
+< SELECT AsText(PolyFromWKB(AsBinary(boundary),101))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(PolyFromWKB(AsBinary(boundary),101))
+< POLYGON((67 13,67 18,59 18,59 13,67 13))
+< SELECT SRID(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< SRID(boundary)
+< 101
+< SELECT IsEmpty(centerline)
+< FROM road_segments
+< WHERE name = 'Route 5'
+< AND aliases = 'Main Street';
+< IsEmpty(centerline)
+< 0
+< SELECT AsText(Envelope(boundary))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(Envelope(boundary))
+< POLYGON((59 13,67 13,67 18,59 18,59 13))
+< SELECT X(position)
+< FROM bridges
+< WHERE name = 'Cam Bridge';
+< X(position)
+< 44
+< SELECT Y(position)
+< FROM bridges
+< WHERE name = 'Cam Bridge';
+< Y(position)
+< 31
+< SELECT AsText(StartPoint(centerline))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(StartPoint(centerline))
+< POINT(0 18)
+< SELECT AsText(EndPoint(centerline))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(EndPoint(centerline))
+< POINT(44 31)
+< SELECT GLength(centerline)
+< FROM road_segments
+< WHERE fid = 106;
+< GLength(centerline)
+< 26
+< SELECT NumPoints(centerline)
+< FROM road_segments
+< WHERE fid = 102;
+< NumPoints(centerline)
+< 5
+< SELECT AsText(PointN(centerline, 1))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(PointN(centerline, 1))
+< POINT(0 18)
+< SELECT AsText(Centroid(boundary))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(Centroid(boundary))
+< POINT(63 15.5)
+< SELECT Area(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< Area(boundary)
+< 40
+< SELECT AsText(ExteriorRing(shore))
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< AsText(ExteriorRing(shore))
+< LINESTRING(52 18,66 23,73 9,48 6,52 18)
+< SELECT NumInteriorRings(shore)
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< NumInteriorRings(shore)
+< 1
+< SELECT AsText(InteriorRingN(shore, 1))
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< AsText(InteriorRingN(shore, 1))
+< LINESTRING(59 18,67 18,67 13,59 13,59 18)
+< SELECT NumGeometries(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< NumGeometries(centerlines)
+< 2
+< SELECT AsText(GeometryN(centerlines, 2))
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< AsText(GeometryN(centerlines, 2))
+< LINESTRING(16 0,16 23,16 48)
+< SELECT IsClosed(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< IsClosed(centerlines)
+< 0
+< SELECT GLength(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< GLength(centerlines)
+< 96
+< SELECT AsText(Centroid(shores))
+< FROM ponds
+< WHERE fid = 120;
+< AsText(Centroid(shores))
+< POINT(25 42)
+< SELECT Area(shores)
+< FROM ponds
+< WHERE fid = 120;
+< Area(shores)
+< 8
+< SELECT ST_Equals(boundary,
+< PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< ST_Equals(boundary,
+< PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+< 1
+< SELECT ST_Disjoint(centerlines, boundary)
+< FROM divided_routes, named_places
+< WHERE divided_routes.name = 'Route 75'
+< AND named_places.name = 'Ashton';
+< ST_Disjoint(centerlines, boundary)
+< 1
+< SELECT ST_Touches(centerline, shore)
+< FROM streams, lakes
+< WHERE streams.name = 'Cam Stream'
+< AND lakes.name = 'Blue Lake';
+< ST_Touches(centerline, shore)
+< 1
+< SELECT Crosses(road_segments.centerline, divided_routes.centerlines)
+< FROM road_segments, divided_routes
+< WHERE road_segments.fid = 102
+< AND divided_routes.name = 'Route 75';
+< Crosses(road_segments.centerline, divided_routes.centerlines)
+< 1
+< SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+< FROM road_segments, divided_routes
+< WHERE road_segments.fid = 102
+< AND divided_routes.name = 'Route 75';
+< ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+< 1
+< SELECT ST_Contains(forests.boundary, named_places.boundary)
+< FROM forests, named_places
+< WHERE forests.name = 'Green Forest'
+< AND named_places.name = 'Ashton';
+< ST_Contains(forests.boundary, named_places.boundary)
+< 0
+< SELECT ST_Distance(position, boundary)
+< FROM bridges, named_places
+< WHERE bridges.name = 'Cam Bridge'
+< AND named_places.name = 'Ashton';
+< ST_Distance(position, boundary)
+< 12
+< SELECT AsText(ST_Difference(named_places.boundary, forests.boundary))
+< FROM named_places, forests
+< WHERE named_places.name = 'Ashton'
+< AND forests.name = 'Green Forest';
+< AsText(ST_Difference(named_places.boundary, forests.boundary))
+< POLYGON((56 34,62 48,84 48,84 42,56 34))
+< SELECT AsText(ST_Union(shore, boundary))
+< FROM lakes, named_places
+< WHERE lakes.name = 'Blue Lake'
+< AND named_places.name = 'Goose Island';
+< AsText(ST_Union(shore, boundary))
+< POLYGON((48 6,52 18,66 23,73 9,48 6))
+< SELECT AsText(ST_SymDifference(shore, boundary))
+< FROM lakes, named_places
+< WHERE lakes.name = 'Blue Lake'
+< AND named_places.name = 'Ashton';
+< AsText(ST_SymDifference(shore, boundary))
+< MULTIPOLYGON(((48 6,52 18,66 23,73 9,48 6),(59 13,59 18,67 18,67 13,59 13)),((56 30,56 34,62 48,84 48,84 30,56 30)))
+< SELECT count(*)
+< FROM buildings, bridges
+< WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
+< count(*)
+< 1
+---
+> ERROR 42000: The storage engine for the table doesn't support GEOMETRY
+> # ERROR: Statement ended with errno 1178, errname ER_CHECK_NOT_IMPLEMENTED (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE gis_point (fid INT(11) /*!*/ /*Custom column options*/, g POINT) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.gis_point) INSERT_METHOD=LAST ]
+> # The statement|command finished with ER_CHECK_NOT_IMPLEMENTED.
+> # Geometry types or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff b/storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff
new file mode 100644
index 00000000000..89f1100f550
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/type_spatial_indexes.rdiff
@@ -0,0 +1,1412 @@
+5,698c5,14
+< CREATE TABLE gis_line (fid <INT_COLUMN>, g LINESTRING, <CUSTOM_INDEX> g(g(256))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_polygon (fid <INT_COLUMN>, g POLYGON, <CUSTOM_INDEX> g(g(512))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_point (fid <INT_COLUMN>, g MULTIPOINT, <CUSTOM_INDEX> g(g(128))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_line (fid <INT_COLUMN>, g MULTILINESTRING, <CUSTOM_INDEX> g(g(256))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_polygon (fid <INT_COLUMN>, g MULTIPOLYGON) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_geometrycollection (fid <INT_COLUMN>, g GEOMETRYCOLLECTION) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_geometry (fid <INT_COLUMN>, g GEOMETRY) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< USE gis_ogs;
+< CREATE TABLE lakes (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< shore POLYGON, <CUSTOM_INDEX> s(shore(64))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE road_segments (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< aliases CHAR(64) <CUSTOM_COL_OPTIONS>,
+< num_lanes INT <CUSTOM_COL_OPTIONS>,
+< centerline LINESTRING, <CUSTOM_INDEX> c(centerline(128))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE divided_routes (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< num_lanes INT <CUSTOM_COL_OPTIONS>,
+< centerlines MULTILINESTRING, <CUSTOM_INDEX> c(centerlines(512))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE forests (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< boundary MULTIPOLYGON, <CUSTOM_INDEX> b(boundary(128))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE bridges (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< position POINT, <CUSTOM_INDEX> p(`position`(64))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE streams (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< centerline LINESTRING, <CUSTOM_INDEX> c(centerline(256))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE buildings (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< position POINT,
+< footprint POLYGON, <CUSTOM_INDEX> p(`position`(64)), <CUSTOM_INDEX> f(footprint(128))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE ponds (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< type CHAR(64) <CUSTOM_COL_OPTIONS>,
+< shores MULTIPOLYGON, <CUSTOM_INDEX> s(shores(256))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE named_places (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< boundary POLYGON, <CUSTOM_INDEX> b(boundary(512))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE map_neatlines (fid INT <CUSTOM_COL_OPTIONS>,
+< neatline POLYGON, <CUSTOM_INDEX> n(neatline(700))) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< USE test;
+< SHOW FIELDS FROM gis_point;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g point YES MUL NULL
+< SHOW FIELDS FROM gis_line;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g linestring YES MUL NULL
+< SHOW FIELDS FROM gis_polygon;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g polygon YES MUL NULL
+< SHOW FIELDS FROM gis_multi_point;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multipoint YES MUL NULL
+< SHOW FIELDS FROM gis_multi_line;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multilinestring YES MUL NULL
+< SHOW FIELDS FROM gis_multi_polygon;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multipolygon YES NULL
+< SHOW FIELDS FROM gis_geometrycollection;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g geometrycollection YES NULL
+< SHOW FIELDS FROM gis_geometry;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g geometry YES NULL
+< INSERT INTO gis_point VALUES
+< (101, PointFromText('POINT(10 10)')),
+< (102, PointFromText('POINT(20 10)')),
+< (103, PointFromText('POINT(20 20)')),
+< (104, PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
+< INSERT INTO gis_line VALUES
+< (105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
+< (106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+< (107, LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10)))));
+< INSERT INTO gis_polygon VALUES
+< (108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+< (109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+< (110, PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))))));
+< INSERT INTO gis_multi_point VALUES
+< (111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+< (112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+< (113, MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));
+< INSERT INTO gis_multi_line VALUES
+< (114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+< (115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+< (116, MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))))));
+< INSERT INTO gis_multi_polygon VALUES
+< (117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+< (118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+< (119, MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
+< INSERT INTO gis_geometrycollection VALUES
+< (120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+< (121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))),
+< (122, GeomFromText('GeometryCollection()')),
+< (123, GeomFromText('GeometryCollection EMPTY'));
+< INSERT into gis_geometry SELECT * FROM gis_point;
+< INSERT into gis_geometry SELECT * FROM gis_line;
+< INSERT into gis_geometry SELECT * FROM gis_polygon;
+< INSERT into gis_geometry SELECT * FROM gis_multi_point;
+< INSERT into gis_geometry SELECT * FROM gis_multi_line;
+< INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+< INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+< SELECT fid, AsText(g) FROM gis_point;
+< fid AsText(g)
+< 101 POINT(10 10)
+< 102 POINT(20 10)
+< 103 POINT(20 20)
+< 104 POINT(10 20)
+< SELECT fid, AsText(g) FROM gis_line;
+< fid AsText(g)
+< 105 LINESTRING(0 0,0 10,10 0)
+< 106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 107 LINESTRING(10 10,40 10)
+< SELECT fid, AsText(g) FROM gis_polygon;
+< fid AsText(g)
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+< 110 POLYGON((0 0,30 0,30 30,0 0))
+< SELECT fid, AsText(g) FROM gis_multi_point;
+< fid AsText(g)
+< 111 MULTIPOINT(0 0,10 10,10 20,20 20)
+< 112 MULTIPOINT(1 1,11 11,11 21,21 21)
+< 113 MULTIPOINT(3 6,4 10)
+< SELECT fid, AsText(g) FROM gis_multi_line;
+< fid AsText(g)
+< 114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+< 115 MULTILINESTRING((10 48,10 21,10 0))
+< 116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+< SELECT fid, AsText(g) FROM gis_multi_polygon;
+< fid AsText(g)
+< 117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+< SELECT fid, AsText(g) FROM gis_geometrycollection;
+< fid AsText(g)
+< 120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+< 121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, AsText(g) FROM gis_geometry;
+< fid AsText(g)
+< 101 POINT(10 10)
+< 102 POINT(20 10)
+< 103 POINT(20 20)
+< 104 POINT(10 20)
+< 105 LINESTRING(0 0,0 10,10 0)
+< 106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 107 LINESTRING(10 10,40 10)
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+< 110 POLYGON((0 0,30 0,30 30,0 0))
+< 111 MULTIPOINT(0 0,10 10,10 20,20 20)
+< 112 MULTIPOINT(1 1,11 11,11 21,21 21)
+< 113 MULTIPOINT(3 6,4 10)
+< 114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+< 115 MULTILINESTRING((10 48,10 21,10 0))
+< 116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+< 117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+< 120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+< 121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, Dimension(g) FROM gis_geometry;
+< fid Dimension(g)
+< 101 0
+< 102 0
+< 103 0
+< 104 0
+< 105 1
+< 106 1
+< 107 1
+< 108 2
+< 109 2
+< 110 2
+< 111 0
+< 112 0
+< 113 0
+< 114 1
+< 115 1
+< 116 1
+< 117 2
+< 118 2
+< 119 2
+< 120 1
+< 121 1
+< 122 0
+< 123 0
+< SELECT fid, GeometryType(g) FROM gis_geometry;
+< fid GeometryType(g)
+< 101 POINT
+< 102 POINT
+< 103 POINT
+< 104 POINT
+< 105 LINESTRING
+< 106 LINESTRING
+< 107 LINESTRING
+< 108 POLYGON
+< 109 POLYGON
+< 110 POLYGON
+< 111 MULTIPOINT
+< 112 MULTIPOINT
+< 113 MULTIPOINT
+< 114 MULTILINESTRING
+< 115 MULTILINESTRING
+< 116 MULTILINESTRING
+< 117 MULTIPOLYGON
+< 118 MULTIPOLYGON
+< 119 MULTIPOLYGON
+< 120 GEOMETRYCOLLECTION
+< 121 GEOMETRYCOLLECTION
+< 122 GEOMETRYCOLLECTION
+< 123 GEOMETRYCOLLECTION
+< SELECT fid, IsEmpty(g) FROM gis_geometry;
+< fid IsEmpty(g)
+< 101 0
+< 102 0
+< 103 0
+< 104 0
+< 105 0
+< 106 0
+< 107 0
+< 108 0
+< 109 0
+< 110 0
+< 111 0
+< 112 0
+< 113 0
+< 114 0
+< 115 0
+< 116 0
+< 117 0
+< 118 0
+< 119 0
+< 120 0
+< 121 0
+< 122 0
+< 123 0
+< SELECT fid, AsText(Envelope(g)) FROM gis_geometry;
+< fid AsText(Envelope(g))
+< 101 POLYGON((10 10,10 10,10 10,10 10,10 10))
+< 102 POLYGON((20 10,20 10,20 10,20 10,20 10))
+< 103 POLYGON((20 20,20 20,20 20,20 20,20 20))
+< 104 POLYGON((10 20,10 20,10 20,10 20,10 20))
+< 105 POLYGON((0 0,10 0,10 10,0 10,0 0))
+< 106 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 107 POLYGON((10 10,40 10,40 10,10 10,10 10))
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0))
+< 110 POLYGON((0 0,30 0,30 30,0 30,0 0))
+< 111 POLYGON((0 0,20 0,20 20,0 20,0 0))
+< 112 POLYGON((1 1,21 1,21 21,1 21,1 1))
+< 113 POLYGON((3 6,4 6,4 10,3 10,3 6))
+< 114 POLYGON((10 0,16 0,16 48,10 48,10 0))
+< 115 POLYGON((10 0,10 0,10 48,10 48,10 0))
+< 116 POLYGON((1 2,21 2,21 8,1 8,1 2))
+< 117 POLYGON((28 0,84 0,84 42,28 42,28 0))
+< 118 POLYGON((28 0,84 0,84 42,28 42,28 0))
+< 119 POLYGON((0 0,3 0,3 3,0 3,0 0))
+< 120 POLYGON((0 0,10 0,10 10,0 10,0 0))
+< 121 POLYGON((3 6,44 6,44 9,3 9,3 6))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, X(g) FROM gis_point;
+< fid X(g)
+< 101 10
+< 102 20
+< 103 20
+< 104 10
+< SELECT fid, Y(g) FROM gis_point;
+< fid Y(g)
+< 101 10
+< 102 10
+< 103 20
+< 104 20
+< SELECT fid, AsText(StartPoint(g)) FROM gis_line;
+< fid AsText(StartPoint(g))
+< 105 POINT(0 0)
+< 106 POINT(10 10)
+< 107 POINT(10 10)
+< SELECT fid, AsText(EndPoint(g)) FROM gis_line;
+< fid AsText(EndPoint(g))
+< 105 POINT(10 0)
+< 106 POINT(10 10)
+< 107 POINT(40 10)
+< SELECT fid, GLength(g) FROM gis_line;
+< fid GLength(g)
+< 105 24.14213562373095
+< 106 40
+< 107 30
+< SELECT fid, NumPoints(g) FROM gis_line;
+< fid NumPoints(g)
+< 105 3
+< 106 5
+< 107 2
+< SELECT fid, AsText(PointN(g, 2)) FROM gis_line;
+< fid AsText(PointN(g, 2))
+< 105 POINT(0 10)
+< 106 POINT(20 10)
+< 107 POINT(40 10)
+< SELECT fid, IsClosed(g) FROM gis_line;
+< fid IsClosed(g)
+< 105 0
+< 106 1
+< 107 0
+< SELECT fid, AsText(Centroid(g)) FROM gis_polygon;
+< fid AsText(Centroid(g))
+< 108 POINT(15 15)
+< 109 POINT(25.416666666666668 25.416666666666668)
+< 110 POINT(20 10)
+< SELECT fid, Area(g) FROM gis_polygon;
+< fid Area(g)
+< 108 100
+< 109 2400
+< 110 450
+< SELECT fid, AsText(ExteriorRing(g)) FROM gis_polygon;
+< fid AsText(ExteriorRing(g))
+< 108 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 109 LINESTRING(0 0,50 0,50 50,0 50,0 0)
+< 110 LINESTRING(0 0,30 0,30 30,0 0)
+< SELECT fid, NumInteriorRings(g) FROM gis_polygon;
+< fid NumInteriorRings(g)
+< 108 0
+< 109 1
+< 110 0
+< SELECT fid, AsText(InteriorRingN(g, 1)) FROM gis_polygon;
+< fid AsText(InteriorRingN(g, 1))
+< 108 NULL
+< 109 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 110 NULL
+< SELECT fid, IsClosed(g) FROM gis_multi_line;
+< fid IsClosed(g)
+< 114 0
+< 115 0
+< 116 0
+< SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon;
+< fid AsText(Centroid(g))
+< 117 POINT(55.58852775304245 17.426536064113982)
+< 118 POINT(55.58852775304245 17.426536064113982)
+< 119 POINT(2 2)
+< SELECT fid, Area(g) FROM gis_multi_polygon;
+< fid Area(g)
+< 117 1684.5
+< 118 1684.5
+< 119 4.5
+< SELECT fid, NumGeometries(g) from gis_multi_point;
+< fid NumGeometries(g)
+< 111 4
+< 112 4
+< 113 2
+< SELECT fid, NumGeometries(g) from gis_multi_line;
+< fid NumGeometries(g)
+< 114 2
+< 115 1
+< 116 2
+< SELECT fid, NumGeometries(g) from gis_multi_polygon;
+< fid NumGeometries(g)
+< 117 2
+< 118 2
+< 119 1
+< SELECT fid, NumGeometries(g) from gis_geometrycollection;
+< fid NumGeometries(g)
+< 120 2
+< 121 2
+< 122 0
+< 123 0
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_point;
+< fid AsText(GeometryN(g, 2))
+< 111 POINT(10 10)
+< 112 POINT(11 11)
+< 113 POINT(4 10)
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_line;
+< fid AsText(GeometryN(g, 2))
+< 114 LINESTRING(16 0,16 23,16 48)
+< 115 NULL
+< 116 LINESTRING(2 5,5 8,21 7)
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_polygon;
+< fid AsText(GeometryN(g, 2))
+< 117 POLYGON((59 18,67 18,67 13,59 13,59 18))
+< 118 POLYGON((59 18,67 18,67 13,59 13,59 18))
+< 119 NULL
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_geometrycollection;
+< fid AsText(GeometryN(g, 2))
+< 120 LINESTRING(0 0,10 10)
+< 121 LINESTRING(3 6,7 9)
+< 122 NULL
+< 123 NULL
+< SELECT fid, AsText(GeometryN(g, 1)) from gis_geometrycollection;
+< fid AsText(GeometryN(g, 1))
+< 120 POINT(0 0)
+< 121 POINT(44 6)
+< 122 NULL
+< 123 NULL
+< SELECT g1.fid as first, g2.fid as second,
+< Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o,
+< Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t,
+< Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r
+< FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+< first second w c o e d t i r
+< 120 120 1 1 0 1 0 1 1 0
+< 120 121 0 0 1 0 0 0 1 0
+< 120 122 0 1 NULL 0 NULL 0 NULL 0
+< 120 123 0 1 NULL 0 NULL 0 NULL 0
+< 121 120 0 0 1 0 0 0 1 0
+< 121 121 1 1 0 1 0 1 1 0
+< 121 122 0 1 NULL 0 NULL 0 NULL 0
+< 121 123 0 1 NULL 0 NULL 0 NULL 0
+< 122 120 1 0 NULL 0 NULL 0 NULL 0
+< 122 121 1 0 NULL 0 NULL 0 NULL 0
+< 122 122 1 1 NULL 1 NULL 0 NULL 0
+< 122 123 1 1 NULL 1 NULL 0 NULL 0
+< 123 120 1 0 NULL 0 NULL 0 NULL 0
+< 123 121 1 0 NULL 0 NULL 0 NULL 0
+< 123 122 1 1 NULL 1 NULL 0 NULL 0
+< 123 123 1 1 NULL 1 NULL 0 NULL 0
+< DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+< USE gis_ogs;
+< # Lakes
+< INSERT INTO lakes VALUES (
+< 101, 'BLUE LAKE',
+< PolyFromText(
+< 'POLYGON(
+< (52 18,66 23,73 9,48 6,52 18),
+< (59 18,67 18,67 13,59 13,59 18)
+< )',
+< 101));
+< # Road Segments
+< INSERT INTO road_segments VALUES(102, 'Route 5', NULL, 2,
+< LineFromText(
+< 'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
+< INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
+< LineFromText(
+< 'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
+< INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
+< LineFromText(
+< 'LINESTRING( 70 38, 72 48 )' ,101));
+< INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
+< LineFromText(
+< 'LINESTRING( 70 38, 84 42 )' ,101));
+< INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
+< 1,
+< LineFromText(
+< 'LINESTRING( 28 26, 28 0 )',101));
+< # DividedRoutes
+< INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
+< MLineFromText(
+< 'MULTILINESTRING((10 48,10 21,10 0),
+< (16 0,16 23,16 48))', 101));
+< # Forests
+< INSERT INTO forests VALUES(109, 'Green Forest',
+< MPolyFromText(
+< 'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),
+< (52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))',
+< 101));
+< # Bridges
+< INSERT INTO bridges VALUES(110, 'Cam Bridge', PointFromText(
+< 'POINT( 44 31 )', 101));
+< # Streams
+< INSERT INTO streams VALUES(111, 'Cam Stream',
+< LineFromText(
+< 'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
+< INSERT INTO streams VALUES(112, NULL,
+< LineFromText(
+< 'LINESTRING( 76 0, 78 4, 73 9 )', 101));
+< # Buildings
+< INSERT INTO buildings VALUES(113, '123 Main Street',
+< PointFromText(
+< 'POINT( 52 30 )', 101),
+< PolyFromText(
+< 'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
+< INSERT INTO buildings VALUES(114, '215 Main Street',
+< PointFromText(
+< 'POINT( 64 33 )', 101),
+< PolyFromText(
+< 'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
+< # Ponds
+< INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
+< MPolyFromText(
+< 'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ),
+< ( ( 26 44, 26 40, 28 42, 26 44) ) )', 101));
+< # Named Places
+< INSERT INTO named_places VALUES(117, 'Ashton',
+< PolyFromText(
+< 'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
+< INSERT INTO named_places VALUES(118, 'Goose Island',
+< PolyFromText(
+< 'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
+< # Map Neatlines
+< INSERT INTO map_neatlines VALUES(115,
+< PolyFromText(
+< 'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101));
+< SELECT Dimension(shore)
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< Dimension(shore)
+< 2
+< SELECT GeometryType(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< GeometryType(centerlines)
+< MULTILINESTRING
+< SELECT AsText(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(boundary)
+< POLYGON((67 13,67 18,59 18,59 13,67 13))
+< SELECT AsText(PolyFromWKB(AsBinary(boundary),101))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(PolyFromWKB(AsBinary(boundary),101))
+< POLYGON((67 13,67 18,59 18,59 13,67 13))
+< SELECT SRID(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< SRID(boundary)
+< 101
+< SELECT IsEmpty(centerline)
+< FROM road_segments
+< WHERE name = 'Route 5'
+< AND aliases = 'Main Street';
+< IsEmpty(centerline)
+< 0
+< SELECT AsText(Envelope(boundary))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(Envelope(boundary))
+< POLYGON((59 13,67 13,67 18,59 18,59 13))
+< SELECT X(position)
+< FROM bridges
+< WHERE name = 'Cam Bridge';
+< X(position)
+< 44
+< SELECT Y(position)
+< FROM bridges
+< WHERE name = 'Cam Bridge';
+< Y(position)
+< 31
+< SELECT AsText(StartPoint(centerline))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(StartPoint(centerline))
+< POINT(0 18)
+< SELECT AsText(EndPoint(centerline))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(EndPoint(centerline))
+< POINT(44 31)
+< SELECT GLength(centerline)
+< FROM road_segments
+< WHERE fid = 106;
+< GLength(centerline)
+< 26
+< SELECT NumPoints(centerline)
+< FROM road_segments
+< WHERE fid = 102;
+< NumPoints(centerline)
+< 5
+< SELECT AsText(PointN(centerline, 1))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(PointN(centerline, 1))
+< POINT(0 18)
+< SELECT AsText(Centroid(boundary))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(Centroid(boundary))
+< POINT(63 15.5)
+< SELECT Area(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< Area(boundary)
+< 40
+< SELECT AsText(ExteriorRing(shore))
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< AsText(ExteriorRing(shore))
+< LINESTRING(52 18,66 23,73 9,48 6,52 18)
+< SELECT NumInteriorRings(shore)
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< NumInteriorRings(shore)
+< 1
+< SELECT AsText(InteriorRingN(shore, 1))
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< AsText(InteriorRingN(shore, 1))
+< LINESTRING(59 18,67 18,67 13,59 13,59 18)
+< SELECT NumGeometries(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< NumGeometries(centerlines)
+< 2
+< SELECT AsText(GeometryN(centerlines, 2))
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< AsText(GeometryN(centerlines, 2))
+< LINESTRING(16 0,16 23,16 48)
+< SELECT IsClosed(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< IsClosed(centerlines)
+< 0
+< SELECT GLength(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< GLength(centerlines)
+< 96
+< SELECT AsText(Centroid(shores))
+< FROM ponds
+< WHERE fid = 120;
+< AsText(Centroid(shores))
+< POINT(25 42)
+< SELECT Area(shores)
+< FROM ponds
+< WHERE fid = 120;
+< Area(shores)
+< 8
+< SELECT ST_Equals(boundary,
+< PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< ST_Equals(boundary,
+< PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+< 1
+< SELECT ST_Disjoint(centerlines, boundary)
+< FROM divided_routes, named_places
+< WHERE divided_routes.name = 'Route 75'
+< AND named_places.name = 'Ashton';
+< ST_Disjoint(centerlines, boundary)
+< 1
+< SELECT ST_Touches(centerline, shore)
+< FROM streams, lakes
+< WHERE streams.name = 'Cam Stream'
+< AND lakes.name = 'Blue Lake';
+< ST_Touches(centerline, shore)
+< 1
+< SELECT Crosses(road_segments.centerline, divided_routes.centerlines)
+< FROM road_segments, divided_routes
+< WHERE road_segments.fid = 102
+< AND divided_routes.name = 'Route 75';
+< Crosses(road_segments.centerline, divided_routes.centerlines)
+< 1
+< SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+< FROM road_segments, divided_routes
+< WHERE road_segments.fid = 102
+< AND divided_routes.name = 'Route 75';
+< ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+< 1
+< SELECT ST_Contains(forests.boundary, named_places.boundary)
+< FROM forests, named_places
+< WHERE forests.name = 'Green Forest'
+< AND named_places.name = 'Ashton';
+< ST_Contains(forests.boundary, named_places.boundary)
+< 0
+< SELECT ST_Distance(position, boundary)
+< FROM bridges, named_places
+< WHERE bridges.name = 'Cam Bridge'
+< AND named_places.name = 'Ashton';
+< ST_Distance(position, boundary)
+< 12
+< SELECT AsText(ST_Difference(named_places.boundary, forests.boundary))
+< FROM named_places, forests
+< WHERE named_places.name = 'Ashton'
+< AND forests.name = 'Green Forest';
+< AsText(ST_Difference(named_places.boundary, forests.boundary))
+< POLYGON((56 34,62 48,84 48,84 42,56 34))
+< SELECT AsText(ST_Union(shore, boundary))
+< FROM lakes, named_places
+< WHERE lakes.name = 'Blue Lake'
+< AND named_places.name = 'Goose Island';
+< AsText(ST_Union(shore, boundary))
+< POLYGON((48 6,52 18,66 23,73 9,48 6))
+< SELECT AsText(ST_SymDifference(shore, boundary))
+< FROM lakes, named_places
+< WHERE lakes.name = 'Blue Lake'
+< AND named_places.name = 'Ashton';
+< AsText(ST_SymDifference(shore, boundary))
+< MULTIPOLYGON(((48 6,52 18,66 23,73 9,48 6),(59 13,59 18,67 18,67 13,59 13)),((56 30,56 34,62 48,84 48,84 30,56 30)))
+< SELECT count(*)
+< FROM buildings, bridges
+< WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
+< count(*)
+< 1
+---
+> ERROR 42000: The storage engine for the table doesn't support GEOMETRY
+> # ERROR: Statement ended with errno 1178, errname ER_CHECK_NOT_IMPLEMENTED (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE gis_point (fid INT(11) /*!*/ /*Custom column options*/, g POINT, /*!INDEX*/ /*Custom index*/ g(g(128))) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.gis_point) INSERT_METHOD=LAST ]
+> # The statement|command finished with ER_CHECK_NOT_IMPLEMENTED.
+> # Geometry types or indexes on them or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
+705,1398c21,30
+< CREATE TABLE gis_line (fid <INT_COLUMN>, g LINESTRING NOT NULL, SPATIAL INDEX(g)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_polygon (fid <INT_COLUMN>, g POLYGON NOT NULL, SPATIAL INDEX(g)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_point (fid <INT_COLUMN>, g MULTIPOINT NOT NULL, SPATIAL INDEX(g)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_line (fid <INT_COLUMN>, g MULTILINESTRING NOT NULL, SPATIAL INDEX(g)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_multi_polygon (fid <INT_COLUMN>, g MULTIPOLYGON NOT NULL, SPATIAL INDEX(g)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_geometrycollection (fid <INT_COLUMN>, g GEOMETRYCOLLECTION NOT NULL, SPATIAL INDEX(g)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE gis_geometry (fid <INT_COLUMN>, g GEOMETRY NOT NULL) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< USE gis_ogs;
+< CREATE TABLE lakes (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< shore POLYGON NOT NULL, SPATIAL INDEX s(shore)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE road_segments (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< aliases CHAR(64) <CUSTOM_COL_OPTIONS>,
+< num_lanes INT <CUSTOM_COL_OPTIONS>,
+< centerline LINESTRING NOT NULL, SPATIAL INDEX c(centerline)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE divided_routes (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< num_lanes INT <CUSTOM_COL_OPTIONS>,
+< centerlines MULTILINESTRING NOT NULL, SPATIAL INDEX c(centerlines)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE forests (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< boundary MULTIPOLYGON NOT NULL, SPATIAL INDEX b(boundary)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE bridges (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< position POINT NOT NULL, SPATIAL INDEX p(position)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE streams (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< centerline LINESTRING NOT NULL, SPATIAL INDEX c(centerline)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE buildings (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< position POINT NOT NULL,
+< footprint POLYGON NOT NULL, SPATIAL INDEX p(position), SPATIAL INDEX f(footprint)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE ponds (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< type CHAR(64) <CUSTOM_COL_OPTIONS>,
+< shores MULTIPOLYGON NOT NULL, SPATIAL INDEX s(shores)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE named_places (fid INT <CUSTOM_COL_OPTIONS>,
+< name CHAR(64) <CUSTOM_COL_OPTIONS>,
+< boundary POLYGON NOT NULL, SPATIAL INDEX b(boundary)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< CREATE TABLE map_neatlines (fid INT <CUSTOM_COL_OPTIONS>,
+< neatline POLYGON NOT NULL, SPATIAL INDEX n(neatline)) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< USE test;
+< SHOW FIELDS FROM gis_point;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g point NO MUL NULL
+< SHOW FIELDS FROM gis_line;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g linestring NO MUL NULL
+< SHOW FIELDS FROM gis_polygon;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g polygon NO MUL NULL
+< SHOW FIELDS FROM gis_multi_point;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multipoint NO MUL NULL
+< SHOW FIELDS FROM gis_multi_line;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multilinestring NO MUL NULL
+< SHOW FIELDS FROM gis_multi_polygon;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g multipolygon NO MUL NULL
+< SHOW FIELDS FROM gis_geometrycollection;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g geometrycollection NO MUL NULL
+< SHOW FIELDS FROM gis_geometry;
+< Field Type Null Key Default Extra
+< fid int(11) YES NULL
+< g geometry NO NULL
+< INSERT INTO gis_point VALUES
+< (101, PointFromText('POINT(10 10)')),
+< (102, PointFromText('POINT(20 10)')),
+< (103, PointFromText('POINT(20 20)')),
+< (104, PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
+< INSERT INTO gis_line VALUES
+< (105, LineFromText('LINESTRING(0 0,0 10,10 0)')),
+< (106, LineStringFromText('LINESTRING(10 10,20 10,20 20,10 20,10 10)')),
+< (107, LineStringFromWKB(AsWKB(LineString(Point(10, 10), Point(40, 10)))));
+< INSERT INTO gis_polygon VALUES
+< (108, PolygonFromText('POLYGON((10 10,20 10,20 20,10 20,10 10))')),
+< (109, PolyFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')),
+< (110, PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))))));
+< INSERT INTO gis_multi_point VALUES
+< (111, MultiPointFromText('MULTIPOINT(0 0,10 10,10 20,20 20)')),
+< (112, MPointFromText('MULTIPOINT(1 1,11 11,11 21,21 21)')),
+< (113, MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4, 10)))));
+< INSERT INTO gis_multi_line VALUES
+< (114, MultiLineStringFromText('MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))')),
+< (115, MLineFromText('MULTILINESTRING((10 48,10 21,10 0))')),
+< (116, MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2), Point(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21, 7))))));
+< INSERT INTO gis_multi_polygon VALUES
+< (117, MultiPolygonFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+< (118, MPolyFromText('MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))')),
+< (119, MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
+< INSERT INTO gis_geometrycollection VALUES
+< (120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
+< (121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))),
+< (122, GeomFromText('GeometryCollection()')),
+< (123, GeomFromText('GeometryCollection EMPTY'));
+< INSERT into gis_geometry SELECT * FROM gis_point;
+< INSERT into gis_geometry SELECT * FROM gis_line;
+< INSERT into gis_geometry SELECT * FROM gis_polygon;
+< INSERT into gis_geometry SELECT * FROM gis_multi_point;
+< INSERT into gis_geometry SELECT * FROM gis_multi_line;
+< INSERT into gis_geometry SELECT * FROM gis_multi_polygon;
+< INSERT into gis_geometry SELECT * FROM gis_geometrycollection;
+< SELECT fid, AsText(g) FROM gis_point;
+< fid AsText(g)
+< 101 POINT(10 10)
+< 102 POINT(20 10)
+< 103 POINT(20 20)
+< 104 POINT(10 20)
+< SELECT fid, AsText(g) FROM gis_line;
+< fid AsText(g)
+< 105 LINESTRING(0 0,0 10,10 0)
+< 106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 107 LINESTRING(10 10,40 10)
+< SELECT fid, AsText(g) FROM gis_polygon;
+< fid AsText(g)
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+< 110 POLYGON((0 0,30 0,30 30,0 0))
+< SELECT fid, AsText(g) FROM gis_multi_point;
+< fid AsText(g)
+< 111 MULTIPOINT(0 0,10 10,10 20,20 20)
+< 112 MULTIPOINT(1 1,11 11,11 21,21 21)
+< 113 MULTIPOINT(3 6,4 10)
+< SELECT fid, AsText(g) FROM gis_multi_line;
+< fid AsText(g)
+< 114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+< 115 MULTILINESTRING((10 48,10 21,10 0))
+< 116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+< SELECT fid, AsText(g) FROM gis_multi_polygon;
+< fid AsText(g)
+< 117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+< SELECT fid, AsText(g) FROM gis_geometrycollection;
+< fid AsText(g)
+< 120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+< 121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, AsText(g) FROM gis_geometry;
+< fid AsText(g)
+< 101 POINT(10 10)
+< 102 POINT(20 10)
+< 103 POINT(20 20)
+< 104 POINT(10 20)
+< 105 LINESTRING(0 0,0 10,10 0)
+< 106 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 107 LINESTRING(10 10,40 10)
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0),(10 10,20 10,20 20,10 20,10 10))
+< 110 POLYGON((0 0,30 0,30 30,0 0))
+< 111 MULTIPOINT(0 0,10 10,10 20,20 20)
+< 112 MULTIPOINT(1 1,11 11,11 21,21 21)
+< 113 MULTIPOINT(3 6,4 10)
+< 114 MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48))
+< 115 MULTILINESTRING((10 48,10 21,10 0))
+< 116 MULTILINESTRING((1 2,3 5),(2 5,5 8,21 7))
+< 117 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 118 MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))
+< 119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
+< 120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
+< 121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, Dimension(g) FROM gis_geometry;
+< fid Dimension(g)
+< 101 0
+< 102 0
+< 103 0
+< 104 0
+< 105 1
+< 106 1
+< 107 1
+< 108 2
+< 109 2
+< 110 2
+< 111 0
+< 112 0
+< 113 0
+< 114 1
+< 115 1
+< 116 1
+< 117 2
+< 118 2
+< 119 2
+< 120 1
+< 121 1
+< 122 0
+< 123 0
+< SELECT fid, GeometryType(g) FROM gis_geometry;
+< fid GeometryType(g)
+< 101 POINT
+< 102 POINT
+< 103 POINT
+< 104 POINT
+< 105 LINESTRING
+< 106 LINESTRING
+< 107 LINESTRING
+< 108 POLYGON
+< 109 POLYGON
+< 110 POLYGON
+< 111 MULTIPOINT
+< 112 MULTIPOINT
+< 113 MULTIPOINT
+< 114 MULTILINESTRING
+< 115 MULTILINESTRING
+< 116 MULTILINESTRING
+< 117 MULTIPOLYGON
+< 118 MULTIPOLYGON
+< 119 MULTIPOLYGON
+< 120 GEOMETRYCOLLECTION
+< 121 GEOMETRYCOLLECTION
+< 122 GEOMETRYCOLLECTION
+< 123 GEOMETRYCOLLECTION
+< SELECT fid, IsEmpty(g) FROM gis_geometry;
+< fid IsEmpty(g)
+< 101 0
+< 102 0
+< 103 0
+< 104 0
+< 105 0
+< 106 0
+< 107 0
+< 108 0
+< 109 0
+< 110 0
+< 111 0
+< 112 0
+< 113 0
+< 114 0
+< 115 0
+< 116 0
+< 117 0
+< 118 0
+< 119 0
+< 120 0
+< 121 0
+< 122 0
+< 123 0
+< SELECT fid, AsText(Envelope(g)) FROM gis_geometry;
+< fid AsText(Envelope(g))
+< 101 POLYGON((10 10,10 10,10 10,10 10,10 10))
+< 102 POLYGON((20 10,20 10,20 10,20 10,20 10))
+< 103 POLYGON((20 20,20 20,20 20,20 20,20 20))
+< 104 POLYGON((10 20,10 20,10 20,10 20,10 20))
+< 105 POLYGON((0 0,10 0,10 10,0 10,0 0))
+< 106 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 107 POLYGON((10 10,40 10,40 10,10 10,10 10))
+< 108 POLYGON((10 10,20 10,20 20,10 20,10 10))
+< 109 POLYGON((0 0,50 0,50 50,0 50,0 0))
+< 110 POLYGON((0 0,30 0,30 30,0 30,0 0))
+< 111 POLYGON((0 0,20 0,20 20,0 20,0 0))
+< 112 POLYGON((1 1,21 1,21 21,1 21,1 1))
+< 113 POLYGON((3 6,4 6,4 10,3 10,3 6))
+< 114 POLYGON((10 0,16 0,16 48,10 48,10 0))
+< 115 POLYGON((10 0,10 0,10 48,10 48,10 0))
+< 116 POLYGON((1 2,21 2,21 8,1 8,1 2))
+< 117 POLYGON((28 0,84 0,84 42,28 42,28 0))
+< 118 POLYGON((28 0,84 0,84 42,28 42,28 0))
+< 119 POLYGON((0 0,3 0,3 3,0 3,0 0))
+< 120 POLYGON((0 0,10 0,10 10,0 10,0 0))
+< 121 POLYGON((3 6,44 6,44 9,3 9,3 6))
+< 122 GEOMETRYCOLLECTION EMPTY
+< 123 GEOMETRYCOLLECTION EMPTY
+< SELECT fid, X(g) FROM gis_point;
+< fid X(g)
+< 101 10
+< 102 20
+< 103 20
+< 104 10
+< SELECT fid, Y(g) FROM gis_point;
+< fid Y(g)
+< 101 10
+< 102 10
+< 103 20
+< 104 20
+< SELECT fid, AsText(StartPoint(g)) FROM gis_line;
+< fid AsText(StartPoint(g))
+< 105 POINT(0 0)
+< 106 POINT(10 10)
+< 107 POINT(10 10)
+< SELECT fid, AsText(EndPoint(g)) FROM gis_line;
+< fid AsText(EndPoint(g))
+< 105 POINT(10 0)
+< 106 POINT(10 10)
+< 107 POINT(40 10)
+< SELECT fid, GLength(g) FROM gis_line;
+< fid GLength(g)
+< 105 24.14213562373095
+< 106 40
+< 107 30
+< SELECT fid, NumPoints(g) FROM gis_line;
+< fid NumPoints(g)
+< 105 3
+< 106 5
+< 107 2
+< SELECT fid, AsText(PointN(g, 2)) FROM gis_line;
+< fid AsText(PointN(g, 2))
+< 105 POINT(0 10)
+< 106 POINT(20 10)
+< 107 POINT(40 10)
+< SELECT fid, IsClosed(g) FROM gis_line;
+< fid IsClosed(g)
+< 105 0
+< 106 1
+< 107 0
+< SELECT fid, AsText(Centroid(g)) FROM gis_polygon;
+< fid AsText(Centroid(g))
+< 108 POINT(15 15)
+< 109 POINT(25.416666666666668 25.416666666666668)
+< 110 POINT(20 10)
+< SELECT fid, Area(g) FROM gis_polygon;
+< fid Area(g)
+< 108 100
+< 109 2400
+< 110 450
+< SELECT fid, AsText(ExteriorRing(g)) FROM gis_polygon;
+< fid AsText(ExteriorRing(g))
+< 108 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 109 LINESTRING(0 0,50 0,50 50,0 50,0 0)
+< 110 LINESTRING(0 0,30 0,30 30,0 0)
+< SELECT fid, NumInteriorRings(g) FROM gis_polygon;
+< fid NumInteriorRings(g)
+< 108 0
+< 109 1
+< 110 0
+< SELECT fid, AsText(InteriorRingN(g, 1)) FROM gis_polygon;
+< fid AsText(InteriorRingN(g, 1))
+< 108 NULL
+< 109 LINESTRING(10 10,20 10,20 20,10 20,10 10)
+< 110 NULL
+< SELECT fid, IsClosed(g) FROM gis_multi_line;
+< fid IsClosed(g)
+< 114 0
+< 115 0
+< 116 0
+< SELECT fid, AsText(Centroid(g)) FROM gis_multi_polygon;
+< fid AsText(Centroid(g))
+< 117 POINT(55.58852775304245 17.426536064113982)
+< 118 POINT(55.58852775304245 17.426536064113982)
+< 119 POINT(2 2)
+< SELECT fid, Area(g) FROM gis_multi_polygon;
+< fid Area(g)
+< 117 1684.5
+< 118 1684.5
+< 119 4.5
+< SELECT fid, NumGeometries(g) from gis_multi_point;
+< fid NumGeometries(g)
+< 111 4
+< 112 4
+< 113 2
+< SELECT fid, NumGeometries(g) from gis_multi_line;
+< fid NumGeometries(g)
+< 114 2
+< 115 1
+< 116 2
+< SELECT fid, NumGeometries(g) from gis_multi_polygon;
+< fid NumGeometries(g)
+< 117 2
+< 118 2
+< 119 1
+< SELECT fid, NumGeometries(g) from gis_geometrycollection;
+< fid NumGeometries(g)
+< 120 2
+< 121 2
+< 122 0
+< 123 0
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_point;
+< fid AsText(GeometryN(g, 2))
+< 111 POINT(10 10)
+< 112 POINT(11 11)
+< 113 POINT(4 10)
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_line;
+< fid AsText(GeometryN(g, 2))
+< 114 LINESTRING(16 0,16 23,16 48)
+< 115 NULL
+< 116 LINESTRING(2 5,5 8,21 7)
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_polygon;
+< fid AsText(GeometryN(g, 2))
+< 117 POLYGON((59 18,67 18,67 13,59 13,59 18))
+< 118 POLYGON((59 18,67 18,67 13,59 13,59 18))
+< 119 NULL
+< SELECT fid, AsText(GeometryN(g, 2)) from gis_geometrycollection;
+< fid AsText(GeometryN(g, 2))
+< 120 LINESTRING(0 0,10 10)
+< 121 LINESTRING(3 6,7 9)
+< 122 NULL
+< 123 NULL
+< SELECT fid, AsText(GeometryN(g, 1)) from gis_geometrycollection;
+< fid AsText(GeometryN(g, 1))
+< 120 POINT(0 0)
+< 121 POINT(44 6)
+< 122 NULL
+< 123 NULL
+< SELECT g1.fid as first, g2.fid as second,
+< Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o,
+< Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t,
+< Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r
+< FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
+< first second w c o e d t i r
+< 120 120 1 1 0 1 0 1 1 0
+< 120 121 0 0 1 0 0 0 1 0
+< 120 122 0 1 NULL 0 NULL 0 NULL 0
+< 120 123 0 1 NULL 0 NULL 0 NULL 0
+< 121 120 0 0 1 0 0 0 1 0
+< 121 121 1 1 0 1 0 1 1 0
+< 121 122 0 1 NULL 0 NULL 0 NULL 0
+< 121 123 0 1 NULL 0 NULL 0 NULL 0
+< 122 120 1 0 NULL 0 NULL 0 NULL 0
+< 122 121 1 0 NULL 0 NULL 0 NULL 0
+< 122 122 1 1 NULL 1 NULL 0 NULL 0
+< 122 123 1 1 NULL 1 NULL 0 NULL 0
+< 123 120 1 0 NULL 0 NULL 0 NULL 0
+< 123 121 1 0 NULL 0 NULL 0 NULL 0
+< 123 122 1 1 NULL 1 NULL 0 NULL 0
+< 123 123 1 1 NULL 1 NULL 0 NULL 0
+< DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
+< USE gis_ogs;
+< # Lakes
+< INSERT INTO lakes VALUES (
+< 101, 'BLUE LAKE',
+< PolyFromText(
+< 'POLYGON(
+< (52 18,66 23,73 9,48 6,52 18),
+< (59 18,67 18,67 13,59 13,59 18)
+< )',
+< 101));
+< # Road Segments
+< INSERT INTO road_segments VALUES(102, 'Route 5', NULL, 2,
+< LineFromText(
+< 'LINESTRING( 0 18, 10 21, 16 23, 28 26, 44 31 )' ,101));
+< INSERT INTO road_segments VALUES(103, 'Route 5', 'Main Street', 4,
+< LineFromText(
+< 'LINESTRING( 44 31, 56 34, 70 38 )' ,101));
+< INSERT INTO road_segments VALUES(104, 'Route 5', NULL, 2,
+< LineFromText(
+< 'LINESTRING( 70 38, 72 48 )' ,101));
+< INSERT INTO road_segments VALUES(105, 'Main Street', NULL, 4,
+< LineFromText(
+< 'LINESTRING( 70 38, 84 42 )' ,101));
+< INSERT INTO road_segments VALUES(106, 'Dirt Road by Green Forest', NULL,
+< 1,
+< LineFromText(
+< 'LINESTRING( 28 26, 28 0 )',101));
+< # DividedRoutes
+< INSERT INTO divided_routes VALUES(119, 'Route 75', 4,
+< MLineFromText(
+< 'MULTILINESTRING((10 48,10 21,10 0),
+< (16 0,16 23,16 48))', 101));
+< # Forests
+< INSERT INTO forests VALUES(109, 'Green Forest',
+< MPolyFromText(
+< 'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),
+< (52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18)))',
+< 101));
+< # Bridges
+< INSERT INTO bridges VALUES(110, 'Cam Bridge', PointFromText(
+< 'POINT( 44 31 )', 101));
+< # Streams
+< INSERT INTO streams VALUES(111, 'Cam Stream',
+< LineFromText(
+< 'LINESTRING( 38 48, 44 41, 41 36, 44 31, 52 18 )', 101));
+< INSERT INTO streams VALUES(112, NULL,
+< LineFromText(
+< 'LINESTRING( 76 0, 78 4, 73 9 )', 101));
+< # Buildings
+< INSERT INTO buildings VALUES(113, '123 Main Street',
+< PointFromText(
+< 'POINT( 52 30 )', 101),
+< PolyFromText(
+< 'POLYGON( ( 50 31, 54 31, 54 29, 50 29, 50 31) )', 101));
+< INSERT INTO buildings VALUES(114, '215 Main Street',
+< PointFromText(
+< 'POINT( 64 33 )', 101),
+< PolyFromText(
+< 'POLYGON( ( 66 34, 62 34, 62 32, 66 32, 66 34) )', 101));
+< # Ponds
+< INSERT INTO ponds VALUES(120, NULL, 'Stock Pond',
+< MPolyFromText(
+< 'MULTIPOLYGON( ( ( 24 44, 22 42, 24 40, 24 44) ),
+< ( ( 26 44, 26 40, 28 42, 26 44) ) )', 101));
+< # Named Places
+< INSERT INTO named_places VALUES(117, 'Ashton',
+< PolyFromText(
+< 'POLYGON( ( 62 48, 84 48, 84 30, 56 30, 56 34, 62 48) )', 101));
+< INSERT INTO named_places VALUES(118, 'Goose Island',
+< PolyFromText(
+< 'POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )', 101));
+< # Map Neatlines
+< INSERT INTO map_neatlines VALUES(115,
+< PolyFromText(
+< 'POLYGON( ( 0 0, 0 48, 84 48, 84 0, 0 0 ) )', 101));
+< SELECT Dimension(shore)
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< Dimension(shore)
+< 2
+< SELECT GeometryType(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< GeometryType(centerlines)
+< MULTILINESTRING
+< SELECT AsText(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(boundary)
+< POLYGON((67 13,67 18,59 18,59 13,67 13))
+< SELECT AsText(PolyFromWKB(AsBinary(boundary),101))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(PolyFromWKB(AsBinary(boundary),101))
+< POLYGON((67 13,67 18,59 18,59 13,67 13))
+< SELECT SRID(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< SRID(boundary)
+< 101
+< SELECT IsEmpty(centerline)
+< FROM road_segments
+< WHERE name = 'Route 5'
+< AND aliases = 'Main Street';
+< IsEmpty(centerline)
+< 0
+< SELECT AsText(Envelope(boundary))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(Envelope(boundary))
+< POLYGON((59 13,67 13,67 18,59 18,59 13))
+< SELECT X(position)
+< FROM bridges
+< WHERE name = 'Cam Bridge';
+< X(position)
+< 44
+< SELECT Y(position)
+< FROM bridges
+< WHERE name = 'Cam Bridge';
+< Y(position)
+< 31
+< SELECT AsText(StartPoint(centerline))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(StartPoint(centerline))
+< POINT(0 18)
+< SELECT AsText(EndPoint(centerline))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(EndPoint(centerline))
+< POINT(44 31)
+< SELECT GLength(centerline)
+< FROM road_segments
+< WHERE fid = 106;
+< GLength(centerline)
+< 26
+< SELECT NumPoints(centerline)
+< FROM road_segments
+< WHERE fid = 102;
+< NumPoints(centerline)
+< 5
+< SELECT AsText(PointN(centerline, 1))
+< FROM road_segments
+< WHERE fid = 102;
+< AsText(PointN(centerline, 1))
+< POINT(0 18)
+< SELECT AsText(Centroid(boundary))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< AsText(Centroid(boundary))
+< POINT(63 15.5)
+< SELECT Area(boundary)
+< FROM named_places
+< WHERE name = 'Goose Island';
+< Area(boundary)
+< 40
+< SELECT AsText(ExteriorRing(shore))
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< AsText(ExteriorRing(shore))
+< LINESTRING(52 18,66 23,73 9,48 6,52 18)
+< SELECT NumInteriorRings(shore)
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< NumInteriorRings(shore)
+< 1
+< SELECT AsText(InteriorRingN(shore, 1))
+< FROM lakes
+< WHERE name = 'Blue Lake';
+< AsText(InteriorRingN(shore, 1))
+< LINESTRING(59 18,67 18,67 13,59 13,59 18)
+< SELECT NumGeometries(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< NumGeometries(centerlines)
+< 2
+< SELECT AsText(GeometryN(centerlines, 2))
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< AsText(GeometryN(centerlines, 2))
+< LINESTRING(16 0,16 23,16 48)
+< SELECT IsClosed(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< IsClosed(centerlines)
+< 0
+< SELECT GLength(centerlines)
+< FROM divided_routes
+< WHERE name = 'Route 75';
+< GLength(centerlines)
+< 96
+< SELECT AsText(Centroid(shores))
+< FROM ponds
+< WHERE fid = 120;
+< AsText(Centroid(shores))
+< POINT(25 42)
+< SELECT Area(shores)
+< FROM ponds
+< WHERE fid = 120;
+< Area(shores)
+< 8
+< SELECT ST_Equals(boundary,
+< PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+< FROM named_places
+< WHERE name = 'Goose Island';
+< ST_Equals(boundary,
+< PolyFromText('POLYGON( ( 67 13, 67 18, 59 18, 59 13, 67 13) )',1))
+< 1
+< SELECT ST_Disjoint(centerlines, boundary)
+< FROM divided_routes, named_places
+< WHERE divided_routes.name = 'Route 75'
+< AND named_places.name = 'Ashton';
+< ST_Disjoint(centerlines, boundary)
+< 1
+< SELECT ST_Touches(centerline, shore)
+< FROM streams, lakes
+< WHERE streams.name = 'Cam Stream'
+< AND lakes.name = 'Blue Lake';
+< ST_Touches(centerline, shore)
+< 1
+< SELECT Crosses(road_segments.centerline, divided_routes.centerlines)
+< FROM road_segments, divided_routes
+< WHERE road_segments.fid = 102
+< AND divided_routes.name = 'Route 75';
+< Crosses(road_segments.centerline, divided_routes.centerlines)
+< 1
+< SELECT ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+< FROM road_segments, divided_routes
+< WHERE road_segments.fid = 102
+< AND divided_routes.name = 'Route 75';
+< ST_Intersects(road_segments.centerline, divided_routes.centerlines)
+< 1
+< SELECT ST_Contains(forests.boundary, named_places.boundary)
+< FROM forests, named_places
+< WHERE forests.name = 'Green Forest'
+< AND named_places.name = 'Ashton';
+< ST_Contains(forests.boundary, named_places.boundary)
+< 0
+< SELECT ST_Distance(position, boundary)
+< FROM bridges, named_places
+< WHERE bridges.name = 'Cam Bridge'
+< AND named_places.name = 'Ashton';
+< ST_Distance(position, boundary)
+< 12
+< SELECT AsText(ST_Difference(named_places.boundary, forests.boundary))
+< FROM named_places, forests
+< WHERE named_places.name = 'Ashton'
+< AND forests.name = 'Green Forest';
+< AsText(ST_Difference(named_places.boundary, forests.boundary))
+< POLYGON((56 34,62 48,84 48,84 42,56 34))
+< SELECT AsText(ST_Union(shore, boundary))
+< FROM lakes, named_places
+< WHERE lakes.name = 'Blue Lake'
+< AND named_places.name = 'Goose Island';
+< AsText(ST_Union(shore, boundary))
+< POLYGON((48 6,52 18,66 23,73 9,48 6))
+< SELECT AsText(ST_SymDifference(shore, boundary))
+< FROM lakes, named_places
+< WHERE lakes.name = 'Blue Lake'
+< AND named_places.name = 'Ashton';
+< AsText(ST_SymDifference(shore, boundary))
+< MULTIPOLYGON(((48 6,52 18,66 23,73 9,48 6),(59 13,59 18,67 18,67 13,59 13)),((56 30,56 34,62 48,84 48,84 30,56 30)))
+< SELECT count(*)
+< FROM buildings, bridges
+< WHERE ST_Contains(ST_Buffer(bridges.position, 15.0), buildings.footprint) = 1;
+< count(*)
+< 1
+---
+> ERROR 42000: The storage engine for the table doesn't support GEOMETRY
+> # ERROR: Statement ended with errno 1178, errname ER_CHECK_NOT_IMPLEMENTED (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE gis_point (fid INT(11) /*!*/ /*Custom column options*/, g POINT NOT NULL, SPATIAL INDEX(g)) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.gis_point) INSERT_METHOD=LAST ]
+> # The statement|command finished with ER_CHECK_NOT_IMPLEMENTED.
+> # Geometry types or spatial indexes or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------
diff --git a/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff b/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff
new file mode 100644
index 00000000000..20431a9c713
--- /dev/null
+++ b/storage/myisammrg/mysql-test/storage_engine/vcol.rdiff
@@ -0,0 +1,79 @@
+3,69c3,12
+< SHOW COLUMNS IN t1;
+< Field Type Null Key Default Extra
+< a int(11) # #
+< b int(11) # # VIRTUAL
+< INSERT INTO t1 (a) VALUES (1),(2);
+< INSERT INTO t1 (a,b) VALUES (3,3),(4,4);
+< Warnings:
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< SELECT * FROM t1;
+< a b
+< 1 2
+< 2 3
+< 3 4
+< 4 5
+< DROP TABLE t1;
+< CREATE TABLE t1 (a <INT_COLUMN>, b <INT_COLUMN> GENERATED ALWAYS AS (a+1) PERSISTENT) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< SHOW COLUMNS IN t1;
+< Field Type Null Key Default Extra
+< a int(11) # #
+< b int(11) # # PERSISTENT
+< INSERT INTO t1 (a) VALUES (1),(2);
+< INSERT INTO t1 (a,b) VALUES (3,3),(4,4);
+< Warnings:
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< SELECT * FROM t1;
+< a b
+< 1 2
+< 2 3
+< 3 4
+< 4 5
+< DROP TABLE t1;
+< CREATE TABLE t1 (a <INT_COLUMN>, b <INT_COLUMN> GENERATED ALWAYS AS (a+1) VIRTUAL) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< SHOW COLUMNS IN t1;
+< Field Type Null Key Default Extra
+< a int(11) # #
+< b int(11) # # VIRTUAL
+< INSERT INTO t1 (a) VALUES (1),(2);
+< INSERT INTO t1 (a,b) VALUES (3,3),(4,4);
+< Warnings:
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< SELECT * FROM t1;
+< a b
+< 1 2
+< 2 3
+< 3 4
+< 4 5
+< DROP TABLE t1;
+< CREATE TABLE t1 (a <INT_COLUMN>, b <INT_COLUMN> AS (a+1) PERSISTENT) ENGINE=<STORAGE_ENGINE> <CUSTOM_TABLE_OPTIONS>;
+< SHOW COLUMNS IN t1;
+< Field Type Null Key Default Extra
+< a int(11) # #
+< b int(11) # # PERSISTENT
+< INSERT INTO t1 (a) VALUES (1),(2);
+< INSERT INTO t1 (a,b) VALUES (3,3),(4,4);
+< Warnings:
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< Warning 1906 The value specified for computed column 'b' in table 't1' ignored
+< SELECT * FROM t1;
+< a b
+< 1 2
+< 2 3
+< 3 4
+< 4 5
+< DROP TABLE t1;
+---
+> ERROR HY000: MRG_MYISAM storage engine does not support computed columns
+> # ERROR: Statement ended with errno 1910, errname ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS (expected to succeed)
+> # ------------ UNEXPECTED RESULT ------------
+> # [ CREATE TABLE t1 (a INT(11) /*!*/ /*Custom column options*/, b INT(11) /*!*/ /*Custom column options*/ GENERATED ALWAYS AS (a+1)) ENGINE=MRG_MYISAM /*!*/ /*Custom table options*/ UNION(mrg.t1) INSERT_METHOD=LAST ]
+> # The statement|command finished with ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS.
+> # Virtual columns or the mix could be unsupported|malfunctioning, or the problem was caused by previous errors.
+> # You can change the engine code, or create an rdiff, or disable the test by adding it to disabled.def.
+> # Further in this test, the message might sometimes be suppressed; a part of the test might be skipped.
+> # Also, this problem may cause a chain effect (more errors of different kinds in the test).
+> # -------------------------------------------