Re: [Maria-developers] 5150dfd6ab3: MDEV-17891 Assertion failures in select_insert::abort_result_set and mysql_load upon attempt to replace into a full table
Hi, Nikita! On Apr 27, Nikita Malyavin wrote:
revision-id: 5150dfd6ab3 (mariadb-10.3.12-230-g5150dfd6ab3) parent(s): cf78b8c699d author: Nikita Malyavin
committer: Nikita Malyavin timestamp: 2019-06-12 22:11:45 +1000 message: MDEV-17891 Assertion failures in select_insert::abort_result_set and mysql_load upon attempt to replace into a full table
* set modified_non_trans_table in one missed place
This commit needs way more text than that. This is just too misterious now. What asserts fails? What has the test case to do with the fix? Why modified_non_trans_table even matters without replication? Why it's specific to versioning and partitioning? Where trans_safe becomes false?
diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index 3fcb59bdb40..99a297417d5 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -541,6 +541,29 @@ t1 CREATE TABLE `t1` ( PARTITION BY SYSTEM_TIME INTERVAL 7 SECOND (PARTITION `ver_p1` HISTORY ENGINE = DEFAULT_ENGINE, PARTITION `ver_pn` CURRENT ENGINE = DEFAULT_ENGINE) +set timestamp= default; +# MDEV-17891 Assertion failures in select_insert::abort_result_set and +# mysql_load upon attempt to replace into a full table +set @@max_heap_table_size= 1024*1024; +create or replace table t1 ( +pk integer auto_increment, +primary key (pk), +f varchar(45000) +) with system versioning engine=memory +partition by system_time interval 1 year (partition p1 history, +partition pn current); +# fill the table until full +insert into t1 () values (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(); +insert into t1 (f) select f from t1; +ERROR HY000: The table 't1' is full +# leave space for exactly one record in current partition +delete from t1 where pk = 1; +# copy all data into history partition +replace into t1 select * from t1; +replace into t1 select * from t1; +ERROR HY000: The table 't1' is full +drop table t1; +set @@max_heap_table_size= 1048576; # Test cleanup drop database test; create database test; diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index d5c83b4d3bb..23768836efc 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -474,6 +474,7 @@ set timestamp=1523466002.799571; insert into t1 values (11),(12); set timestamp=1523466004.169435; delete from t1 where pk in (11, 12); +set timestamp= default;
--echo # --echo # MDEV-18136 Server crashes in Item_func_dyncol_create::prepare_arguments @@ -489,6 +490,34 @@ partition by system_time interval column_get(column_create(7,7), 7 as int) secon --replace_result $default_engine DEFAULT_ENGINE show create table t1;
+--echo # MDEV-17891 Assertion failures in select_insert::abort_result_set and +--echo # mysql_load upon attempt to replace into a full table + +--let $max_heap_table_size_orig= `select @@max_heap_table_size;` +set @@max_heap_table_size= 1024*1024; +create or replace table t1 ( + pk integer auto_increment, + primary key (pk), + f varchar(45000) +) with system versioning engine=memory + partition by system_time interval 1 year (partition p1 history, + partition pn current); + +--echo # fill the table until full +insert into t1 () values (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(); +--error ER_RECORD_FILE_FULL +insert into t1 (f) select f from t1; +--echo # leave space for exactly one record in current partition +delete from t1 where pk = 1; +--echo # copy all data into history partition +replace into t1 select * from t1; +--error ER_RECORD_FILE_FULL +replace into t1 select * from t1; + +# cleanup +drop table t1; +eval set @@max_heap_table_size= $max_heap_table_size_orig; + --echo # Test cleanup drop database test; create database test; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 1f3a70721fc..44502ea6704 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1953,6 +1953,8 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info) if (likely(!error)) { info->deleted++; + if (!table->file->has_transactions()) + thd->transaction.stmt.modified_non_trans_table= TRUE; if (table->versioned(VERS_TIMESTAMP)) { store_record(table, record[2]);
Regards, Sergei VP of MariaDB Server Engineering and security@mariadb.org
Hello! This commit needs way more text than that.
This is just too misterious now. What asserts fails? What has the test case to do with the fix? Why modified_non_trans_table even matters without replication? Why it's specific to versioning and partitioning? Where trans_safe becomes false?
You are right. To get the answer I had to run the debugger and read the discussion with midenok. Though I think one can always GET jira.mariadb.org/browse/MDEV-17891 to see some details about what was the exact assertion, what was the stack trace and so on. I have updated the comment and have added one more test case from the ticket. See bb-10.3-nikita, or simply https://github.com/MariaDB/server/commit/688b9de0fedfcf13c4d33e7aa98e03e6e37... -- Yours truly, Nikita Malyavin
participants (2)
-
Nikita Malyavin
-
Sergei Golubchik