mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.11 into 11.4
This commit is contained in:
12
mysql-test/suite/innodb/r/innochecksum_undo_page.result
Normal file
12
mysql-test/suite/innodb/r/innochecksum_undo_page.result
Normal file
@@ -0,0 +1,12 @@
|
||||
SET GLOBAL INNODB_FILE_PER_TABLE= 0;
|
||||
Warnings:
|
||||
Warning 1287 '@@innodb_file_per_table' is deprecated and will be removed in a future release
|
||||
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL innodb_fast_shutdown=0;
|
||||
# Run the innochecksum to display undo log pages
|
||||
FOUND 1 /Undo page state: 0 active, [0-9]+ cached, [0-9]+ to_purge, [0-9]+ prepared, [0-9]+ other/ in result.log
|
||||
# Run the innochecksum with --skip-freed-pages
|
||||
FOUND 1 /Undo page state: 0 active, 0 cached, 0 to_purge, 0 prepared, 0 other/ in result.log
|
||||
# restart
|
16
mysql-test/suite/innodb/r/innodb-replace,INPLACE.rdiff
Normal file
16
mysql-test/suite/innodb/r/innodb-replace,INPLACE.rdiff
Normal file
@@ -0,0 +1,16 @@
|
||||
--- innodb-replace.result
|
||||
+++ innodb-replace,INPLACE.result
|
||||
@@ -31,10 +31,10 @@
|
||||
REPLACE INTO t1 (c1,c2,c3) VALUES (0,1,b'11');
|
||||
SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN ('HANDLER_DELETE','HANDLER_WRITE','HANDLER_READ_KEY','HANDLER_UPDATE');
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
-HANDLER_DELETE 1
|
||||
+HANDLER_DELETE 2
|
||||
HANDLER_READ_KEY 2
|
||||
-HANDLER_UPDATE 1
|
||||
-HANDLER_WRITE 2
|
||||
+HANDLER_UPDATE 0
|
||||
+HANDLER_WRITE 3
|
||||
SELECT * FROM t1;
|
||||
c1 c2 c3
|
||||
0 1
|
@@ -11,3 +11,53 @@ ERROR HY000: DELAYED option not supported for table 't1'
|
||||
select * from t1;
|
||||
c1 c2 stamp
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-35115 Inconsistent Replace behaviour when multiple
|
||||
# unique index exist
|
||||
#
|
||||
CREATE TABLE t1 (c1 NUMERIC UNSIGNED NOT NULL,
|
||||
c2 INT3 UNIQUE,
|
||||
c3 BIT(2) PRIMARY KEY)ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD UNIQUE INDEX(c1);
|
||||
INSERT INTO t1 (c1,c2,c3) VALUES (0,0,b'01');
|
||||
INSERT INTO t1 (c1,c2,c3) VALUES (1,1,b'10');
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN ('HANDLER_DELETE','HANDLER_WRITE','HANDLER_READ_KEY','HANDLER_UPDATE');
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
HANDLER_DELETE 0
|
||||
HANDLER_READ_KEY 0
|
||||
HANDLER_UPDATE 0
|
||||
HANDLER_WRITE 0
|
||||
REPLACE INTO t1 (c1,c2,c3) VALUES (0,1,b'11');
|
||||
SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN ('HANDLER_DELETE','HANDLER_WRITE','HANDLER_READ_KEY','HANDLER_UPDATE');
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
HANDLER_DELETE 1
|
||||
HANDLER_READ_KEY 2
|
||||
HANDLER_UPDATE 1
|
||||
HANDLER_WRITE 2
|
||||
SELECT * FROM t1;
|
||||
c1 c2 c3
|
||||
0 1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY,
|
||||
f2 INT, f3 INT, f4 INT,
|
||||
UNIQUE INDEX i1(f2))ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD INDEX i3(f4);
|
||||
ALTER TABLE t1 ADD UNIQUE INDEX i2(f3);
|
||||
INSERT INTO t1 VALUES (0,0,0,0);
|
||||
INSERT INTO t1 VALUES (1,1,1,1);
|
||||
FLUSH STATUS;
|
||||
SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN ('HANDLER_DELETE','HANDLER_WRITE','HANDLER_READ_KEY','HANDLER_UPDATE');
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
HANDLER_DELETE 0
|
||||
HANDLER_READ_KEY 0
|
||||
HANDLER_UPDATE 0
|
||||
HANDLER_WRITE 0
|
||||
REPLACE INTO t1 VALUES (0,0,1,1);
|
||||
SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN ('HANDLER_DELETE','HANDLER_WRITE','HANDLER_READ_KEY','HANDLER_UPDATE');
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
HANDLER_DELETE 1
|
||||
HANDLER_READ_KEY 2
|
||||
HANDLER_UPDATE 1
|
||||
HANDLER_WRITE 2
|
||||
DROP TABLE t1;
|
||||
|
@@ -49,7 +49,6 @@ SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||
WHERE engine = 'innodb'
|
||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||
FOUND 1 /InnoDB: Could not measure the size of single-table tablespace file '.*test/t2\.ibd'/ in mysqld.1.err
|
||||
# restart
|
||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||
WHERE engine = 'innodb'
|
||||
|
@@ -58,5 +58,13 @@ COUNT(*) LENGTH(b)
|
||||
SHOW VARIABLES LIKE 'innodb_log_file_size';
|
||||
Variable_name Value
|
||||
innodb_log_file_size 5242880
|
||||
FOUND 1 /InnoDB: Resized log to 5\.000MiB/ in mysqld.1.err
|
||||
SET GLOBAL innodb_log_file_size=6291456;
|
||||
SHOW VARIABLES LIKE 'innodb_log_file_size';
|
||||
Variable_name Value
|
||||
innodb_log_file_size 6291456
|
||||
SET GLOBAL innodb_log_file_size=5242880;
|
||||
SHOW VARIABLES LIKE 'innodb_log_file_size';
|
||||
Variable_name Value
|
||||
innodb_log_file_size 5242880
|
||||
FOUND 1 /InnoDB: Resized log to 6\.000MiB/ in mysqld.1.err
|
||||
DROP TABLE t;
|
||||
|
36
mysql-test/suite/innodb/r/purge_pessimistic.result
Normal file
36
mysql-test/suite/innodb/r/purge_pessimistic.result
Normal file
@@ -0,0 +1,36 @@
|
||||
#
|
||||
# MDEV-35508: Race condition between purge and secondary index INSERT or UPDATE
|
||||
#
|
||||
SET @old_debug_dbug = @@global.debug_dbug;
|
||||
CREATE TABLE t1(col1 INT PRIMARY KEY, col2 int, KEY k1(col2)) ENGINE=Innodb;
|
||||
INSERT INTO t1 VALUES(1, 100);
|
||||
CREATE TABLE t2(col1 INT PRIMARY KEY) Engine=Innodb;
|
||||
InnoDB 0 transactions not purged
|
||||
START TRANSACTION;
|
||||
INSERT INTO t2 VALUES(10);
|
||||
SET DEBUG_SYNC='RESET';
|
||||
SET GLOBAL debug_dbug= "+d,btr_force_pessimistic_delete";
|
||||
SET GLOBAL debug_dbug= "+d,enable_row_purge_sec_tree_sync";
|
||||
connect con1,localhost,root;
|
||||
UPDATE t1 SET col2 = 200 WHERE col1 = 1;
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR purge_sec_tree_begin';
|
||||
SET GLOBAL debug_dbug= "-d,enable_row_purge_sec_tree_sync";
|
||||
UPDATE t1 SET col2 = 100 WHERE col1 = 1;
|
||||
SET DEBUG_SYNC= 'now SIGNAL purge_sec_tree_execute';
|
||||
COMMIT;
|
||||
InnoDB 0 transactions not purged
|
||||
disconnect con1;
|
||||
SELECT * FROM t1;
|
||||
col1 col2
|
||||
1 100
|
||||
CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1;
|
||||
SELECT * FROM t2;
|
||||
col1
|
||||
10
|
||||
DROP TABLE t2;
|
||||
SET @@GLOBAL.debug_dbug = @old_debug_dbug;
|
||||
SET DEBUG_SYNC='RESET';
|
1
mysql-test/suite/innodb/t/innochecksum_undo_page.opt
Normal file
1
mysql-test/suite/innodb/t/innochecksum_undo_page.opt
Normal file
@@ -0,0 +1 @@
|
||||
--innodb_undo_tablespaces=0
|
27
mysql-test/suite/innodb/t/innochecksum_undo_page.test
Normal file
27
mysql-test/suite/innodb/t/innochecksum_undo_page.test
Normal file
@@ -0,0 +1,27 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/not_embedded.inc
|
||||
let MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||
|
||||
SET GLOBAL INNODB_FILE_PER_TABLE= 0;
|
||||
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL innodb_fast_shutdown=0;
|
||||
--source include/shutdown_mysqld.inc
|
||||
|
||||
--echo # Run the innochecksum to display undo log pages
|
||||
let $resultlog=$MYSQLTEST_VARDIR/tmp/result.log;
|
||||
let SEARCH_FILE = $MYSQLTEST_VARDIR/tmp/result.log;
|
||||
let SEARCH_ABORT = NOT FOUND;
|
||||
exec $INNOCHECKSUM -S $MYSQLD_DATADIR/ibdata1 > $resultlog;
|
||||
# Expected > 0 cached undo log pages, but can't guarantee it because
|
||||
# the writes of freed pages may be optimized while flushing
|
||||
let SEARCH_PATTERN= Undo page state: 0 active, [0-9]+ cached, [0-9]+ to_purge, [0-9]+ prepared, [0-9]+ other;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
--echo # Run the innochecksum with --skip-freed-pages
|
||||
exec $INNOCHECKSUM -S -r $MYSQLD_DATADIR/ibdata1 > $resultlog;
|
||||
let SEARCH_PATTERN= Undo page state: 0 active, 0 cached, 0 to_purge, 0 prepared, 0 other;
|
||||
--source include/search_pattern_in_file.inc
|
||||
--remove_file $resultlog
|
||||
--source include/start_mysqld.inc
|
2
mysql-test/suite/innodb/t/innodb-replace.combinations
Normal file
2
mysql-test/suite/innodb/t/innodb-replace.combinations
Normal file
@@ -0,0 +1,2 @@
|
||||
[COPY]
|
||||
[INPLACE]
|
@@ -20,3 +20,67 @@ select * from t1;
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-35115 Inconsistent Replace behaviour when multiple
|
||||
--echo # unique index exist
|
||||
--echo #
|
||||
let $get_handler_status_counts= SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN ('HANDLER_DELETE','HANDLER_WRITE','HANDLER_READ_KEY','HANDLER_UPDATE');
|
||||
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
let $algorithm=`select regexp_replace('$MTR_COMBINATIONS', 'innodb,\|,innodb', '')`;
|
||||
|
||||
CREATE TABLE t1 (c1 NUMERIC UNSIGNED NOT NULL,
|
||||
c2 INT3 UNIQUE,
|
||||
c3 BIT(2) PRIMARY KEY)ENGINE=InnoDB;
|
||||
|
||||
replace_result ,ALGORITHM=COPY '' ,ALGORITHM=INPLACE '';
|
||||
eval ALTER TABLE t1 ADD UNIQUE INDEX(c1),ALGORITHM=$algorithm;
|
||||
INSERT INTO t1 (c1,c2,c3) VALUES (0,0,b'01');
|
||||
INSERT INTO t1 (c1,c2,c3) VALUES (1,1,b'10');
|
||||
|
||||
FLUSH STATUS;
|
||||
|
||||
--disable_ps2_protocol
|
||||
eval $get_handler_status_counts;
|
||||
--enable_ps2_protocol
|
||||
|
||||
# INPLACE algorithm appends the index, so unique index
|
||||
# reordering happened between innodb and .frm file. This
|
||||
# lead to deletion of 2 existing rows for the replace statement
|
||||
|
||||
# COPY algorithm does table rebuild everytime. No reordering
|
||||
# happened in this case. This lead to 1 deletion of record
|
||||
# and 1 update on the existing record
|
||||
REPLACE INTO t1 (c1,c2,c3) VALUES (0,1,b'11');
|
||||
|
||||
--disable_ps2_protocol
|
||||
eval $get_handler_status_counts;
|
||||
--enable_ps2_protocol
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (f1 INT NOT NULL PRIMARY KEY,
|
||||
f2 INT, f3 INT, f4 INT,
|
||||
UNIQUE INDEX i1(f2))ENGINE=InnoDB;
|
||||
replace_result ,ALGORITHM=COPY '' ,ALGORITHM=INPLACE '';
|
||||
eval ALTER TABLE t1 ADD INDEX i3(f4),ALGORITHM=$algorithm;
|
||||
|
||||
replace_result ,ALGORITHM=COPY '' ,ALGORITHM=INPLACE '';
|
||||
eval ALTER TABLE t1 ADD UNIQUE INDEX i2(f3),ALGORITHM=$algorithm;
|
||||
|
||||
INSERT INTO t1 VALUES (0,0,0,0);
|
||||
INSERT INTO t1 VALUES (1,1,1,1);
|
||||
|
||||
FLUSH STATUS;
|
||||
--disable_ps2_protocol
|
||||
eval $get_handler_status_counts;
|
||||
--enable_ps2_protocol
|
||||
|
||||
REPLACE INTO t1 VALUES (0,0,1,1);
|
||||
|
||||
--disable_ps2_protocol
|
||||
eval $get_handler_status_counts;
|
||||
--enable_ps2_protocol
|
||||
|
||||
DROP TABLE t1;
|
||||
|
@@ -92,7 +92,6 @@ let SEARCH_PATTERN= InnoDB: Set innodb_force_recovery=1 to ignore this and to pe
|
||||
|
||||
--source include/start_mysqld.inc
|
||||
eval $check_no_innodb;
|
||||
--let $on_linux= `select @@version_compile_os LIKE 'Linux%'`
|
||||
--source include/shutdown_mysqld.inc
|
||||
|
||||
let SEARCH_PATTERN= InnoDB: Tablespace \d+ was not found at .*t[12].ibd.
|
||||
@@ -107,17 +106,14 @@ let SEARCH_PATTERN= InnoDB: Tablespace \d+ was not found at .*t[12].ibd.
|
||||
eval $check_no_innodb;
|
||||
--source include/shutdown_mysqld.inc
|
||||
|
||||
--let SEARCH_PATTERN= InnoDB: Could not measure the size of single-table tablespace file '.*test/t2\\.ibd'
|
||||
if (!$on_linux)
|
||||
{
|
||||
# os_file_get_size() would succeed on a directory.
|
||||
--echo FOUND 1 /$SEARCH_PATTERN/ in mysqld.1.err
|
||||
}
|
||||
if ($on_linux)
|
||||
{
|
||||
# lseek() reports EINVAL when invoked on a directory.
|
||||
--source include/search_pattern_in_file.inc
|
||||
}
|
||||
# On Linux, lseek() would typically report EINVAL when invoked on a directory.
|
||||
# On other plaftorms as well as some GNU/Linux based environments, such as
|
||||
# a Ubuntu 22.04 based image on Amazon Web Services,
|
||||
# os_file_get_size() would succeed on a directory, and we would get another
|
||||
# error about inability to apply log to a corrupted page.
|
||||
|
||||
#--let SEARCH_PATTERN= InnoDB: Could not measure the size of single-table tablespace file '.*test/t2\\.ibd'
|
||||
#--source include/search_pattern_in_file.inc
|
||||
|
||||
--rmdir $MYSQLD_DATADIR/test/t2.ibd
|
||||
|
||||
|
@@ -60,7 +60,11 @@ SELECT * FROM t WHERE a<10;
|
||||
SELECT COUNT(*),LENGTH(b) FROM t GROUP BY b;
|
||||
|
||||
SHOW VARIABLES LIKE 'innodb_log_file_size';
|
||||
let SEARCH_PATTERN = InnoDB: Resized log to 5\\.000MiB;
|
||||
SET GLOBAL innodb_log_file_size=6291456;
|
||||
SHOW VARIABLES LIKE 'innodb_log_file_size';
|
||||
SET GLOBAL innodb_log_file_size=5242880;
|
||||
SHOW VARIABLES LIKE 'innodb_log_file_size';
|
||||
let SEARCH_PATTERN = InnoDB: Resized log to 6\\.000MiB;
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
DROP TABLE t;
|
||||
|
1
mysql-test/suite/innodb/t/purge_pessimistic.opt
Normal file
1
mysql-test/suite/innodb/t/purge_pessimistic.opt
Normal file
@@ -0,0 +1 @@
|
||||
--innodb_purge_threads=1
|
51
mysql-test/suite/innodb/t/purge_pessimistic.test
Normal file
51
mysql-test/suite/innodb/t/purge_pessimistic.test
Normal file
@@ -0,0 +1,51 @@
|
||||
--source include/have_innodb.inc
|
||||
--source include/count_sessions.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-35508: Race condition between purge and secondary index INSERT or UPDATE
|
||||
--echo #
|
||||
|
||||
SET @old_debug_dbug = @@global.debug_dbug;
|
||||
|
||||
CREATE TABLE t1(col1 INT PRIMARY KEY, col2 int, KEY k1(col2)) ENGINE=Innodb;
|
||||
INSERT INTO t1 VALUES(1, 100);
|
||||
|
||||
CREATE TABLE t2(col1 INT PRIMARY KEY) Engine=Innodb;
|
||||
--source include/wait_all_purged.inc
|
||||
|
||||
START TRANSACTION;
|
||||
INSERT INTO t2 VALUES(10);
|
||||
|
||||
SET DEBUG_SYNC='RESET';
|
||||
|
||||
SET GLOBAL debug_dbug= "+d,btr_force_pessimistic_delete";
|
||||
SET GLOBAL debug_dbug= "+d,enable_row_purge_sec_tree_sync";
|
||||
|
||||
--connect (con1,localhost,root)
|
||||
UPDATE t1 SET col2 = 200 WHERE col1 = 1;
|
||||
|
||||
--connection default
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR purge_sec_tree_begin';
|
||||
SET GLOBAL debug_dbug= "-d,enable_row_purge_sec_tree_sync";
|
||||
|
||||
UPDATE t1 SET col2 = 100 WHERE col1 = 1;
|
||||
SET DEBUG_SYNC= 'now SIGNAL purge_sec_tree_execute';
|
||||
|
||||
COMMIT;
|
||||
--source include/wait_all_purged.inc
|
||||
|
||||
--disconnect con1
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
||||
SELECT * FROM t1;
|
||||
CHECK TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
SELECT * FROM t2;
|
||||
DROP TABLE t2;
|
||||
|
||||
SET @@GLOBAL.debug_dbug = @old_debug_dbug;
|
||||
SET DEBUG_SYNC='RESET';
|
Reference in New Issue
Block a user