Merge 10.5 into 10.6

This commit is contained in:
Marko Mäkelä 2022-11-08 17:37:22 +02:00
commit 2ac1edb1c3
47 changed files with 471 additions and 475 deletions

View file

@ -3816,10 +3816,6 @@ static dberr_t xb_assign_undo_space_start()
int n_retries = 5;
ulint fsp_flags;
if (srv_undo_tablespaces == 0) {
return error;
}
file = os_file_create(0, srv_sys_space.first_datafile()->filepath(),
OS_FILE_OPEN, OS_FILE_NORMAL, OS_DATA_FILE, true, &ret);

View file

@ -31,7 +31,10 @@ extern ulong my_time_to_wait_for_lock;
#include <signal.h>
#ifdef HAVE_SIGHANDLER_T
#define sig_return sighandler_t
#elif defined(SOLARIS) || defined(__sun) || defined(__APPLE__) || defined(__FreeBSD__) || defined(_AIX)
#elif defined(SOLARIS) || defined(__sun) || defined(__APPLE__) || \
defined(_AIX) || \
defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
defined(__DragonFly__)
typedef void (*sig_return)(int); /* Returns type from signal */
#else
typedef void (*sig_return)(void); /* Returns type from signal */

View file

@ -340,7 +340,9 @@ program to set the server\'s scheduling priority to the given value\&.
.\}
.\" mysqld_safe: no-auto-restart option
.\" no-auto-restart option: mysqld_safe
\fB\-\-no\-auto\-restart\fR
\fB\-\-no\-auto\-restart\fR,
\fB\-\-nowatch\fR,
\fB\-\-no\-watch\fR
.sp
Exit after starting mysqld\&.
.RE
@ -368,21 +370,6 @@ Do not read any option files\&. This must be the first option on the command lin
.sp -1
.IP \(bu 2.3
.\}
.\" mysqld_safe: no-watch option
.\" no-watch option: mysqld_safe
\fB\-\-no\-auto\-restart\fR
.sp
Exit after starting mysqld\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.\" mysqld_safe: numa-interleave option
.\" numa-interleave option: mysqld_safe
\fB\-\-numa\-interleave\fR

View file

@ -1,17 +1,14 @@
--source include/have_debug.inc
--source include/have_debug_sync.inc
--source include/have_sequence.inc
--source include/count_sessions.inc
--echo #
--echo # MDEV-22761 KILL QUERY during rowid_filter, crashes
--echo #
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
# 100 rows
create table t2(a int);
insert into t2 select A.a + B.a* 10 from t0 A, t0 B;
insert into t2 select * from seq_0_to_99;
# 10K rows
CREATE TABLE t3 (
@ -26,11 +23,10 @@ where table_schema=database() and table_name='t3';
insert into t3
select
A.a,
B.a,
A.seq,
B.seq,
'filler-data-filler-data'
from
t2 A, t2 B;
from seq_0_to_99 A, seq_0_to_99 B;
analyze table t2,t3;
@ -48,7 +44,6 @@ where
t3.key1=t2.a and t3.key2 in (2,3);
connect (con1, localhost, root,,);
connection con1;
set debug_sync='now WAIT_FOR at_rowid_filter_check';
evalp kill query $target_id;
set debug_sync='now SIGNAL go';
@ -60,6 +55,5 @@ disconnect con1;
reap;
set debug_sync='RESET';
drop table t0,t2,t3;
drop table t2,t3;
--source include/wait_until_count_sessions.inc

View file

@ -317,6 +317,15 @@ ERROR 23000: Duplicate entry '1' for key 'v2'
update t1,t2 set v1 = v2 , v5 = 0;
ERROR 23000: Duplicate entry '-128' for key 'v1'
drop table t1, t2;
CREATE TABLE t1 (f TEXT UNIQUE);
INSERT INTO t1 VALUES (NULL),(NULL);
UPDATE t1 SET f = '';
ERROR 23000: Duplicate entry '' for key 'f'
SELECT * FROM t1;
f
NULL
DROP TABLE t1;
#
# MDEV-21540 Initialization of already inited long unique index on reorganize partition
#

View file

@ -397,6 +397,17 @@ update t1 set v2 = 1, v3 = -128;
update t1,t2 set v1 = v2 , v5 = 0;
drop table t1, t2;
#
# MDEV-23264 Unique blobs allow duplicate values upon UPDATE
#
CREATE TABLE t1 (f TEXT UNIQUE);
INSERT INTO t1 VALUES (NULL),(NULL);
--error ER_DUP_ENTRY
UPDATE t1 SET f = '';
SELECT * FROM t1;
DROP TABLE t1;
--echo #
--echo # MDEV-21540 Initialization of already inited long unique index on reorganize partition
--echo #

View file

@ -1,8 +1,8 @@
drop table if exists t0,t1,t2,t3;
#
# MDEV-6434: Wrong result (extra rows) with ORDER BY, multiple-column index, InnoDB
#
CREATE TABLE t1 (a INT, b INT, c INT, d TEXT, KEY idx(a,b,c)) ENGINE=InnoDB;
CREATE TABLE t1 (a INT, b INT, c INT, d TEXT, KEY idx(a,b,c)) ENGINE=InnoDB
STATS_PERSISTENT=0;
INSERT INTO t1 (a,c) VALUES
(8, 9),(8, 10),(13, 15),(16, 17),(16, 18),(16, 19),(20, 21),
(20, 22),(20, 24),(20, 25),(20, 26),(20, 27),(20, 28);
@ -14,8 +14,6 @@ DROP TABLE t1;
#
# MDEV-9457: Poor query plan chosen for ORDER BY query by a recent 10.1
#
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (
pk int primary key,
key1 int,
@ -23,15 +21,9 @@ key2 int,
col1 char(255),
key(key1),
key(key2)
) engine=innodb;
set @a=-1;
) engine=innodb stats_persistent=0;
insert into t1
select
@a:=@a+1,
@a,
@a,
repeat('abcd', 63)
from t0 A, t0 B, t0 C, t0 D;
select seq,seq,seq,repeat('abcd', 63) from seq_0_to_9999;
# The following must NOT use 'index' on PK.
# It should use index_merge(key1,key2) + filesort
explain
@ -47,7 +39,7 @@ from t1
where key1<3 or key2<3;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index_merge key1,key2 key1,key2 5,5 NULL # Using sort_union(key1,key2); Using where
drop table t0, t1;
drop table t1;
#
# MDEV-18094: Query with order by limit picking index scan over filesort
#
@ -78,9 +70,12 @@ drop table t1,t0;
# MDEV-14071: wrong results with orderby_uses_equalities=on
# (duplicate of MDEV-13994)
#
CREATE TABLE t1 (i int, j int, z int,PRIMARY KEY (i,j), KEY (z)) ENGINE=InnoDB;
CREATE TABLE t2 (i int, j int, PRIMARY KEY (i,j)) ENGINE=InnoDB;
CREATE TABLE t3 (j int, n varchar(5), PRIMARY KEY (j)) ENGINE=InnoDB;
CREATE TABLE t1 (i int, j int, z int,PRIMARY KEY (i,j), KEY (z)) ENGINE=InnoDB
STATS_PERSISTENT=0;
CREATE TABLE t2 (i int, j int, PRIMARY KEY (i,j)) ENGINE=InnoDB
STATS_PERSISTENT=0;
CREATE TABLE t3 (j int, n varchar(5), PRIMARY KEY (j)) ENGINE=InnoDB
STATS_PERSISTENT=0;
INSERT INTO t1 VALUES
(127,0,1),(188,0,1),(206,0,1),(218,0,1),(292,0,1),(338,0,1),(375,0,1),
(381,0,1),(409,0,1),(466,0,1),(469,0,1),(498,0,1),(656,0,1);
@ -150,7 +145,8 @@ DROP TABLE t1,t2,t3;
#
# MDEV-25858: Query results are incorrect when indexes are added
#
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb;
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb
STATS_PERSISTENT=0;
insert into t1 values (1),(2),(3);
CREATE TABLE t2 (
id int NOT NULL PRIMARY KEY,

View file

@ -2,16 +2,14 @@
# ORDER BY handling (e.g. filesort) tests that require innodb
#
-- source include/have_innodb.inc
--disable_warnings
drop table if exists t0,t1,t2,t3;
--enable_warnings
-- source include/have_sequence.inc
--echo #
--echo # MDEV-6434: Wrong result (extra rows) with ORDER BY, multiple-column index, InnoDB
--echo #
CREATE TABLE t1 (a INT, b INT, c INT, d TEXT, KEY idx(a,b,c)) ENGINE=InnoDB;
CREATE TABLE t1 (a INT, b INT, c INT, d TEXT, KEY idx(a,b,c)) ENGINE=InnoDB
STATS_PERSISTENT=0;
INSERT INTO t1 (a,c) VALUES
(8, 9),(8, 10),(13, 15),(16, 17),(16, 18),(16, 19),(20, 21),
@ -24,9 +22,6 @@ DROP TABLE t1;
--echo #
--echo # MDEV-9457: Poor query plan chosen for ORDER BY query by a recent 10.1
--echo #
create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (
pk int primary key,
key1 int,
@ -34,16 +29,10 @@ create table t1 (
col1 char(255),
key(key1),
key(key2)
) engine=innodb;
) engine=innodb stats_persistent=0;
set @a=-1;
insert into t1
select
@a:=@a+1,
@a,
@a,
repeat('abcd', 63)
from t0 A, t0 B, t0 C, t0 D;
select seq,seq,seq,repeat('abcd', 63) from seq_0_to_9999;
--echo # The following must NOT use 'index' on PK.
--echo # It should use index_merge(key1,key2) + filesort
@ -60,7 +49,7 @@ select *
from t1
where key1<3 or key2<3;
drop table t0, t1;
drop table t1;
--echo #
--echo # MDEV-18094: Query with order by limit picking index scan over filesort
@ -93,9 +82,12 @@ drop table t1,t0;
--echo # (duplicate of MDEV-13994)
--echo #
CREATE TABLE t1 (i int, j int, z int,PRIMARY KEY (i,j), KEY (z)) ENGINE=InnoDB;
CREATE TABLE t2 (i int, j int, PRIMARY KEY (i,j)) ENGINE=InnoDB;
CREATE TABLE t3 (j int, n varchar(5), PRIMARY KEY (j)) ENGINE=InnoDB;
CREATE TABLE t1 (i int, j int, z int,PRIMARY KEY (i,j), KEY (z)) ENGINE=InnoDB
STATS_PERSISTENT=0;
CREATE TABLE t2 (i int, j int, PRIMARY KEY (i,j)) ENGINE=InnoDB
STATS_PERSISTENT=0;
CREATE TABLE t3 (j int, n varchar(5), PRIMARY KEY (j)) ENGINE=InnoDB
STATS_PERSISTENT=0;
INSERT INTO t1 VALUES
(127,0,1),(188,0,1),(206,0,1),(218,0,1),(292,0,1),(338,0,1),(375,0,1),
@ -139,7 +131,8 @@ DROP TABLE t1,t2,t3;
--echo # MDEV-25858: Query results are incorrect when indexes are added
--echo #
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb;
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb
STATS_PERSISTENT=0;
insert into t1 values (1),(2),(3);
CREATE TABLE t2 (

View file

@ -1,15 +1,11 @@
#
# Range optimizer (and related) tests that need InnoDB.
#
drop table if exists t0, t1, t2;
#
# MDEV-6735: Range checked for each record used with key
#
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1(a int);
insert into t1 select A.a + B.a* 10 + C.a * 100 + D.a * 1000
from t0 A, t0 B, t0 C, t0 D;
create table t2 (
a int,
b int,
@ -22,12 +18,12 @@ key(b)
) engine=innodb;
insert into t2
select
a,a,
seq,seq,
repeat('0123456789', 10),
repeat('0123456789', 10),
repeat('0123456789', 10),
repeat('0123456789', 10)
from t1;
from seq_0_to_9999;
analyze table t2;
Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
@ -37,7 +33,7 @@ explain select * from t0 left join t2 on t2.a <t0.a and t2.b between 50 and 250;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 10
1 SIMPLE t2 range a,b b 5 NULL 201 Using where; Using join buffer (flat, BNL join)
drop table t0,t1,t2;
drop table t0,t2;
#
# MDEV-10466: constructing an invalid SEL_ARG
#
@ -89,15 +85,14 @@ drop table t1,t2;
#
set @optimizer_switch_save= @@optimizer_switch;
set optimizer_switch='index_merge_sort_intersection=off';
create table t0 (a int)engine=innodb;
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (
a int, b int, c int,
key(a),key(b),key(c)
)engine=innodb;
insert into t1
select A.a+10*B.a, A.a+10*B.a, A.a+10*B.a+100*C.a
from t0 A, t0 B, t0 C, t0 D where D.a<5;
select a.seq/10, a.seq/10, a.seq from seq_0_to_499 a, seq_0_to_4 b;
SET @saved_dbug = @@GLOBAL.debug_dbug;
set @@global.debug_dbug="+d,ha_index_init_fail";
explain select * from t1 where a=10 and b=10;

View file

@ -4,12 +4,9 @@
--source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_sequence.inc
--source include/no_valgrind_without_big.inc
--disable_warnings
drop table if exists t0, t1, t2;
--enable_warnings
--echo #
--echo # MDEV-6735: Range checked for each record used with key
--echo #
@ -17,10 +14,6 @@ drop table if exists t0, t1, t2;
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1(a int);
insert into t1 select A.a + B.a* 10 + C.a * 100 + D.a * 1000
from t0 A, t0 B, t0 C, t0 D;
create table t2 (
a int,
b int,
@ -34,18 +27,18 @@ create table t2 (
insert into t2
select
a,a,
seq,seq,
repeat('0123456789', 10),
repeat('0123456789', 10),
repeat('0123456789', 10),
repeat('0123456789', 10)
from t1;
from seq_0_to_9999;
analyze table t2;
--echo # The following must not use "Range checked for each record":
explain select * from t0 left join t2 on t2.a <t0.a and t2.b between 50 and 250;
drop table t0,t1,t2;
drop table t0,t2;
--echo #
@ -98,15 +91,14 @@ drop table t1,t2;
set @optimizer_switch_save= @@optimizer_switch;
set optimizer_switch='index_merge_sort_intersection=off';
create table t0 (a int)engine=innodb;
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (
a int, b int, c int,
key(a),key(b),key(c)
)engine=innodb;
insert into t1
select A.a+10*B.a, A.a+10*B.a, A.a+10*B.a+100*C.a
from t0 A, t0 B, t0 C, t0 D where D.a<5;
select a.seq/10, a.seq/10, a.seq from seq_0_to_499 a, seq_0_to_4 b;
SET @saved_dbug = @@GLOBAL.debug_dbug;
set @@global.debug_dbug="+d,ha_index_init_fail";
explain select * from t1 where a=10 and b=10;
@ -122,8 +114,6 @@ set @@optimizer_switch= @optimizer_switch_save;
--echo # MDEV-27262: Index intersection with full scan over an index
--echo #
--source include/have_sequence.inc
CREATE TABLE t1 (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
p char(32) DEFAULT NULL,

View file

@ -2,10 +2,8 @@ set default_storage_engine=innodb;
#
# MDEV-22761 KILL QUERY during rowid_filter, crashes
#
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t2(a int);
insert into t2 select A.a + B.a* 10 from t0 A, t0 B;
insert into t2 select * from seq_0_to_99;
CREATE TABLE t3 (
key1 int ,
key2 int,
@ -19,11 +17,10 @@ engine
InnoDB
insert into t3
select
A.a,
B.a,
A.seq,
B.seq,
'filler-data-filler-data'
from
t2 A, t2 B;
from seq_0_to_99 A, seq_0_to_99 B;
analyze table t2,t3;
Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
@ -42,7 +39,6 @@ select * from t2, t3
where
t3.key1=t2.a and t3.key2 in (2,3);
connect con1, localhost, root,,;
connection con1;
set debug_sync='now WAIT_FOR at_rowid_filter_check';
kill query $target_id;
set debug_sync='now SIGNAL go';
@ -50,7 +46,7 @@ connection default;
disconnect con1;
ERROR 70100: Query execution was interrupted
set debug_sync='RESET';
drop table t0,t2,t3;
drop table t2,t3;
set default_storage_engine=default;
set @save_optimizer_switch= @@optimizer_switch;
set @save_use_stat_tables= @@use_stat_tables;
@ -67,7 +63,6 @@ INSERT INTO t1 VALUES (0,0),(1,0),(-1,1), (-2,1), (-2,3), (-3,4), (-2,4);
set debug_sync='handler_rowid_filter_check SIGNAL killme WAIT_FOR go';
SELECT * FROM t1 WHERE a > 0 AND b=0;
connect con1, localhost, root,,;
connection con1;
set debug_sync='now WAIT_FOR killme';
kill query @id;
set debug_sync='now SIGNAL go';

View file

@ -31,7 +31,6 @@ set debug_sync='handler_rowid_filter_check SIGNAL killme WAIT_FOR go';
send SELECT * FROM t1 WHERE a > 0 AND b=0;
connect (con1, localhost, root,,);
connection con1;
let $ignore= `SELECT @id := $ID`;
set debug_sync='now WAIT_FOR killme';
kill query @id;

View file

@ -1,10 +1,8 @@
#
# MDEV-22761 KILL QUERY during rowid_filter, crashes
#
create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t2(a int);
insert into t2 select A.a + B.a* 10 from t0 A, t0 B;
insert into t2 select * from seq_0_to_99;
CREATE TABLE t3 (
key1 int ,
key2 int,
@ -18,11 +16,10 @@ engine
MyISAM
insert into t3
select
A.a,
B.a,
A.seq,
B.seq,
'filler-data-filler-data'
from
t2 A, t2 B;
from seq_0_to_99 A, seq_0_to_99 B;
analyze table t2,t3;
Table Op Msg_type Msg_text
test.t2 analyze status Engine-independent statistics collected
@ -41,7 +38,6 @@ select * from t2, t3
where
t3.key1=t2.a and t3.key2 in (2,3);
connect con1, localhost, root,,;
connection con1;
set debug_sync='now WAIT_FOR at_rowid_filter_check';
kill query $target_id;
set debug_sync='now SIGNAL go';
@ -49,4 +45,4 @@ connection default;
disconnect con1;
ERROR 70100: Query execution was interrupted
set debug_sync='RESET';
drop table t0,t2,t3;
drop table t2,t3;

View file

@ -471,6 +471,51 @@ a
1
2
3
#
# MDEV-29655: ASAN heap-use-after-free in
# Pushdown_derived::Pushdown_derived
#
connection slave;
DROP TABLE IF EXISTS federated.t1;
CREATE TABLE federated.t1 (
id int(20) NOT NULL,
name varchar(16) NOT NULL default ''
)
DEFAULT CHARSET=latin1;
INSERT INTO federated.t1 VALUES
(3,'xxx'), (7,'yyy'), (4,'xxx'), (1,'zzz'), (5,'yyy');
connection master;
DROP TABLE IF EXISTS federated.t1;
CREATE TABLE federated.t1 (
id int(20) NOT NULL,
name varchar(16) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1';
use federated;
SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3
WHERE id=2) dt2) dt;
id name
connection slave;
CREATE TABLE federated.t10 (a INT,b INT);
CREATE TABLE federated.t11 (a INT, b INT);
INSERT INTO federated.t10 VALUES (1,1),(2,2);
INSERT INTO federated.t11 VALUES (1,1),(2,2);
connection master;
CREATE TABLE federated.t10
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/federated/t10';
CREATE TABLE federated.t11
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/federated/t11';
use federated;
SELECT * FROM t10 LEFT JOIN
(t11, (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3
WHERE id=2) dt2) dt
) ON t10.a=t11.a;
a b a b id name
1 1 NULL NULL NULL NULL
2 2 NULL NULL NULL NULL
set global federated_pushdown=0;
connection master;
DROP TABLE IF EXISTS federated.t1;

View file

@ -267,7 +267,6 @@ INSERT INTO federated.t2
SELECT * FROM (SELECT * FROM federated.t1 LIMIT 70000) dt;
SELECT COUNT(DISTINCT a) FROM federated.t2;
--echo #
--echo # MDEV-29640 FederatedX does not properly handle pushdown
--echo # in case of difference in local and remote table names
@ -314,6 +313,64 @@ CREATE TABLE federated.t3 (a INT)
EXPLAIN SELECT * FROM federated.t3;
SELECT * FROM federated.t3;
--echo #
--echo # MDEV-29655: ASAN heap-use-after-free in
--echo # Pushdown_derived::Pushdown_derived
--echo #
connection slave;
DROP TABLE IF EXISTS federated.t1;
CREATE TABLE federated.t1 (
id int(20) NOT NULL,
name varchar(16) NOT NULL default ''
)
DEFAULT CHARSET=latin1;
INSERT INTO federated.t1 VALUES
(3,'xxx'), (7,'yyy'), (4,'xxx'), (1,'zzz'), (5,'yyy');
connection master;
DROP TABLE IF EXISTS federated.t1;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t1 (
id int(20) NOT NULL,
name varchar(16) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1';
use federated;
SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3
WHERE id=2) dt2) dt;
connection slave;
CREATE TABLE federated.t10 (a INT,b INT);
CREATE TABLE federated.t11 (a INT, b INT);
INSERT INTO federated.t10 VALUES (1,1),(2,2);
INSERT INTO federated.t11 VALUES (1,1),(2,2);
connection master;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t10
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t10';
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval
CREATE TABLE federated.t11
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t11';
use federated;
SELECT * FROM t10 LEFT JOIN
(t11, (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3
WHERE id=2) dt2) dt
) ON t10.a=t11.a;
set global federated_pushdown=0;
source include/federated_cleanup.inc;

View file

@ -13,3 +13,4 @@
rtree_concurrent_srch : MDEV-15284 COUNT(*) mismatch
rtree_recovery : MDEV-15284 COUNT(*) mismatch
rtree_compress2 : MDEV-16269 CHECK TABLE reports wrong count
types : MDEV-22512 recovery runs out of memory before 10.5

View file

@ -795,4 +795,14 @@ ENGINE=InnoDB;
INSERT INTO t VALUES (REPEAT('MariaDB Corporation Ab ',351),POINT(0,0));
ALTER TABLE t FORCE;
DROP TABLE t;
#
# MDEV-29856 heap-use-after-poison in row_merge_spatial_rows()
# with PRIMARY KEY on column prefix
#
CREATE TABLE t (id INT, f TEXT, s POINT NOT NULL,
PRIMARY KEY(id,f(1)), SPATIAL(s)) ENGINE=InnoDB;
INSERT INTO t VALUES
(1,REPEAT('x',8192),@p:=ST_GeomFromText('POINT(0 0)')),(2,'',@p);
ALTER TABLE t FORCE;
DROP TABLE t;
# End of 10.3 tests

View file

@ -791,4 +791,16 @@ ALTER TABLE t FORCE;
# Cleanup
DROP TABLE t;
--echo #
--echo # MDEV-29856 heap-use-after-poison in row_merge_spatial_rows()
--echo # with PRIMARY KEY on column prefix
--echo #
CREATE TABLE t (id INT, f TEXT, s POINT NOT NULL,
PRIMARY KEY(id,f(1)), SPATIAL(s)) ENGINE=InnoDB;
INSERT INTO t VALUES
(1,REPEAT('x',8192),@p:=ST_GeomFromText('POINT(0 0)')),(2,'',@p);
ALTER TABLE t FORCE;
DROP TABLE t;
--echo # End of 10.3 tests

View file

@ -1 +1 @@
recover : MDEV-22512 recovery runs out of memory before 10.5

View file

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

View file

@ -12,3 +12,18 @@ SELECT * FROM t;
i
1
DROP TABLE t;
#
# MDEV-27121 mariabackup incompatible with disabled dedicated
# undo log tablespaces
#
call mtr.add_suppression("InnoDB: innodb_undo_tablespaces=0 disables dedicated undo log tablespaces");
# restart: --innodb_undo_tablespaces=0
# xtrabackup backup
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart: --innodb_undo_tablespaces=0
# Display undo log files from target directory
undo001
undo002

View file

@ -29,3 +29,27 @@ SELECT * FROM t;
DROP TABLE t;
rmdir $targetdir;
--echo #
--echo # MDEV-27121 mariabackup incompatible with disabled dedicated
--echo # undo log tablespaces
--echo #
call mtr.add_suppression("InnoDB: innodb_undo_tablespaces=0 disables dedicated undo log tablespaces");
let $restart_parameters=--innodb_undo_tablespaces=0;
--source include/restart_mysqld.inc
echo # xtrabackup backup;
--disable_result_log
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir;
--enable_result_log
echo # xtrabackup prepare;
--disable_result_log
exec $XTRABACKUP --prepare --target-dir=$targetdir;
-- source include/restart_and_restore.inc
--enable_result_log
--echo # Display undo log files from target directory
list_files $targetdir undo*;
rmdir $targetdir;

View file

@ -0,0 +1,5 @@
[crc32]
--innodb-checksum-algorithm=crc32
[full_crc32]
--innodb-checksum-algorithm=full_crc32

View file

@ -202,7 +202,7 @@ int start_addr2line_fork(const char *binary_path)
close(out[0]);
close(out[1]);
execlp("addr2line", "addr2line", "-C", "-f", "-e", binary_path, NULL);
exit(1);
_exit(1);
}
close(in[0]);

View file

@ -23,7 +23,7 @@
#ifndef MAIN
#if defined(_AIX) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__linux__) || defined(__sun) || defined(_WIN32)
#if defined(_AIX) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__linux__) || defined(__sun) || defined(_WIN32)
static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
{
uint i, res= 1;
@ -35,8 +35,14 @@ static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
}
#endif
#if defined(__APPLE__) || defined(__FreeBSD__)
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#ifdef __OpenBSD__
#include <netinet/in.h>
#include <net/if_arp.h>
#include <netinet/if_ether.h>
#else
#include <net/ethernet.h>
#endif
#include <sys/sysctl.h>
#include <net/route.h>
#include <net/if.h>

View file

@ -44,11 +44,6 @@ Pushdown_derived::Pushdown_derived(TABLE_LIST *tbl, derived_handler *h)
}
Pushdown_derived::~Pushdown_derived()
{
delete handler;
}
int Pushdown_derived::execute()
{

View file

@ -1760,12 +1760,6 @@ public:
Used by the ALTER TABLE
*/
virtual bool is_equal(const Column_definition &new_field) const= 0;
// Used as double dispatch pattern: calls virtual method of handler
virtual bool
can_be_converted_by_engine(const Column_definition &new_type) const
{
return false;
}
/* convert decimal to longlong with overflow check */
longlong convert_decimal2longlong(const my_decimal *val, bool unsigned_flag,
int *err);
@ -4052,11 +4046,6 @@ public:
void sql_type(String &str) const override;
void sql_rpl_type(String*) const override;
bool is_equal(const Column_definition &new_field) const override;
bool can_be_converted_by_engine(const Column_definition &new_type) const
override
{
return table->file->can_convert_string(this, new_type);
}
uchar *pack(uchar *to, const uchar *from, uint max_length) override;
const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data) override;
@ -4211,11 +4200,6 @@ public:
uchar *new_ptr, uint32 length,
uchar *new_null_ptr, uint new_null_bit) override;
bool is_equal(const Column_definition &new_field) const override;
bool can_be_converted_by_engine(const Column_definition &new_type) const
override
{
return table->file->can_convert_varstring(this, new_type);
}
void hash(ulong *nr, ulong *nr2) override;
uint length_size() const override { return length_bytes; }
void print_key_value(String *out, uint32 length) override;
@ -4654,11 +4638,6 @@ public:
uint32 char_length() const override;
uint32 character_octet_length() const override;
bool is_equal(const Column_definition &new_field) const override;
bool can_be_converted_by_engine(const Column_definition &new_type) const
override
{
return table->file->can_convert_blob(this, new_type);
}
void print_key_value(String *out, uint32 length) override;
Binlog_type_info binlog_type_info() const override;

View file

@ -12120,35 +12120,12 @@ int ha_partition::info_push(uint info_type, void *info)
bool
ha_partition::can_convert_string(const Field_string* field,
const Column_definition& new_type) const
ha_partition::can_convert_nocopy(const Field &field,
const Column_definition &new_type) const
{
for (uint index= 0; index < m_tot_parts; index++)
{
if (!m_file[index]->can_convert_string(field, new_type))
return false;
}
return true;
}
bool
ha_partition::can_convert_varstring(const Field_varstring* field,
const Column_definition& new_type) const{
for (uint index= 0; index < m_tot_parts; index++)
{
if (!m_file[index]->can_convert_varstring(field, new_type))
return false;
}
return true;
}
bool
ha_partition::can_convert_blob(const Field_blob* field,
const Column_definition& new_type) const
{
for (uint index= 0; index < m_tot_parts; index++)
{
if (!m_file[index]->can_convert_blob(field, new_type))
if (!m_file[index]->can_convert_nocopy(field, new_type))
return false;
}
return true;

View file

@ -1629,16 +1629,8 @@ public:
friend int cmp_key_rowid_part_id(void *ptr, uchar *ref1, uchar *ref2);
friend int cmp_key_part_id(void *key_p, uchar *ref1, uchar *ref2);
bool can_convert_string(
const Field_string* field,
const Column_definition& new_field) const override;
bool can_convert_varstring(
const Field_varstring* field,
const Column_definition& new_field) const override;
bool can_convert_blob(
const Field_blob* field,
const Column_definition& new_field) const override;
bool can_convert_nocopy(const Field &field,
const Column_definition &new_field) const override;
};
#endif /* HA_PARTITION_INCLUDED */

View file

@ -7320,8 +7320,13 @@ int handler::check_duplicate_long_entries_update(const uchar *new_rec)
{
int error;
field= keypart->field;
/* Compare fields if they are different then check for duplicates */
if (field->cmp_binary_offset(reclength))
/*
Compare fields if they are different then check for duplicates
cmp_binary_offset cannot differentiate between null and empty string
So also check for that too
*/
if((field->is_null(0) != field->is_null(reclength)) ||
field->cmp_binary_offset(reclength))
{
if((error= check_duplicate_long_entry_key(new_rec, i)))
return error;

View file

@ -5172,18 +5172,8 @@ public:
These functions check for such possibility.
Implementation could be based on Field_xxx::is_equal()
*/
virtual bool can_convert_string(const Field_string *field,
const Column_definition &new_type) const
{
return false;
}
virtual bool can_convert_varstring(const Field_varstring *field,
const Column_definition &new_type) const
{
return false;
}
virtual bool can_convert_blob(const Field_blob *field,
const Column_definition &new_type) const
virtual bool can_convert_nocopy(const Field &,
const Column_definition &) const
{
return false;
}

View file

@ -4089,8 +4089,8 @@ static int init_common_variables()
files= my_set_max_open_files(max_open_files);
SYSVAR_AUTOSIZE_IF_CHANGED(open_files_limit, files, ulong);
if (files < wanted_files && global_system_variables.log_warnings)
sql_print_warning("Could not increase number of max_open_files to more than %u (request: %u)", files, wanted_files);
if (files < max_open_files && global_system_variables.log_warnings)
sql_print_warning("Could not increase number of max_open_files to more than %u (request: %u)", files, max_open_files);
/* If we required too much tc_instances than we reduce */
SYSVAR_AUTOSIZE_IF_CHANGED(tc_instances,

View file

@ -1016,11 +1016,7 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived)
/* Create an object for execution of the query specifying the table */
if (!(derived->pushdown_derived=
new (thd->mem_root) Pushdown_derived(derived, derived->dt_handler)))
{
delete derived->dt_handler;
derived->dt_handler= NULL;
DBUG_RETURN(TRUE);
}
}
lex->current_select= first_select;
@ -1245,7 +1241,6 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived)
/* Execute the query that specifies the derived table by a foreign engine */
res= derived->pushdown_derived->execute();
unit->executed= true;
delete derived->pushdown_derived;
DBUG_RETURN(res);
}

View file

@ -67,6 +67,7 @@
#include "select_handler.h"
#include "my_json_writer.h"
#include "opt_trace.h"
#include "derived_handler.h"
#include "create_tmp_table.h"
/*
@ -14579,6 +14580,7 @@ void JOIN::cleanup(bool full)
}
}
}
free_pushdown_handlers(*join_list);
}
/* Restore ref array to original state */
if (current_ref_ptrs != items0)
@ -14589,6 +14591,32 @@ void JOIN::cleanup(bool full)
DBUG_VOID_RETURN;
}
/**
Clean up all derived pushdown handlers in this join.
@detail
Note that dt_handler is picked at the prepare stage (as opposed
to optimization stage where one could expect this).
Because of that, we have to do cleanups in this function that is called
from JOIN::cleanup() and not in JOIN_TAB::cleanup.
*/
void JOIN::free_pushdown_handlers(List<TABLE_LIST>& join_list)
{
List_iterator<TABLE_LIST> li(join_list);
TABLE_LIST *table_ref;
while ((table_ref= li++))
{
if (table_ref->nested_join)
free_pushdown_handlers(table_ref->nested_join->join_list);
if (table_ref->pushdown_derived)
{
delete table_ref->pushdown_derived;
table_ref->pushdown_derived= NULL;
}
delete table_ref->dt_handler;
table_ref->dt_handler= NULL;
}
}
/**
Remove the following expressions from ORDER BY and GROUP BY:
@ -28071,12 +28099,6 @@ bool mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
result, unit, first);
}
if (unit->derived && unit->derived->pushdown_derived)
{
delete unit->derived->pushdown_derived;
unit->derived->pushdown_derived= NULL;
}
DBUG_RETURN(res || thd->is_error());
}

View file

@ -1791,6 +1791,7 @@ private:
bool add_having_as_table_cond(JOIN_TAB *tab);
bool make_aggr_tables_info();
bool add_fields_for_current_rowid(JOIN_TAB *cur, List<Item> *fields);
void free_pushdown_handlers(List<TABLE_LIST>& join_list);
void init_join_cache_and_keyread();
bool transform_in_predicates_into_equalities(THD *thd);
bool transform_all_conds_and_on_exprs(THD *thd,
@ -2471,8 +2472,6 @@ public:
Pushdown_derived(TABLE_LIST *tbl, derived_handler *h);
~Pushdown_derived();
int execute();
};

View file

@ -6436,7 +6436,7 @@ static bool fill_alter_inplace_info(THD *thd, TABLE *table, bool varchar,
bool is_equal= field->is_equal(*new_field);
if (!is_equal)
{
if (field->can_be_converted_by_engine(*new_field))
if (field->table->file->can_convert_nocopy(*field, *new_field))
{
/*
New column type differs from the old one, but storage engine can

View file

@ -2,7 +2,7 @@
#define SQL_TYPE_GEOM_H_INCLUDED
/*
Copyright (c) 2015 MariaDB Foundation
Copyright (c) 2019 MariaDB
Copyright (c) 2019, 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -397,12 +397,6 @@ public:
!table->copy_blobs;
}
bool is_equal(const Column_definition &new_field) const override;
bool can_be_converted_by_engine(const Column_definition &new_type)
const override
{
return false; // Override the Field_blob behavior
}
int store(const char *to, size_t length, CHARSET_INFO *charset) override;
int store(double nr) override;
int store(longlong nr, bool unsigned_val) override;

View file

@ -563,8 +563,9 @@ inline void PageBulk::finish()
void PageBulk::commit(bool success)
{
finish();
if (success && !dict_index_is_clust(m_index) && page_is_leaf(m_page))
ibuf_set_bitmap_for_bulk_load(m_block, innobase_fill_factor == 100);
if (success && !m_index->is_clust() && page_is_leaf(m_page))
ibuf_set_bitmap_for_bulk_load(m_block, &m_mtr,
innobase_fill_factor == 100);
m_mtr.commit();
}

View file

@ -591,7 +591,7 @@ buf_page_is_corrupted(
DBUG_EXECUTE_IF(
"page_intermittent_checksum_mismatch", {
static int page_counter;
if (page_counter++ == 2) {
if (page_counter++ == 3) {
crc32++;
}
});
@ -726,7 +726,7 @@ buf_page_is_corrupted(
DBUG_EXECUTE_IF(
"page_intermittent_checksum_mismatch", {
static int page_counter;
if (page_counter++ == 2) return true;
if (page_counter++ == 3) return true;
});
if ((checksum_field1 != crc32

View file

@ -54,7 +54,7 @@ this program; if not, write to the Free Software Foundation, Inc.,
#include <my_bitmap.h>
#include <mysql/service_thd_alloc.h>
#include <mysql/service_thd_wait.h>
#include "field.h"
#include "sql_type_geom.h"
#include "scope.h"
#include "srv0srv.h"
@ -20589,6 +20589,26 @@ bool ha_innobase::can_convert_blob(const Field_blob *field,
return true;
}
bool ha_innobase::can_convert_nocopy(const Field &field,
const Column_definition &new_type) const
{
if (const Field_string *tf= dynamic_cast<const Field_string *>(&field))
return can_convert_string(tf, new_type);
if (const Field_varstring *tf= dynamic_cast<const Field_varstring *>(&field))
return can_convert_varstring(tf, new_type);
if (dynamic_cast<const Field_geom *>(&field))
return false;
if (const Field_blob *tf= dynamic_cast<const Field_blob *>(&field))
return can_convert_blob(tf, new_type);
return false;
}
Compare_keys ha_innobase::compare_key_parts(
const Field &old_field, const Column_definition &new_field,
const KEY_PART_INFO &old_part, const KEY_PART_INFO &new_part) const
@ -20599,7 +20619,7 @@ Compare_keys ha_innobase::compare_key_parts(
if (!is_equal)
{
if (!old_field.can_be_converted_by_engine(new_field))
if (!old_field.table->file->can_convert_nocopy(old_field, new_field))
return Compare_keys::NotEqual;
if (!Charset(old_cs).eq_collation_specific_names(new_cs))

View file

@ -422,15 +422,9 @@ public:
@retval false if pushed (always) */
bool rowid_filter_push(Rowid_filter *rowid_filter) override;
bool
can_convert_string(const Field_string* field,
const Column_definition& new_field) const override;
bool can_convert_varstring(
const Field_varstring* field,
const Column_definition& new_field) const override;
bool
can_convert_blob(const Field_blob* field,
const Column_definition& new_field) const override;
bool can_convert_nocopy(const Field &field,
const Column_definition& new_field) const
override;
/** @return whether innodb_strict_mode is active */
static bool is_innodb_strict_mode(THD* thd);
@ -445,6 +439,16 @@ public:
const KEY_PART_INFO& new_part) const override;
protected:
bool
can_convert_string(const Field_string* field,
const Column_definition& new_field) const;
bool can_convert_varstring(
const Field_varstring* field,
const Column_definition& new_field) const;
bool
can_convert_blob(const Field_blob* field,
const Column_definition& new_field) const;
dberr_t innobase_get_autoinc(ulonglong* value);
dberr_t innobase_lock_autoinc();
ulonglong innobase_peek_autoinc();

View file

@ -2464,6 +2464,7 @@ ibuf_merge_space(
ut_ad(space < SRV_SPACE_ID_UPPER_BOUND);
log_free_check();
ibuf_mtr_start(&mtr);
/* Position the cursor on the first matching record. */
@ -2566,6 +2567,7 @@ ulint ibuf_merge_all()
ulint n_pages = srv_io_capacity;
for (ulint sum_pages = 0; sum_pages < n_pages; ) {
log_free_check();
ulint n_pag2;
ulint n_bytes = ibuf_merge(&n_pag2);
@ -4461,7 +4463,7 @@ reset_bit:
}
/** Delete all change buffer entries for a tablespace,
in DISCARD TABLESPACE, IMPORT TABLESPACE, or crash recovery.
in DISCARD TABLESPACE, IMPORT TABLESPACE, or read-ahead.
@param[in] space missing or to-be-discarded tablespace */
void ibuf_delete_for_discarded_space(ulint space)
{
@ -4483,6 +4485,7 @@ void ibuf_delete_for_discarded_space(ulint space)
memset(dops, 0, sizeof(dops));
loop:
log_free_check();
ibuf_mtr_start(&mtr);
/* Position pcur in the insert buffer at the first entry for the
@ -4622,9 +4625,6 @@ dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space)
}
mtr_start(&mtr);
mtr_set_log_mode(&mtr, MTR_LOG_NO_REDO);
ibuf_enter(&mtr);
buf_block_t* bitmap_page = ibuf_bitmap_get_map_page(
@ -4712,29 +4712,18 @@ dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space)
return(DB_SUCCESS);
}
/** Updates free bits and buffered bits for bulk loaded page.
@param[in] block index page
@param[in] reset flag if reset free val */
void
ibuf_set_bitmap_for_bulk_load(
buf_block_t* block,
bool reset)
void ibuf_set_bitmap_for_bulk_load(buf_block_t *block, mtr_t *mtr, bool reset)
{
mtr_t mtr;
ut_a(page_is_leaf(block->page.frame));
mtr.start();
fil_space_t *space= mtr.set_named_space_id(block->page.id().space());
if (buf_block_t *bitmap_page=
ibuf_bitmap_get_map_page(block->page.id(), space->zip_size(), &mtr))
ibuf_bitmap_get_map_page(block->page.id(), block->zip_size(), mtr))
{
ulint free_val= reset ? 0 : ibuf_index_page_calc_free(block);
/* FIXME: update the bitmap byte only once! */
ibuf_bitmap_page_set_bits<IBUF_BITMAP_FREE>
(bitmap_page, block->page.id(), block->physical_size(), free_val, &mtr);
(bitmap_page, block->page.id(), block->physical_size(), free_val, mtr);
ibuf_bitmap_page_set_bits<IBUF_BITMAP_BUFFERED>
(bitmap_page, block->page.id(), block->physical_size(), false, &mtr);
(bitmap_page, block->page.id(), block->physical_size(), false, mtr);
}
mtr.commit();
}

View file

@ -264,7 +264,6 @@ ibuf_page_low(
MY_ATTRIBUTE((warn_unused_result));
#ifdef UNIV_DEBUG
/** Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages.
Must not be called when recv_no_ibuf_operations==true.
@param[in] page_id tablespace/page identifier
@ -274,7 +273,7 @@ Must not be called when recv_no_ibuf_operations==true.
# define ibuf_page(page_id, zip_size, mtr) \
ibuf_page_low(page_id, zip_size, true, mtr)
#else /* UVIV_DEBUG */
#else /* UNIV_DEBUG */
/** Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages.
Must not be called when recv_no_ibuf_operations==true.
@ -285,7 +284,7 @@ Must not be called when recv_no_ibuf_operations==true.
# define ibuf_page(page_id, zip_size, mtr) \
ibuf_page_low(page_id, zip_size, mtr)
#endif /* UVIV_DEBUG */
#endif /* UNIV_DEBUG */
/***********************************************************************//**
Frees excess pages from the ibuf free list. This function is called when an OS
thread calls fsp services to allocate a new file segment, or a new page to a
@ -334,7 +333,7 @@ dberr_t ibuf_merge_or_delete_for_page(buf_block_t *block,
ulint zip_size);
/** Delete all change buffer entries for a tablespace,
in DISCARD TABLESPACE, IMPORT TABLESPACE, or crash recovery.
in DISCARD TABLESPACE, IMPORT TABLESPACE, or read-ahead.
@param[in] space missing or to-be-discarded tablespace */
void ibuf_delete_for_discarded_space(ulint space);
@ -385,13 +384,11 @@ ibuf_close(void);
dberr_t ibuf_check_bitmap_on_import(const trx_t* trx, fil_space_t* space)
MY_ATTRIBUTE((nonnull, warn_unused_result));
/** Updates free bits and buffered bits for bulk loaded page.
@param[in] block index page
@param]in] reset flag if reset free val */
void
ibuf_set_bitmap_for_bulk_load(
buf_block_t* block,
bool reset);
/** Update free bits and buffered bits for bulk loaded page.
@param block secondary index leaf page
@param mtr mini-transaction
@param reset whether the page is full */
void ibuf_set_bitmap_for_bulk_load(buf_block_t *block, mtr_t *mtr, bool reset);
#define IBUF_HEADER_PAGE_NO FSP_IBUF_HEADER_PAGE_NO
#define IBUF_TREE_ROOT_PAGE_NO FSP_IBUF_TREE_ROOT_PAGE_NO

View file

@ -1781,7 +1781,7 @@ ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
if (!log_crypt_101_read_checkpoint(buf))
{
ib::error() << "Decrypting checkpoint failed";
sql_print_error("InnoDB: Decrypting checkpoint failed");
continue;
}
@ -1803,11 +1803,11 @@ ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
if (!lsn)
{
ib::error() << "Upgrade after a crash is not supported."
" This redo log was created before MariaDB 10.2.2,"
" and we did not find a valid checkpoint."
" Please follow the instructions at"
" https://mariadb.com/kb/en/library/upgrading/";
sql_print_error("InnoDB: Upgrade after a crash is not supported."
" This redo log was created before MariaDB 10.2.2,"
" and we did not find a valid checkpoint."
" Please follow the instructions at"
" https://mariadb.com/kb/en/library/upgrading/");
return DB_ERROR;
}
@ -1816,7 +1816,7 @@ ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
const lsn_t source_offset= log_sys.log.calc_lsn_offset_old(lsn);
static constexpr char NO_UPGRADE_RECOVERY_MSG[]=
"Upgrade after a crash is not supported."
"InnoDB: Upgrade after a crash is not supported."
" This redo log was created before MariaDB 10.2.2";
recv_sys.read(source_offset & ~511, {buf, 512});
@ -1824,7 +1824,7 @@ ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
if (log_block_calc_checksum_format_0(buf) != log_block_get_checksum(buf) &&
!log_crypt_101_read_block(buf, lsn))
{
ib::error() << NO_UPGRADE_RECOVERY_MSG << ", and it appears corrupted.";
sql_print_error("%s, and it appears corrupted.", NO_UPGRADE_RECOVERY_MSG);
return DB_CORRUPTION;
}
@ -1841,10 +1841,13 @@ ATTRIBUTE_COLD static dberr_t recv_log_recover_pre_10_2()
}
if (buf[20 + 32 * 9] == 2)
ib::error() << "Cannot decrypt log for upgrading."
" The encrypted log was created before MariaDB 10.2.2.";
sql_print_error("InnoDB: Cannot decrypt log for upgrading."
" The encrypted log was created before MariaDB 10.2.2.");
else
ib::error() << NO_UPGRADE_RECOVERY_MSG << ".";
sql_print_error("%s. You must start up and shut down"
" MariaDB 10.1 or MySQL 5.6 or earlier"
" on the data directory.",
NO_UPGRADE_RECOVERY_MSG);
return DB_ERROR;
}
@ -1951,8 +1954,8 @@ recv_find_max_checkpoint(ulint* max_field)
: 0;
if (log_sys.log.format != log_t::FORMAT_3_23
&& !recv_check_log_header_checksum(buf)) {
ib::error() << "Invalid redo log header checksum.";
return(DB_CORRUPTION);
sql_print_error("InnoDB: Invalid redo log header checksum.");
return DB_CORRUPTION;
}
char creator[LOG_HEADER_CREATOR_END - LOG_HEADER_CREATOR + 1];
@ -1974,9 +1977,9 @@ recv_find_max_checkpoint(ulint* max_field)
case log_t::FORMAT_10_5 | log_t::FORMAT_ENCRYPTED:
break;
default:
ib::error() << "Unsupported redo log format."
" The redo log was created with " << creator << ".";
return(DB_ERROR);
sql_print_error("InnoDB: Unsupported redo log format."
" The redo log was created with %s.", creator);
return DB_ERROR;
}
for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2;
@ -1998,8 +2001,8 @@ recv_find_max_checkpoint(ulint* max_field)
if (log_sys.is_encrypted()
&& !log_crypt_read_checkpoint_buf(buf)) {
ib::error() << "Reading checkpoint"
" encryption info failed.";
sql_print_error("InnoDB: Reading checkpoint"
" encryption info failed.");
continue;
}
@ -2028,11 +2031,11 @@ recv_find_max_checkpoint(ulint* max_field)
was filled with zeroes, and were killed. After
10.2.2, we would reject such a file already earlier,
when checking the file header. */
ib::error() << "No valid checkpoint found"
" (corrupted redo log)."
" You can try --innodb-force-recovery=6"
" as a last resort.";
return(DB_ERROR);
sql_print_error("InnoDB: No valid checkpoint found"
" (corrupted redo log)."
" You can try --innodb-force-recovery=6"
" as a last resort.");
return DB_ERROR;
}
switch (log_sys.log.format) {
@ -2041,11 +2044,15 @@ recv_find_max_checkpoint(ulint* max_field)
break;
default:
if (dberr_t err = recv_log_recover_10_4()) {
ib::error()
<< "Upgrade after a crash is not supported."
" The redo log was created with " << creator
<< (err == DB_ERROR
? "." : ", and it appears corrupted.");
sql_print_error("InnoDB: Upgrade after a crash "
"is not supported."
" The redo log was created with %s%s.",
creator,
err == DB_ERROR
? ". You must start up and shut down"
" MariaDB 10.4 or earlier"
" on the data directory"
: ", and it appears corrupted");
return err;
}
}

View file

@ -1,14 +0,0 @@
{
global:
_maria_plugin_interface_version_;
_maria_sizeof_struct_st_plugin_;
_maria_plugin_declarations_;
my_snprintf_service;
thd_alloc_service;
thd_autoinc_service;
thd_error_context_service;
thd_kill_statement_service;
thd_wait_service;
local:
*;
};

View file

@ -260,17 +260,10 @@ que_graph_free_recursive(
ind_node_t* cre_ind;
purge_node_t* purge;
DBUG_ENTER("que_graph_free_recursive");
if (node == NULL) {
DBUG_VOID_RETURN;
return;
}
DBUG_PRINT("que_graph_free_recursive",
("node: %p, type: " ULINTPF, node,
que_node_get_type(node)));
switch (que_node_get_type(node)) {
case QUE_NODE_FORK:
@ -410,8 +403,6 @@ que_graph_free_recursive(
default:
ut_error;
}
DBUG_VOID_RETURN;
}
/**********************************************************************//**
@ -507,66 +498,6 @@ que_node_get_containing_loop_node(
return(node);
}
#ifdef DBUG_TRACE
/** Gets information of an SQL query graph node.
@return type description */
static MY_ATTRIBUTE((warn_unused_result, nonnull))
const char*
que_node_type_string(
/*=================*/
const que_node_t* node) /*!< in: query graph node */
{
switch (que_node_get_type(node)) {
case QUE_NODE_SELECT:
return("SELECT");
case QUE_NODE_INSERT:
return("INSERT");
case QUE_NODE_UPDATE:
return("UPDATE");
case QUE_NODE_WHILE:
return("WHILE");
case QUE_NODE_ASSIGNMENT:
return("ASSIGNMENT");
case QUE_NODE_IF:
return("IF");
case QUE_NODE_FETCH:
return("FETCH");
case QUE_NODE_OPEN:
return("OPEN");
case QUE_NODE_PROC:
return("STORED PROCEDURE");
case QUE_NODE_FUNC:
return("FUNCTION");
case QUE_NODE_LOCK:
return("LOCK");
case QUE_NODE_THR:
return("QUERY THREAD");
case QUE_NODE_COMMIT:
return("COMMIT");
case QUE_NODE_UNDO:
return("UNDO ROW");
case QUE_NODE_PURGE:
return("PURGE ROW");
case QUE_NODE_ROLLBACK:
return("ROLLBACK");
case QUE_NODE_CREATE_TABLE:
return("CREATE TABLE");
case QUE_NODE_CREATE_INDEX:
return("CREATE INDEX");
case QUE_NODE_FOR:
return("FOR LOOP");
case QUE_NODE_RETURN:
return("RETURN");
case QUE_NODE_EXIT:
return("EXIT");
default:
ut_ad(0);
return("UNKNOWN NODE TYPE");
}
}
#endif /* DBUG_TRACE */
/**********************************************************************//**
Performs an execution step of an open or close cursor statement node.
@param thr query thread */
@ -614,10 +545,6 @@ que_thr_step(
old_thr = thr;
DBUG_PRINT("ib_que", ("Execute %u (%s) at %p",
unsigned(type), que_node_type_string(node),
(const void*) node));
if (type & QUE_NODE_CONTROL_STAT) {
if ((thr->prev_node != que_node_get_parent(node))
&& que_node_get_next(thr->prev_node)) {

View file

@ -61,57 +61,49 @@ Completed by Sunny Bains and Marko Makela
/* Whether to disable file system cache */
char srv_disable_sort_file_cache;
/** Class that caches index row tuples made from a single cluster
/** Class that caches spatial index row tuples made from a single cluster
index page scan, and then insert into corresponding index tree */
class index_tuple_info_t {
class spatial_index_info {
public:
/** constructor
@param[in] heap memory heap
@param[in] index index to be created */
index_tuple_info_t(mem_heap_t* heap, dict_index_t* index) :
m_dtuple_vec(UT_NEW_NOKEY(idx_tuple_vec())),
m_index(index), m_heap(heap)
{ ut_ad(index->is_spatial()); }
/** constructor
@param index spatial index to be created */
spatial_index_info(dict_index_t *index) : index(index)
{
ut_ad(index->is_spatial());
}
/** destructor */
~index_tuple_info_t()
{
UT_DELETE(m_dtuple_vec);
}
/** Get the index object
@return the index object */
dict_index_t* get_index() UNIV_NOTHROW
{
return(m_index);
}
/** Caches an index row into index tuple vector
@param[in] row table row
@param[in] ext externally stored column
prefixes, or NULL */
void add(
const dtuple_t* row,
const row_ext_t* ext) UNIV_NOTHROW
{
dtuple_t* dtuple;
dtuple = row_build_index_entry(row, ext, m_index, m_heap);
ut_ad(dtuple);
m_dtuple_vec->push_back(dtuple);
}
/** Caches an index row into index tuple vector
@param[in] row table row
@param[in] ext externally stored column prefixes, or NULL */
void add(const dtuple_t *row, const row_ext_t *ext, mem_heap_t *heap)
{
dtuple_t *dtuple= row_build_index_entry(row, ext, index, heap);
ut_ad(dtuple);
ut_ad(dtuple->n_fields == index->n_fields);
if (ext)
{
/* Replace any references to ext, because ext will be allocated
from row_heap. */
for (ulint i= 1; i < dtuple->n_fields; i++)
{
dfield_t &dfield= dtuple->fields[i];
if (dfield.data >= ext->buf &&
dfield.data <= &ext->buf[ext->n_ext * ext->max_len])
dfield_dup(&dfield, heap);
}
}
m_dtuple_vec.push_back(dtuple);
}
/** Insert spatial index rows cached in vector into spatial index
@param[in] trx_id transaction id
@param[in,out] row_heap memory heap
@param[in] pcur cluster index scanning cursor
@param[in,out] mtr_started whether scan_mtr is active
@param[in,out] heap temporary memory heap
@param[in,out] scan_mtr mini-transaction for pcur
@return DB_SUCCESS if successful, else error number */
dberr_t insert(trx_id_t trx_id, mem_heap_t* row_heap, btr_pcur_t* pcur,
bool& mtr_started, mtr_t* scan_mtr) const
dberr_t insert(trx_id_t trx_id, btr_pcur_t* pcur,
bool& mtr_started, mem_heap_t* heap, mtr_t* scan_mtr)
{
big_rec_t* big_rec;
rec_t* rec;
@ -130,8 +122,8 @@ public:
DBUG_EXECUTE_IF("row_merge_instrument_log_check_flush",
log_sys.set_check_flush_or_checkpoint(););
for (idx_tuple_vec::iterator it = m_dtuple_vec->begin();
it != m_dtuple_vec->end();
for (idx_tuple_vec::iterator it = m_dtuple_vec.begin();
it != m_dtuple_vec.end();
++it) {
dtuple = *it;
ut_ad(dtuple);
@ -151,29 +143,29 @@ public:
}
mtr.start();
m_index->set_modified(mtr);
index->set_modified(mtr);
ins_cur.index = m_index;
rtr_init_rtr_info(&rtr_info, false, &ins_cur, m_index,
ins_cur.index = index;
rtr_init_rtr_info(&rtr_info, false, &ins_cur, index,
false);
rtr_info_update_btr(&ins_cur, &rtr_info);
error = btr_cur_search_to_nth_level(
m_index, 0, dtuple, PAGE_CUR_RTREE_INSERT,
index, 0, dtuple, PAGE_CUR_RTREE_INSERT,
BTR_MODIFY_LEAF, &ins_cur, &mtr);
/* It need to update MBR in parent entry,
so change search mode to BTR_MODIFY_TREE */
if (error == DB_SUCCESS && rtr_info.mbr_adj) {
mtr_commit(&mtr);
mtr.commit();
rtr_clean_rtr_info(&rtr_info, true);
rtr_init_rtr_info(&rtr_info, false, &ins_cur,
m_index, false);
index, false);
rtr_info_update_btr(&ins_cur, &rtr_info);
mtr_start(&mtr);
m_index->set_modified(mtr);
mtr.start();
index->set_modified(mtr);
error = btr_cur_search_to_nth_level(
m_index, 0, dtuple,
index, 0, dtuple,
PAGE_CUR_RTREE_INSERT,
BTR_MODIFY_TREE, &ins_cur, &mtr);
}
@ -181,7 +173,7 @@ public:
if (error == DB_SUCCESS) {
error = btr_cur_optimistic_insert(
flag, &ins_cur, &ins_offsets,
&row_heap, dtuple, &rec, &big_rec,
&heap, dtuple, &rec, &big_rec,
0, NULL, &mtr);
}
@ -190,15 +182,15 @@ public:
if (error == DB_FAIL) {
mtr.commit();
mtr.start();
m_index->set_modified(mtr);
index->set_modified(mtr);
rtr_clean_rtr_info(&rtr_info, true);
rtr_init_rtr_info(&rtr_info, false,
&ins_cur, m_index, false);
&ins_cur, index, false);
rtr_info_update_btr(&ins_cur, &rtr_info);
error = btr_cur_search_to_nth_level(
m_index, 0, dtuple,
index, 0, dtuple,
PAGE_CUR_RTREE_INSERT,
BTR_MODIFY_TREE,
&ins_cur, &mtr);
@ -206,7 +198,7 @@ public:
if (error == DB_SUCCESS) {
error = btr_cur_pessimistic_insert(
flag, &ins_cur, &ins_offsets,
&row_heap, dtuple, &rec,
&heap, dtuple, &rec,
&big_rec, 0, NULL, &mtr);
}
}
@ -232,30 +224,26 @@ public:
}
}
mtr_commit(&mtr);
mtr.commit();
rtr_clean_rtr_info(&rtr_info, true);
}
m_dtuple_vec->clear();
m_dtuple_vec.clear();
return(error);
}
private:
/** Cache index rows made from a cluster index scan. Usually
for rows on single cluster index page */
typedef std::vector<dtuple_t*, ut_allocator<dtuple_t*> >
idx_tuple_vec;
/** Cache index rows made from a cluster index scan. Usually
for rows on single cluster index page */
typedef std::vector<dtuple_t*, ut_allocator<dtuple_t*> > idx_tuple_vec;
/** vector used to cache index rows made from cluster index scan */
idx_tuple_vec* const m_dtuple_vec;
/** the index being built */
dict_index_t* const m_index;
/** memory heap for creating index tuples */
mem_heap_t* const m_heap;
/** vector used to cache index rows made from cluster index scan */
idx_tuple_vec m_dtuple_vec;
public:
/** the index being built */
dict_index_t*const index;
};
/* Maximum pending doc memory limit in bytes for a fts tokenization thread */
@ -1578,8 +1566,7 @@ row_mtuple_cmp(
@param[in] trx_id transaction id
@param[in] sp_tuples cached spatial rows
@param[in] num_spatial number of spatial indexes
@param[in,out] heap heap for insert
@param[in,out] sp_heap heap for tuples
@param[in,out] heap temporary memory heap
@param[in,out] pcur cluster index cursor
@param[in,out] started whether mtr is active
@param[in,out] mtr mini-transaction
@ -1588,10 +1575,9 @@ static
dberr_t
row_merge_spatial_rows(
trx_id_t trx_id,
index_tuple_info_t** sp_tuples,
spatial_index_info** sp_tuples,
ulint num_spatial,
mem_heap_t* heap,
mem_heap_t* sp_heap,
btr_pcur_t* pcur,
bool& started,
mtr_t* mtr)
@ -1600,10 +1586,10 @@ row_merge_spatial_rows(
return DB_SUCCESS;
for (ulint j= 0; j < num_spatial; j++)
if (dberr_t err= sp_tuples[j]->insert(trx_id, heap, pcur, started, mtr))
if (dberr_t err= sp_tuples[j]->insert(trx_id, pcur, started, heap, mtr))
return err;
mem_heap_empty(sp_heap);
mem_heap_empty(heap);
return DB_SUCCESS;
}
@ -1719,8 +1705,7 @@ row_merge_read_clustered_index(
doc_id_t max_doc_id = 0;
ibool add_doc_id = FALSE;
pthread_cond_t* fts_parallel_sort_cond = nullptr;
index_tuple_info_t** sp_tuples = NULL;
mem_heap_t* sp_heap = NULL;
spatial_index_info** sp_tuples = nullptr;
ulint num_spatial = 0;
BtrBulk* clust_btr_bulk = NULL;
bool clust_temp_file = false;
@ -1809,9 +1794,7 @@ row_merge_read_clustered_index(
if (num_spatial > 0) {
ulint count = 0;
sp_heap = mem_heap_create(512);
sp_tuples = static_cast<index_tuple_info_t**>(
sp_tuples = static_cast<spatial_index_info**>(
ut_malloc_nokey(num_spatial
* sizeof(*sp_tuples)));
@ -1819,9 +1802,7 @@ row_merge_read_clustered_index(
if (dict_index_is_spatial(index[i])) {
sp_tuples[count]
= UT_NEW_NOKEY(
index_tuple_info_t(
sp_heap,
index[i]));
spatial_index_info(index[i]));
count++;
}
}
@ -1996,7 +1977,7 @@ corrupted_rec:
/* Insert the cached spatial index rows. */
err = row_merge_spatial_rows(
trx->id, sp_tuples, num_spatial,
row_heap, sp_heap, &pcur, mtr_started, &mtr);
row_heap, &pcur, mtr_started, &mtr);
if (err != DB_SUCCESS) {
goto func_exit;
@ -2390,7 +2371,7 @@ write_buffers:
continue;
}
ut_ad(sp_tuples[s_idx_cnt]->get_index()
ut_ad(sp_tuples[s_idx_cnt]->index
== buf->index);
/* If the geometry field is invalid, report
@ -2400,7 +2381,7 @@ write_buffers:
break;
}
sp_tuples[s_idx_cnt]->add(row, ext);
sp_tuples[s_idx_cnt]->add(row, ext, buf->heap);
s_idx_cnt++;
continue;
@ -2522,7 +2503,7 @@ write_buffers:
err = row_merge_spatial_rows(
trx->id, sp_tuples,
num_spatial,
row_heap, sp_heap,
row_heap,
&pcur, mtr_started,
&mtr);
@ -2884,10 +2865,6 @@ wait_again:
UT_DELETE(sp_tuples[i]);
}
ut_free(sp_tuples);
if (sp_heap) {
mem_heap_free(sp_heap);
}
}
/* Update the next Doc ID we used. Table should be locked, so