Commit 4bc268d4 authored by Eugene Kosov's avatar Eugene Kosov Committed by GitHub

MDEV-14632 Assertion `!((new_col->prtype ^ col->prtype) & ~256U)' failed in...

MDEV-14632 Assertion `!((new_col->prtype ^ col->prtype) & ~256U)' failed in row_log_table_apply_convert_mrec

SQL, IB: proper fix is to disable unimplemented Online DDL for system-versioned tables inside InnoDB
parent b13f1cc5
...@@ -305,10 +305,6 @@ a ...@@ -305,10 +305,6 @@ a
1 1
call verify_vtq; call verify_vtq;
No A B C D No A B C D
alter table t drop system versioning, algorithm=inplace;
call verify_vtq;
No A B C D
alter table t add system versioning;
alter table t drop system versioning, algorithm=copy; alter table t drop system versioning, algorithm=copy;
show create table t; show create table t;
Table Create Table Table Create Table
......
set system_versioning_alter_history=keep;
create or replace table t (a int) engine=innodb;
alter table t add system versioning, lock=none;
ERROR 0A000: LOCK=NONE is not supported for this operation. Try LOCK=SHARED
alter table t add system versioning;
alter table t add index idx(a), lock=none;
ERROR 0A000: LOCK=NONE is not supported for this operation. Try LOCK=SHARED
alter table t drop system versioning, lock=none;
ERROR 0A000: LOCK=NONE is not supported for this operation. Try LOCK=SHARED
set global system_versioning_transaction_registry=on;
Warnings:
Warning 4144 Transaction-based system versioning is EXPERIMENTAL and is subject to change in future.
create or replace table t (a int) engine=innodb;
alter table t
add s bigint unsigned as row start,
add e bigint unsigned as row end,
add period for system_time(s, e),
add system versioning,
lock=none;
ERROR 0A000: LOCK=NONE is not supported for this operation. Try LOCK=SHARED
alter table t
add s bigint unsigned as row start,
add e bigint unsigned as row end,
add period for system_time(s, e),
add system versioning;
alter table t add index idx(a), lock=none;
ERROR 0A000: LOCK=NONE is not supported for this operation. Try LOCK=SHARED
alter table t drop column s, drop column e;
alter table t drop system versioning, lock=none;
ERROR 0A000: LOCK=NONE is not supported for this operation. Try LOCK=SHARED
set global system_versioning_transaction_registry=off;
drop table t;
...@@ -198,11 +198,12 @@ show create table t; ...@@ -198,11 +198,12 @@ show create table t;
select * from t for system_time all; select * from t for system_time all;
call verify_vtq; call verify_vtq;
alter table t drop system versioning, algorithm=inplace;
call verify_vtq;
## FIXME: #414 IB: inplace for VERS_TIMESTAMP versioning ## FIXME: #414 IB: inplace for VERS_TIMESTAMP versioning
if (0) if (0)
{ {
alter table t drop system versioning, algorithm=inplace;
call verify_vtq;
alter table t add system versioning, algorithm=inplace; alter table t add system versioning, algorithm=inplace;
call verify_vtq; call verify_vtq;
show create table t; show create table t;
...@@ -220,7 +221,6 @@ alter table t drop column b, algorithm=inplace; ...@@ -220,7 +221,6 @@ alter table t drop column b, algorithm=inplace;
show create table t; show create table t;
select * from t for system_time all; select * from t for system_time all;
} }
alter table t add system versioning;
## FIXME END ## FIXME END
alter table t drop system versioning, algorithm=copy; alter table t drop system versioning, algorithm=copy;
......
--source include/have_innodb.inc
set system_versioning_alter_history=keep;
create or replace table t (a int) engine=innodb;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
alter table t add system versioning, lock=none;
alter table t add system versioning;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
alter table t add index idx(a), lock=none;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
alter table t drop system versioning, lock=none;
set global system_versioning_transaction_registry=on;
create or replace table t (a int) engine=innodb;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
alter table t
add s bigint unsigned as row start,
add e bigint unsigned as row end,
add period for system_time(s, e),
add system versioning,
lock=none;
alter table t
add s bigint unsigned as row start,
add e bigint unsigned as row end,
add period for system_time(s, e),
add system versioning;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
alter table t add index idx(a), lock=none;
alter table t drop column s, drop column e;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
alter table t drop system versioning, lock=none;
set global system_versioning_transaction_registry=off;
drop table t;
...@@ -6885,7 +6885,7 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( ...@@ -6885,7 +6885,7 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields(
List<Item> *items, List<Item> *items,
bool *versioned_write) bool *versioned_write)
{ {
DBUG_ASSERT(!vers_info.without_system_versioning); DBUG_ASSERT(!(alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING));
int vers_tables= 0; int vers_tables= 0;
if (select_tables) if (select_tables)
...@@ -6901,13 +6901,13 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( ...@@ -6901,13 +6901,13 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields(
// then created table will be versioned. // then created table will be versioned.
if (thd->variables.vers_force) if (thd->variables.vers_force)
{ {
vers_info.with_system_versioning= true; alter_info->flags|= Alter_info::ALTER_ADD_SYSTEM_VERSIONING;
options|= HA_VERSIONED_TABLE; options|= HA_VERSIONED_TABLE;
} }
// Possibly override default storage engine to match one used in source table. // Possibly override default storage engine to match one used in source table.
if (vers_tables && vers_info.with_system_versioning && if (vers_tables && alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING &&
!(used_fields & HA_CREATE_USED_ENGINE)) !(used_fields & HA_CREATE_USED_ENGINE))
{ {
List_iterator_fast<Create_field> it(alter_info->create_list); List_iterator_fast<Create_field> it(alter_info->create_list);
while (Create_field *f= it++) while (Create_field *f= it++)
...@@ -6923,19 +6923,18 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( ...@@ -6923,19 +6923,18 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields(
} }
} }
if (!vers_info.need_check()) if (!vers_info.need_check(alter_info))
return false; return false;
if (!vers_info.versioned_fields && if (!vers_info.versioned_fields && vers_info.unversioned_fields &&
vers_info.unversioned_fields && !(alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING))
!vers_info.with_system_versioning)
{ {
// All is correct but this table is not versioned. // All is correct but this table is not versioned.
options&= ~HA_VERSIONED_TABLE; options&= ~HA_VERSIONED_TABLE;
return false; return false;
} }
if (!vers_info.with_system_versioning && vers_info) if (!(alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING) && vers_info)
{ {
my_error(ER_MISSING, MYF(0), create_table.table_name, "WITH SYSTEM VERSIONING"); my_error(ER_MISSING, MYF(0), create_table.table_name, "WITH SYSTEM VERSIONING");
return true; return true;
...@@ -6953,7 +6952,7 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields( ...@@ -6953,7 +6952,7 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields(
while (Create_field *f= it++) while (Create_field *f= it++)
{ {
if ((f->versioning == Column_definition::VERSIONING_NOT_SET && if ((f->versioning == Column_definition::VERSIONING_NOT_SET &&
!vers_info.with_system_versioning) || !(alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING)) ||
f->versioning == Column_definition::WITHOUT_VERSIONING) f->versioning == Column_definition::WITHOUT_VERSIONING)
{ {
f->flags|= VERS_UPDATE_UNVERSIONED_FLAG; f->flags|= VERS_UPDATE_UNVERSIONED_FLAG;
...@@ -7110,28 +7109,16 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info, ...@@ -7110,28 +7109,16 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info,
TABLE_SHARE *share= table->s; TABLE_SHARE *share= table->s;
const char *table_name= share->table_name.str; const char *table_name= share->table_name.str;
if (!need_check() && !share->versioned) if (!need_check(alter_info) && !share->versioned)
return false; return false;
if (with_system_versioning || without_system_versioning) if (alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING && table->versioned())
{
// Disable Online DDL which is not implemented yet for ADD/DROP SYSTEM VERSIONING.
if (thd->mdl_context.upgrade_shared_lock(table->mdl_ticket, MDL_EXCLUSIVE,
thd->variables.lock_wait_timeout))
{
my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0));
return true;
}
alter_info->requested_lock= Alter_info::ALTER_TABLE_LOCK_EXCLUSIVE;
}
if (with_system_versioning && table->versioned())
{ {
my_error(ER_VERS_ALREADY_VERSIONED, MYF(0), table_name); my_error(ER_VERS_ALREADY_VERSIONED, MYF(0), table_name);
return true; return true;
} }
if (without_system_versioning) if (alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING)
{ {
if (!share->versioned) if (!share->versioned)
{ {
...@@ -7300,7 +7287,7 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info, ...@@ -7300,7 +7287,7 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info,
if (fix_implicit(thd, alter_info)) if (fix_implicit(thd, alter_info))
return true; return true;
if (with_system_versioning) if (alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING)
{ {
if (check_with_conditions(table_name)) if (check_with_conditions(table_name))
return true; return true;
...@@ -7370,6 +7357,12 @@ Vers_parse_info::fix_create_like(Alter_info &alter_info, HA_CREATE_INFO &create_ ...@@ -7370,6 +7357,12 @@ Vers_parse_info::fix_create_like(Alter_info &alter_info, HA_CREATE_INFO &create_
return false; return false;
} }
bool Vers_parse_info::need_check(const Alter_info *alter_info) const
{
return versioned_fields || unversioned_fields ||
alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING ||
alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING || *this;
}
bool Vers_parse_info::check_with_conditions(const char *table_name) const bool Vers_parse_info::check_with_conditions(const char *table_name) const
{ {
......
...@@ -1715,8 +1715,6 @@ class Create_field; ...@@ -1715,8 +1715,6 @@ class Create_field;
struct Vers_parse_info struct Vers_parse_info
{ {
Vers_parse_info() : Vers_parse_info() :
with_system_versioning(false),
without_system_versioning(false),
versioned_fields(false), versioned_fields(false),
unversioned_fields(false) unversioned_fields(false)
{} {}
...@@ -1762,15 +1760,7 @@ struct Vers_parse_info ...@@ -1762,15 +1760,7 @@ struct Vers_parse_info
{ {
return as_row.start || as_row.end || system_time.start || system_time.end; return as_row.start || as_row.end || system_time.start || system_time.end;
} }
bool need_check() const bool need_check(const Alter_info *alter_info) const;
{
return
versioned_fields ||
unversioned_fields ||
with_system_versioning ||
without_system_versioning ||
*this;
}
bool check_with_conditions(const char *table_name) const; bool check_with_conditions(const char *table_name) const;
bool check_sys_fields(const char *table_name, Alter_info *alter_info, bool check_sys_fields(const char *table_name, Alter_info *alter_info,
bool native) const; bool native) const;
...@@ -1784,10 +1774,6 @@ struct Vers_parse_info ...@@ -1784,10 +1774,6 @@ struct Vers_parse_info
bool fix_create_like(Alter_info &alter_info, HA_CREATE_INFO &create_info, bool fix_create_like(Alter_info &alter_info, HA_CREATE_INFO &create_info,
TABLE_LIST &src_table, TABLE_LIST &table); TABLE_LIST &src_table, TABLE_LIST &table);
/** Table definition has 'WITH/WITHOUT SYSTEM VERSIONING' */
bool with_system_versioning : 1;
bool without_system_versioning : 1;
/** /**
At least one field was specified 'WITH/WITHOUT SYSTEM VERSIONING'. At least one field was specified 'WITH/WITHOUT SYSTEM VERSIONING'.
Useful for error handling. Useful for error handling.
...@@ -2170,6 +2156,10 @@ class Alter_inplace_info ...@@ -2170,6 +2156,10 @@ class Alter_inplace_info
static const HA_ALTER_FLAGS ALTER_COLUMN_UNVERSIONED = 1ULL << 42; static const HA_ALTER_FLAGS ALTER_COLUMN_UNVERSIONED = 1ULL << 42;
static const HA_ALTER_FLAGS ALTER_ADD_SYSTEM_VERSIONING= 1ULL << 43;
static const HA_ALTER_FLAGS ALTER_DROP_SYSTEM_VERSIONING= 1ULL << 44;
/** /**
Create options (like MAX_ROWS) for the new version of table. Create options (like MAX_ROWS) for the new version of table.
......
...@@ -97,6 +97,8 @@ class Alter_info ...@@ -97,6 +97,8 @@ class Alter_info
ALTER_ADD_CHECK_CONSTRAINT = 1L << 27, ALTER_ADD_CHECK_CONSTRAINT = 1L << 27,
ALTER_DROP_CHECK_CONSTRAINT = 1L << 28, ALTER_DROP_CHECK_CONSTRAINT = 1L << 28,
ALTER_COLUMN_UNVERSIONED = 1L << 29, ALTER_COLUMN_UNVERSIONED = 1L << 29,
ALTER_ADD_SYSTEM_VERSIONING = 1L << 30,
ALTER_DROP_SYSTEM_VERSIONING= 1L << 31,
}; };
enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE }; enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
......
...@@ -6564,6 +6564,10 @@ static bool fill_alter_inplace_info(THD *thd, ...@@ -6564,6 +6564,10 @@ static bool fill_alter_inplace_info(THD *thd,
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_DROP_HISTORICAL; ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_DROP_HISTORICAL;
if (alter_info->flags & Alter_info::ALTER_COLUMN_UNVERSIONED) if (alter_info->flags & Alter_info::ALTER_COLUMN_UNVERSIONED)
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_UNVERSIONED; ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_UNVERSIONED;
if (alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING)
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_ADD_SYSTEM_VERSIONING;
if (alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING)
ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_DROP_SYSTEM_VERSIONING;
/* /*
If we altering table with old VARCHAR fields we will be automatically If we altering table with old VARCHAR fields we will be automatically
......
...@@ -6242,7 +6242,7 @@ versioning_option: ...@@ -6242,7 +6242,7 @@ versioning_option:
} }
else else
{ {
Lex->vers_get_info().with_system_versioning= true; Lex->alter_info.flags|= Alter_info::ALTER_ADD_SYSTEM_VERSIONING;
Lex->create_info.options|= HA_VERSIONED_TABLE; Lex->create_info.options|= HA_VERSIONED_TABLE;
} }
} }
...@@ -8250,12 +8250,12 @@ alter_list_item: ...@@ -8250,12 +8250,12 @@ alter_list_item:
| alter_lock_option | alter_lock_option
| ADD SYSTEM VERSIONING_SYM | ADD SYSTEM VERSIONING_SYM
{ {
Lex->vers_get_info().with_system_versioning= true; Lex->alter_info.flags|= Alter_info::ALTER_ADD_SYSTEM_VERSIONING;
Lex->create_info.options|= HA_VERSIONED_TABLE; Lex->create_info.options|= HA_VERSIONED_TABLE;
} }
| DROP SYSTEM VERSIONING_SYM | DROP SYSTEM VERSIONING_SYM
{ {
Lex->vers_get_info().without_system_versioning= true; Lex->alter_info.flags|= Alter_info::ALTER_DROP_SYSTEM_VERSIONING;
} }
; ;
......
...@@ -633,7 +633,7 @@ instant_alter_column_possible( ...@@ -633,7 +633,7 @@ instant_alter_column_possible(
const TABLE* table) const TABLE* table)
{ {
// Making table system-versioned instantly is not implemented yet. // Making table system-versioned instantly is not implemented yet.
if (ha_alter_info->create_info->vers_info.with_system_versioning) { if (ha_alter_info->handler_flags & Alter_inplace_info::ALTER_ADD_SYSTEM_VERSIONING) {
return false; return false;
} }
...@@ -694,9 +694,10 @@ ha_innobase::check_if_supported_inplace_alter( ...@@ -694,9 +694,10 @@ ha_innobase::check_if_supported_inplace_alter(
{ {
DBUG_ENTER("check_if_supported_inplace_alter"); DBUG_ENTER("check_if_supported_inplace_alter");
if (altered_table->versioned(VERS_TIMESTAMP)) { if (altered_table->versioned(VERS_TIMESTAMP)
|| ha_alter_info->handler_flags & Alter_inplace_info::ALTER_DROP_SYSTEM_VERSIONING) {
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
} }
/* Before 10.2.2 information about virtual columns was not stored in /* Before 10.2.2 information about virtual columns was not stored in
system tables. We need to do a full alter to rebuild proper 10.2.2+ system tables. We need to do a full alter to rebuild proper 10.2.2+
...@@ -1226,6 +1227,13 @@ ha_innobase::check_if_supported_inplace_alter( ...@@ -1226,6 +1227,13 @@ ha_innobase::check_if_supported_inplace_alter(
} }
} }
// FIXME: implement Online DDL for system-versioned tables
DBUG_ASSERT(!altered_table->versioned(VERS_TIMESTAMP));
if (altered_table->versioned(VERS_TRX_ID)
|| ha_alter_info->handler_flags & Alter_inplace_info::ALTER_DROP_SYSTEM_VERSIONING) {
online = false;
}
DBUG_RETURN(online DBUG_RETURN(online
? HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE ? HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE
: HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE); : HA_ALTER_INPLACE_SHARED_LOCK_AFTER_PREPARE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment