summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2017-11-01 09:55:00 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2017-11-01 09:55:00 +0200
commit6692b5f74a91ddf0df165a63d2cc97535400d309 (patch)
treecf19b4918ed1ea70745e27e5e4c701e3d53e7f22
parentc3b641ee20f49c8850c4c02056c120dc17a5eeb6 (diff)
parent892cf2de13e1dc01ee47afc244deb86101002fc2 (diff)
downloadmariadb-git-6692b5f74a91ddf0df165a63d2cc97535400d309.tar.gz
Merge 10.1 into 10.2
-rw-r--r--mysql-test/suite/encryption/r/encryption_force.result4
-rw-r--r--mysql-test/suite/encryption/r/filekeys_encfile.result2
-rw-r--r--mysql-test/suite/encryption/r/filekeys_encfile_file.result2
-rw-r--r--mysql-test/suite/encryption/r/innodb-encryption-alter.result5
-rw-r--r--mysql-test/suite/encryption/r/innodb-spatial-index.result2
-rw-r--r--mysql-test/suite/encryption/t/encryption_force.test6
-rw-r--r--mysql-test/suite/encryption/t/filekeys_goodtest.inc4
-rw-r--r--mysql-test/suite/encryption/t/innodb-encryption-alter.test4
-rw-r--r--mysql-test/suite/encryption/t/innodb-spatial-index.test4
-rw-r--r--mysql-test/suite/innodb/r/innodb-page_compression_tables.result5
-rw-r--r--mysql-test/suite/innodb/r/innodb-table-online.result3
-rw-r--r--mysql-test/suite/innodb/t/innodb-page_compression_tables.test4
-rw-r--r--mysql-test/suite/innodb/t/innodb-table-online.test3
-rw-r--r--storage/innobase/handler/handler0alter.cc82
-rw-r--r--storage/xtradb/handler/handler0alter.cc88
-rw-r--r--storage/xtradb/trx/trx0trx.cc5
-rw-r--r--storage/xtradb/trx/trx0undo.cc14
17 files changed, 124 insertions, 113 deletions
diff --git a/mysql-test/suite/encryption/r/encryption_force.result b/mysql-test/suite/encryption/r/encryption_force.result
index 730a32a4b27..c71a9885455 100644
--- a/mysql-test/suite/encryption/r/encryption_force.result
+++ b/mysql-test/suite/encryption/r/encryption_force.result
@@ -34,11 +34,11 @@ t4 CREATE TABLE `t4` (
PARTITION BY HASH (`a`)
PARTITIONS 2
alter table t1 encrypted=no;
-ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
+ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTED'
alter table t2 encrypted=yes;
alter table t3 encrypted=default;
alter table t4 encrypted=no;
-ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
+ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTED'
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
diff --git a/mysql-test/suite/encryption/r/filekeys_encfile.result b/mysql-test/suite/encryption/r/filekeys_encfile.result
index add6f312fda..6d5baa1b7ff 100644
--- a/mysql-test/suite/encryption/r/filekeys_encfile.result
+++ b/mysql-test/suite/encryption/r/filekeys_encfile.result
@@ -14,7 +14,7 @@ t1 CREATE TABLE `t1` (
`b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 `encrypted`=yes `encryption_key_id`=2
alter table t1 encryption_key_id=3;
-ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
+ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID'
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
diff --git a/mysql-test/suite/encryption/r/filekeys_encfile_file.result b/mysql-test/suite/encryption/r/filekeys_encfile_file.result
index add6f312fda..6d5baa1b7ff 100644
--- a/mysql-test/suite/encryption/r/filekeys_encfile_file.result
+++ b/mysql-test/suite/encryption/r/filekeys_encfile_file.result
@@ -14,7 +14,7 @@ t1 CREATE TABLE `t1` (
`b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 `encrypted`=yes `encryption_key_id`=2
alter table t1 encryption_key_id=3;
-ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
+ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID'
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
diff --git a/mysql-test/suite/encryption/r/innodb-encryption-alter.result b/mysql-test/suite/encryption/r/innodb-encryption-alter.result
index 06e4172bbae..fcc87493976 100644
--- a/mysql-test/suite/encryption/r/innodb-encryption-alter.result
+++ b/mysql-test/suite/encryption/r/innodb-encryption-alter.result
@@ -41,11 +41,10 @@ CREATE TABLE t2 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNOD
Warnings:
Warning 140 InnoDB: Ignored ENCRYPTION_KEY_ID 1 when encryption is disabled
ALTER TABLE t1 ENCRYPTION_KEY_ID=99;
-ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
+ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID'
SHOW WARNINGS;
Level Code Message
Warning 140 InnoDB: ENCRYPTION_KEY_ID 99 not available
-Error 1005 Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
-Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB
+Error 1478 Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID'
set innodb_default_encryption_key_id = 1;
drop table t1,t2;
diff --git a/mysql-test/suite/encryption/r/innodb-spatial-index.result b/mysql-test/suite/encryption/r/innodb-spatial-index.result
index c2a41ac4c2e..d8f76988f9e 100644
--- a/mysql-test/suite/encryption/r/innodb-spatial-index.result
+++ b/mysql-test/suite/encryption/r/innodb-spatial-index.result
@@ -5,7 +5,7 @@ ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options")
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT,
c VARCHAR(256), coordinate POINT NOT NULL, SPATIAL index(coordinate)) ENGINE=INNODB;
ALTER TABLE t1 ENCRYPTED=YES;
-ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
+ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTED'
DROP TABLE t1;
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT,
c VARCHAR(256), coordinate POINT NOT NULL) ENCRYPTED=YES ENGINE=INNODB;
diff --git a/mysql-test/suite/encryption/t/encryption_force.test b/mysql-test/suite/encryption/t/encryption_force.test
index 3e09dd91839..3c6f039184b 100644
--- a/mysql-test/suite/encryption/t/encryption_force.test
+++ b/mysql-test/suite/encryption/t/encryption_force.test
@@ -22,13 +22,11 @@ show create table t2;
show create table t3;
show create table t4;
---replace_regex /#sql-[0-9a-f_]*/#sql-temporary/
---error ER_CANT_CREATE_TABLE
+--error ER_ILLEGAL_HA_CREATE_OPTION
alter table t1 encrypted=no;
alter table t2 encrypted=yes;
alter table t3 encrypted=default;
---replace_regex /#sql-[0-9a-f_]*/#sql-temporary/
---error ER_CANT_CREATE_TABLE
+--error ER_ILLEGAL_HA_CREATE_OPTION
alter table t4 encrypted=no;
show create table t1;
diff --git a/mysql-test/suite/encryption/t/filekeys_goodtest.inc b/mysql-test/suite/encryption/t/filekeys_goodtest.inc
index 12a79c13d2a..252060796fe 100644
--- a/mysql-test/suite/encryption/t/filekeys_goodtest.inc
+++ b/mysql-test/suite/encryption/t/filekeys_goodtest.inc
@@ -7,8 +7,7 @@ insert t1 values (12345, repeat('1234567890', 20));
alter table t1 encryption_key_id=2;
show create table t1;
---replace_regex /#sql-[0-9a-f_]*/#sql-temporary/
---error ER_CANT_CREATE_TABLE
+--error ER_ILLEGAL_HA_CREATE_OPTION
alter table t1 encryption_key_id=3;
show create table t1;
alter table t1 encryption_key_id=33;
@@ -17,4 +16,3 @@ alter table t1 encryption_key_id=4;
show create table t1;
drop table t1;
-
diff --git a/mysql-test/suite/encryption/t/innodb-encryption-alter.test b/mysql-test/suite/encryption/t/innodb-encryption-alter.test
index cb7d5a47975..af1c749d8a9 100644
--- a/mysql-test/suite/encryption/t/innodb-encryption-alter.test
+++ b/mysql-test/suite/encryption/t/innodb-encryption-alter.test
@@ -27,10 +27,8 @@ DROP TABLE t1;
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB;
SHOW CREATE TABLE t1;
CREATE TABLE t2 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO ENCRYPTION_KEY_ID=1;
---replace_regex /#sql-[0-9a-f_]*/#sql-temporary/
---error 1005
+--error ER_ILLEGAL_HA_CREATE_OPTION
ALTER TABLE t1 ENCRYPTION_KEY_ID=99;
---replace_regex /#sql-[0-9a-f_]*/#sql-temporary/
SHOW WARNINGS;
set innodb_default_encryption_key_id = 1;
diff --git a/mysql-test/suite/encryption/t/innodb-spatial-index.test b/mysql-test/suite/encryption/t/innodb-spatial-index.test
index 6b6191c69cb..8eb6a803765 100644
--- a/mysql-test/suite/encryption/t/innodb-spatial-index.test
+++ b/mysql-test/suite/encryption/t/innodb-spatial-index.test
@@ -20,10 +20,8 @@ ENCRYPTED=YES;
#
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT,
c VARCHAR(256), coordinate POINT NOT NULL, SPATIAL index(coordinate)) ENGINE=INNODB;
---replace_regex /#sql-[0-9a-f_]*`/#sql-temporary`/
---error ER_CANT_CREATE_TABLE
+--error ER_ILLEGAL_HA_CREATE_OPTION
ALTER TABLE t1 ENCRYPTED=YES;
---replace_regex /#sql-[0-9a-f_]*`/#sql-temporary`/
DROP TABLE t1;
#
diff --git a/mysql-test/suite/innodb/r/innodb-page_compression_tables.result b/mysql-test/suite/innodb/r/innodb-page_compression_tables.result
index 94420e5397d..33b36428040 100644
--- a/mysql-test/suite/innodb/r/innodb-page_compression_tables.result
+++ b/mysql-test/suite/innodb/r/innodb-page_compression_tables.result
@@ -36,12 +36,11 @@ innodb_redundant CREATE TABLE `innodb_redundant` (
`b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT
alter table innodb_redundant page_compressed=1;
-ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
+ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'PAGE_COMPRESSED'
show warnings;
Level Code Message
Warning 140 InnoDB: PAGE_COMPRESSED table can't have ROW_TYPE=REDUNDANT
-Error 1005 Can't create table `test`.`#sql-temporary` (errno: 140 "Wrong create options")
-Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB
+Error 1478 Table storage engine 'InnoDB' does not support the create option 'PAGE_COMPRESSED'
show create table innodb_redundant;
Table Create Table
innodb_redundant CREATE TABLE `innodb_redundant` (
diff --git a/mysql-test/suite/innodb/r/innodb-table-online.result b/mysql-test/suite/innodb/r/innodb-table-online.result
index d6a0d4785f5..09ec3bbc252 100644
--- a/mysql-test/suite/innodb/r/innodb-table-online.result
+++ b/mysql-test/suite/innodb/r/innodb-table-online.result
@@ -235,7 +235,8 @@ t1 CREATE TABLE `t1` (
ALTER TABLE t1 ROW_FORMAT=REDUNDANT;
SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt2 WAIT_FOR dml2_done';
SET lock_wait_timeout = 10;
-ALTER TABLE t1 ROW_FORMAT=COMPACT, ALGORITHM = INPLACE;
+ALTER TABLE t1 ROW_FORMAT=COMPACT
+PAGE_COMPRESSED = YES PAGE_COMPRESSION_LEVEL = 1, ALGORITHM = INPLACE;
# session default
connection default;
INSERT INTO t1 SELECT 80 + c1, c2, c3 FROM t1;
diff --git a/mysql-test/suite/innodb/t/innodb-page_compression_tables.test b/mysql-test/suite/innodb/t/innodb-page_compression_tables.test
index be8300b39aa..bf83ebf5e82 100644
--- a/mysql-test/suite/innodb/t/innodb-page_compression_tables.test
+++ b/mysql-test/suite/innodb/t/innodb-page_compression_tables.test
@@ -26,10 +26,8 @@ create table innodb_redundant(c1 bigint not null, b char(200)) engine=innodb row
show warnings;
create table innodb_redundant(c1 bigint not null, b char(200)) engine=innodb row_format=redundant;
show create table innodb_redundant;
---replace_regex /#sql-[0-9a-f_]*`/#sql-temporary`/
---error 1005
+--error ER_ILLEGAL_HA_CREATE_OPTION
alter table innodb_redundant page_compressed=1;
---replace_regex /#sql-[0-9a-f_]*`/#sql-temporary`/
show warnings;
show create table innodb_redundant;
alter table innodb_redundant row_format=compact page_compressed=1;
diff --git a/mysql-test/suite/innodb/t/innodb-table-online.test b/mysql-test/suite/innodb/t/innodb-table-online.test
index d3fbeffd19f..1bb4b686b56 100644
--- a/mysql-test/suite/innodb/t/innodb-table-online.test
+++ b/mysql-test/suite/innodb/t/innodb-table-online.test
@@ -215,7 +215,8 @@ SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt2 WAIT_FOR dml2_done
# Ensure that the ALTER TABLE will be executed even with some concurrent DML.
SET lock_wait_timeout = 10;
--send
-ALTER TABLE t1 ROW_FORMAT=COMPACT, ALGORITHM = INPLACE;
+ALTER TABLE t1 ROW_FORMAT=COMPACT
+PAGE_COMPRESSED = YES PAGE_COMPRESSION_LEVEL = 1, ALGORITHM = INPLACE;
# Generate some log (delete-mark, delete-unmark, insert etc.)
# while the index creation is blocked. Some of this may run
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index d5c37dae704..3f3994d1d56 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -390,23 +390,34 @@ innobase_spatial_exist(
return(false);
}
-/*******************************************************************//**
-Determine if ALTER TABLE needs to rebuild the table.
-@param ha_alter_info the DDL operation
-@param altered_table MySQL original table
+/** Determine if ALTER TABLE needs to rebuild the table.
+@param ha_alter_info the DDL operation
+@param table metadata before ALTER TABLE
@return whether it is necessary to rebuild the table */
static MY_ATTRIBUTE((nonnull, warn_unused_result))
bool
innobase_need_rebuild(
-/*==================*/
const Alter_inplace_info* ha_alter_info,
- const TABLE* altered_table)
+ const TABLE* table)
{
Alter_inplace_info::HA_ALTER_FLAGS alter_inplace_flags =
- ha_alter_info->handler_flags & ~(INNOBASE_INPLACE_IGNORE);
+ ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE;
+
+ if (alter_inplace_flags & Alter_inplace_info::CHANGE_CREATE_OPTION) {
+ const ha_table_option_struct& alt_opt=
+ *ha_alter_info->create_info->option_struct;
+ const ha_table_option_struct& opt= *table->s->option_struct;
+
+ if (alt_opt.page_compressed != opt.page_compressed
+ || alt_opt.page_compression_level
+ != opt.page_compression_level
+ || alt_opt.encryption != opt.encryption
+ || alt_opt.encryption_key_id != opt.encryption_key_id) {
+ return(true);
+ }
+ }
- if (alter_inplace_flags
- == Alter_inplace_info::CHANGE_CREATE_OPTION
+ if (alter_inplace_flags == Alter_inplace_info::CHANGE_CREATE_OPTION
&& !(ha_alter_info->create_info->used_fields
& (HA_CREATE_USED_ROW_FORMAT
| HA_CREATE_USED_KEY_BLOCK_SIZE))) {
@@ -416,7 +427,7 @@ innobase_need_rebuild(
return(false);
}
- return(!!(ha_alter_info->handler_flags & INNOBASE_ALTER_REBUILD));
+ return(!!(alter_inplace_flags & INNOBASE_ALTER_REBUILD));
}
/** Check if virtual column in old and new table are in order, excluding
@@ -571,28 +582,6 @@ ha_innobase::check_if_supported_inplace_alter(
update_thd();
- /* Change on engine specific table options require rebuild of the
- table */
- if (ha_alter_info->handler_flags
- & Alter_inplace_info::CHANGE_CREATE_OPTION) {
- ha_table_option_struct *new_options= ha_alter_info->create_info->option_struct;
- ha_table_option_struct *old_options= table->s->option_struct;
-
- if (new_options->page_compressed != old_options->page_compressed ||
- new_options->page_compression_level != old_options->page_compression_level) {
- ha_alter_info->unsupported_reason = innobase_get_err_msg(
- ER_ALTER_OPERATION_NOT_SUPPORTED_REASON);
- DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
- }
-
- if (new_options->encryption != old_options->encryption ||
- new_options->encryption_key_id != old_options->encryption_key_id) {
- ha_alter_info->unsupported_reason = innobase_get_err_msg(
- ER_ALTER_OPERATION_NOT_SUPPORTED_REASON);
- DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
- }
- }
-
if (ha_alter_info->handler_flags
& ~(INNOBASE_INPLACE_IGNORE
| INNOBASE_ALTER_NOREBUILD
@@ -4501,7 +4490,6 @@ prepare_inplace_alter_table_dict(
to rebuild the table with a temporary name. */
if (new_clustered) {
- fil_space_crypt_t* crypt_data;
const char* new_table_name
= dict_mem_create_temporary_tablename(
ctx->heap,
@@ -4515,13 +4503,29 @@ prepare_inplace_alter_table_dict(
uint32_t key_id = FIL_DEFAULT_ENCRYPTION_KEY;
fil_encryption_t mode = FIL_ENCRYPTION_DEFAULT;
- fil_space_t* space = fil_space_acquire(ctx->prebuilt->table->space);
- crypt_data = space->crypt_data;
- fil_space_release(space);
+ if (fil_space_t* space
+ = fil_space_acquire(ctx->prebuilt->table->space)) {
+ if (const fil_space_crypt_t* crypt_data
+ = space->crypt_data) {
+ key_id = crypt_data->key_id;
+ mode = crypt_data->encryption;
+ }
+
+ fil_space_release(space);
+ }
- if (crypt_data) {
- key_id = crypt_data->key_id;
- mode = crypt_data->encryption;
+ if (ha_alter_info->handler_flags
+ & Alter_inplace_info::CHANGE_CREATE_OPTION) {
+ const ha_table_option_struct& alt_opt=
+ *ha_alter_info->create_info->option_struct;
+ const ha_table_option_struct& opt=
+ *old_table->s->option_struct;
+ if (alt_opt.encryption != opt.encryption
+ || alt_opt.encryption_key_id
+ != opt.encryption_key_id) {
+ key_id = alt_opt.encryption_key_id;
+ mode = fil_encryption_t(alt_opt.encryption);
+ }
}
if (innobase_check_foreigns(
diff --git a/storage/xtradb/handler/handler0alter.cc b/storage/xtradb/handler/handler0alter.cc
index ca3c4648af3..e867b996fa7 100644
--- a/storage/xtradb/handler/handler0alter.cc
+++ b/storage/xtradb/handler/handler0alter.cc
@@ -212,32 +212,44 @@ innobase_fulltext_exist(
return(false);
}
-/*******************************************************************//**
-Determine if ALTER TABLE needs to rebuild the table.
-@param ha_alter_info the DDL operation
-@param altered_table MySQL original table
+/** Determine if ALTER TABLE needs to rebuild the table.
+@param ha_alter_info the DDL operation
+@param table metadata before ALTER TABLE
@return whether it is necessary to rebuild the table */
static MY_ATTRIBUTE((nonnull, warn_unused_result))
bool
innobase_need_rebuild(
-/*==================*/
const Alter_inplace_info* ha_alter_info,
- const TABLE* altered_table)
+ const TABLE* table)
{
Alter_inplace_info::HA_ALTER_FLAGS alter_inplace_flags =
- ha_alter_info->handler_flags & ~(INNOBASE_INPLACE_IGNORE);
+ ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE;
+
+ if (alter_inplace_flags & Alter_inplace_info::CHANGE_CREATE_OPTION) {
+ const ha_table_option_struct& alt_opt=
+ *ha_alter_info->create_info->option_struct;
+ const ha_table_option_struct& opt= *table->s->option_struct;
+
+ if (alt_opt.page_compressed != opt.page_compressed
+ || alt_opt.page_compression_level
+ != opt.page_compression_level
+ || alt_opt.encryption != opt.encryption
+ || alt_opt.encryption_key_id != opt.encryption_key_id) {
+ return(true);
+ }
+ }
- if (alter_inplace_flags
- == Alter_inplace_info::CHANGE_CREATE_OPTION
+ if (alter_inplace_flags == Alter_inplace_info::CHANGE_CREATE_OPTION
&& !(ha_alter_info->create_info->used_fields
& (HA_CREATE_USED_ROW_FORMAT
| HA_CREATE_USED_KEY_BLOCK_SIZE))) {
/* Any other CHANGE_CREATE_OPTION than changing
- ROW_FORMAT or KEY_BLOCK_SIZE is ignored. */
+ ROW_FORMAT or KEY_BLOCK_SIZE can be done without
+ rebuilding the table. */
return(false);
}
- return(!!(ha_alter_info->handler_flags & INNOBASE_ALTER_REBUILD));
+ return(!!(alter_inplace_flags & INNOBASE_ALTER_REBUILD));
}
/** Check if InnoDB supports a particular alter table in-place
@@ -287,29 +299,6 @@ ha_innobase::check_if_supported_inplace_alter(
update_thd();
trx_search_latch_release_if_reserved(prebuilt->trx);
- /* Change on engine specific table options require rebuild of the
- table */
- if (ha_alter_info->handler_flags
- & Alter_inplace_info::CHANGE_CREATE_OPTION) {
- ha_table_option_struct *new_options= ha_alter_info->create_info->option_struct;
- ha_table_option_struct *old_options= table->s->option_struct;
-
- if (new_options->page_compressed != old_options->page_compressed ||
- new_options->page_compression_level != old_options->page_compression_level ||
- new_options->atomic_writes != old_options->atomic_writes) {
- ha_alter_info->unsupported_reason = innobase_get_err_msg(
- ER_ALTER_OPERATION_NOT_SUPPORTED_REASON);
- DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
- }
-
- if (new_options->encryption != old_options->encryption ||
- new_options->encryption_key_id != old_options->encryption_key_id) {
- ha_alter_info->unsupported_reason = innobase_get_err_msg(
- ER_ALTER_OPERATION_NOT_SUPPORTED_REASON);
- DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
- }
- }
-
if (ha_alter_info->handler_flags
& ~(INNOBASE_INPLACE_IGNORE
| INNOBASE_ALTER_NOREBUILD
@@ -589,7 +578,7 @@ ha_innobase::check_if_supported_inplace_alter(
operation is possible. */
} else if (((ha_alter_info->handler_flags
& Alter_inplace_info::ADD_PK_INDEX)
- || innobase_need_rebuild(ha_alter_info, table))
+ || innobase_need_rebuild(ha_alter_info, table))
&& (innobase_fulltext_exist(altered_table))) {
/* Refuse to rebuild the table online, if
fulltext indexes are to survive the rebuild. */
@@ -2870,7 +2859,6 @@ prepare_inplace_alter_table_dict(
to rebuild the table with a temporary name. */
if (new_clustered) {
- fil_space_crypt_t* crypt_data;
const char* new_table_name
= dict_mem_create_temporary_tablename(
ctx->heap,
@@ -2881,13 +2869,29 @@ prepare_inplace_alter_table_dict(
ulint key_id = FIL_DEFAULT_ENCRYPTION_KEY;
fil_encryption_t mode = FIL_ENCRYPTION_DEFAULT;
- fil_space_t* space = fil_space_acquire(ctx->prebuilt->table->space);
- crypt_data = space->crypt_data;
- fil_space_release(space);
+ if (fil_space_t* space
+ = fil_space_acquire(ctx->prebuilt->table->space)) {
+ if (const fil_space_crypt_t* crypt_data
+ = space->crypt_data) {
+ key_id = crypt_data->key_id;
+ mode = crypt_data->encryption;
+ }
+
+ fil_space_release(space);
+ }
- if (crypt_data) {
- key_id = crypt_data->key_id;
- mode = crypt_data->encryption;
+ if (ha_alter_info->handler_flags
+ & Alter_inplace_info::CHANGE_CREATE_OPTION) {
+ const ha_table_option_struct& alt_opt=
+ *ha_alter_info->create_info->option_struct;
+ const ha_table_option_struct& opt=
+ *old_table->s->option_struct;
+ if (alt_opt.encryption != opt.encryption
+ || alt_opt.encryption_key_id
+ != opt.encryption_key_id) {
+ key_id = alt_opt.encryption_key_id;
+ mode = fil_encryption_t(alt_opt.encryption);
+ }
}
if (innobase_check_foreigns(
diff --git a/storage/xtradb/trx/trx0trx.cc b/storage/xtradb/trx/trx0trx.cc
index ef6e7d01cc4..2b0b05dc327 100644
--- a/storage/xtradb/trx/trx0trx.cc
+++ b/storage/xtradb/trx/trx0trx.cc
@@ -480,8 +480,9 @@ trx_free_prepared(
trx_t* trx) /*!< in, own: trx object */
{
ut_a(trx_state_eq(trx, TRX_STATE_PREPARED)
- || (trx_state_eq(trx, TRX_STATE_ACTIVE)
- && trx->is_recovered
+ || (trx->is_recovered
+ && (trx_state_eq(trx, TRX_STATE_ACTIVE)
+ || trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY))
&& (srv_read_only_mode
|| srv_apply_log_only
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO)));
diff --git a/storage/xtradb/trx/trx0undo.cc b/storage/xtradb/trx/trx0undo.cc
index cb064e3d485..0cc3048e624 100644
--- a/storage/xtradb/trx/trx0undo.cc
+++ b/storage/xtradb/trx/trx0undo.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2014, 2017, MariaDB Corporation. All Rights Reserved.
+Copyright (c) 2014, 2017, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -2015,6 +2015,12 @@ trx_undo_free_prepared(
switch (trx->update_undo->state) {
case TRX_UNDO_PREPARED:
break;
+ case TRX_UNDO_CACHED:
+ case TRX_UNDO_TO_FREE:
+ case TRX_UNDO_TO_PURGE:
+ ut_ad(trx_state_eq(trx,
+ TRX_STATE_COMMITTED_IN_MEMORY));
+ /* fall through */
case TRX_UNDO_ACTIVE:
/* lock_trx_release_locks() assigns
trx->is_recovered=false */
@@ -2033,6 +2039,12 @@ trx_undo_free_prepared(
switch (trx->insert_undo->state) {
case TRX_UNDO_PREPARED:
break;
+ case TRX_UNDO_CACHED:
+ case TRX_UNDO_TO_FREE:
+ case TRX_UNDO_TO_PURGE:
+ ut_ad(trx_state_eq(trx,
+ TRX_STATE_COMMITTED_IN_MEMORY));
+ /* fall through */
case TRX_UNDO_ACTIVE:
/* lock_trx_release_locks() assigns
trx->is_recovered=false */