Commit fa56adff authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.6 into 10.8

parents acf46b7b e8e0559e
...@@ -214,6 +214,21 @@ WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; ...@@ -214,6 +214,21 @@ WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test';
TABLE_ROWS AVG_ROW_LENGTH>0 TABLE_ROWS AVG_ROW_LENGTH>0
3 1 3 1
DROP TABLE t1; 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 # End of 10.6 tests
# #
# MDEV-26947 UNIQUE column checks fail in InnoDB resulting # MDEV-26947 UNIQUE column checks fail in InnoDB resulting
......
SET GLOBAL innodb_undo_log_truncate = 0; SET GLOBAL innodb_undo_log_truncate = 0;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; 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 t1(keyc int primary key, c char(100)) engine = innodb;
create table t2(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,,; connect con1,localhost,root,,;
......
...@@ -235,6 +235,20 @@ SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES ...@@ -235,6 +235,20 @@ SELECT TABLE_ROWS, AVG_ROW_LENGTH>0 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test';
DROP TABLE t1; 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 # End of 10.6 tests
--echo # --echo #
......
--innodb-buffer-pool-size=24M --innodb-buffer-pool-size=24M
--innodb-immediate-scrub-data-uncompressed=ON --innodb-immediate-scrub-data-uncompressed=ON
--loose-innodb-sys-tablespaces
...@@ -15,6 +15,9 @@ call mtr.add_suppression("InnoDB: Trying to delete tablespace.*pending operation ...@@ -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_undo_log_truncate = 0;
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1; 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. # Perform DML action using multiple clients and multiple undo tablespace.
......
...@@ -4473,6 +4473,25 @@ innobase_commit_ordered( ...@@ -4473,6 +4473,25 @@ innobase_commit_ordered(
DBUG_VOID_RETURN; 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 Commits a transaction in an InnoDB database or marks an SQL statement
ended. ended.
...@@ -4549,10 +4568,7 @@ innobase_commit( ...@@ -4549,10 +4568,7 @@ innobase_commit(
/* Store the current undo_no of the transaction so that we /* Store the current undo_no of the transaction so that we
know where to roll back if we have to roll back the next know where to roll back if we have to roll back the next
SQL statement */ SQL statement */
if (UNIV_UNLIKELY(end_of_statement(trx))) {
trx_mark_sql_stat_end(trx);
if (UNIV_UNLIKELY(trx->error_state != DB_SUCCESS)) {
trx_rollback_for_mysql(trx);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
...@@ -16986,10 +17002,7 @@ innobase_xa_prepare( ...@@ -16986,10 +17002,7 @@ innobase_xa_prepare(
/* Store the current undo_no of the transaction so that we /* Store the current undo_no of the transaction so that we
know where to roll back if we have to roll back the next know where to roll back if we have to roll back the next
SQL statement */ SQL statement */
if (UNIV_UNLIKELY(end_of_statement(trx))) {
trx_mark_sql_stat_end(trx);
if (UNIV_UNLIKELY(trx->error_state != DB_SUCCESS)) {
trx_rollback_for_mysql(trx);
return 1; return 1;
} }
} }
......
...@@ -6436,8 +6436,13 @@ static int i_s_sys_tablespaces_fill(THD *thd, const fil_space_t &s, TABLE *t) ...@@ -6436,8 +6436,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)); OK(f->store(name.data(), name.size(), system_charset_info));
f->set_notnull(); f->set_notnull();
} }
else else if (srv_is_undo_tablespace(s.id))
f->set_notnull(); {
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(); fields[SYS_TABLESPACES_NAME]->set_null();
......
...@@ -557,9 +557,13 @@ trx_release_savepoint_for_mysql( ...@@ -557,9 +557,13 @@ trx_release_savepoint_for_mysql(
if (savep != NULL) { if (savep != NULL) {
trx_roll_savepoint_free(trx, savep); 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;
} }
/*******************************************************************//** /*******************************************************************//**
......
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