1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Merge 10.6 into 10.11

This commit is contained in:
Marko Mäkelä
2024-11-29 13:43:17 +02:00
397 changed files with 6215 additions and 4216 deletions

View File

@@ -0,0 +1,10 @@
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;
# 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

View 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 

View File

@@ -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;

View File

@@ -50,7 +50,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'

View 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';

View File

@@ -0,0 +1 @@
--innodb_undo_tablespaces=0

View 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

View File

@@ -0,0 +1,2 @@
[COPY]
[INPLACE]

View File

@@ -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;

View File

@@ -94,7 +94,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.
@@ -109,17 +108,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

View File

@@ -0,0 +1 @@
--innodb_purge_threads=1

View 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';