summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2019-10-30 19:31:26 +0100
committerSergei Golubchik <serg@mariadb.org>2019-10-30 23:14:44 +0100
commit5392b4a32c9da296f7b2e6a5b83e3bff6c24871e (patch)
tree2f37d97bbf9ebe895fe409b12dff3d99ea2d2724 /mysql-test
parentc8ba98206f1b08bf02c6a6f993b8e1b6842cb665 (diff)
downloadmariadb-git-5392b4a32c9da296f7b2e6a5b83e3bff6c24871e.tar.gz
MDEV-20354 All but last insert ignored in InnoDB tables when table locked
mysql_insert() first opens all affected tables (which implicitly starts a transaction in InnoDB), then stat tables. A failure to open a stat table caused open_tables() to abort the current stmt transaction (trans_rollback_stmt()). So, from the server point of view the following ha_write_row()-s happened outside of a transactions, and the server didn't bother to commit them. The server has a mechanism to prevent a transaction being unexpectedly committed or rolled back in the middle of a statement - if an operation takes place _in a sub-statement_ it cannot change the transaction state. Operations on stat tables are exactly that - they are not allowed to change a transaction state. Put them in a sub-statement to make sure they don't.
Diffstat (limited to 'mysql-test')
-rw-r--r--mysql-test/suite/innodb/r/stat_tables.result15
-rw-r--r--mysql-test/suite/innodb/t/stat_tables.test17
2 files changed, 32 insertions, 0 deletions
diff --git a/mysql-test/suite/innodb/r/stat_tables.result b/mysql-test/suite/innodb/r/stat_tables.result
new file mode 100644
index 00000000000..bb449570479
--- /dev/null
+++ b/mysql-test/suite/innodb/r/stat_tables.result
@@ -0,0 +1,15 @@
+rename table mysql.table_stats to mysql.table_stats_save;
+flush tables;
+set use_stat_tables= PREFERABLY;
+create table t1 (a int) engine=InnoDB;
+start transaction;
+insert t1 values (1);
+insert t1 values (2);
+commit;
+select * from t1;
+a
+1
+2
+drop table t1;
+rename table mysql.table_stats_save to mysql.table_stats;
+flush tables;
diff --git a/mysql-test/suite/innodb/t/stat_tables.test b/mysql-test/suite/innodb/t/stat_tables.test
new file mode 100644
index 00000000000..68344b3f425
--- /dev/null
+++ b/mysql-test/suite/innodb/t/stat_tables.test
@@ -0,0 +1,17 @@
+source include/have_innodb.inc;
+
+#
+# MDEV-20354 All but last insert ignored in InnoDB tables when table locked
+#
+rename table mysql.table_stats to mysql.table_stats_save;
+flush tables;
+set use_stat_tables= PREFERABLY;
+create table t1 (a int) engine=InnoDB;
+start transaction;
+insert t1 values (1);
+insert t1 values (2);
+commit;
+select * from t1;
+drop table t1;
+rename table mysql.table_stats_save to mysql.table_stats;
+flush tables;