diff options
68 files changed, 925 insertions, 364 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 06a6feef8c3..56f11c2917d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,9 +28,12 @@ stages: - test - Salsa-CI -# Base image for builds and tests unless otherwise defined -# @TODO: Fedora 34 is latest, but fails to start on Gitlab.com with error "shell not found" -image: fedora:33 +default: + # Base image for builds and tests unless otherwise defined + image: fedora:latest + # Extend build jobs to have longer timeout as the default GitLab + # timeout (1h) is often not enough + timeout: 3h # Define common CMAKE_FLAGS for all builds. Skim down build by omitting all # submodules (a commit in this repo does not affect their builds anyway) and @@ -427,14 +430,14 @@ fedora upgrade: dependencies: - fedora script: - - yum install -y mariadb-server + - dnf install -y mariadb-server # Fedora does not support running services in Docker (like Debian packages do) so start it manually - - /usr/libexec/mysql-check-socket - - /usr/libexec/mysql-prepare-db-dir - - sudo -u mysql /usr/libexec/mysqld --basedir=/usr & sleep 10 + - /usr/libexec/mariadb-check-socket + - /usr/libexec/mariadb-prepare-db-dir + - sudo -u mysql /usr/libexec/mariadbd --basedir=/usr & sleep 10 # Dump database contents in installed state - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > old-installed-database.sql - - /usr/libexec/mysql-check-upgrade + - /usr/libexec/mariadb-check-upgrade # Dump database contents in upgraded state - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > old-upgraded-database.sql - mariadb --skip-column-names -e "SELECT @@version, @@version_comment" # Show version diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 45a828cb18c..07026f0080d 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -1164,7 +1164,10 @@ static int dbConnect(char *host, char *user, char *passwd) opt_ssl_capath, opt_ssl_cipher); mysql_options(&mysql_connection, MYSQL_OPT_SSL_CRL, opt_ssl_crl); mysql_options(&mysql_connection, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath); + mysql_options(&mysql_connection, MARIADB_OPT_TLS_VERSION, opt_tls_version); } + mysql_options(&mysql_connection, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, + (char*)&opt_ssl_verify_server_cert); #endif if (opt_protocol) mysql_options(&mysql_connection,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol); diff --git a/client/mysqlslap.c b/client/mysqlslap.c index 5871e899fad..54df0124063 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -304,7 +304,10 @@ void set_mysql_connect_options(MYSQL *mysql) opt_ssl_capath, opt_ssl_cipher); mysql_options(mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl); mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath); + mysql_options(mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version); } + mysql_options(mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, + (char*)&opt_ssl_verify_server_cert); #endif if (opt_protocol) mysql_options(mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol); diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 0ed5a62c1a4..bd9f55e715b 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -9823,6 +9823,7 @@ int main(int argc, char **argv) opt_ssl_capath, opt_ssl_cipher); mysql_options(con->mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl); mysql_options(con->mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath); + mysql_options(con->mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version); #if MYSQL_VERSION_ID >= 50000 /* Turn on ssl_verify_server_cert only if host is "localhost" */ opt_ssl_verify_server_cert= opt_host && !strcmp(opt_host, "localhost"); diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index dbb551af121..3a0db1401ad 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -3882,6 +3882,21 @@ func_exit: return error; } +/** Close all undo tablespaces while applying incremental delta */ +static void xb_close_undo_tablespaces() +{ + if (srv_undo_space_id_start == 0) + return; + for (uint32_t space_id= srv_undo_space_id_start; + space_id < srv_undo_space_id_start + srv_undo_tablespaces_open; + space_id++) + { + fil_space_t *space= fil_space_get(space_id); + ut_ad(space); + space->close(); + } +} + /**************************************************************************** Populates the tablespace memory cache by scanning for and opening data files. @returns DB_SUCCESS or error code.*/ @@ -3945,6 +3960,10 @@ xb_load_tablespaces() return(err); } + if (srv_operation == SRV_OPERATION_RESTORE_DELTA) { + xb_close_undo_tablespaces(); + } + DBUG_MARIABACKUP_EVENT("after_load_tablespaces", {}); return(DB_SUCCESS); } diff --git a/include/sslopt-longopts.h b/include/sslopt-longopts.h index d0278a1645d..ee90d17fb64 100644 --- a/include/sslopt-longopts.h +++ b/include/sslopt-longopts.h @@ -39,10 +39,10 @@ {"ssl-key", OPT_SSL_KEY, "X509 key in PEM format (implies --ssl).", &opt_ssl_key, &opt_ssl_key, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"ssl-crl", OPT_SSL_KEY, "Certificate revocation list (implies --ssl).", + {"ssl-crl", OPT_SSL_CRL, "Certificate revocation list (implies --ssl).", &opt_ssl_crl, &opt_ssl_crl, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"ssl-crlpath", OPT_SSL_KEY, + {"ssl-crlpath", OPT_SSL_CRLPATH, "Certificate revocation list path (implies --ssl).", &opt_ssl_crlpath, &opt_ssl_crlpath, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, diff --git a/mysql-test/main/ctype_tis620.result b/mysql-test/main/ctype_tis620.result index f86c2574582..10b7042f709 100644 --- a/mysql-test/main/ctype_tis620.result +++ b/mysql-test/main/ctype_tis620.result @@ -4472,3 +4472,28 @@ HEX(WEIGHT_STRING(_tis620 'a\0b' COLLATE tis620_thai_nopad_ci)) # # End of 10.2 tests # +# +# Start of 10.4 tests +# +# +# MDEV-27670 Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +# +CREATE OR REPLACE TABLE t1 +( +a VARCHAR(250) COLLATE tis620_thai_nopad_ci, +UNIQUE KEY(a(100)) USING HASH +) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('a'),('A'); +ERROR 23000: Duplicate entry 'A' for key 'a' +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 +( +a CHAR(250) COLLATE tis620_thai_nopad_ci, +UNIQUE KEY(a(100)) USING HASH +) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('a'),('A'); +ERROR 23000: Duplicate entry 'A' for key 'a' +DROP TABLE t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/ctype_tis620.test b/mysql-test/main/ctype_tis620.test index f432b23d71c..39908b995b2 100644 --- a/mysql-test/main/ctype_tis620.test +++ b/mysql-test/main/ctype_tis620.test @@ -223,3 +223,34 @@ SELECT HEX(WEIGHT_STRING(_tis620 'a\0b' COLLATE tis620_thai_nopad_ci)); --echo # --echo # End of 10.2 tests --echo # + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-27670 Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +--echo # + +CREATE OR REPLACE TABLE t1 +( + a VARCHAR(250) COLLATE tis620_thai_nopad_ci, + UNIQUE KEY(a(100)) USING HASH +) ENGINE=MyISAM; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES ('a'),('A'); +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 + +( + a CHAR(250) COLLATE tis620_thai_nopad_ci, + UNIQUE KEY(a(100)) USING HASH +) ENGINE=MyISAM; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES ('a'),('A'); +DROP TABLE t1; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/main/derived_view.result b/mysql-test/main/derived_view.result index 50f6d381dd6..15a7784c890 100644 --- a/mysql-test/main/derived_view.result +++ b/mysql-test/main/derived_view.result @@ -2696,7 +2696,7 @@ ON p.id = g.p_random ORDER BY gallery_name ASC ; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY <derived2> ALL NULL NULL NULL NULL 10 Using temporary; Using filesort +1 PRIMARY <derived2> ALL NULL NULL NULL NULL 10 Using filesort 1 PRIMARY p eq_ref PRIMARY PRIMARY 4 g.p_random 1 Using where 2 DERIVED gal ALL NULL NULL NULL NULL 10 3 DEPENDENT SUBQUERY pi ref gallery_id gallery_id 4 test.gal.id 4 Using temporary; Using filesort diff --git a/mysql-test/main/having.result b/mysql-test/main/having.result index ac26d69543d..d7cbadd5e75 100644 --- a/mysql-test/main/having.result +++ b/mysql-test/main/having.result @@ -834,13 +834,13 @@ test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK explain SELECT t, next_seq_value() r FROM t1 FORCE INDEX(t) GROUP BY t HAVING r = 1 ORDER BY t1.u; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using temporary; Using filesort +1 SIMPLE t1 index NULL t 5 NULL 8 Using temporary; Using filesort SELECT t, next_seq_value() r FROM t1 FORCE INDEX(t) GROUP BY t HAVING r = 1 ORDER BY t1.u; t r 10 1 12 1 -14 1 -16 1 +15 1 +17 1 DROP TABLE t1; DROP FUNCTION next_seq_value; DROP TABLE series; diff --git a/mysql-test/main/show_explain.result b/mysql-test/main/show_explain.result index 317a12ef311..6ad93930448 100644 --- a/mysql-test/main/show_explain.result +++ b/mysql-test/main/show_explain.result @@ -1007,7 +1007,7 @@ SELECT a+SLEEP(0.01) FROM t1 WHERE a IN ( 255, 0 ) OR b BETWEEN 6 AND 129 ORDER BY b; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 8 Using sort_union(a,b); Using where; Using temporary; Using filesort +1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 8 Using sort_union(a,b); Using where; Using filesort set @show_explain_probe_select_id=1; SET debug_dbug='+d,show_explain_probe_join_exec_start'; SELECT a+SLEEP(0.01) FROM t1 @@ -1016,7 +1016,7 @@ ORDER BY b; connection default; show explain for $thr2; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 8 Using sort_union(a,b); Using where; Using temporary; Using filesort +1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 8 Using sort_union(a,b); Using where; Using filesort Warnings: Note 1003 SELECT a+SLEEP(0.01) FROM t1 WHERE a IN ( 255, 0 ) OR b BETWEEN 6 AND 129 @@ -1039,7 +1039,7 @@ ORDER BY b; connection default; show explain for $thr2; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 8 Using sort_union(a,b); Using where; Using temporary; Using filesort +1 SIMPLE t1 index_merge a,b a,b 5,5 NULL 8 Using sort_union(a,b); Using where; Using filesort Warnings: Note 1003 SELECT a+SLEEP(0.01) FROM t1 WHERE a IN ( 255, 0 ) OR b BETWEEN 6 AND 129 diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result index 37fdf62a6a9..37c22e45b45 100644 --- a/mysql-test/main/sp.result +++ b/mysql-test/main/sp.result @@ -8933,6 +8933,46 @@ DROP TABLE t1; # End of 10.4 tests # # +# MDEV-29129: Performance regression starting in 10.6: unlimited "select order by limit" +# +CREATE TABLE t1 ( +lookupId int primary key, +value varchar(255) +); +insert into t1 select seq, seq from seq_1_to_100; +# Note: the function is intentionally NOT declared as DETERMINISTIC +CREATE FUNCTION f1(LOOKUPID_IN INT) RETURNS varchar(255) CHARSET utf8 +BEGIN +DECLARE LOOKUP_VALUE VARCHAR(255); +SET LOOKUP_VALUE = (SELECT value FROM t1 WHERE lookupId = LOOKUPID_IN); +set @counter=@counter+1; +RETURN LOOKUP_VALUE; +END; +// +create table t2 ( +col1 int, +col2 int +); +insert into t2 select mod(seq,100), seq from seq_1_to_1000; +explain +select f1(col1) from t2 order by col2 desc limit 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 1000 Using filesort +set @counter=0; +select f1(col1) from t2 order by col2 desc limit 5; +f1(col1) +NULL +99 +98 +97 +96 +# Must show 5, not 1000: +select @counter; +@counter +5 +drop function f1; +drop table t1,t2; +# # MDEV-28129: MariaDB UAF issue at lex_end_nops(LEX*) # CREATE PROCEDURE sp() SELECT 1 INTO @; diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test index 57038c82761..2e3a492659e 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -10521,6 +10521,43 @@ DROP TABLE t1; --echo # --echo # +--echo # MDEV-29129: Performance regression starting in 10.6: unlimited "select order by limit" +--echo # + +CREATE TABLE t1 ( + lookupId int primary key, + value varchar(255) +); +insert into t1 select seq, seq from seq_1_to_100; + +-- echo # Note: the function is intentionally NOT declared as DETERMINISTIC +delimiter //; +CREATE FUNCTION f1(LOOKUPID_IN INT) RETURNS varchar(255) CHARSET utf8 +BEGIN + DECLARE LOOKUP_VALUE VARCHAR(255); + SET LOOKUP_VALUE = (SELECT value FROM t1 WHERE lookupId = LOOKUPID_IN); + set @counter=@counter+1; + RETURN LOOKUP_VALUE; +END; +// +delimiter ;// + +create table t2 ( + col1 int, + col2 int +); +insert into t2 select mod(seq,100), seq from seq_1_to_1000; + +explain +select f1(col1) from t2 order by col2 desc limit 5; +set @counter=0; +select f1(col1) from t2 order by col2 desc limit 5; +--echo # Must show 5, not 1000: +select @counter; +drop function f1; +drop table t1,t2; + +--echo # --echo # MDEV-28129: MariaDB UAF issue at lex_end_nops(LEX*) --echo # diff --git a/mysql-test/main/user_var.result b/mysql-test/main/user_var.result index 924c252b951..a5837996c19 100644 --- a/mysql-test/main/user_var.result +++ b/mysql-test/main/user_var.result @@ -372,14 +372,14 @@ insert into t1 (b) values (10), (30), (10), (10); set @var := 0; explain select if(b=@var, 999, b) , @var := b from t1 order by b; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort set @var := 0; select if(b=@var, 999, b) , @var := b from t1 order by b; if(b=@var, 999, b) @var := b 10 10 -10 10 30 30 999 10 +999 10 drop table t1; create temporary table t1 (id int); insert into t1 values (2), (3), (3), (4); diff --git a/mysql-test/main/win.result b/mysql-test/main/win.result index 0874e5b9a24..3e130c9653e 100644 --- a/mysql-test/main/win.result +++ b/mysql-test/main/win.result @@ -4352,3 +4352,27 @@ row_number() OVER (order by a) 2 3 drop table t1; +# +# MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER +# +CREATE TABLE t(c1 INT); +CREATE FUNCTION f() RETURNS INT READS SQL DATA BEGIN +DECLARE v INT; +SELECT 1 INTO v FROM (SELECT c1,COALESCE(LEAD(a2.c1) OVER (PARTITION BY a2.c1 ORDER BY a2.c1),a2.c1) AS a1 FROM (t a2 JOIN t a3 USING (c1))) a4; +RETURN 1; +END// +SELECT f(),f(); +f() f() +1 1 +EXECUTE IMMEDIATE "SELECT LEAD(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +LEAD(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT SUM(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +SUM(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT LEAD(c) OVER (ORDER BY c) FROM (SELECT 1 AS c) AS a NATURAL JOIN (SELECT 1 AS c) AS b;"; +LEAD(c) OVER (ORDER BY c) +NULL +DROP FUNCTION f; +DROP TABLE t; +# +# End of 10.6 tests +# diff --git a/mysql-test/main/win.test b/mysql-test/main/win.test index 5a216123369..d7f52ec32e9 100644 --- a/mysql-test/main/win.test +++ b/mysql-test/main/win.test @@ -2829,3 +2829,31 @@ create table t1 (a int); insert into t1 values (1),(2),(3); SELECT row_number() OVER (order by a) FROM t1 order by NAME_CONST('myname',NULL); drop table t1; + +--echo # +--echo # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER +--echo # + +CREATE TABLE t(c1 INT); + +DELIMITER //; +CREATE FUNCTION f() RETURNS INT READS SQL DATA BEGIN + DECLARE v INT; + SELECT 1 INTO v FROM (SELECT c1,COALESCE(LEAD(a2.c1) OVER (PARTITION BY a2.c1 ORDER BY a2.c1),a2.c1) AS a1 FROM (t a2 JOIN t a3 USING (c1))) a4; + RETURN 1; +END// +DELIMITER ;// + +SELECT f(),f(); + +EXECUTE IMMEDIATE "SELECT LEAD(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +EXECUTE IMMEDIATE "SELECT SUM(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; + +EXECUTE IMMEDIATE "SELECT LEAD(c) OVER (ORDER BY c) FROM (SELECT 1 AS c) AS a NATURAL JOIN (SELECT 1 AS c) AS b;"; + +DROP FUNCTION f; +DROP TABLE t; + +--echo # +--echo # End of 10.6 tests +--echo # diff --git a/mysql-test/suite/encryption/r/tempfiles_encrypted.result b/mysql-test/suite/encryption/r/tempfiles_encrypted.result index fb4738a1fed..2b91cd638e2 100644 --- a/mysql-test/suite/encryption/r/tempfiles_encrypted.result +++ b/mysql-test/suite/encryption/r/tempfiles_encrypted.result @@ -4359,6 +4359,30 @@ row_number() OVER (order by a) 3 drop table t1; # +# MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER +# +CREATE TABLE t(c1 INT); +CREATE FUNCTION f() RETURNS INT READS SQL DATA BEGIN +DECLARE v INT; +SELECT 1 INTO v FROM (SELECT c1,COALESCE(LEAD(a2.c1) OVER (PARTITION BY a2.c1 ORDER BY a2.c1),a2.c1) AS a1 FROM (t a2 JOIN t a3 USING (c1))) a4; +RETURN 1; +END// +SELECT f(),f(); +f() f() +1 1 +EXECUTE IMMEDIATE "SELECT LEAD(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +LEAD(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT SUM(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; +SUM(c1) OVER (ORDER BY c1) +EXECUTE IMMEDIATE "SELECT LEAD(c) OVER (ORDER BY c) FROM (SELECT 1 AS c) AS a NATURAL JOIN (SELECT 1 AS c) AS b;"; +LEAD(c) OVER (ORDER BY c) +NULL +DROP FUNCTION f; +DROP TABLE t; +# +# End of 10.6 tests +# +# # MDEV-23867: select crash in compute_window_func # set @save_sort_buffer_size=@@sort_buffer_size; diff --git a/mysql-test/suite/galera/r/MDEV-25389.result b/mysql-test/suite/galera/r/MDEV-25389.result new file mode 100644 index 00000000000..f369fe4dbae --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-25389.result @@ -0,0 +1,17 @@ +connection node_2; +connection node_1; +connection node_1; +connection node_2; +connection node_2; +call mtr.add_suppression("WSREP: Failed to create/initialize system thread"); +SET GLOBAL debug_dbug='+d,wsrep_simulate_failed_connection_1'; +SET GLOBAL wsrep_slave_threads=2; +ERROR HY000: Incorrect arguments to SET +SELECT @@wsrep_slave_threads; +@@wsrep_slave_threads +1 +SET GLOBAL debug_dbug=''; +SET GLOBAL wsrep_slave_threads=1; +SELECT @@wsrep_slave_threads; +@@wsrep_slave_threads +1 diff --git a/mysql-test/suite/galera/r/MDEV-29512.result b/mysql-test/suite/galera/r/MDEV-29512.result new file mode 100644 index 00000000000..aaf24df920e --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-29512.result @@ -0,0 +1,40 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 int, f3 varchar(2000)); +INSERT INTO t1 VALUES (1, 0, REPEAT('1234567890', 200)); +INSERT INTO t1 VALUES (3, 3, REPEAT('1234567890', 200)); +SET SESSION wsrep_sync_wait=0; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1a; +SET SESSION wsrep_sync_wait=0; +connection node_1; +begin; +select f1,f2 from t1; +f1 f2 +1 0 +3 3 +connection node_2; +UPDATE t1 SET f2=2 WHERE f1=3; +connection node_1a; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; +connection node_1; +UPDATE t1 SET f2=1 WHERE f1=3; +SET GLOBAL wsrep_provider_options = 'dbug=d,commit_monitor_master_enter_sync'; +COMMIT; +connection node_1a; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'signal=commit_monitor_master_enter_sync'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET GLOBAL debug_dbug = NULL; +SET debug_sync='RESET'; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +select f1,f2 from t1; +f1 f2 +1 0 +3 2 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/galera_var_dirty_reads.result b/mysql-test/suite/galera/r/galera_var_dirty_reads.result index 240f1802385..2b164fecee6 100644 --- a/mysql-test/suite/galera/r/galera_var_dirty_reads.result +++ b/mysql-test/suite/galera/r/galera_var_dirty_reads.result @@ -19,9 +19,9 @@ SHOW STATUS LIKE 'wsrep_cluster_status'; Variable_name Value wsrep_cluster_status Disconnected SELECT * FROM t1; -Got one of the listed errors +ERROR 08S01: WSREP has not yet prepared node for application use SELECT 1 FROM t1; -Got one of the listed errors +ERROR 08S01: WSREP has not yet prepared node for application use SET @@session.wsrep_dirty_reads=ON; SELECT * FROM t1; i @@ -34,7 +34,7 @@ i variable_name variable_value 1 WSREP_DIRTY_READS ON SET @@session.wsrep_dirty_reads=OFF; SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; -Got one of the listed errors +ERROR 08S01: WSREP has not yet prepared node for application use SELECT 1; 1 1 diff --git a/mysql-test/suite/galera/t/MDEV-25389.test b/mysql-test/suite/galera/t/MDEV-25389.test new file mode 100644 index 00000000000..fc523371918 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-25389.test @@ -0,0 +1,24 @@ +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source ../galera/include/auto_increment_offset_save.inc + +--connection node_2 +call mtr.add_suppression("WSREP: Failed to create/initialize system thread"); +SET GLOBAL debug_dbug='+d,wsrep_simulate_failed_connection_1'; +--error ER_WRONG_ARGUMENTS +SET GLOBAL wsrep_slave_threads=2; +SELECT @@wsrep_slave_threads; +SET GLOBAL debug_dbug=''; +SET GLOBAL wsrep_slave_threads=1; +SELECT @@wsrep_slave_threads; + +# MDEV-29878: this test caused a subsequent test to fail +# during shutdown. Do a restart here, to make sure the +# issue is fixed. +--source include/restart_mysqld.inc + +--source ../galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/MDEV-29512.cnf b/mysql-test/suite/galera/t/MDEV-29512.cnf new file mode 100644 index 00000000000..bf8e0c37984 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-29512.cnf @@ -0,0 +1,15 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin +log-slave-updates + +[mysqld.1] +log_bin +log_slave_updates +max-binlog-size=4096 +expire-logs-days=1 + + +[mysqld.2] + diff --git a/mysql-test/suite/galera/t/MDEV-29512.test b/mysql-test/suite/galera/t/MDEV-29512.test new file mode 100644 index 00000000000..ffcef792f85 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-29512.test @@ -0,0 +1,91 @@ +# +# This test is for reproducing the issue in: +# https://jira.mariadb.org/browse/MDEV-29512 +# +# The hanging in MDEV-29512 happens when binlog purging is attempted, and there is +# one local BF aborted transaction waiting for commit monitor. +# +# The test will launch two node cluster and enable binlogging with expire log days, +# to force binlog purging to happen. +# A local transaction is executed so that will become BF abort victim, and has advanced +# to replication stage waiting for commit monitor for final cleanup (to mark position in innodb) +# after that, applier is released to complete the BF abort and due to binlog configuration, +# starting the binlog purging. This is where the hanging would occur, if code is buggy +# +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc +--source include/galera_have_debug_sync.inc + +# +# binlog size is limited to 4096 bytes, we will create enough events to +# cause binlog rotation +# +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 int, f3 varchar(2000)); +INSERT INTO t1 VALUES (1, 0, REPEAT('1234567890', 200)); +INSERT INTO t1 VALUES (3, 3, REPEAT('1234567890', 200)); + +SET SESSION wsrep_sync_wait=0; + +# set sync point for replication applier +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; + +# Control connection to manage sync points for appliers +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait=0; + +# starting local transaction, only select so far, +# write will happen later and this will be ordered after the transaction in node_2 +--connection node_1 +begin; +select f1,f2 from t1; + +# send from node 2 an UPDATE transaction, which will BF abort the transaction in node_1 +--connection node_2 +--let $wait_condition=select count(*)=2 from t1 +--source include/wait_condition.inc + +UPDATE t1 SET f2=2 WHERE f1=3; + +--connection node_1a +# wait to see the UPDATE from node_2 in apply_cb sync point +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; + +--connection node_1 +# now issuing conflicting update +UPDATE t1 SET f2=1 WHERE f1=3; + +# Block the local commit, send final COMMIT and wait until it gets blocked +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_set_sync_point.inc +--send COMMIT + +--connection node_1a +# wait for the local commit to enter in commit monitor wait state +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +# release the local transaction to continue with commit +--let $galera_sync_point = commit_monitor_master_enter_sync +--source include/galera_signal_sync_point.inc + +# and now release the applier, it should force local trx to abort +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; +SET GLOBAL debug_dbug = NULL; +SET debug_sync='RESET'; + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +# wait until applying is complete +--let $wait_condition = SELECT COUNT(*)=1 FROM t1 WHERE f2=2 +--source include/wait_condition.inc + +# final read to verify what we got +select f1,f2 from t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/galera_var_dirty_reads.test b/mysql-test/suite/galera/t/galera_var_dirty_reads.test index 85f72e633dc..e0c5b666c32 100644 --- a/mysql-test/suite/galera/t/galera_var_dirty_reads.test +++ b/mysql-test/suite/galera/t/galera_var_dirty_reads.test @@ -31,10 +31,10 @@ SHOW STATUS LIKE 'wsrep_ready'; # Must return 'Disconnected' SHOW STATUS LIKE 'wsrep_cluster_status'; ---error ER_UNKNOWN_COM_ERROR,1047 +--error ER_UNKNOWN_COM_ERROR SELECT * FROM t1; ---error ER_UNKNOWN_COM_ERROR,1047 +--error ER_UNKNOWN_COM_ERROR SELECT 1 FROM t1; SET @@session.wsrep_dirty_reads=ON; @@ -46,7 +46,7 @@ SELECT i, variable_name, variable_value FROM t1, information_schema.session_vari SET @@session.wsrep_dirty_reads=OFF; ---error ER_UNKNOWN_COM_ERROR,1047 +--error ER_UNKNOWN_COM_ERROR SELECT i, variable_name, variable_value FROM t1, information_schema.session_variables WHERE variable_name LIKE "wsrep_dirty_reads" AND i = 1; diff --git a/mysql-test/suite/galera_3nodes_sr/disabled.def b/mysql-test/suite/galera_3nodes_sr/disabled.def index 900b27860a5..f1ec92eee79 100644 --- a/mysql-test/suite/galera_3nodes_sr/disabled.def +++ b/mysql-test/suite/galera_3nodes_sr/disabled.def @@ -1,4 +1,3 @@ -GCF-336 : GCF-582 : GCF-810A : GCF-810B : diff --git a/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result b/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result index bb6c11edf36..eeccfa3b5a3 100644 --- a/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result +++ b/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result @@ -1,11 +1,17 @@ +connection node_2; +connection node_1; +connection node_2; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; SET SESSION wsrep_trx_fragment_size = 1; SET AUTOCOMMIT=OFF; START TRANSACTION; INSERT INTO t1 VALUES (1); +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log; COUNT(*) > 0 1 +connection node_1; SELECT COUNT(*) > 0 FROM mysql.wsrep_streaming_log; COUNT(*) > 0 1 @@ -13,14 +19,19 @@ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT COUNT(*) > 0 FROM t1; COUNT(*) > 0 1 +connection node_2a; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; SET SESSION wsrep_sync_wait=0; +connection node_2; INSERT INTO t1 VALUES (2); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction COMMIT; ERROR 08S01: WSREP has not yet prepared node for application use +connection node_2a; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; DROP TABLE t1; CALL mtr.add_suppression("replication aborted"); CALL mtr.add_suppression("WSREP: fragment replication failed: 3"); CALL mtr.add_suppression("WSREP: failed to send SR rollback for "); +connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connection node_3; diff --git a/mysql-test/suite/innodb/r/innodb_ctype_tis620.result b/mysql-test/suite/innodb/r/innodb_ctype_tis620.result index bea188af08f..cf15d1232aa 100644 --- a/mysql-test/suite/innodb/r/innodb_ctype_tis620.result +++ b/mysql-test/suite/innodb/r/innodb_ctype_tis620.result @@ -26,3 +26,69 @@ DROP TABLE t1; # # End of 10.2 tests # +# +# Start of 10.4 tests +# +# +# MDEV-27670 Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +# +CREATE TABLE t1 (id INT PRIMARY KEY, a CHAR(8), KEY(a)) ENGINE=InnoDB COLLATE tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); +DROP TABLE t1; +# +# MDEV-27768 MDEV-25440: Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +# +CREATE TABLE t1 (a INT KEY,b INT,c CHAR,KEY(b),KEY(c)) ROW_FORMAT=REDUNDANT COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +INSERT INTO t1 VALUES (3,4,4); +DROP TABLE t1; +CREATE TABLE t1 (C1 CHAR KEY,B1 BIT,B2 BIT,C2 CHAR DEFAULT'') ROW_FORMAT=DYNAMIC COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +SELECT HEX(c1),HEX (c2) FROM t1 WHERE c1>=''AND c1<''AND c2=''LIMIT 2; +HEX(c1) HEX (c2) +DROP TABLE t1; +SET sql_mode=''; +CREATE TABLE t1 (a INT UNSIGNED,b INT,c CHAR(1),d BINARY (1),e VARCHAR(1),f VARBINARY(1),g BLOB,h BLOB,id INT,KEY(b),KEY(e)) ROW_FORMAT=REDUNDANT COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +INSERT INTO t1 VALUES (4386060749083099108,157,0,0,0,0,0,0,12); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +INSERT INTO t1 VALUES (104,15158706241929488558,0,0,0,0,0,0,13); +Warnings: +Warning 1264 Out of range value for column 'b' at row 1 +SELECT GROUP_CONCAT(DISTINCT a,b ORDER BY c,b) FROM t1; +GROUP_CONCAT(DISTINCT a,b ORDER BY c,b) +4294967295157,1042147483647 +DROP TABLE t1; +SET sql_mode=DEFAULT; +CREATE TABLE t1 (a CHAR(9),b CHAR(7)) COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0); +ALTER TABLE t1 ADD INDEX kb (b),ADD INDEX kab (a,b),ALGORITHM=INPLACE; +DROP TABLE t1; +SET sql_mode=''; +CREATE TABLE t1 (a INT UNSIGNED,b INT UNSIGNED,c CHAR(1),d CHAR(1),e VARCHAR(1),f VARCHAR(1),g BLOB,h BLOB,id INT,KEY(b),KEY(e)) ROW_FORMAT=REDUNDANT COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (15842995496588415350,5339224446865937973,0,0,0,0,0,0,4); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +Warning 1264 Out of range value for column 'b' at row 1 +INSERT INTO t1 VALUES (8118894032862615316,5299008984764990929,0,0,0,0,0,0,1); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +Warning 1264 Out of range value for column 'b' at row 1 +SELECT GROUP_CONCAT(DISTINCT a,c ORDER BY a) FROM t1; +GROUP_CONCAT(DISTINCT a,c ORDER BY a) +42949672950 +DROP TABLE t1; +SET sql_mode=DEFAULT; +CREATE TABLE t1 (a CHAR,b CHAR,KEY(a,b)) ROW_FORMAT=DYNAMIC COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +INSERT INTO t1 VALUES (0,0); +DROP TABLE t1; +CREATE TABLE t1 (a CHAR,b CHAR) COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (0,0); +SELECT a,SUM(DISTINCT a),MIN(b) FROM t1 GROUP BY a; +a SUM(DISTINCT a) MIN(b) +0 0 0 +DROP TABLE t1; +CREATE TABLE t1 (a CHAR,KEY(a)) ENGINE=InnoDB COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (0); +DROP TABLE t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/suite/innodb/t/innodb_ctype_tis620.test b/mysql-test/suite/innodb/t/innodb_ctype_tis620.test index 4bab0fe9561..b0e9f42cc5a 100644 --- a/mysql-test/suite/innodb/t/innodb_ctype_tis620.test +++ b/mysql-test/suite/innodb/t/innodb_ctype_tis620.test @@ -27,3 +27,65 @@ DROP TABLE t1; --echo # --echo # End of 10.2 tests --echo # + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-27670 Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +--echo # + +CREATE TABLE t1 (id INT PRIMARY KEY, a CHAR(8), KEY(a)) ENGINE=InnoDB COLLATE tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); +DROP TABLE t1; + +--echo # +--echo # MDEV-27768 MDEV-25440: Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +--echo # + +CREATE TABLE t1 (a INT KEY,b INT,c CHAR,KEY(b),KEY(c)) ROW_FORMAT=REDUNDANT COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +INSERT INTO t1 VALUES (3,4,4); +DROP TABLE t1; + +CREATE TABLE t1 (C1 CHAR KEY,B1 BIT,B2 BIT,C2 CHAR DEFAULT'') ROW_FORMAT=DYNAMIC COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +SELECT HEX(c1),HEX (c2) FROM t1 WHERE c1>=''AND c1<''AND c2=''LIMIT 2; +DROP TABLE t1; + +SET sql_mode=''; +CREATE TABLE t1 (a INT UNSIGNED,b INT,c CHAR(1),d BINARY (1),e VARCHAR(1),f VARBINARY(1),g BLOB,h BLOB,id INT,KEY(b),KEY(e)) ROW_FORMAT=REDUNDANT COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +INSERT INTO t1 VALUES (4386060749083099108,157,0,0,0,0,0,0,12); +INSERT INTO t1 VALUES (104,15158706241929488558,0,0,0,0,0,0,13); +SELECT GROUP_CONCAT(DISTINCT a,b ORDER BY c,b) FROM t1; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +CREATE TABLE t1 (a CHAR(9),b CHAR(7)) COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0); +ALTER TABLE t1 ADD INDEX kb (b),ADD INDEX kab (a,b),ALGORITHM=INPLACE; +DROP TABLE t1; + +SET sql_mode=''; +CREATE TABLE t1 (a INT UNSIGNED,b INT UNSIGNED,c CHAR(1),d CHAR(1),e VARCHAR(1),f VARCHAR(1),g BLOB,h BLOB,id INT,KEY(b),KEY(e)) ROW_FORMAT=REDUNDANT COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (15842995496588415350,5339224446865937973,0,0,0,0,0,0,4); +INSERT INTO t1 VALUES (8118894032862615316,5299008984764990929,0,0,0,0,0,0,1); +SELECT GROUP_CONCAT(DISTINCT a,c ORDER BY a) FROM t1; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +CREATE TABLE t1 (a CHAR,b CHAR,KEY(a,b)) ROW_FORMAT=DYNAMIC COLLATE=tis620_thai_nopad_ci ENGINE=InnoDB; +INSERT INTO t1 VALUES (0,0); +DROP TABLE t1; + +CREATE TABLE t1 (a CHAR,b CHAR) COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (0,0); +SELECT a,SUM(DISTINCT a),MIN(b) FROM t1 GROUP BY a; +DROP TABLE t1; + +CREATE TABLE t1 (a CHAR,KEY(a)) ENGINE=InnoDB COLLATE=tis620_thai_nopad_ci; +INSERT INTO t1 VALUES (0); +DROP TABLE t1; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/suite/mariabackup/apply-log-only-incr.test b/mysql-test/suite/mariabackup/apply-log-only-incr.test index c2d23c88a3e..b110d12540e 100644 --- a/mysql-test/suite/mariabackup/apply-log-only-incr.test +++ b/mysql-test/suite/mariabackup/apply-log-only-incr.test @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/innodb_undo_tablespaces.inc call mtr.add_suppression("InnoDB: New log files created"); diff --git a/mysql-test/suite/mariabackup/incremental_backup.test b/mysql-test/suite/mariabackup/incremental_backup.test index ec38af4c27d..fed2d5e60a9 100644 --- a/mysql-test/suite/mariabackup/incremental_backup.test +++ b/mysql-test/suite/mariabackup/incremental_backup.test @@ -1,5 +1,6 @@ --source include/have_aria.inc --source include/innodb_page_size.inc +--source include/innodb_undo_tablespaces.inc # see suite.pm "check for exact values, in case the default changes to be small everywhere" if (`select @@max_binlog_stmt_cache_size = 4294963200 and @@innodb_page_size = 65536`) { diff --git a/mysql-test/suite/mariabackup/incremental_compressed.test b/mysql-test/suite/mariabackup/incremental_compressed.test index 32607d57174..15aff909a43 100644 --- a/mysql-test/suite/mariabackup/incremental_compressed.test +++ b/mysql-test/suite/mariabackup/incremental_compressed.test @@ -1,5 +1,6 @@ --source include/have_innodb.inc --source include/have_partition.inc +--source include/innodb_undo_tablespaces.inc let $basedir=$MYSQLTEST_VARDIR/tmp/backup; let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; diff --git a/mysql-test/suite/mariabackup/incremental_ddl_before_backup.test b/mysql-test/suite/mariabackup/incremental_ddl_before_backup.test index f243ac1acd9..6d34166d7b5 100644 --- a/mysql-test/suite/mariabackup/incremental_ddl_before_backup.test +++ b/mysql-test/suite/mariabackup/incremental_ddl_before_backup.test @@ -1,4 +1,5 @@ --source include/have_debug.inc +--source include/innodb_undo_tablespaces.inc call mtr.add_suppression("InnoDB: New log files created"); diff --git a/mysql-test/suite/mariabackup/incremental_ddl_during_backup.test b/mysql-test/suite/mariabackup/incremental_ddl_during_backup.test index d7ba15c28ae..d9c6a72b5ee 100644 --- a/mysql-test/suite/mariabackup/incremental_ddl_during_backup.test +++ b/mysql-test/suite/mariabackup/incremental_ddl_during_backup.test @@ -1,4 +1,5 @@ --source include/have_debug.inc +--source include/innodb_undo_tablespaces.inc call mtr.add_suppression("InnoDB: New log files created"); diff --git a/mysql-test/suite/mariabackup/incremental_encrypted.test b/mysql-test/suite/mariabackup/incremental_encrypted.test index e618ac4f79e..d5570f20006 100644 --- a/mysql-test/suite/mariabackup/incremental_encrypted.test +++ b/mysql-test/suite/mariabackup/incremental_encrypted.test @@ -1,4 +1,5 @@ --source include/innodb_page_size.inc +--source include/innodb_undo_tablespaces.inc if (!$EXAMPLE_KEY_MANAGEMENT_SO) { diff --git a/mysql-test/suite/mariabackup/incremental_newdb_while_backup.test b/mysql-test/suite/mariabackup/incremental_newdb_while_backup.test index c4695edb845..6bd69712ed7 100644 --- a/mysql-test/suite/mariabackup/incremental_newdb_while_backup.test +++ b/mysql-test/suite/mariabackup/incremental_newdb_while_backup.test @@ -1,5 +1,6 @@ --source include/have_innodb.inc --source include/have_debug.inc +--source include/innodb_undo_tablespaces.inc call mtr.add_suppression("InnoDB: New log files created"); diff --git a/mysql-test/suite/mariabackup/log_page_corruption.test b/mysql-test/suite/mariabackup/log_page_corruption.test index b9b3a6e6a7b..2b101529039 100644 --- a/mysql-test/suite/mariabackup/log_page_corruption.test +++ b/mysql-test/suite/mariabackup/log_page_corruption.test @@ -1,5 +1,6 @@ --source include/have_debug.inc --source include/no_valgrind_without_big.inc +--source include/innodb_undo_tablespaces.inc --echo ######## --echo # Test for generating "innodb_corrupted_pages" file during full and diff --git a/mysql-test/suite/mariabackup/unsupported_redo.test b/mysql-test/suite/mariabackup/unsupported_redo.test index b02bcc3f695..97e1cad222d 100644 --- a/mysql-test/suite/mariabackup/unsupported_redo.test +++ b/mysql-test/suite/mariabackup/unsupported_redo.test @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/innodb_undo_tablespaces.inc call mtr.add_suppression("InnoDB: New log files created"); call mtr.add_suppression("InnoDB: Operating system error number .* in a file operation"); call mtr.add_suppression("InnoDB: The error means the system cannot find the path specified"); diff --git a/mysql-test/suite/mariabackup/xb_partition.test b/mysql-test/suite/mariabackup/xb_partition.test index 3d027b67fc1..1c8eeaa19e6 100644 --- a/mysql-test/suite/mariabackup/xb_partition.test +++ b/mysql-test/suite/mariabackup/xb_partition.test @@ -1,5 +1,6 @@ #--source include/innodb_page_size.inc --source include/have_partition.inc +--source include/innodb_undo_tablespaces.inc CREATE TABLE t1(a INT) ENGINE=InnoDB; INSERT INTO t1 VALUES (1), (2), (3); diff --git a/mysql-test/suite/parts/r/part_ctype_tis620.result b/mysql-test/suite/parts/r/part_ctype_tis620.result new file mode 100644 index 00000000000..48a8a95f40e --- /dev/null +++ b/mysql-test/suite/parts/r/part_ctype_tis620.result @@ -0,0 +1,47 @@ +# +# MDEV-27768 MDEV-25440: Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +# +CREATE TABLE t1 ( +a CHAR +) COLLATE=tis620_thai_nopad_ci +PARTITION BY RANGE COLUMNS (a) +( +PARTITION p0 VALUES LESS THAN (''), +PARTITION p VALUES LESS THAN ('') +); +ERROR HY000: VALUES LESS THAN value must be strictly increasing for each partition +CREATE TABLE t1 ( +a CHAR +) COLLATE=tis620_thai_nopad_ci +PARTITION BY RANGE COLUMNS (a) +( +PARTITION p0 VALUES LESS THAN (''), +PARTITION p VALUES LESS THAN (' ') +); +ERROR HY000: VALUES LESS THAN value must be strictly increasing for each partition +CREATE TABLE t1 ( +a CHAR +) COLLATE=tis620_thai_nopad_ci +PARTITION BY RANGE COLUMNS (a) +( +PARTITION p0 VALUES LESS THAN (' '), +PARTITION p VALUES LESS THAN ('') +); +ERROR HY000: VALUES LESS THAN value must be strictly increasing for each partition +CREATE TABLE t1 +( +id INT NOT NULL, +data VARCHAR(2), +KEY data_id (data(1),id) +) COLLATE tis620_thai_nopad_ci ENGINE=MyISAM +PARTITION BY RANGE (id) +( +PARTITION p10 VALUES LESS THAN (10), +PARTITION p20 VALUES LESS THAN (20) +); +INSERT INTO t1 VALUES (4, 'ab'), (14, 'ab'), (19,''),(9,'') ; +SELECT id FROM t1 WHERE data='' ORDER BY id; +id +9 +19 +DROP TABLE t1; diff --git a/mysql-test/suite/parts/t/part_ctype_tis620.test b/mysql-test/suite/parts/t/part_ctype_tis620.test new file mode 100644 index 00000000000..2e5bcd651b1 --- /dev/null +++ b/mysql-test/suite/parts/t/part_ctype_tis620.test @@ -0,0 +1,52 @@ +--source include/have_partition.inc +--source include/have_tis620.inc + +--echo # +--echo # MDEV-27768 MDEV-25440: Assertion `(cs->state & 0x20000) == 0' failed in my_strnncollsp_nchars_generic_8bit +--echo # + +--error ER_RANGE_NOT_INCREASING_ERROR +CREATE TABLE t1 ( + a CHAR +) COLLATE=tis620_thai_nopad_ci +PARTITION BY RANGE COLUMNS (a) +( + PARTITION p0 VALUES LESS THAN (''), + PARTITION p VALUES LESS THAN ('') +); + +--error ER_RANGE_NOT_INCREASING_ERROR +CREATE TABLE t1 ( + a CHAR +) COLLATE=tis620_thai_nopad_ci +PARTITION BY RANGE COLUMNS (a) +( + PARTITION p0 VALUES LESS THAN (''), + PARTITION p VALUES LESS THAN (' ') +); + +--error ER_RANGE_NOT_INCREASING_ERROR +CREATE TABLE t1 ( + a CHAR +) COLLATE=tis620_thai_nopad_ci +PARTITION BY RANGE COLUMNS (a) +( + PARTITION p0 VALUES LESS THAN (' '), + PARTITION p VALUES LESS THAN ('') +); + + +CREATE TABLE t1 +( + id INT NOT NULL, + data VARCHAR(2), + KEY data_id (data(1),id) +) COLLATE tis620_thai_nopad_ci ENGINE=MyISAM +PARTITION BY RANGE (id) +( + PARTITION p10 VALUES LESS THAN (10), + PARTITION p20 VALUES LESS THAN (20) +); +INSERT INTO t1 VALUES (4, 'ab'), (14, 'ab'), (19,''),(9,'') ; +SELECT id FROM t1 WHERE data='' ORDER BY id; +DROP TABLE t1; diff --git a/mysql-test/suite/period/r/create.result b/mysql-test/suite/period/r/create.result index dcae15c0772..e5fa2d1797d 100644 --- a/mysql-test/suite/period/r/create.result +++ b/mysql-test/suite/period/r/create.result @@ -100,3 +100,14 @@ show status like "Feature_application_time_periods"; Variable_name Value Feature_application_time_periods 6 drop table t; +# MDEV-29387: Period name with more than 32 symbols crashes the server +# +# test 34 symbols +create table t2 (s date, e date, +period for `abcd123456789012345678901234567890` (s,e)); +drop table t2; +# test 64 symbols +create table t2 (s date, e date, period for +`abcd123456789012345678901234567890123456789012345678901234567890` + (s,e)); +drop table t2; diff --git a/mysql-test/suite/period/r/delete.result b/mysql-test/suite/period/r/delete.result index d8dae7b2a99..2b0a97e03d8 100644 --- a/mysql-test/suite/period/r/delete.result +++ b/mysql-test/suite/period/r/delete.result @@ -397,3 +397,27 @@ insert into t1 values (1,'2020-01-01','2020-02-20'); delete from t1 for portion of se from '2020-01-30' to '2020-01-31'; drop table t1; # End of 10.5 tests +# +# MDEV-19190 Assertion `part_share->auto_inc_initialized` failed in +# ha_partition::get_auto_increment +# +create table t1 (id int, s date, e date, period for app(s,e)) +partition by key(id); +insert into t1 (s,e) values ('2023-07-21','2024-06-07'); +alter table t1 modify id int auto_increment key; +delete from t1 for portion of app from '2023-07-20' to '2024-05-23'; +select * from t1; +id s e +2 2024-05-23 2024-06-07 +drop table t1; +create table t1 (id int, s date, e date, period for app(s,e)) +partition by key(id); +insert into t1 (s,e) values ('2023-07-21','2024-06-07'); +alter table t1 modify id int auto_increment key; +delete from t1 for portion of app from '2023-07-20' to '2024-05-23'; +select * from t1; +id s e +2 2024-05-23 2024-06-07 +drop table t1; +drop table log_tbl; +drop procedure log; diff --git a/mysql-test/suite/period/t/create.test b/mysql-test/suite/period/t/create.test index 49dcc6ad3c7..0bca5b6df56 100644 --- a/mysql-test/suite/period/t/create.test +++ b/mysql-test/suite/period/t/create.test @@ -85,3 +85,17 @@ insert t values (2, '2001-01-01', '2001-01-01'); show status like "Feature_application_time_periods"; drop table t; + +--echo # MDEV-29387: Period name with more than 32 symbols crashes the server +--echo # + +--echo # test 34 symbols +create table t2 (s date, e date, + period for `abcd123456789012345678901234567890` (s,e)); +drop table t2; + +--echo # test 64 symbols +create table t2 (s date, e date, period for + `abcd123456789012345678901234567890123456789012345678901234567890` + (s,e)); +drop table t2; diff --git a/mysql-test/suite/period/t/delete.test b/mysql-test/suite/period/t/delete.test index 3750e064ab9..676fa256f95 100644 --- a/mysql-test/suite/period/t/delete.test +++ b/mysql-test/suite/period/t/delete.test @@ -1,5 +1,6 @@ source suite/period/engines.inc; source include/have_log_bin.inc; +source include/have_partition.inc; create table t (id int, s date, e date, period for apptime(s,e)); @@ -240,3 +241,30 @@ delete from t1 for portion of se from '2020-01-30' to '2020-01-31'; drop table t1; --echo # End of 10.5 tests +--echo # +--echo # MDEV-19190 Assertion `part_share->auto_inc_initialized` failed in +--echo # ha_partition::get_auto_increment +--echo # +create table t1 (id int, s date, e date, period for app(s,e)) + partition by key(id); +insert into t1 (s,e) values ('2023-07-21','2024-06-07'); +alter table t1 modify id int auto_increment key; +delete from t1 for portion of app from '2023-07-20' to '2024-05-23'; +select * from t1; +drop table t1; + +create table t1 (id int, s date, e date, period for app(s,e)) + partition by key(id); +insert into t1 (s,e) values ('2023-07-21','2024-06-07'); +alter table t1 modify id int auto_increment key; +--let $trig_table=t1 +--let $trig_cols=id, s, e +--disable_query_log +--source suite/period/create_triggers.inc +--enable_query_log + +delete from t1 for portion of app from '2023-07-20' to '2024-05-23'; +select * from t1; +drop table t1; +drop table log_tbl; +drop procedure log; diff --git a/mysql-test/suite/sysschema/disabled.def b/mysql-test/suite/sysschema/disabled.def new file mode 100644 index 00000000000..62df96a4663 --- /dev/null +++ b/mysql-test/suite/sysschema/disabled.def @@ -0,0 +1,12 @@ +############################################################################## +# +# List the test cases that are to be disabled temporarily. +# +# Separate the test case name and the comment with ':'. +# +# <testcasename> : BUG#<xxxx> <date disabled> <disabler> <comment> +# +# Do not use any TAB characters for whitespace. +# +############################################################################## +pr_statement_performance_analyzer : MDEV-29822 perfschema specific and Windows specific problems. diff --git a/sql/handler.cc b/sql/handler.cc index d3de74a8451..6487ccd2f92 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -4531,7 +4531,7 @@ void handler::print_error(int error, myf errflag) break; case HA_ERR_AUTOINC_ERANGE: textno= error; - my_error(textno, errflag, table->next_number_field->field_name.str, + my_error(textno, errflag, table->found_next_number_field->field_name.str, table->in_use->get_stmt_da()->current_row_for_warning()); DBUG_VOID_RETURN; break; diff --git a/sql/item.cc b/sql/item.cc index 385016d51b0..535fb1328d2 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -6130,6 +6130,7 @@ bool Item_field::fix_fields(THD *thd, Item **reference) if (!thd->lex->current_select->no_wrap_view_item && thd->lex->in_sum_func && + select && thd->lex == select->parent_lex && thd->lex->in_sum_func->nest_level == select->nest_level) diff --git a/sql/slave.cc b/sql/slave.cc index cf290fb8a89..361e77f2d04 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -7342,9 +7342,9 @@ static int connect_to_master(THD* thd, MYSQL* mysql, Master_info* mi, mi->ssl_ca[0]?mi->ssl_ca:0, mi->ssl_capath[0]?mi->ssl_capath:0, mi->ssl_cipher[0]?mi->ssl_cipher:0); - mysql_options(mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, - &mi->ssl_verify_server_cert); - mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, + mysql_options(mysql, MYSQL_OPT_SSL_CRL, + mi->ssl_crl[0] ? mi->ssl_crl : 0); + mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, mi->ssl_crlpath[0] ? mi->ssl_crlpath : 0); mysql_options(mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, &mi->ssl_verify_server_cert); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index b7296395444..4142540fa88 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -7738,6 +7738,8 @@ bool setup_fields(THD *thd, Ref_ptr_array ref_pointer_array, thd->lex->current_select->select_list_tables|= item->used_tables(); thd->lex->used_tables|= item->used_tables(); thd->lex->current_select->cur_pos_in_select_list++; + + thd->lex->current_select->rownum_in_field_list |= item->with_rownum_func(); } thd->lex->current_select->is_item_list_lookup= save_is_item_list_lookup; thd->lex->current_select->cur_pos_in_select_list= UNDEF_POS; diff --git a/sql/sql_const.h b/sql/sql_const.h index bcc556e61f9..490b870d768 100644 --- a/sql/sql_const.h +++ b/sql/sql_const.h @@ -29,7 +29,7 @@ /* extra 4+4 bytes for slave tmp tables */ #define MAX_DBKEY_LENGTH (NAME_LEN*2+1+1+4+4) #define MAX_ALIAS_NAME 256 -#define MAX_FIELD_NAME 34 /* Max colum name length +2 */ +#define MAX_FIELD_NAME (NAME_LEN+1) /* Max colum name length +1 */ #define MAX_SYS_VAR_LENGTH 32 #define MAX_KEY MAX_INDEXES /* Max used keys */ #define MAX_REF_PARTS 32 /* Max parts used as ref */ diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index e64dd847dcd..d74b9e8916f 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -704,6 +704,10 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, { table->use_all_columns(); table->rpl_write_set= table->write_set; + // Initialize autoinc. + // We don't set next_number_field here, as it is handled manually. + if (table->found_next_number_field) + table->file->info(HA_STATUS_AUTO); } else { diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index dbc38552e76..9cf10bd5b82 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -3002,6 +3002,8 @@ void st_select_lex::init_query() prep_leaf_list_state= UNINIT; bzero((char*) expr_cache_may_be_used, sizeof(expr_cache_may_be_used)); select_list_tables= 0; + rownum_in_field_list= 0; + window_specs.empty(); window_funcs.empty(); tvc= 0; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index c16947edc5a..85f7da7d09f 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -1343,6 +1343,9 @@ public: */ table_map select_list_tables; + /* Set to 1 if any field in field list has ROWNUM() */ + bool rownum_in_field_list; + /* namp of nesting SELECT visibility (for aggregate functions check) */ nesting_map name_visibility_map; table_map with_dep; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 3d0809f8785..2b8ea9265de 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1136,7 +1136,7 @@ static bool wsrep_tables_accessible_when_detached(const TABLE_LIST *tables) if (get_table_category(&db, &tn) < TABLE_CATEGORY_INFORMATION) return false; } - return true; + return tables != NULL; } static bool wsrep_command_no_result(char command) @@ -3687,6 +3687,8 @@ mysql_execute_command(THD *thd, bool is_called_from_prepared_stmt) (sql_command_flags[lex->sql_command] & CF_CHANGES_DATA) == 0) && !wsrep_tables_accessible_when_detached(all_tables) && lex->sql_command != SQLCOM_SET_OPTION && + lex->sql_command != SQLCOM_CHANGE_DB && + !(lex->sql_command == SQLCOM_SELECT && !all_tables) && !wsrep_is_show_query(lex->sql_command)) { my_message(ER_UNKNOWN_COM_ERROR, diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 6e914a1529e..be78cad5f7a 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -434,7 +434,6 @@ void JOIN::init(THD *thd_arg, List<Item> &fields_arg, no_order= 0; simple_order= 0; simple_group= 0; - rand_table_in_field_list= 0; ordered_index_usage= ordered_index_void; need_distinct= 0; skip_sort_order= 0; @@ -1434,7 +1433,6 @@ JOIN::prepare(TABLE_LIST *tables_init, COND *conds_init, uint og_num, &all_fields, &select_lex->pre_fix, 1)) DBUG_RETURN(-1); thd->lex->current_select->context_analysis_place= save_place; - rand_table_in_field_list= select_lex->select_list_tables & RAND_TABLE_BIT; if (setup_without_group(thd, ref_ptrs, tables_list, select_lex->leaf_tables, fields_list, @@ -14806,7 +14804,7 @@ remove_const(JOIN *join,ORDER *first_order, COND *cond, and some wrong results so better to leave the code as it was related to ROLLUP. */ - *simple_order= !join->rand_table_in_field_list; + *simple_order= !join->select_lex->rownum_in_field_list; if (join->only_const_tables()) return change_list ? 0 : first_order; // No need to sort diff --git a/sql/sql_select.h b/sql/sql_select.h index c9e0fa25421..3332bc78b6c 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -1420,11 +1420,6 @@ public: GROUP/ORDER BY. */ bool simple_order, simple_group; - /* - Set to 1 if any field in field list has RAND_TABLE set. For example if - if one uses RAND() or ROWNUM() in field list - */ - bool rand_table_in_field_list; /* ordered_index_usage is set if an ordered index access diff --git a/sql/table.cc b/sql/table.cc index 52dc78aea28..8773eed9a40 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8993,6 +8993,7 @@ int TABLE::update_generated_fields() res= found_next_number_field->set_default(); if (likely(!res)) res= file->update_auto_increment(); + next_number_field= NULL; } if (likely(!res) && vfield) diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index ccd7693bb09..3dd7a6ef9d4 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -125,6 +125,7 @@ ulong wsrep_trx_fragment_unit= WSREP_FRAG_BYTES; ulong wsrep_SR_store_type= WSREP_SR_STORE_TABLE; uint wsrep_ignore_apply_errors= 0; +std::atomic <bool> wsrep_thread_create_failed; /* * End configuration options @@ -3513,7 +3514,7 @@ int wsrep_create_trigger_query(THD *thd, uchar** buf, size_t* buf_len) void* start_wsrep_THD(void *arg) { - THD *thd; + THD *thd= NULL; Wsrep_thd_args* thd_args= (Wsrep_thd_args*) arg; @@ -3544,6 +3545,7 @@ void* start_wsrep_THD(void *arg) mysql_thread_set_psi_id(thd->thread_id); thd->thr_create_utime= microsecond_interval_timer(); + DBUG_EXECUTE_IF("wsrep_simulate_failed_connection_1", goto error; ); // </5.1.17> /* handle_one_connection() is normally the only way a thread would @@ -3650,6 +3652,18 @@ void* start_wsrep_THD(void *arg) error: WSREP_ERROR("Failed to create/initialize system thread"); + if (thd) + { + close_connection(thd, ER_OUT_OF_RESOURCES); + statistic_increment(aborted_connects, &LOCK_status); + server_threads.erase(thd); + delete thd; + my_thread_end(); + } + delete thd_args; + // This will signal error to wsrep_slave_threads_update + wsrep_thread_create_failed.store(true, std::memory_order_relaxed); + /* Abort if its the first applier/rollbacker thread. */ if (!mysqld_server_initialized) unireg_abort(1); diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 5ba466a03d3..412b9242d77 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -88,6 +88,7 @@ extern ulong wsrep_running_rollbacker_threads; extern bool wsrep_new_cluster; extern bool wsrep_gtid_mode; extern uint32 wsrep_gtid_domain_id; +extern std::atomic <bool > wsrep_thread_create_failed; extern ulonglong wsrep_mode; enum enum_wsrep_reject_types { diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 770c4657e65..e610d3a6c2b 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -23,8 +23,7 @@ #include "rpl_rli.h" #include "log_event.h" #include "sql_parse.h" -#include "mysqld.h" // start_wsrep_THD(); -#include "wsrep_applier.h" // start_wsrep_THD(); +#include "wsrep_mysqld.h" // start_wsrep_THD(); #include "mysql/service_wsrep.h" #include "debug_sync.h" #include "slave.h" diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index 4f4e7817fef..0de1b034953 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -789,18 +789,25 @@ bool wsrep_slave_threads_update (sys_var *self, THD* thd, enum_var_type type) if (wsrep_slave_count_change > 0) { WSREP_DEBUG("Creating %d applier threads, total %ld", wsrep_slave_count_change, wsrep_slave_threads); + wsrep_thread_create_failed.store(false, std::memory_order_relaxed); res= wsrep_create_appliers(wsrep_slave_count_change, true); mysql_mutex_unlock(&LOCK_global_system_variables); mysql_mutex_unlock(&LOCK_wsrep_slave_threads); // Thread creation and execution is asyncronous, therefore we need // wait them to be started or error produced - while (wsrep_running_applier_threads != (ulong)wsrep_slave_threads) + while (wsrep_running_applier_threads != (ulong)wsrep_slave_threads && + !wsrep_thread_create_failed.load(std::memory_order_relaxed)) { my_sleep(1000); } mysql_mutex_lock(&LOCK_global_system_variables); + if (wsrep_thread_create_failed.load(std::memory_order_relaxed)) { + wsrep_slave_threads= wsrep_running_applier_threads; + return true; + } + WSREP_DEBUG("Running %lu applier threads", wsrep_running_applier_threads); wsrep_slave_count_change = 0; } diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index ba28ba6d33f..013ea428e9a 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -2629,288 +2629,6 @@ dberr_t btr_cur_t::open_leaf(bool first, dict_index_t *index, return err; } -/**********************************************************************//** -Positions a cursor at a randomly chosen position within a B-tree. -@return true if the index is available and we have put the cursor, false -if the index is unavailable */ -bool -btr_cur_open_at_rnd_pos( - dict_index_t* index, /*!< in: index */ - btr_latch_mode latch_mode, /*!< in: BTR_SEARCH_LEAF, ... */ - btr_cur_t* cursor, /*!< in/out: B-tree cursor */ - mtr_t* mtr) /*!< in: mtr */ -{ - page_cur_t* page_cursor; - ulint node_ptr_max_size = srv_page_size / 2; - ulint height; - rec_t* node_ptr; - btr_intention_t lock_intention; - buf_block_t* tree_blocks[BTR_MAX_LEVELS]; - ulint tree_savepoints[BTR_MAX_LEVELS]; - ulint n_blocks = 0; - ulint n_releases = 0; - mem_heap_t* heap = NULL; - rec_offs offsets_[REC_OFFS_NORMAL_SIZE]; - rec_offs* offsets = offsets_; - rec_offs_init(offsets_); - - ut_ad(!index->is_spatial()); - - lock_intention = btr_cur_get_and_clear_intention(&latch_mode); - - ulint savepoint = mtr_set_savepoint(mtr); - - rw_lock_type_t upper_rw_latch; - - switch (latch_mode) { - case BTR_MODIFY_TREE: - /* Most of delete-intended operations are purging. - Free blocks and read IO bandwidth should be prior - for them, when the history list is glowing huge. */ - if (lock_intention == BTR_INTENTION_DELETE - && buf_pool.n_pend_reads - && trx_sys.history_size_approx() - > BTR_CUR_FINE_HISTORY_LENGTH) { - mtr_x_lock_index(index, mtr); - } else { - mtr_sx_lock_index(index, mtr); - } - upper_rw_latch = RW_X_LATCH; - break; - case BTR_SEARCH_PREV: - case BTR_MODIFY_PREV: - /* This function doesn't support left uncle - page lock for left leaf page lock, when - needed. */ - case BTR_SEARCH_TREE: - case BTR_CONT_MODIFY_TREE: - case BTR_CONT_SEARCH_TREE: - ut_ad(0); - /* fall through */ - default: - if (!srv_read_only_mode) { - mtr_s_lock_index(index, mtr); - upper_rw_latch = RW_S_LATCH; - } else { - upper_rw_latch = RW_NO_LATCH; - } - } - - DBUG_EXECUTE_IF("test_index_is_unavailable", - return(false);); - - if (index->page == FIL_NULL) { - /* Since we don't hold index lock until just now, the index - could be modified by others, for example, if this is a - statistics updater for referenced table, it could be marked - as unavailable by 'DROP TABLE' in the mean time, since - we don't hold lock for statistics updater */ - return(false); - } - - const rw_lock_type_t root_leaf_rw_latch = btr_cur_latch_for_root_leaf( - latch_mode); - - page_cursor = btr_cur_get_page_cur(cursor); - page_cursor->index = index; - - page_id_t page_id(index->table->space_id, index->page); - const ulint zip_size = index->table->space->zip_size(); - dberr_t err; - - if (root_leaf_rw_latch == RW_X_LATCH) { - node_ptr_max_size = btr_node_ptr_max_size(index); - } - - height = ULINT_UNDEFINED; - - for (;;) { - page_t* page; - - ut_ad(n_blocks < BTR_MAX_LEVELS); - tree_savepoints[n_blocks] = mtr_set_savepoint(mtr); - - const rw_lock_type_t rw_latch = height - && latch_mode != BTR_MODIFY_TREE - ? upper_rw_latch : RW_NO_LATCH; - buf_block_t* block = buf_page_get_gen(page_id, zip_size, - rw_latch, NULL, BUF_GET, - mtr, &err, - height == 0 - && !index->is_clust()); - tree_blocks[n_blocks] = block; - - ut_ad((block != NULL) == (err == DB_SUCCESS)); - - if (!block) { - if (err == DB_DECRYPTION_FAILED) { - btr_decryption_failed(*index); - } - - break; - } - - page = buf_block_get_frame(block); - - if (height == ULINT_UNDEFINED - && page_is_leaf(page) - && rw_latch != RW_NO_LATCH - && rw_latch != root_leaf_rw_latch) { - /* We should retry to get the page, because the root page - is latched with different level as a leaf page. */ - ut_ad(root_leaf_rw_latch != RW_NO_LATCH); - ut_ad(rw_latch == RW_S_LATCH); - - ut_ad(n_blocks == 0); - mtr_release_block_at_savepoint( - mtr, tree_savepoints[n_blocks], - tree_blocks[n_blocks]); - - upper_rw_latch = root_leaf_rw_latch; - continue; - } - - ut_ad(fil_page_index_page_check(page)); - ut_ad(index->id == btr_page_get_index_id(page)); - - if (height == ULINT_UNDEFINED) { - /* We are in the root node */ - - height = btr_page_get_level(page); - } - - if (height == 0) { - if (rw_latch == RW_NO_LATCH - || srv_read_only_mode) { - btr_cur_latch_leaves(block, latch_mode, cursor, - mtr); - } - - /* btr_cur_t::open_leaf() and - btr_cur_search_to_nth_level() release - tree s-latch here.*/ - switch (latch_mode) { - case BTR_MODIFY_TREE: - case BTR_CONT_MODIFY_TREE: - case BTR_CONT_SEARCH_TREE: - break; - default: - /* Release the tree s-latch */ - if (!srv_read_only_mode) { - mtr_release_s_latch_at_savepoint( - mtr, savepoint, - &index->lock); - } - - /* release upper blocks */ - for (; n_releases < n_blocks; n_releases++) { - mtr_release_block_at_savepoint( - mtr, - tree_savepoints[n_releases], - tree_blocks[n_releases]); - } - } - } - - page_cursor->block = block; - page_cur_open_on_rnd_user_rec(page_cursor); - - if (height == 0) { - - break; - } - - ut_ad(height > 0); - - height--; - - node_ptr = page_cur_get_rec(page_cursor); - offsets = rec_get_offsets(node_ptr, page_cursor->index, - offsets, 0, ULINT_UNDEFINED, &heap); - - /* If the rec is the first or last in the page for - pessimistic delete intention, it might cause node_ptr insert - for the upper level. We should change the intention and retry. - */ - if (latch_mode == BTR_MODIFY_TREE - && btr_cur_need_opposite_intention( - page, lock_intention, node_ptr)) { - - ut_ad(upper_rw_latch == RW_X_LATCH); - /* release all blocks */ - for (; n_releases <= n_blocks; n_releases++) { - mtr_release_block_at_savepoint( - mtr, tree_savepoints[n_releases], - tree_blocks[n_releases]); - } - - lock_intention = BTR_INTENTION_BOTH; - - page_id.set_page_no(dict_index_get_page(index)); - - height = ULINT_UNDEFINED; - - n_blocks = 0; - n_releases = 0; - - continue; - } - - if (latch_mode == BTR_MODIFY_TREE - && !btr_cur_will_modify_tree( - page_cursor->index, page, lock_intention, - node_ptr, node_ptr_max_size, zip_size, mtr)) { - ut_ad(upper_rw_latch == RW_X_LATCH); - ut_ad(n_releases <= n_blocks); - - /* we can release upper blocks */ - for (; n_releases < n_blocks; n_releases++) { - if (n_releases == 0) { - /* we should not release root page - to pin to same block. */ - continue; - } - - /* release unused blocks to unpin */ - mtr_release_block_at_savepoint( - mtr, tree_savepoints[n_releases], - tree_blocks[n_releases]); - } - } - - if (height == 0 - && latch_mode == BTR_MODIFY_TREE) { - ut_ad(upper_rw_latch == RW_X_LATCH); - /* we should sx-latch root page, if released already. - It contains seg_header. */ - if (n_releases > 0) { - mtr->sx_latch_at_savepoint( - tree_savepoints[0], - tree_blocks[0]); - } - - /* x-latch the branch blocks not released yet. */ - for (ulint i = n_releases; i <= n_blocks; i++) { - mtr->x_latch_at_savepoint( - tree_savepoints[i], - tree_blocks[i]); - } - } - - /* Go to the child node */ - page_id.set_page_no( - btr_node_ptr_get_child_page_no(node_ptr, offsets)); - - n_blocks++; - } - - if (UNIV_LIKELY_NULL(heap)) { - mem_heap_free(heap); - } - - return err == DB_SUCCESS; -} - /*==================== B-TREE INSERT =========================*/ /*************************************************************//** diff --git a/storage/innobase/dict/dict0stats.cc b/storage/innobase/dict/dict0stats.cc index 5f2d8f27377..ba277ca67e9 100644 --- a/storage/innobase/dict/dict0stats.cc +++ b/storage/innobase/dict/dict0stats.cc @@ -1079,6 +1079,60 @@ btr_record_not_null_field_in_rec( } } +inline dberr_t +btr_cur_t::open_random_leaf(rec_offs *&offsets, mem_heap_t *&heap, mtr_t &mtr) +{ + ut_ad(!index()->is_spatial()); + ut_ad(!mtr.get_savepoint()); + + mtr_s_lock_index(index(), &mtr); + + if (index()->page == FIL_NULL) + return DB_CORRUPTION; + + dberr_t err; + auto offset= index()->page; + bool merge= false; + ulint height= ULINT_UNDEFINED; + + while (buf_block_t *block= + btr_block_get(*index(), offset, RW_S_LATCH, merge, &mtr, &err)) + { + page_cur.block= block; + + if (height == ULINT_UNDEFINED) + { + height= btr_page_get_level(block->page.frame); + if (height > BTR_MAX_LEVELS) + return DB_CORRUPTION; + + if (height == 0) + goto got_leaf; + } + + if (height == 0) + { + mtr.rollback_to_savepoint(0, mtr.get_savepoint() - 1); + got_leaf: + page_cur.rec= page_get_infimum_rec(block->page.frame); + return DB_SUCCESS; + } + + if (!--height) + merge= !index()->is_clust(); + + page_cur_open_on_rnd_user_rec(&page_cur); + + offsets= rec_get_offsets(page_cur.rec, page_cur.index, offsets, 0, + ULINT_UNDEFINED, &heap); + + /* Go to the child node */ + offset= btr_node_ptr_get_child_page_no(page_cur.rec, offsets); + } + + return err; +} + /** Estimated table level stats from sampled value. @param value sampled stats @param index index being sampled @@ -1107,7 +1161,6 @@ std::vector<index_field_stats_t> btr_estimate_number_of_different_key_vals(dict_index_t* index, trx_id_t bulk_trx_id) { - btr_cur_t cursor; page_t* page; rec_t* rec; ulint n_cols; @@ -1222,14 +1275,15 @@ btr_estimate_number_of_different_key_vals(dict_index_t* index, ut_ad(n_sample_pages > 0 && n_sample_pages <= (index->stat_index_size <= 1 ? 1 : index->stat_index_size)); /* We sample some pages in the index to get an estimate */ + btr_cur_t cursor; + cursor.page_cur.index = index; for (ulint i = 0; i < n_sample_pages; i++) { mtr.start(); - if (!btr_cur_open_at_rnd_pos(index, BTR_SEARCH_LEAF, - &cursor, &mtr) - || index->table->bulk_trx_id != bulk_trx_id - || !index->is_readable()) { + if (cursor.open_random_leaf(offsets_rec, heap, mtr) != + DB_SUCCESS + || index->table->bulk_trx_id != bulk_trx_id) { mtr.commit(); goto exit_loop; } @@ -1242,9 +1296,8 @@ btr_estimate_number_of_different_key_vals(dict_index_t* index, page = btr_cur_get_page(&cursor); - rec = page_rec_get_next(page_get_infimum_rec(page)); - const ulint n_core = page_is_leaf(page) - ? index->n_core_fields : 0; + rec = page_rec_get_next(cursor.page_cur.rec); + const ulint n_core = index->n_core_fields; if (rec && !page_rec_is_supremum(rec)) { not_empty_flag = 1; diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 783e882562f..f672bc8da2f 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -2416,36 +2416,26 @@ will be merged from ibuf trees to the pages read ulint ibuf_contract() { mtr_t mtr; - btr_pcur_t pcur; + btr_cur_t cur; ulint sum_sizes; uint32_t page_nos[IBUF_MAX_N_PAGES_MERGED]; uint32_t space_ids[IBUF_MAX_N_PAGES_MERGED]; ibuf_mtr_start(&mtr); - /* Open a cursor to a randomly chosen leaf of the tree, at a random - position within the leaf */ - pcur.pos_state = BTR_PCUR_IS_POSITIONED; - pcur.old_rec = nullptr; - pcur.trx_if_known = nullptr; - pcur.search_mode = PAGE_CUR_G; - pcur.latch_mode = BTR_SEARCH_LEAF; - - btr_pcur_init(&pcur); - - if (!btr_cur_open_at_rnd_pos(ibuf.index, BTR_SEARCH_LEAF, - btr_pcur_get_btr_cur(&pcur), &mtr)) { + if (cur.open_leaf(true, ibuf.index, BTR_SEARCH_LEAF, &mtr) != + DB_SUCCESS) { return 0; } - ut_ad(page_validate(btr_pcur_get_page(&pcur), ibuf.index)); + ut_ad(page_validate(btr_cur_get_page(&cur), ibuf.index)); - if (page_is_empty(btr_pcur_get_page(&pcur))) { + if (page_is_empty(btr_cur_get_page(&cur))) { /* If a B-tree page is empty, it must be the root page and the whole B-tree must be empty. InnoDB does not allow empty B-tree pages other than the root. */ ut_ad(ibuf.empty); - ut_ad(btr_pcur_get_block(&pcur)->page.id() + ut_ad(btr_cur_get_block(&cur)->page.id() == page_id_t(IBUF_SPACE_ID, FSP_IBUF_TREE_ROOT_PAGE_NO)); ibuf_mtr_commit(&mtr); @@ -2455,7 +2445,7 @@ ulint ibuf_contract() ulint n_pages = 0; sum_sizes = ibuf_get_merge_page_nos(TRUE, - btr_pcur_get_rec(&pcur), &mtr, + btr_cur_get_rec(&cur), &mtr, space_ids, page_nos, &n_pages); ibuf_mtr_commit(&mtr); diff --git a/storage/innobase/include/btr0cur.h b/storage/innobase/include/btr0cur.h index aa890be9936..49bc8a4ff1b 100644 --- a/storage/innobase/include/btr0cur.h +++ b/storage/innobase/include/btr0cur.h @@ -172,17 +172,6 @@ dberr_t btr_cur_search_to_nth_level(ulint level, btr_cur_t *cursor, mtr_t *mtr, ib_uint64_t autoinc= 0); -/**********************************************************************//** -Positions a cursor at a randomly chosen position within a B-tree. -@return true if the index is available and we have put the cursor, false -if the index is unavailable */ -bool -btr_cur_open_at_rnd_pos( - dict_index_t* index, /*!< in: index */ - btr_latch_mode latch_mode, /*!< in: BTR_SEARCH_LEAF, ... */ - btr_cur_t* cursor, /*!< in/out: B-tree cursor */ - mtr_t* mtr) /*!< in: mtr */ - MY_ATTRIBUTE((nonnull,warn_unused_result)); /*************************************************************//** Tries to perform an insert to a page in an index tree, next to cursor. It is assumed that mtr holds an x-latch on the page. The operation does @@ -813,6 +802,14 @@ struct btr_cur_t { @return error code */ dberr_t open_leaf(bool first, dict_index_t *index, btr_latch_mode latch_mode, mtr_t *mtr); + + /** Open the cursor at a random leaf page record. + @param offsets temporary memory for rec_get_offsets() + @param heap memory heap for rec_get_offsets() + @param mtr mini-transaction + @return error code */ + inline dberr_t open_random_leaf(rec_offs *&offsets, mem_heap_t *& heap, + mtr_t &mtr); }; /** Modify the delete-mark flag of a record. diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index ce5e56ba542..dcbbe412ffe 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -589,6 +589,18 @@ ret: } +static int +my_strnncollsp_nchars_tis620(CHARSET_INFO * cs, + const uchar *a, size_t a_length, + const uchar *b, size_t b_length, + size_t nchars) +{ + set_if_smaller(a_length, nchars); + set_if_smaller(b_length, nchars); + return my_strnncollsp_tis620(cs, a, a_length, b, b_length); +} + + static int my_strnncollsp_tis620_nopad(CHARSET_INFO * cs __attribute__((unused)), const uchar *a0, size_t a_length, @@ -856,7 +868,7 @@ static MY_COLLATION_HANDLER my_collation_ci_handler = NULL, /* init */ my_strnncoll_tis620, my_strnncollsp_tis620, - my_strnncollsp_nchars_generic_8bit, + my_strnncollsp_nchars_tis620, my_strnxfrm_tis620, my_strnxfrmlen_simple, my_like_range_simple, @@ -874,7 +886,7 @@ static MY_COLLATION_HANDLER my_collation_nopad_ci_handler = NULL, /* init */ my_strnncoll_tis620, my_strnncollsp_tis620_nopad, - my_strnncollsp_nchars_generic_8bit, + my_strnncollsp_nchars_tis620, my_strnxfrm_tis620_nopad, my_strnxfrmlen_simple, my_like_range_simple, diff --git a/unittest/strings/strings-t.c b/unittest/strings/strings-t.c index 7532244b0a2..597998f5360 100644 --- a/unittest/strings/strings-t.c +++ b/unittest/strings/strings-t.c @@ -1469,6 +1469,7 @@ test_strnncollsp_char() #ifdef HAVE_CHARSET_tis620 failed+= strnncollsp_char_mbminlen1("tis620_thai_ci", NULL); + failed+= strnncollsp_char_mbminlen1("tis620_thai_nopad_ci", NULL); #endif #ifdef HAVE_CHARSET_big5 diff --git a/wsrep-lib b/wsrep-lib -Subproject 8bfce04189671eb1f06e0fa83dff8c880f31088 +Subproject f8ff2cfdd4c6424ffd96fc53bcc0f2e1d9ffe13 |