Skip to content

Commit

Permalink
Merge 10.9 into 10.10
Browse files Browse the repository at this point in the history
  • Loading branch information
dr-m committed Mar 17, 2023
2 parents 3dd3378 + 1147e32 commit df08731
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 11 deletions.
15 changes: 15 additions & 0 deletions mysql-test/suite/innodb/r/insert_into_empty.result
Expand Up @@ -214,6 +214,21 @@ WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test';
TABLE_ROWS AVG_ROW_LENGTH>0
3 1
DROP TABLE t1;
#
# MDEV-29975 InnoDB fails to release savepoint during bulk insert
#
CREATE TABLE t (c INT KEY) ENGINE=InnoDB;
begin;
INSERT INTO t VALUES (0,0);
ERROR 21S01: Column count doesn't match value count at row 1
SAVEPOINT a;
INSERT INTO t VALUES (0),(0);
ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
SAVEPOINT a;
commit;
SELECT * FROM t;
c
DROP TABLE t;
# End of 10.6 tests
#
# MDEV-26947 UNIQUE column checks fail in InnoDB resulting
Expand Down
5 changes: 5 additions & 0 deletions mysql-test/suite/innodb/r/undo_truncate.result
@@ -1,5 +1,10 @@
SET GLOBAL innodb_undo_log_truncate = 0;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
=== information_schema.innodb_sys_tablespaces and innodb_sys_datafiles ===
Space_Name Page_Size Zip_Size Path
innodb_undo001 DEFAULT DEFAULT MYSQLD_DATADIR//undo001
innodb_undo002 DEFAULT DEFAULT MYSQLD_DATADIR//undo002
innodb_temporary DEFAULT DEFAULT MYSQLD_DATADIR/ibtmp1
create table t1(keyc int primary key, c char(100)) engine = innodb;
create table t2(keyc int primary key, c char(100)) engine = innodb;
connect con1,localhost,root,,;
Expand Down
14 changes: 14 additions & 0 deletions mysql-test/suite/innodb/t/insert_into_empty.test
Expand Up @@ -235,6 +235,20 @@ SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test';
DROP TABLE t1;

--echo #
--echo # MDEV-29975 InnoDB fails to release savepoint during bulk insert
--echo #
CREATE TABLE t (c INT KEY) ENGINE=InnoDB;
begin;
--error ER_WRONG_VALUE_COUNT_ON_ROW
INSERT INTO t VALUES (0,0);
SAVEPOINT a;
--error ER_ERROR_DURING_COMMIT
INSERT INTO t VALUES (0),(0);
SAVEPOINT a;
commit;
SELECT * FROM t;
DROP TABLE t;
--echo # End of 10.6 tests

--echo #
Expand Down
1 change: 1 addition & 0 deletions mysql-test/suite/innodb/t/undo_truncate.opt
@@ -1,2 +1,3 @@
--innodb-buffer-pool-size=24M
--innodb-immediate-scrub-data-uncompressed=ON
--loose-innodb-sys-tablespaces
3 changes: 3 additions & 0 deletions mysql-test/suite/innodb/t/undo_truncate.test
Expand Up @@ -15,6 +15,9 @@ call mtr.add_suppression("InnoDB: Trying to delete tablespace.*pending operation
SET GLOBAL innodb_undo_log_truncate = 0;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;

LET $MYSQLD_DATADIR = `select @@datadir`;
LET $INNODB_PAGE_SIZE = `select @@innodb_page_size`;
--source suite/innodb/include/show_i_s_tablespaces.inc
#-----------------------------------------------------------------------------
#
# Perform DML action using multiple clients and multiple undo tablespace.
Expand Down
29 changes: 21 additions & 8 deletions storage/innobase/handler/ha_innodb.cc
Expand Up @@ -4455,6 +4455,25 @@ innobase_commit_ordered(
DBUG_VOID_RETURN;
}

/** Mark the end of a statement.
@param trx transaction
@return whether an error occurred */
static bool end_of_statement(trx_t *trx)
{
trx_mark_sql_stat_end(trx);
if (UNIV_LIKELY(trx->error_state == DB_SUCCESS))
return false;

trx_savept_t savept;
savept.least_undo_no= 0;
trx->rollback(&savept);
/* MariaDB will roll back the entire transaction. */
trx->bulk_insert= false;
trx->last_sql_stat_start.least_undo_no= 0;
trx->savepoints_discard();
return true;
}

/*****************************************************************//**
Commits a transaction in an InnoDB database or marks an SQL statement
ended.
Expand Down Expand Up @@ -4531,10 +4550,7 @@ innobase_commit(
/* Store the current undo_no of the transaction so that we
know where to roll back if we have to roll back the next
SQL statement */

trx_mark_sql_stat_end(trx);
if (UNIV_UNLIKELY(trx->error_state != DB_SUCCESS)) {
trx_rollback_for_mysql(trx);
if (UNIV_UNLIKELY(end_of_statement(trx))) {
DBUG_RETURN(1);
}
}
Expand Down Expand Up @@ -16954,10 +16970,7 @@ innobase_xa_prepare(
/* Store the current undo_no of the transaction so that we
know where to roll back if we have to roll back the next
SQL statement */

trx_mark_sql_stat_end(trx);
if (UNIV_UNLIKELY(trx->error_state != DB_SUCCESS)) {
trx_rollback_for_mysql(trx);
if (UNIV_UNLIKELY(end_of_statement(trx))) {
return 1;
}
}
Expand Down
9 changes: 7 additions & 2 deletions storage/innobase/handler/i_s.cc
Expand Up @@ -6142,8 +6142,13 @@ static int i_s_sys_tablespaces_fill(THD *thd, const fil_space_t &s, TABLE *t)
OK(f->store(name.data(), name.size(), system_charset_info));
f->set_notnull();
}
else
f->set_notnull();
else if (srv_is_undo_tablespace(s.id))
{
char name[15];
snprintf(name, sizeof name, "innodb_undo%03u",
(s.id - srv_undo_space_id_start + 1));
OK(f->store(name, strlen(name), system_charset_info));
} else f->set_notnull();
}

fields[SYS_TABLESPACES_NAME]->set_null();
Expand Down
6 changes: 5 additions & 1 deletion storage/innobase/trx/trx0roll.cc
Expand Up @@ -557,9 +557,13 @@ trx_release_savepoint_for_mysql(

if (savep != NULL) {
trx_roll_savepoint_free(trx, savep);
return DB_SUCCESS;
} else if (trx->last_sql_stat_start.least_undo_no == 0) {
/* Bulk insert could have discarded savepoints */
return DB_SUCCESS;
}

return(savep != NULL ? DB_SUCCESS : DB_NO_SAVEPOINT);
return DB_NO_SAVEPOINT;
}

/*******************************************************************//**
Expand Down

0 comments on commit df08731

Please sign in to comment.