diff --git a/mysql-test/suite/versioning/r/insert.result b/mysql-test/suite/versioning/r/insert.result index 16f95ee183f..b7a133e2ccd 100644 --- a/mysql-test/suite/versioning/r/insert.result +++ b/mysql-test/suite/versioning/r/insert.result @@ -355,6 +355,11 @@ rollback to a; commit; call verify_vtq; No A B C D +set global transaction_registry= off; +insert into t2(x) values (1); +insert into t1(x) values (1); +ERROR HY000: Some versioned DML requires `transaction_registry` to be set to ON. +set global transaction_registry= on; drop table t1; drop table t2; drop procedure test_01; diff --git a/mysql-test/suite/versioning/t/insert.test b/mysql-test/suite/versioning/t/insert.test index 730c5478841..666ae370a21 100644 --- a/mysql-test/suite/versioning/t/insert.test +++ b/mysql-test/suite/versioning/t/insert.test @@ -185,6 +185,12 @@ rollback to a; commit; call verify_vtq; +set global transaction_registry= off; +insert into t2(x) values (1); +--error ER_VERS_TRT_IS_DISABLED +insert into t1(x) values (1); +set global transaction_registry= on; + drop table t1; drop table t2; diff --git a/sql/handler.cc b/sql/handler.cc index 9299102ba58..1c75bf80218 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1414,16 +1414,14 @@ int ha_commit_trans(THD *thd, bool all) goto err; } - if (rw_trans && use_transaction_registry) + if (rw_trans) { ulonglong trx_start_id= 0, trx_end_id= 0; - for (Ha_trx_info *ha_info= trans->ha_list; ha_info; - ha_info= ha_info->next()) + for (Ha_trx_info *ha_info= trans->ha_list; ha_info; ha_info= ha_info->next()) { - if (ulonglong (*prepare)(THD*,ulonglong*)= ha_info->ht()-> - prepare_commit_versioned) + if (ha_info->ht()->prepare_commit_versioned) { - trx_end_id= prepare(thd, &trx_start_id); + trx_end_id= ha_info->ht()->prepare_commit_versioned(thd, &trx_start_id); if (trx_end_id) break; // FIXME: use a common ID for cross-engine transactions } @@ -1431,6 +1429,11 @@ int ha_commit_trans(THD *thd, bool all) if (trx_end_id) { + if (!use_transaction_registry) + { + my_error(ER_VERS_TRT_IS_DISABLED, MYF(0)); + goto err; + } DBUG_ASSERT(trx_start_id); TR_table trt(thd, true); if (trt.update(trx_start_id, trx_end_id)) diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 83c71234bd6..cad877a13bd 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7913,3 +7913,6 @@ ER_NOT_LOG_TABLE ER_VERS_GENERATED_ALWAYS_NOT_EMPTY eng "Can not modify column `%s` to GENERATED ALWAYS AS ROW START/END for non-empty table" + +ER_VERS_TRT_IS_DISABLED + eng "Some versioned DML requires `transaction_registry` to be set to ON." diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 7c65e515e3d..60a636d17e1 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -7442,15 +7442,21 @@ static bool mysql_inplace_alter_table(THD *thd, { TR_table trt(thd, true); - if (trt == *table_list || !use_transaction_registry); - else if (ulonglong (*prepare)(THD*,ulonglong*)= table->file->ht-> - prepare_commit_versioned) + if (trt != *table_list && table->file->ht->prepare_commit_versioned) { - ulonglong trx_start_id, trx_end_id= prepare(thd, &trx_start_id); - if (trx_end_id && trt.update(trx_start_id, trx_end_id)) + ulonglong trx_start_id= 0; + ulonglong trx_end_id= table->file->ht->prepare_commit_versioned(thd, &trx_start_id); + if (trx_end_id) { - my_error(ER_UNKNOWN_ERROR, MYF(0)); - goto rollback; + if (!use_transaction_registry) + { + my_error(ER_VERS_TRT_IS_DISABLED, MYF(0)); + goto rollback; + } + if (trt.update(trx_start_id, trx_end_id)) + { + goto rollback; + } } } diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 8afd07bd97a..a30d202db63 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -423,11 +423,18 @@ static Sys_var_enum Sys_vers_alter_history( SESSION_VAR(vers_alter_history), CMD_LINE(REQUIRED_ARG), vers_alter_history_keywords, DEFAULT(VERS_ALTER_HISTORY_ERROR)); +static bool update_transaction_registry(sys_var *self, THD *thd, enum_var_type type) +{ + use_transaction_registry= opt_transaction_registry; + return false; +} + static Sys_var_mybool Sys_transaction_registry( "transaction_registry", "Enable or disable update of transaction_registry", GLOBAL_VAR(opt_transaction_registry), CMD_LINE(OPT_ARG), - DEFAULT(TRUE)); + DEFAULT(TRUE), NO_MUTEX_GUARD, NOT_IN_BINLOG, + 0, ON_UPDATE(update_transaction_registry)); static Sys_var_ulonglong Sys_binlog_cache_size( "binlog_cache_size", "The size of the transactional cache for " diff --git a/sql/vtmd.cc b/sql/vtmd.cc index 6a516178324..b66d8ba0d18 100644 --- a/sql/vtmd.cc +++ b/sql/vtmd.cc @@ -255,12 +255,12 @@ err: } quit: - if (result || !use_transaction_registry); - else if (ulonglong (*prepare)(THD*,ulonglong*)= vtmd.table->file->ht-> - prepare_commit_versioned) + if (!result && vtmd.table->file->ht->prepare_commit_versioned) { + DBUG_ASSERT(use_transaction_registry); // FIXME: disable survival mode while TRT is disabled TR_table trt(thd, true); - ulonglong trx_start_id, trx_end_id= prepare(thd, &trx_start_id); + ulonglong trx_start_id= 0; + ulonglong trx_end_id= vtmd.table->file->ht->prepare_commit_versioned(thd, &trx_start_id); result= trx_end_id && trt.update(trx_start_id, trx_end_id); }