mirror of
https://github.com/MariaDB/server.git
synced 2025-11-30 05:23:50 +03:00
If the user "opts in" (as in the parent
commit 92b2a911e5),
we can optimize multiple INSERT statements to use table-level locking
and undo logging.
There will be a change of behavior:
CREATE TABLE t(a PRIMARY KEY) ENGINE=InnoDB;
SET foreign_key_checks=0, unique_checks=0;
BEGIN; INSERT INTO t SET a=1; INSERT INTO t SET a=1; COMMIT;
will end up with an empty table, because in case of an error,
the entire transaction will be rolled back, instead of rolling
back the failing statement. Previously, the second INSERT statement
would have been logged row by row, and only that second statement
would have been rolled back, leaving the first INSERT intact.
lock_table_x_unlock(), trx_mod_table_time_t::WAS_BULK: Remove.
Because we cannot really support statement rollback in this
optimized mode, we will not optimize the locking. The exclusive
table lock will be held until the end of the transaction.
102 lines
2.4 KiB
Plaintext
102 lines
2.4 KiB
Plaintext
--source include/have_innodb.inc
|
|
--source include/have_sequence.inc
|
|
|
|
# Enable MDEV-515 table-level undo logging for insert into empty table
|
|
SET foreign_key_checks=0, unique_checks=0;
|
|
|
|
--echo #
|
|
--echo # MDEV-24715 Assertion !node->table->skip_alter_undo
|
|
--echo #
|
|
CREATE TABLE t (a INT UNIQUE) ENGINE=InnoDB
|
|
REPLACE SELECT 1 AS a, 2 AS b UNION SELECT 1 AS a, 3 AS c;
|
|
SELECT * FROM t;
|
|
DROP TABLE t;
|
|
|
|
CREATE TEMPORARY TABLE t (a INT UNIQUE) ENGINE=InnoDB
|
|
REPLACE SELECT 1 AS a, 2 AS b UNION SELECT 1 AS a, 3 AS c;
|
|
SELECT * FROM t;
|
|
DROP TEMPORARY TABLE t;
|
|
|
|
--echo #
|
|
--echo # MDEV-24720 AHI removal during bulk index rollback
|
|
--echo #
|
|
SET @save_ahi = @@global.innodb_adaptive_hash_index;
|
|
SET GLOBAL innodb_adaptive_hash_index = 1;
|
|
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
|
|
BEGIN;
|
|
INSERT INTO t1 SELECT * FROM seq_1_to_65536;
|
|
ROLLBACK;
|
|
CHECK TABLE t1;
|
|
--echo #
|
|
--echo # MDEV-24832 Root page AHI Removal fails fails during
|
|
--echo # bulk index rollback
|
|
--echo #
|
|
BEGIN;
|
|
INSERT INTO t1 SELECT * FROM seq_1_to_500;
|
|
ROLLBACK;
|
|
DROP TABLE t1;
|
|
SET GLOBAL innodb_adaptive_hash_index = @save_ahi;
|
|
|
|
--echo #
|
|
--echo # MDEV-24951 Assertion m.first->second.valid(trx->undo_no) failed
|
|
--echo # in trx_undo_report_row_operation
|
|
--echo #
|
|
|
|
CREATE TEMPORARY TABLE t (c INT) ENGINE=InnoDB;
|
|
CREATE TEMPORARY TABLE t2 (c INT) ENGINE=InnoDB;
|
|
SET tx_read_only=1;
|
|
BEGIN;
|
|
INSERT INTO t2 VALUES(0);
|
|
INSERT INTO t VALUES(0);
|
|
COMMIT;
|
|
INSERT INTO t VALUES(0);
|
|
|
|
--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION
|
|
DROP TEMPORARY TABLE t,t2;
|
|
SET tx_read_only=0;
|
|
DROP TEMPORARY TABLE t,t2;
|
|
|
|
--echo #
|
|
--echo # MDEV-24818 Optimize multiple INSERT into empty table
|
|
--echo #
|
|
|
|
CREATE TABLE t1(f1 INT PRIMARY KEY) ENGINE=InnoDB;
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (5),(6),(7);
|
|
--error ER_DUP_ENTRY
|
|
INSERT INTO t1 VALUES (4),(5),(6);
|
|
COMMIT;
|
|
SELECT * FROM t1;
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (5),(6),(7);
|
|
SAVEPOINT a;
|
|
--error ER_DUP_ENTRY
|
|
INSERT INTO t1 VALUES (4),(5),(6);
|
|
ROLLBACK TO SAVEPOINT a;
|
|
COMMIT;
|
|
SELECT * FROM t1;
|
|
DROP TABLE t1;
|
|
|
|
# Repeat the same with the MDEV-515 test disabled
|
|
SET foreign_key_checks=1;
|
|
|
|
CREATE TABLE t1(f1 INT PRIMARY KEY) ENGINE=InnoDB;
|
|
BEGIN;
|
|
INSERT INTO t1 VALUES (5),(6),(7);
|
|
--error ER_DUP_ENTRY
|
|
INSERT INTO t1 VALUES (4),(5),(6);
|
|
COMMIT;
|
|
SELECT * FROM t1;
|
|
BEGIN;
|
|
--error ER_DUP_ENTRY
|
|
INSERT INTO t1 VALUES (5),(6),(7);
|
|
SAVEPOINT a;
|
|
--error ER_DUP_ENTRY
|
|
INSERT INTO t1 VALUES (4),(5),(6);
|
|
ROLLBACK TO SAVEPOINT a;
|
|
COMMIT;
|
|
SELECT * FROM t1;
|
|
DROP TABLE t1;
|
|
|
|
SET foreign_key_checks=0;
|