summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/mysqlcheck.result6
-rw-r--r--mysql-test/r/mysqld--help.result7
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_server_embedded.result10
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result10
-rw-r--r--mysql-test/suite/versioning/r/alter.result60
-rw-r--r--mysql-test/suite/versioning/t/alter.test23
-rw-r--r--sql/mysqld.h3
-rw-r--r--sql/share/errmsg-utf8.txt4
-rw-r--r--sql/sql_alter.h13
-rw-r--r--sql/sql_table.cc30
-rw-r--r--sql/sys_vars.cc11
11 files changed, 89 insertions, 88 deletions
diff --git a/mysql-test/r/mysqlcheck.result b/mysql-test/r/mysqlcheck.result
index d1785626fc5..c6ce2b465da 100644
--- a/mysql-test/r/mysqlcheck.result
+++ b/mysql-test/r/mysqlcheck.result
@@ -73,7 +73,8 @@ status : OK
mysql.user OK
mysql.vtmd_template
note : Table does not support optimize, doing recreate + analyze instead
-status : OK
+error : Not allowed for versioned `mysql.vtmd_template`. Change `versioning_alter_history` to proceed with ALTER.
+status : Operation failed
mysql.column_stats OK
mysql.columns_priv OK
mysql.db OK
@@ -141,7 +142,8 @@ status : OK
mysql.user Table is already up to date
mysql.vtmd_template
note : Table does not support optimize, doing recreate + analyze instead
-status : OK
+error : Not allowed for versioned `mysql.vtmd_template`. Change `versioning_alter_history` to proceed with ALTER.
+status : Operation failed
create table t1 (a int) engine=myisam;
create view v1 as select * from t1;
test.t1 OK
diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result
index 145193338fd..e31571e93a8 100644
--- a/mysql-test/r/mysqld--help.result
+++ b/mysql-test/r/mysqld--help.result
@@ -1293,10 +1293,9 @@ The following options may be given as the first argument:
-V, --version[=name]
Output version information and exit.
--versioning-alter-history=name
- Versioning ALTER TABLE mode. KEEP: leave historical
- system rows as is on ALTER TABLE; SURVIVE: use DDL
- survival feature; DROP: delete historical system rows on
- ALTER TABLE
+ Versioning ALTER TABLE mode. ERROR: Fail ALTER with
+ error; KEEP: Keep historical system rows and subject them
+ to ALTER;
--versioning-force Force system versioning for all created tables
--versioning-hide=name
Hide system versioning from being displayed in table
diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
index ba3e2900624..385ecb4e4e6 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
@@ -4463,17 +4463,17 @@ ENUM_VALUE_LIST NEVER,COMPLEMENTARY,PREFERABLY
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME VERSIONING_ALTER_HISTORY
-SESSION_VALUE KEEP
-GLOBAL_VALUE KEEP
+SESSION_VALUE ERROR
+GLOBAL_VALUE ERROR
GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE KEEP
+DEFAULT_VALUE ERROR
VARIABLE_SCOPE SESSION
VARIABLE_TYPE ENUM
-VARIABLE_COMMENT Versioning ALTER TABLE mode. KEEP: leave historical system rows as is on ALTER TABLE; SURVIVE: use DDL survival feature; DROP: delete historical system rows on ALTER TABLE
+VARIABLE_COMMENT Versioning ALTER TABLE mode. ERROR: Fail ALTER with error; KEEP: Keep historical system rows and subject them to ALTER;
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST KEEP,SURVIVE,DROP
+ENUM_VALUE_LIST ERROR,KEEP
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME VERSIONING_ASOF_TIMESTAMP
diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
index 95f73c4e89a..0e6e87619e7 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
@@ -5359,17 +5359,17 @@ ENUM_VALUE_LIST NEVER,COMPLEMENTARY,PREFERABLY
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME VERSIONING_ALTER_HISTORY
-SESSION_VALUE KEEP
-GLOBAL_VALUE KEEP
+SESSION_VALUE ERROR
+GLOBAL_VALUE ERROR
GLOBAL_VALUE_ORIGIN COMPILE-TIME
-DEFAULT_VALUE KEEP
+DEFAULT_VALUE ERROR
VARIABLE_SCOPE SESSION
VARIABLE_TYPE ENUM
-VARIABLE_COMMENT Versioning ALTER TABLE mode. KEEP: leave historical system rows as is on ALTER TABLE; SURVIVE: use DDL survival feature; DROP: delete historical system rows on ALTER TABLE
+VARIABLE_COMMENT Versioning ALTER TABLE mode. ERROR: Fail ALTER with error; KEEP: Keep historical system rows and subject them to ALTER;
NUMERIC_MIN_VALUE NULL
NUMERIC_MAX_VALUE NULL
NUMERIC_BLOCK_SIZE NULL
-ENUM_VALUE_LIST KEEP,SURVIVE,DROP
+ENUM_VALUE_LIST ERROR,KEEP
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME VERSIONING_ASOF_TIMESTAMP
diff --git a/mysql-test/suite/versioning/r/alter.result b/mysql-test/suite/versioning/r/alter.result
index fdceb98ce99..0a3fb3d43e1 100644
--- a/mysql-test/suite/versioning/r/alter.result
+++ b/mysql-test/suite/versioning/r/alter.result
@@ -1,3 +1,6 @@
+select @@versioning_alter_history;
+@@versioning_alter_history
+ERROR
create table t(
a int
);
@@ -17,12 +20,15 @@ t CREATE TABLE `t` (
`sys_trx_end` timestamp(6) GENERATED ALWAYS AS ROW END,
PERIOD FOR SYSTEM_TIME (`sys_trx_start`, `sys_trx_end`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 WITH SYSTEM VERSIONING
+alter table t add column y int;
+ERROR HY000: Not allowed for versioned `test.t`. Change `versioning_alter_history` to proceed with ALTER.
alter table t drop system versioning;
show create table t;
Table Create Table
t CREATE TABLE `t` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
+set versioning_alter_history= keep;
alter table t
add column trx_start bigint(20) unsigned generated always as row start,
add column trx_end bigint(20) unsigned generated always as row end,
@@ -587,51 +593,9 @@ Table Create Table
t CREATE TABLE `t` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
-set versioning_alter_history = DROP;
-create or replace table t (a int) with system versioning engine innodb;
-insert into t values (1);
-update t set a = 2;
-select * from t for system_time all;
-a
-2
-1
-alter table t add column b int;
-select * from t for system_time all;
-a b
-2 NULL
-create or replace table t (a int) with system versioning engine myisam;
-insert into t values (1);
-update t set a = 2;
-select * from t for system_time all;
-a
-2
-1
-alter table t add column b int;
-select * from t for system_time all;
-a b
-2 NULL
-create or replace table non_empty (
-a int,
-sys_trx_start bigint(20) unsigned,
-sys_trx_end bigint(20) unsigned
-) engine innodb;
-insert into non_empty values (1, 100, 200);
-alter table non_empty
-change column sys_trx_start sys_trx_start bigint(20) unsigned generated always as row start;
-ERROR HY000: Can not modify column `sys_trx_start` to GENERATED ALWAYS AS ROW START/END for non-empty table
-alter table non_empty
-change column sys_trx_end sys_trx_end bigint(20) unsigned generated always as row end;
-ERROR HY000: Can not modify column `sys_trx_end` to GENERATED ALWAYS AS ROW START/END for non-empty table
-drop table non_empty;
-call verify_vtq;
-No A B C D
-1 1 1 1 1
-2 1 1 1 1
-drop table t;
-drop procedure verify_vtq;
-drop procedure innodb_verify_vtq;
-drop function default_engine;
-drop function sys_commit_ts;
-drop function sys_datatype;
-drop procedure concat_exec2;
-drop procedure concat_exec3;
+set versioning_alter_history= SURVIVE;
+ERROR 42000: Variable 'versioning_alter_history' can't be set to the value of 'SURVIVE'
+set versioning_alter_history= DROP;
+ERROR 42000: Variable 'versioning_alter_history' can't be set to the value of 'DROP'
+drop database test;
+create database test;
diff --git a/mysql-test/suite/versioning/t/alter.test b/mysql-test/suite/versioning/t/alter.test
index 817549168bc..71b40c73a2f 100644
--- a/mysql-test/suite/versioning/t/alter.test
+++ b/mysql-test/suite/versioning/t/alter.test
@@ -1,3 +1,5 @@
+select @@versioning_alter_history;
+
create table t(
a int
);
@@ -8,9 +10,14 @@ alter table t drop system versioning;
alter table t add system versioning;
show create table t;
+--error ER_VERS_ALTER_NOT_ALLOWED
+alter table t add column y int;
+
alter table t drop system versioning;
show create table t;
+set versioning_alter_history= keep;
+
--error ER_VERS_FIELD_WRONG_TYPE
alter table t
add column trx_start bigint(20) unsigned generated always as row start,
@@ -273,8 +280,17 @@ select * from t;
alter table t drop system versioning;
show create table t;
-set versioning_alter_history = DROP;
+## These experimental options are now disabled
+
+--error ER_WRONG_VALUE_FOR_VAR
+set versioning_alter_history= SURVIVE;
+
+--error ER_WRONG_VALUE_FOR_VAR
+set versioning_alter_history= DROP;
+
+if (0)
+{
create or replace table t (a int) with system versioning engine innodb;
insert into t values (1);
update t set a = 2;
@@ -305,6 +321,7 @@ alter table non_empty
drop table non_empty;
call verify_vtq;
-drop table t;
+}
--- source suite/versioning/common_finish.inc
+drop database test;
+create database test;
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 0e42788acad..4aaadcc618e 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -210,7 +210,8 @@ enum vers_hide_enum
enum vers_alter_history_enum
{
- VERS_ALTER_HISTORY_KEEP= 0,
+ VERS_ALTER_HISTORY_ERROR= 0,
+ VERS_ALTER_HISTORY_KEEP,
VERS_ALTER_HISTORY_SURVIVE,
VERS_ALTER_HISTORY_DROP
};
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 33dd0b9d0c6..fb30fe89c95 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -7845,8 +7845,8 @@ WARN_VERS_TRX_MISSING
WARN_VERS_PART_NON_HISTORICAL
eng "Partition %`s contains non-historical data"
-ER_VERS_NOT_ALLOWED
- eng "%`s is not allowed for versioned table"
+ER_VERS_ALTER_NOT_ALLOWED
+ eng "Not allowed for versioned `%s.%s`. Change `versioning_alter_history` to proceed with ALTER."
ER_VERS_RANGE_PROHIBITED
eng "SYSTEM_TIME range selector is prohibited"
diff --git a/sql/sql_alter.h b/sql/sql_alter.h
index 39458c45b80..5c651b0c91b 100644
--- a/sql/sql_alter.h
+++ b/sql/sql_alter.h
@@ -100,20 +100,25 @@ public:
enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
- bool vers_data_modifying() const
+ bool data_modifying() const
{
return flags & (
ALTER_ADD_COLUMN |
ALTER_DROP_COLUMN |
ALTER_CHANGE_COLUMN |
+ ALTER_COLUMN_ORDER);
+ }
+
+ bool partition_modifying() const
+ {
+ return flags & (
ALTER_DROP_PARTITION |
ALTER_COALESCE_PARTITION |
ALTER_REORGANIZE_PARTITION |
- ALTER_TABLE_REORG |
ALTER_REMOVE_PARTITIONING |
+ ALTER_TABLE_REORG |
ALTER_EXCHANGE_PARTITION |
- ALTER_TRUNCATE_PARTITION |
- ALTER_COLUMN_ORDER);
+ ALTER_TRUNCATE_PARTITION);
}
/**
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 300a75ffe77..b04c9acbc38 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -8843,11 +8843,23 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name,
&alter_prelocking_strategy);
thd->open_options&= ~HA_OPEN_FOR_ALTER;
bool versioned= table_list->table && table_list->table->versioned();
- bool vers_data_mod= versioned &&
- thd->variables.vers_alter_history == VERS_ALTER_HISTORY_SURVIVE &&
- alter_info->vers_data_modifying();
+ bool vers_survival_mod= false;
- if (vers_data_mod)
+ if (versioned)
+ {
+ bool vers_data_mod= alter_info->data_modifying();
+ if (thd->variables.vers_alter_history == VERS_ALTER_HISTORY_SURVIVE)
+ {
+ vers_survival_mod= alter_info->data_modifying() || alter_info->partition_modifying();
+ }
+ else if (vers_data_mod && thd->variables.vers_alter_history == VERS_ALTER_HISTORY_ERROR)
+ {
+ my_error(ER_VERS_ALTER_NOT_ALLOWED, MYF(0), table_list->db, table_list->table_name);
+ DBUG_RETURN(true);
+ }
+ }
+
+ if (vers_survival_mod)
{
table_list->set_lock_type(thd, TL_WRITE);
if (thd->mdl_context.upgrade_shared_lock(table_list->table->mdl_ticket,
@@ -9178,7 +9190,7 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name,
Upgrade from MDL_SHARED_UPGRADABLE to MDL_SHARED_NO_WRITE.
Afterwards it's safe to take the table level lock.
*/
- if ((!vers_data_mod &&
+ if ((!vers_survival_mod &&
thd->mdl_context.upgrade_shared_lock(
mdl_ticket, MDL_SHARED_NO_WRITE,
thd->variables.lock_wait_timeout)) ||
@@ -9609,7 +9621,7 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name,
alter_info->keys_onoff,
&alter_ctx))
{
- if (vers_data_mod && new_versioned && table->versioned_by_sql())
+ if (vers_survival_mod && new_versioned && table->versioned_by_sql())
{
// Failure of this function may result in corruption of an original table.
vers_reset_alter_copy(thd, table);
@@ -9711,7 +9723,7 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name,
anything goes wrong while renaming the new table.
*/
char backup_name[FN_LEN];
- if (vers_data_mod)
+ if (vers_survival_mod)
VTMD_table::archive_name(thd, alter_ctx.table_name, backup_name,
sizeof(backup_name));
else
@@ -9745,7 +9757,7 @@ bool mysql_alter_table(THD *thd, const char *new_db, const char *new_name,
goto err_with_mdl;
}
- if (vers_data_mod && new_versioned)
+ if (vers_survival_mod && new_versioned)
{
DBUG_ASSERT(alter_info && table_list);
VTMD_rename vtmd(*table_list);
@@ -9781,7 +9793,7 @@ err_after_rename:
}
// ALTER TABLE succeeded, delete the backup of the old table.
- if (!(vers_data_mod && new_versioned) &&
+ if (!(vers_survival_mod && new_versioned) &&
quick_rm_table(thd, old_db_type, alter_ctx.db, backup_name, FN_IS_TMP))
{
/*
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index fd5409ab26d..8afd07bd97a 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -413,14 +413,15 @@ static Sys_var_mybool Sys_vers_innodb_algorithm_simple(
SESSION_VAR(vers_innodb_algorithm_simple), CMD_LINE(OPT_ARG),
DEFAULT(TRUE));
-static const char *vers_alter_history_keywords[]= {"KEEP", "SURVIVE", "DROP", NULL};
+static const char *vers_alter_history_keywords[]= {"ERROR", "KEEP",/* "SURVIVE", "DROP",*/ NULL};
static Sys_var_enum Sys_vers_alter_history(
"versioning_alter_history", "Versioning ALTER TABLE mode. "
- "KEEP: leave historical system rows as is on ALTER TABLE; "
- "SURVIVE: use DDL survival feature; "
- "DROP: delete historical system rows on ALTER TABLE",
+ "ERROR: Fail ALTER with error; " /* TODO: fail only when history non-empty */
+ "KEEP: Keep historical system rows and subject them to ALTER; "
+ /*"SURVIVE: Keep historical system rows intact; "
+ "DROP: Drop historical system rows while processing ALTER"*/,
SESSION_VAR(vers_alter_history), CMD_LINE(REQUIRED_ARG),
- vers_alter_history_keywords, DEFAULT(VERS_ALTER_HISTORY_KEEP));
+ vers_alter_history_keywords, DEFAULT(VERS_ALTER_HISTORY_ERROR));
static Sys_var_mybool Sys_transaction_registry(
"transaction_registry",