From 81d7adb1e2cdfb1064279b8643a8c3d22b3dd423 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 18 Nov 2021 00:51:17 +0100 Subject: [PATCH 01/16] MDEV-27075 mysql_upgrade_service.exe - using uninitialized memory 'defaults_file' Remove section that was trying to rename default-character-set to character-set-server This seems to be an old workaround for some upgrade warning, which did not work for some time already, because the ini filename was not initialized. --- sql/mysql_upgrade_service.cc | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/sql/mysql_upgrade_service.cc b/sql/mysql_upgrade_service.cc index 37dae648563..5afe4ccbc52 100644 --- a/sql/mysql_upgrade_service.cc +++ b/sql/mysql_upgrade_service.cc @@ -317,9 +317,6 @@ void initiate_mysqld_shutdown() */ static void change_service_config() { - - char defaults_file[MAX_PATH]; - char default_character_set[64]; char buf[MAX_PATH]; char commandline[3*MAX_PATH + 19]; int i; @@ -382,22 +379,6 @@ static void change_service_config() */ WritePrivateProfileString("mysqld", "basedir",NULL, props.inifile); - /* - Replace default-character-set with character-set-server, to avoid - "default-character-set is deprecated and will be replaced ..." - message. - */ - default_character_set[0]= 0; - GetPrivateProfileString("mysqld", "default-character-set", NULL, - default_character_set, sizeof(default_character_set), defaults_file); - if (default_character_set[0]) - { - WritePrivateProfileString("mysqld", "default-character-set", NULL, - defaults_file); - WritePrivateProfileString("mysqld", "character-set-server", - default_character_set, defaults_file); - } - sprintf(defaults_file_param,"--defaults-file=%s", props.inifile); sprintf_s(commandline, "\"%s\" \"%s\" \"%s\"", mysqld_path, defaults_file_param, opt_service); From 7efcc2794d698f62074290232e0f71234c7a4b41 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Sat, 20 Nov 2021 16:11:08 +0400 Subject: [PATCH 02/16] MDEV-27072 Subquery using the ALL keyword on date columns produces a wrong result --- mysql-test/r/type_date.result | 12 ++++++++++++ mysql-test/t/type_date.test | 9 +++++++++ sql/sql_class.cc | 2 +- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/type_date.result b/mysql-test/r/type_date.result index ee50b1c4f2d..8a45ede4851 100644 --- a/mysql-test/r/type_date.result +++ b/mysql-test/r/type_date.result @@ -932,5 +932,17 @@ Warning 1292 Incorrect datetime value: '1995.0000000' Note 1003 select `test`.`t1`.`f` AS `f` from `test`.`t1` where '0000-00-00' between `test`.`t1`.`f` and ('2012-12-12') DROP TABLE t1; # +# MDEV-27072 Subquery using the ALL keyword on date columns produces a wrong result +# +CREATE TABLE t1 (d DATE); +INSERT INTO t1 VALUES ('2021-11-17'), ('2021-10-17'),('2022-11-17'), ('2020-10-17'); +SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1); +d +2022-11-17 +SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1); +d +2020-10-17 +DROP TABLE t1; +# # End of 10.2 tests # diff --git a/mysql-test/t/type_date.test b/mysql-test/t/type_date.test index fead1739c06..760427bf26c 100644 --- a/mysql-test/t/type_date.test +++ b/mysql-test/t/type_date.test @@ -647,6 +647,15 @@ INSERT INTO t1 VALUES ('2020-01-01'),('2020-01-02'); EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1995.0000000 BETWEEN f AND '2012-12-12'; DROP TABLE t1; +--echo # +--echo # MDEV-27072 Subquery using the ALL keyword on date columns produces a wrong result +--echo # + +CREATE TABLE t1 (d DATE); +INSERT INTO t1 VALUES ('2021-11-17'), ('2021-10-17'),('2022-11-17'), ('2020-10-17'); +SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1); +SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1); +DROP TABLE t1; --echo # --echo # End of 10.2 tests diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 2eec056ec9d..21c06029787 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3479,7 +3479,7 @@ bool select_max_min_finder_subselect::cmp_str() but added for safety */ val1= cache->val_str(&buf1); - val2= maxmin->val_str(&buf1); + val2= maxmin->val_str(&buf2); /* Ignore NULLs for ANY and keep them for ALL subqueries */ if (cache->null_value) From e9f171b4fe65399e9ebbb1660198b690582e2ef5 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Sat, 20 Nov 2021 21:49:25 +0400 Subject: [PATCH 03/16] MDEV-27098 Subquery using the ALL keyword on TIME columns produces a wrong result --- mysql-test/r/type_time.result | 12 ++++++++++++ mysql-test/t/type_time.test | 10 ++++++++++ sql/sql_class.cc | 25 +++++++++++++++++++++++-- sql/sql_class.h | 1 + 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/type_time.result b/mysql-test/r/type_time.result index 90d09ea595f..6e041236ff9 100644 --- a/mysql-test/r/type_time.result +++ b/mysql-test/r/type_time.result @@ -1368,5 +1368,17 @@ Warning 1292 Incorrect datetime value: '1995.0000000' Note 1003 select `test`.`t1`.`f` AS `f` from `test`.`t1` where '00:00:00.000000' between `test`.`t1`.`f` and ('23:59:59') DROP TABLE t1; # +# MDEV-27098 Subquery using the ALL keyword on TIME columns produces a wrong result +# +CREATE TABLE t1 (d TIME); +INSERT INTO t1 VALUES ('120:00:00'), ('20:00:00'), ('-120:00:00'), ('-220:00:00'); +SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1); +d +120:00:00 +SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1); +d +-220:00:00 +DROP TABLE t1; +# # End of 10.2 tests # diff --git a/mysql-test/t/type_time.test b/mysql-test/t/type_time.test index 9ef80cf28fb..7c1a411df37 100644 --- a/mysql-test/t/type_time.test +++ b/mysql-test/t/type_time.test @@ -823,6 +823,16 @@ INSERT INTO t1 VALUES ('10:10:10'),('20:20:20'); EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1995.0000000 BETWEEN f AND '23:59:59'; DROP TABLE t1; +--echo # +--echo # MDEV-27098 Subquery using the ALL keyword on TIME columns produces a wrong result +--echo # + +CREATE TABLE t1 (d TIME); +INSERT INTO t1 VALUES ('120:00:00'), ('20:00:00'), ('-120:00:00'), ('-220:00:00'); +SELECT * FROM t1 WHERE d >= ALL (SELECT * FROM t1); +SELECT * FROM t1 WHERE d <= ALL (SELECT * FROM t1); +DROP TABLE t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 21c06029787..479578679f1 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3394,7 +3394,7 @@ int select_max_min_finder_subselect::send_data(List &items) if (!cache) { cache= Item_cache::get_cache(thd, val_item); - switch (val_item->result_type()) { + switch (val_item->cmp_type()) { case REAL_RESULT: op= &select_max_min_finder_subselect::cmp_real; break; @@ -3407,8 +3407,13 @@ int select_max_min_finder_subselect::send_data(List &items) case DECIMAL_RESULT: op= &select_max_min_finder_subselect::cmp_decimal; break; - case ROW_RESULT: case TIME_RESULT: + if (val_item->field_type() == MYSQL_TYPE_TIME) + op= &select_max_min_finder_subselect::cmp_time; + else + op= &select_max_min_finder_subselect::cmp_str; + break; + case ROW_RESULT: // This case should never be choosen DBUG_ASSERT(0); op= 0; @@ -3453,6 +3458,22 @@ bool select_max_min_finder_subselect::cmp_int() return (val1 < val2); } +bool select_max_min_finder_subselect::cmp_time() +{ + Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0); + longlong val1= cache->val_time_packed(), val2= maxmin->val_time_packed(); + + /* Ignore NULLs for ANY and keep them for ALL subqueries */ + if (cache->null_value) + return (is_all && !maxmin->null_value) || (!is_all && maxmin->null_value); + if (maxmin->null_value) + return !is_all; + + if (fmax) + return(val1 > val2); + return (val1 < val2); +} + bool select_max_min_finder_subselect::cmp_decimal() { Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0); diff --git a/sql/sql_class.h b/sql/sql_class.h index a767a34d869..9fff422684e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -5396,6 +5396,7 @@ public: bool cmp_int(); bool cmp_decimal(); bool cmp_str(); + bool cmp_time(); }; /* EXISTS subselect interface class */ From 0dae41637abd24c8f08e925ef00490e949ce581d Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Fri, 19 Nov 2021 14:51:12 -0800 Subject: [PATCH 04/16] MDEV-27086 "No database selected" when using UNION of CTEs to define table This bug concerned only CREATE TABLE statements of the form CREATE TABLE AS . For such a statement not all references to CTE used in were resolved. As a result a bogus message was reported for the first unresolved reference. This happened because for such statements the function resolving references to CTEs LEX::check_cte_dependencies_and_resolve_references() was called prematurely in the parser. Approved by Oleksandr Byelkin --- mysql-test/r/cte_nonrecursive.result | 26 ++++++++++++++++++++++++++ mysql-test/t/cte_nonrecursive.test | 23 +++++++++++++++++++++++ sql/sql_yacc.yy | 8 ++++---- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/cte_nonrecursive.result b/mysql-test/r/cte_nonrecursive.result index db747a71ac4..d9b7f054271 100644 --- a/mysql-test/r/cte_nonrecursive.result +++ b/mysql-test/r/cte_nonrecursive.result @@ -2136,4 +2136,30 @@ drop procedure sp1; drop function g; drop function f; drop table t1; +# +# MDEV-27086: union using CTEs in CREATE TABLE +# +create or replace temporary table tmp as +with cte1 as (select 1 as a), cte2 as (select 2 as a) +select * from cte1 union select * from cte2; +select * from tmp; +a +1 +2 +create table t1 as +with cte1 as (select 1 as a), cte2 as (select 2 as a) +select * from cte1 union select * from cte2; +select * from t1; +a +1 +2 +insert into t1 values (3); +create table t2 as +with cte1 as (select * from t1 where a <2), cte2 as (select * from t1 where a > 2) +select * from cte1 union select * from cte2; +select * from t2; +a +1 +3 +drop table t1,t2; # End of 10.2 tests diff --git a/mysql-test/t/cte_nonrecursive.test b/mysql-test/t/cte_nonrecursive.test index 2b90babab5b..4618e024d2b 100644 --- a/mysql-test/t/cte_nonrecursive.test +++ b/mysql-test/t/cte_nonrecursive.test @@ -1578,4 +1578,27 @@ drop function g; drop function f; drop table t1; +--echo # +--echo # MDEV-27086: union using CTEs in CREATE TABLE +--echo # + +create or replace temporary table tmp as +with cte1 as (select 1 as a), cte2 as (select 2 as a) +select * from cte1 union select * from cte2; +select * from tmp; + +create table t1 as +with cte1 as (select 1 as a), cte2 as (select 2 as a) +select * from cte1 union select * from cte2; +select * from t1; + +insert into t1 values (3); + +create table t2 as +with cte1 as (select * from t1 where a <2), cte2 as (select * from t1 where a > 2) +select * from cte1 union select * from cte2; +select * from t2; + +drop table t1,t2; + --echo # End of 10.2 tests diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 312ea682975..4dd292258d3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -4869,6 +4869,10 @@ create_like: opt_create_select: /* empty */ {} | opt_duplicate opt_as create_select_query_expression + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } ; create_select_query_expression: @@ -4877,16 +4881,12 @@ create_select_query_expression: { Select->set_braces(0); Select->set_with_clause($1); - if (Lex->check_cte_dependencies_and_resolve_references()) - MYSQL_YYABORT; } union_clause | opt_with_clause SELECT_SYM create_select_part2 create_select_part3_union_not_ready create_select_part4 { Select->set_with_clause($1); - if (Lex->check_cte_dependencies_and_resolve_references()) - MYSQL_YYABORT; } | '(' create_select_query_specification ')' | '(' create_select_query_specification ')' From 114e18b8b68a00b3829ac231cc8f84187f529287 Mon Sep 17 00:00:00 2001 From: Igor Babaev Date: Sat, 20 Nov 2021 21:35:54 -0800 Subject: [PATCH 05/16] MDEV-26470 "No database" selected when using CTE in a subquery of DELETE statement This bug led to reporting bogus messages "No database selected" for DELETE statements if they used subqueries in their WHERE conditions and these subqueries contained references to CTEs. The bug happened because the grammar rule for DELETE statement did not call the function LEX::check_cte_dependencies_and_resolve_references() and as a result of it references to CTEs were not identified as such. Approved by Oleksandr Byelkin --- mysql-test/r/cte_nonrecursive.result | 22 ++++++++++++++++++++++ mysql-test/t/cte_nonrecursive.test | 23 +++++++++++++++++++++++ sql/sql_yacc.yy | 4 ++++ 3 files changed, 49 insertions(+) diff --git a/mysql-test/r/cte_nonrecursive.result b/mysql-test/r/cte_nonrecursive.result index d9b7f054271..b2fee0d3c6f 100644 --- a/mysql-test/r/cte_nonrecursive.result +++ b/mysql-test/r/cte_nonrecursive.result @@ -2162,4 +2162,26 @@ a 1 3 drop table t1,t2; +# +# MDEV-26470: CTE in WITH clause of subquery used in DELETE +# +create table t1 (a int); +insert into t1 values (3), (7), (1), (5); +create table t2 (b int); +insert into t2 values (4), (1), (3), (2); +delete from t1 +where a in (with cte(a) as (select * from t2 where b <=2) select a from cte); +select * from t1; +a +3 +7 +5 +insert into t1 values (1), (3); +delete t1 from t1, t2 +where t1.a=t2.b or +t1.a in (with cte(a) as (select b+1 from t2) select * from cte); +select * from t1; +a +7 +drop table t1,t2; # End of 10.2 tests diff --git a/mysql-test/t/cte_nonrecursive.test b/mysql-test/t/cte_nonrecursive.test index 4618e024d2b..175be8b9881 100644 --- a/mysql-test/t/cte_nonrecursive.test +++ b/mysql-test/t/cte_nonrecursive.test @@ -1601,4 +1601,27 @@ select * from t2; drop table t1,t2; +--echo # +--echo # MDEV-26470: CTE in WITH clause of subquery used in DELETE +--echo # + +create table t1 (a int); +insert into t1 values (3), (7), (1), (5); + +create table t2 (b int); +insert into t2 values (4), (1), (3), (2); + +delete from t1 + where a in (with cte(a) as (select * from t2 where b <=2) select a from cte); +select * from t1; + +insert into t1 values (1), (3); + +delete t1 from t1, t2 + where t1.a=t2.b or + t1.a in (with cte(a) as (select b+1 from t2) select * from cte); +select * from t1; + +drop table t1,t2; + --echo # End of 10.2 tests diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 4dd292258d3..a4b105862f3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -12668,6 +12668,10 @@ delete: lex->select_lex.init_order(); } opt_delete_options single_multi + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } ; single_multi: From b952599786ed8ee453417eaf5173afa72779e68b Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Tue, 16 Nov 2021 05:21:18 +0100 Subject: [PATCH 06/16] MDEV-26064: mariabackup SST fails when starting with --innodb-force-recovery If the server is started with the --innodb-force-recovery argument on the command line, then during SST this argument can be passed to mariabackup only at the --prepare stage, and accordingly it must be removed from the --mysqld-args list (and it is not should be passed to mariabackup otherwise). This commit fixes a flaw in the SST scripts and add a test that checks the ability to run the joiner node in a configuration that uses --innodb-force-recovery=1. --- ...sst_mariabackup_force_recovery,debug.rdiff | 116 +++++++ ...lera_sst_mariabackup_force_recovery.result | 290 ++++++++++++++++++ ..._sst_mariabackup_force_recovery-master.opt | 1 + .../galera_sst_mariabackup_force_recovery.cnf | 16 + ...galera_sst_mariabackup_force_recovery.test | 20 ++ scripts/wsrep_sst_common.sh | 10 + scripts/wsrep_sst_mariabackup.sh | 6 +- scripts/wsrep_sst_xtrabackup-v2.sh | 6 +- 8 files changed, 463 insertions(+), 2 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery,debug.rdiff create mode 100644 mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery.result create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery-master.opt create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.cnf create mode 100644 mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.test diff --git a/mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery,debug.rdiff b/mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery,debug.rdiff new file mode 100644 index 00000000000..819bcba7cac --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery,debug.rdiff @@ -0,0 +1,116 @@ +--- r/galera_sst_mariabackup.result 2018-11-21 16:50:35.766982279 +0200 ++++ r/galera_sst_mariabackup.reject 2018-11-22 09:20:10.344408266 +0200 +@@ -286,5 +286,113 @@ + DROP TABLE t1; + COMMIT; + SET AUTOCOMMIT=ON; ++Performing State Transfer on a server that has been killed and restarted ++while a DDL was in progress on it ++connection node_1; ++CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++INSERT INTO t1 VALUES ('node1_committed_before'); ++connection node_2; ++START TRANSACTION; ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++INSERT INTO t1 VALUES ('node2_committed_before'); ++COMMIT; ++SET GLOBAL debug_dbug = 'd,sync.alter_opened_table'; ++connection node_1; ++ALTER TABLE t1 ADD COLUMN f2 INTEGER; ++connection node_2; ++SET wsrep_sync_wait = 0; ++Killing server ... ++connection node_1; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_during'); ++COMMIT; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++connect node_1a_galera_st_kill_slave_ddl, 127.0.0.1, root, , test, $NODE_MYPORT_1; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++connection node_2; ++Performing --wsrep-recover ... ++connection node_2; ++Starting server ... ++Using --wsrep-start-position when starting mysqld ... ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node2_committed_after'); ++COMMIT; ++connection node_1; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_committed_after'); ++COMMIT; ++SET AUTOCOMMIT=OFF; ++START TRANSACTION; ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++INSERT INTO t1 (f1) VALUES ('node1_committed_after'); ++COMMIT; ++connection node_1a_galera_st_kill_slave_ddl; ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ++ROLLBACK; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++COMMIT; ++SET AUTOCOMMIT=ON; ++connection node_1; ++SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; ++COUNT(*) = 2 ++1 ++SELECT COUNT(*) = 35 FROM t1; ++COUNT(*) = 35 ++1 ++SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; ++COUNT(*) = 0 ++1 ++DROP TABLE t1; ++COMMIT; ++SET AUTOCOMMIT=ON; ++SET GLOBAL debug_dbug = $debug_orig; + disconnect node_2; + disconnect node_1; diff --git a/mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery.result b/mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery.result new file mode 100644 index 00000000000..fdb5883b590 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_sst_mariabackup_force_recovery.result @@ -0,0 +1,290 @@ +connection node_1; +connection node_2; +Performing State Transfer on a server that has been shut down cleanly and restarted +connection node_1; +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +connection node_2; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +Shutting down server ... +connection node_1; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +connect node_1a_galera_st_shutdown_slave, 127.0.0.1, root, , test, $NODE_MYPORT_1; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +connection node_2; +Starting server ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +connection node_1; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +COMMIT; +connection node_1a_galera_st_shutdown_slave; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +ROLLBACK; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +COMMIT; +SET AUTOCOMMIT=ON; +connection node_1; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +DROP TABLE t1; +COMMIT; +SET AUTOCOMMIT=ON; +Performing State Transfer on a server that starts from a clean var directory +This is accomplished by shutting down node #2 and removing its var directory before restarting it +connection node_1; +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +connection node_2; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +Shutting down server ... +connection node_1; +Cleaning var directory ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +connect node_1a_galera_st_clean_slave, 127.0.0.1, root, , test, $NODE_MYPORT_1; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +connection node_2; +Starting server ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +connection node_1; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +COMMIT; +connection node_1a_galera_st_clean_slave; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +ROLLBACK; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +COMMIT; +SET AUTOCOMMIT=ON; +connection node_1; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +DROP TABLE t1; +COMMIT; +SET AUTOCOMMIT=ON; +Performing State Transfer on a server that has been killed and restarted +connection node_1; +CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +INSERT INTO t1 VALUES ('node1_committed_before'); +COMMIT; +connection node_2; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +Killing server ... +connection node_1; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +connect node_1a_galera_st_kill_slave, 127.0.0.1, root, , test, $NODE_MYPORT_1; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +connection node_2; +Performing --wsrep-recover ... +Starting server ... +Using --wsrep-start-position when starting mysqld ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +INSERT INTO t1 VALUES ('node2_committed_after'); +COMMIT; +connection node_1; +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +INSERT INTO t1 VALUES ('node1_to_be_committed_after'); +COMMIT; +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +INSERT INTO t1 VALUES ('node1_committed_after'); +COMMIT; +connection node_1a_galera_st_kill_slave; +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); +ROLLBACK; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +COMMIT; +SET AUTOCOMMIT=ON; +connection node_1; +SELECT COUNT(*) = 35 FROM t1; +COUNT(*) = 35 +1 +SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; +COUNT(*) = 0 +1 +DROP TABLE t1; +COMMIT; +SET AUTOCOMMIT=ON; +disconnect node_2; +disconnect node_1; diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery-master.opt b/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery-master.opt new file mode 100644 index 00000000000..b54b4fad444 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery-master.opt @@ -0,0 +1 @@ +--innodb-force-recovery=1 diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.cnf b/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.cnf new file mode 100644 index 00000000000..4110192b947 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.cnf @@ -0,0 +1,16 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth="root:" +wsrep_debug=ON + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=mbstream diff --git a/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.test b/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.test new file mode 100644 index 00000000000..bcb9ade3a25 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_sst_mariabackup_force_recovery.test @@ -0,0 +1,20 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--source suite/galera/include/galera_st_shutdown_slave.inc +--source suite/galera/include/galera_st_clean_slave.inc + +--source suite/galera/include/galera_st_kill_slave.inc +--source suite/galera/include/galera_st_kill_slave_ddl.inc + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index a1293fcb749..b2c9539a02f 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -44,6 +44,7 @@ WSREP_SST_OPT_HOST_ESCAPED="" INNODB_DATA_HOME_DIR="${INNODB_DATA_HOME_DIR:-}" INNODB_LOG_GROUP_HOME="${INNODB_LOG_GROUP_HOME:-}" INNODB_UNDO_DIR="${INNODB_UNDO_DIR:-}" +INNODB_FORCE_RECOVERY="" INNOEXTRA="" while [ $# -gt 0 ]; do @@ -382,6 +383,14 @@ case "$1" in fi skip_mysqld_arg=1 ;; + '--innodb-force-recovery') + if [ -n "$value" ]; then + if [ "$value" -ne 0 ]; then + INNODB_FORCE_RECOVERY="$value" + fi + fi + skip_mysqld_arg=1 + ;; '--log-bin') if [ -z "$WSREP_SST_OPT_BINLOG" ]; then MYSQLD_OPT_LOG_BIN="$value" @@ -499,6 +508,7 @@ if [ -n "$WSREP_SST_OPT_BINLOG" ]; then fi fi +readonly INNODB_FORCE_RECOVERY readonly WSREP_SST_OPT_MYSQLD get_binlog() diff --git a/scripts/wsrep_sst_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh index 3fe3bf5c206..fa6f48db776 100644 --- a/scripts/wsrep_sst_mariabackup.sh +++ b/scripts/wsrep_sst_mariabackup.sh @@ -951,7 +951,11 @@ setup_commands() if [ -n "$WSREP_SST_OPT_MYSQLD" ]; then mysqld_args="--mysqld-args $WSREP_SST_OPT_MYSQLD" fi - INNOAPPLY="$BACKUP_BIN --prepare $disver $iapts $INNOEXTRA --target-dir='$DATA' --datadir='$DATA' $mysqld_args $INNOAPPLY" + if [ -z "$INNODB_FORCE_RECOVERY" ]; then + INNOAPPLY="$BACKUP_BIN --prepare $disver $iapts $INNOEXTRA --target-dir='$DATA' --datadir='$DATA' $mysqld_args $INNOAPPLY" + else + INNOAPPLY="$BACKUP_BIN --prepare $disver $iapts $INNOEXTRA --innodb-force-recovery=$INNODB_FORCE_RECOVERY --target-dir='$DATA' --datadir='$DATA' $mysqld_args $INNOAPPLY" + fi INNOMOVE="$BACKUP_BIN $WSREP_SST_OPT_CONF --move-back $disver $impts --force-non-empty-directories --target-dir='$DATA' --datadir='${TDATA:-$DATA}' $INNOMOVE" INNOBACKUP="$BACKUP_BIN $WSREP_SST_OPT_CONF --backup $disver $iopts $tmpopts $INNOEXTRA --galera-info --stream=$sfmt --target-dir='$itmpdir' --datadir='$DATA' $mysqld_args $INNOBACKUP" } diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 7cc05185ce3..70a4337f24e 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -973,7 +973,11 @@ fi setup_commands() { - INNOAPPLY="$BACKUP_BIN $disver $iapts $INNOEXTRA --apply-log $rebuildcmd '$DATA' $INNOAPPLY" + if [ -z "$INNODB_FORCE_RECOVERY" ]; then + INNOAPPLY="$BACKUP_BIN $disver $iapts $INNOEXTRA --apply-log $rebuildcmd '$DATA' $INNOAPPLY" + else + INNOAPPLY="$BACKUP_BIN $disver $iapts $INNOEXTRA --innodb-force-recovery=$INNODB_FORCE_RECOVERY --apply-log $rebuildcmd '$DATA' $INNOAPPLY" + fi INNOMOVE="$BACKUP_BIN $WSREP_SST_OPT_CONF --move-back $disver $impts --force-non-empty-directories '$DATA' $INNOMOVE" sfmt_work="$sfmt" if [ "$sfmt" = 'mbstream' ]; then From 2f51511c0831a683cec68b021ffea3434078c851 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Tue, 16 Nov 2021 07:32:14 +0100 Subject: [PATCH 07/16] MDEV-26915: SST scripts do not take log_bin_index setting into account Currently, SST scripts assume that the filename specified in the --log-bin-index argument either does not contain an extension or uses the standard ".index" extension. Similar assumptions are used for the log_bin_index parameter read from the configuration file. This commit adds support for arbitrary extensions for the index file paths. --- .../suite/galera/r/galera_log_bin_ext.result | 73 +++++++++++++++++++ .../suite/galera/t/galera_log_bin_ext.cnf | 11 +++ .../suite/galera/t/galera_log_bin_ext.test | 1 + scripts/wsrep_sst_common.sh | 14 +++- scripts/wsrep_sst_mariabackup.sh | 6 +- scripts/wsrep_sst_rsync.sh | 4 +- scripts/wsrep_sst_xtrabackup-v2.sh | 6 +- 7 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_log_bin_ext.result create mode 100644 mysql-test/suite/galera/t/galera_log_bin_ext.cnf create mode 100644 mysql-test/suite/galera/t/galera_log_bin_ext.test diff --git a/mysql-test/suite/galera/r/galera_log_bin_ext.result b/mysql-test/suite/galera/r/galera_log_bin_ext.result new file mode 100644 index 00000000000..f5276b7d1ac --- /dev/null +++ b/mysql-test/suite/galera/r/galera_log_bin_ext.result @@ -0,0 +1,73 @@ +connection node_1; +reset master; +connection node_2; +reset master; +CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (id INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1); +INSERT INTO t2 VALUES (1); +connection node_2; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +SELECT COUNT(*) = 2 FROM t2; +COUNT(*) = 2 +1 +connection node_1; +ALTER TABLE t1 ADD COLUMN f2 INTEGER; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +hostname1-bin.000001 # Gtid # # GTID #-#-# +hostname1-bin.000001 # Query # # use `test`; CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB +hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-# +hostname1-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES (1) +hostname1-bin.000001 # Table_map # # table_id: # (test.t1) +hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +hostname1-bin.000001 # Xid # # COMMIT /* XID */ +hostname1-bin.000001 # Gtid # # GTID #-#-# +hostname1-bin.000001 # Query # # use `test`; CREATE TABLE t2 (id INT) ENGINE=InnoDB +hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-# +hostname1-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1) +hostname1-bin.000001 # Table_map # # table_id: # (test.t2) +hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +hostname1-bin.000001 # Xid # # COMMIT /* XID */ +hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-# +hostname1-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1) +hostname1-bin.000001 # Table_map # # table_id: # (test.t2) +hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +hostname1-bin.000001 # Xid # # COMMIT /* XID */ +hostname1-bin.000001 # Gtid # # GTID #-#-# +hostname1-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN f2 INTEGER +connection node_2; +SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; +COUNT(*) = 2 +1 +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +hostname1-bin.000001 # Gtid # # GTID #-#-# +hostname1-bin.000001 # Query # # use `test`; CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB +hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-# +hostname1-bin.000001 # Annotate_rows # # INSERT INTO t1 VALUES (1) +hostname1-bin.000001 # Table_map # # table_id: # (test.t1) +hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +hostname1-bin.000001 # Xid # # COMMIT /* XID */ +hostname1-bin.000001 # Gtid # # GTID #-#-# +hostname1-bin.000001 # Query # # use `test`; CREATE TABLE t2 (id INT) ENGINE=InnoDB +hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-# +hostname1-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1) +hostname1-bin.000001 # Table_map # # table_id: # (test.t2) +hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +hostname1-bin.000001 # Xid # # COMMIT /* XID */ +hostname1-bin.000001 # Gtid # # BEGIN GTID #-#-# +hostname1-bin.000001 # Annotate_rows # # INSERT INTO t2 VALUES (1) +hostname1-bin.000001 # Table_map # # table_id: # (test.t2) +hostname1-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F +hostname1-bin.000001 # Xid # # COMMIT /* XID */ +hostname1-bin.000001 # Gtid # # GTID #-#-# +hostname1-bin.000001 # Query # # use `test`; ALTER TABLE t1 ADD COLUMN f2 INTEGER +DROP TABLE t1; +DROP TABLE t2; +#cleanup +connection node_1; +RESET MASTER; diff --git a/mysql-test/suite/galera/t/galera_log_bin_ext.cnf b/mysql-test/suite/galera/t/galera_log_bin_ext.cnf new file mode 100644 index 00000000000..012209610ea --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin_ext.cnf @@ -0,0 +1,11 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +log-bin = hostname1-bin +log-bin-index = hostname1.bdx +log-slave-updates + +[mysqld.2] +log-bin = hostname2-bin +log-bin-index = hostname2.bdx +log-slave-updates diff --git a/mysql-test/suite/galera/t/galera_log_bin_ext.test b/mysql-test/suite/galera/t/galera_log_bin_ext.test new file mode 100644 index 00000000000..923bd623a8a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_log_bin_ext.test @@ -0,0 +1 @@ +--source galera_log_bin.inc diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index b2c9539a02f..dbd639595df 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -230,7 +230,7 @@ case "$1" in shift ;; '--binlog-index'|'--log-bin-index') - readonly WSREP_SST_OPT_BINLOG_INDEX="$2" + WSREP_SST_OPT_BINLOG_INDEX="$2" shift ;; '--log-basename') @@ -453,7 +453,7 @@ if [ -n "${MYSQLD_OPT_LOG_BIN:-}" -a \ fi if [ -n "${MYSQLD_OPT_LOG_BIN_INDEX:-}" -a \ -z "$WSREP_SST_OPT_BINLOG_INDEX" ]; then - readonly WSREP_SST_OPT_BINLOG_INDEX="$MYSQLD_OPT_LOG_BIN_INDEX" + WSREP_SST_OPT_BINLOG_INDEX="$MYSQLD_OPT_LOG_BIN_INDEX" fi if [ -n "${MYSQLD_OPT_DATADIR:-}" -a \ -z "$WSREP_SST_OPT_DATA" ]; then @@ -563,6 +563,16 @@ get_binlog() # is already defined above): readonly WSREP_SST_OPT_BINLOG_INDEX="$WSREP_SST_OPT_BINLOG.index" fi + else + # Remove all directories from the index file path: + local filename="${WSREP_SST_OPT_BINLOG_INDEX##*/}" + # Check if the index file name contains the extension: + if [ "${filename%.*}" = "$filename" ]; then + # Let's add the default extension (".index"): + readonly WSREP_SST_OPT_BINLOG_INDEX="$WSREP_SST_OPT_BINLOG_INDEX.index" + else + readonly WSREP_SST_OPT_BINLOG_INDEX + fi fi fi } diff --git a/scripts/wsrep_sst_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh index fa6f48db776..b429a9effd5 100644 --- a/scripts/wsrep_sst_mariabackup.sh +++ b/scripts/wsrep_sst_mariabackup.sh @@ -1249,8 +1249,8 @@ then cd "$binlog_dir" wsrep_log_info "Cleaning the binlog directory $binlog_dir as well" rm -fv "$WSREP_SST_OPT_BINLOG".[0-9]* 1>&2 \+ || true - binlog_index="${WSREP_SST_OPT_BINLOG_INDEX%.index}.index" - [ -f "$binlog_index" ] && rm -fv "$binlog_index" 1>&2 \+ || true + [ -f "$WSREP_SST_OPT_BINLOG_INDEX" ] && \ + rm -fv "$WSREP_SST_OPT_BINLOG_INDEX" 1>&2 \+ || true cd "$OLD_PWD" fi @@ -1325,7 +1325,7 @@ then cd "$BINLOG_DIRNAME" for bfile in $(ls -1 "$BINLOG_FILENAME".[0-9]*); do - echo "$BINLOG_DIRNAME/$bfile" >> "${WSREP_SST_OPT_BINLOG_INDEX%.index}.index" + echo "$BINLOG_DIRNAME/$bfile" >> "$WSREP_SST_OPT_BINLOG_INDEX" done cd "$OLD_PWD" diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index ad9688011e1..29c9cd43470 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -392,7 +392,7 @@ EOF # Prepare binlog files cd "$BINLOG_DIRNAME" - binlog_files_full=$(tail -n $BINLOG_N_FILES "${WSREP_SST_OPT_BINLOG_INDEX%.index}.index") + binlog_files_full=$(tail -n $BINLOG_N_FILES "$WSREP_SST_OPT_BINLOG_INDEX") binlog_files="" for ii in $binlog_files_full @@ -732,7 +732,7 @@ EOF if [ -f "$BINLOG_TAR_FILE" ]; then cd "$BINLOG_DIRNAME" - binlog_index="${WSREP_SST_OPT_BINLOG_INDEX%.index}.index" + binlog_index="$WSREP_SST_OPT_BINLOG_INDEX" # Clean up old binlog files first rm -f "$BINLOG_FILENAME".[0-9]* diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 70a4337f24e..73f15e79a4c 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -1275,8 +1275,8 @@ then cd "$binlog_dir" wsrep_log_info "Cleaning the binlog directory $binlog_dir as well" rm -fv "$WSREP_SST_OPT_BINLOG".[0-9]* 1>&2 \+ || true - binlog_index="${WSREP_SST_OPT_BINLOG_INDEX%.index}.index" - [ -f "$binlog_index" ] && rm -fv "$binlog_index" 1>&2 \+ || true + [ -f "$WSREP_SST_OPT_BINLOG_INDEX" ] && \ + rm -fv "$WSREP_SST_OPT_BINLOG_INDEX" 1>&2 \+ || true cd "$OLD_PWD" fi @@ -1353,7 +1353,7 @@ then cd "$BINLOG_DIRNAME" for bfile in $(ls -1 "$BINLOG_FILENAME".[0-9]*); do - echo "$BINLOG_DIRNAME/$bfile" >> "${WSREP_SST_OPT_BINLOG_INDEX%.index}.index" + echo "$BINLOG_DIRNAME/$bfile" >> "$WSREP_SST_OPT_BINLOG_INDEX" done cd "$OLD_PWD" From fe065f8d90b05c05ad9ca63a773a8f933b19e4eb Mon Sep 17 00:00:00 2001 From: Alexey Bychko Date: Mon, 22 Nov 2021 19:34:47 +0700 Subject: [PATCH 08/16] MDEV-22522 RPM packages have meaningless summary/description this patch moves cpack summury and description for optional packages to the appropriate CMakeLists.txt files --- cmake/Internal/CPack/CPackRPM.cmake | 6 ++ cmake/cpack_rpm.cmake | 58 +++++-------------- extra/mariabackup/CMakeLists.txt | 3 +- plugin/auth_gssapi/CMakeLists.txt | 6 ++ plugin/cracklib_password_check/CMakeLists.txt | 4 ++ storage/cassandra/CMakeLists.txt | 9 +++ storage/connect/CMakeLists.txt | 5 ++ storage/oqgraph/CMakeLists.txt | 7 +++ storage/rocksdb/CMakeLists.txt | 4 ++ storage/tokudb/CMakeLists.txt | 5 ++ 10 files changed, 60 insertions(+), 47 deletions(-) diff --git a/cmake/Internal/CPack/CPackRPM.cmake b/cmake/Internal/CPack/CPackRPM.cmake index 92bcc6c6c25..a1040a0161f 100644 --- a/cmake/Internal/CPack/CPackRPM.cmake +++ b/cmake/Internal/CPack/CPackRPM.cmake @@ -17,6 +17,12 @@ macro(restore WHAT) set(CPACK_RPM_PACKAGE_${WHAT} ${orig_CPACK_RPM_PACKAGE_${WHAT}}) endmacro() +foreach (WHAT SUMMARY DESCRIPTION) + if(NOT CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_${WHAT}) + message(FATAL_ERROR "CPACK_RPM_${CPACK_RPM_PACKAGE_COMPONENT}_PACKAGE_${WHAT} is not defined") + endif() +endforeach() + set_from_component(LICENSE) set_from_component(VENDOR) diff --git a/cmake/cpack_rpm.cmake b/cmake/cpack_rpm.cmake index 82bd0675b34..eacb6310ece 100644 --- a/cmake/cpack_rpm.cmake +++ b/cmake/cpack_rpm.cmake @@ -61,13 +61,26 @@ conditions of the GNU General Public License Version 2 (http://www.gnu.org/licen MariaDB documentation can be found at https://mariadb.com/kb MariaDB bug reports should be submitted through https://jira.mariadb.org") +# mariabackup +SET(CPACK_RPM_backup_PACKAGE_SUMMARY "Backup tool for MariaDB server") +SET(CPACK_RPM_backup_PACKAGE_DESCRIPTION "Mariabackup is an open source tool provided by MariaDB +for performing physical online backups of InnoDB, Aria and MyISAM tables. +For InnoDB, “hot online” backups are possible. +It was originally forked from Percona XtraBackup 2.3.8.") + # Packages with default description SET(CPACK_RPM_client_PACKAGE_SUMMARY "MariaDB database client binaries") +SET(CPACK_RPM_client_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") SET(CPACK_RPM_common_PACKAGE_SUMMARY "MariaDB database common files (e.g. /etc/mysql/conf.d/mariadb.cnf)") +SET(CPACK_RPM_common_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") SET(CPACK_RPM_compat_PACKAGE_SUMMARY "MariaDB database client library MySQL compat package") +SET(CPACK_RPM_compat_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") SET(CPACK_RPM_devel_PACKAGE_SUMMARY "MariaDB database development files") +SET(CPACK_RPM_devel_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") SET(CPACK_RPM_server_PACKAGE_SUMMARY "MariaDB database server binaries") +SET(CPACK_RPM_server_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") SET(CPACK_RPM_test_PACKAGE_SUMMARY "MariaDB database regression test suite") +SET(CPACK_RPM_test_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") # libmariadb3 SET(CPACK_RPM_shared_PACKAGE_SUMMARY "LGPL MariaDB database client library") @@ -80,51 +93,6 @@ and PHP's mysqlnd extension. This product includes PHP software, freely available from http://www.php.net/software/") -# Summary and descriptions per package -SET(CPACK_RPM_backup_PACKAGE_SUMMARY "Backup tool for MariaDB server") -SET(CPACK_RPM_backup_PACKAGE_DESCRIPTION "Mariabackup is an open source tool provided by MariaDB -for performing physical online backups of InnoDB, Aria and MyISAM tables. -For InnoDB, “hot online” backups are possible. -It was originally forked from Percona XtraBackup 2.3.8.") - -SET(CPACK_RPM_cassandra-engine_PACKAGE_SUMMARY "Cassandra storage engine for MariaDB") -SET(CPACK_RPM_cassandra-engine_PACKAGE_DESCRIPTION "The Cassandra Storage Engine allows access to data in a Cassandra cluster from -MariaDB, combining the best of SQL and no-SQL worlds. Cassandra SE (storage -engine) makes Cassandra's column family appear as a table in MariaDB that you -can insert to, update, and select from. You can write joins against this table, -it is possible to join data that's stored in MariaDB with data that's stored in -Cassandra.") - -SET(CPACK_RPM_connect-engine_PACKAGE_SUMMARY "Connect storage engine for MariaDB") -SET(CPACK_RPM_connect-engine_PACKAGE_DESCRIPTION "Connect engine supports a number of file formats (dbf, xml, txt, bin, etc), -connections to ODBC tables and remote MySQL tables, as well as a number of -other interesting features.") - -SET(CPACK_RPM_cracklib-password-check_PACKAGE_SUMMARY "CrackLib Password Validation Plugin for MariaDB") -SET(CPACK_RPM_cracklib-password-check_PACKAGE_DESCRIPTION "This password validation plugin uses cracklib to allow only -sufficiently secure (as defined by cracklib) user passwords in MariaDB.") - -SET(CPACK_RPM_gssapi-server_PACKAGE_SUMMARY "GSSAPI authentication plugin for MariaDB server") -SET(CPACK_RPM_gssapi-server_PACKAGE_DESCRIPTION "The gssapi authentication plugin allows the user to authenticate with services -that use the Generic Security Services Application Program Interface (GSSAPI). -The gssapi authentication plugin is most often used for authenticating with Microsoft Active Directory.") - -SET(CPACK_RPM_oqgraph-engine_PACKAGE_SUMMARY "OQGraph storage engine for MariaDB") -SET(CPACK_RPM_oqgraph-engine_PACKAGE_DESCRIPTION "The Open Query GRAPH computation engine, or OQGRAPH as the engine itself is called, -allows you to handle hierarchies (tree structures) and complex graphs -(nodes having many connections in several directions). -It is intended to be used for retrieving hierarchical information, such as those used for graphs, -routes or social relationships, in plain SQL.") - -SET(CPACK_RPM_rocksdb-engine_PACKAGE_SUMMARY "RocksDB storage engine for MariaDB") -SET(CPACK_RPM_rocksdb-engine_PACKAGE_DESCRIPTION "The RocksDB storage engine is a high performance storage engine, aimed -at maximising storage efficiency while maintaining InnoDB-like performance.") - -SET(CPACK_RPM_tokudb-engine_PACKAGE_SUMMARY "TokuDB storage engine for MariaDB") -SET(CPACK_RPM_tokudb-engine_PACKAGE_DESCRIPTION "The TokuDB storage engine is for use in high-performance and write-intensive -environments, offering increased compression and better performance based -on fractal indexes.") - SET(CPACK_RPM_SPEC_MORE_DEFINE " %define mysql_vendor ${CPACK_PACKAGE_VENDOR} %define mysqlversion ${MYSQL_NO_DASH_VERSION} diff --git a/extra/mariabackup/CMakeLists.txt b/extra/mariabackup/CMakeLists.txt index 409dcd7efde..e39c1214c7a 100644 --- a/extra/mariabackup/CMakeLists.txt +++ b/extra/mariabackup/CMakeLists.txt @@ -16,11 +16,11 @@ OPTION(WITH_MARIABACKUP "Include mariabackup" ON) ADD_FEATURE_INFO(MARIABACKUP WITH_MARIABACKUP "MariaDB Backup Utility") + IF(NOT WITH_MARIABACKUP) RETURN() ENDIF() - IF(NOT WIN32) CHECK_SYMBOL_EXISTS(regcomp regex.h HAVE_SYSTEM_REGEX) IF(HAVE_SYSTEM_REGEX) @@ -28,7 +28,6 @@ IF(NOT WIN32) ENDIF() ENDIF() - INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql diff --git a/plugin/auth_gssapi/CMakeLists.txt b/plugin/auth_gssapi/CMakeLists.txt index 11063df0884..1110562d9f1 100644 --- a/plugin/auth_gssapi/CMakeLists.txt +++ b/plugin/auth_gssapi/CMakeLists.txt @@ -1,3 +1,9 @@ + +SET(CPACK_RPM_gssapi-server_PACKAGE_SUMMARY "GSSAPI authentication plugin for MariaDB server" PARENT_SCOPE) +SET(CPACK_RPM_gssapi-server_PACKAGE_DESCRIPTION "The gssapi authentication plugin allows the user to authenticate with services +that use the Generic Security Services Application Program Interface (GSSAPI). +The gssapi authentication plugin is most often used for authenticating with Microsoft Active Directory." PARENT_SCOPE) + IF (WIN32) SET(USE_SSPI 1) ENDIF() diff --git a/plugin/cracklib_password_check/CMakeLists.txt b/plugin/cracklib_password_check/CMakeLists.txt index 81db865eae0..620234ccd3f 100644 --- a/plugin/cracklib_password_check/CMakeLists.txt +++ b/plugin/cracklib_password_check/CMakeLists.txt @@ -1,6 +1,10 @@ INCLUDE (CheckIncludeFiles) INCLUDE (CheckLibraryExists) +SET(CPACK_RPM_cracklib-password-check_PACKAGE_SUMMARY "CrackLib Password Validation Plugin for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_cracklib-password-check_PACKAGE_DESCRIPTION "This password validation plugin uses cracklib to allow only +sufficiently secure (as defined by cracklib) user passwords in MariaDB." PARENT_SCOPE) + CHECK_LIBRARY_EXISTS(crack FascistCheckUser "" HAVE_LIBCRACK) SET(CMAKE_REQUIRED_DEFINITIONS -Dsize_t=int) # debian hack, debian bug. diff --git a/storage/cassandra/CMakeLists.txt b/storage/cassandra/CMakeLists.txt index a5d58234d97..e88e2a83f9e 100644 --- a/storage/cassandra/CMakeLists.txt +++ b/storage/cassandra/CMakeLists.txt @@ -1,3 +1,12 @@ + +SET(CPACK_RPM_cassandra-engine_PACKAGE_SUMMARY "Cassandra storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_cassandra-engine_PACKAGE_DESCRIPTION "The Cassandra Storage Engine allows access to data in a Cassandra cluster from +MariaDB, combining the best of SQL and no-SQL worlds. Cassandra SE (storage +engine) makes Cassandra's column family appear as a table in MariaDB that you +can insert to, update, and select from. You can write joins against this table, +it is possible to join data that's stored in MariaDB with data that's stored in +Cassandra." PARENT_SCOPE) + # use the first path that has Thrift.h included, if found FIND_PATH(Thrift_INCLUDE_DIRS Thrift.h PATHS diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index f991726634d..e460d851316 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -17,6 +17,11 @@ IF(WITHOUT_DYNAMIC_PLUGINS OR WITH_NONE OR ("${PLUGIN_CONNECT}" STREQUAL "NO")) RETURN() ENDIF() +SET(CPACK_RPM_connect-engine_PACKAGE_SUMMARY "Connect storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_connect-engine_PACKAGE_DESCRIPTION "Connect engine supports a number of file formats (dbf, xml, txt, bin, etc), +connections to ODBC tables and remote MySQL tables, as well as a number of +other interesting features." PARENT_SCOPE) + SET(CONNECT_PLUGIN_STATIC "connect") SET(CONNECT_PLUGIN_DYNAMIC "connect") diff --git a/storage/oqgraph/CMakeLists.txt b/storage/oqgraph/CMakeLists.txt index 9770820f0b7..1992386d0e4 100644 --- a/storage/oqgraph/CMakeLists.txt +++ b/storage/oqgraph/CMakeLists.txt @@ -1,5 +1,12 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +SET(CPACK_RPM_oqgraph-engine_PACKAGE_SUMMARY "OQGraph storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_oqgraph-engine_PACKAGE_DESCRIPTION "The Open Query GRAPH computation engine, or OQGRAPH as the engine itself is called, +allows you to handle hierarchies (tree structures) and complex graphs +(nodes having many connections in several directions). +It is intended to be used for retrieving hierarchical information, such as those used for graphs, +routes or social relationships, in plain SQL." PARENT_SCOPE) + FUNCTION(CHECK_OQGRAPH) MESSAGE(STATUS "Configuring OQGraph") FIND_PACKAGE(Boost 1.40.0) diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index 1db314b93db..c45787edc76 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -1,5 +1,9 @@ # TODO: Copyrights +SET(CPACK_RPM_rocksdb-engine_PACKAGE_SUMMARY "RocksDB storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_rocksdb-engine_PACKAGE_DESCRIPTION "The RocksDB storage engine is a high performance storage engine, aimed +at maximising storage efficiency while maintaining InnoDB-like performance." PARENT_SCOPE) + MACRO(SKIP_ROCKSDB_PLUGIN msg) MESSAGE_ONCE(SKIP_ROCKSDB_PLUGIN "Can't build rocksdb engine - ${msg}") ADD_FEATURE_INFO(ROCKSDB "OFF" "Storage Engine") diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index eaad6488796..ee91807c619 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -1,3 +1,8 @@ +SET(CPACK_RPM_tokudb-engine_PACKAGE_SUMMARY "TokuDB storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_tokudb-engine_PACKAGE_DESCRIPTION "The TokuDB storage engine is for use in high-performance and write-intensive +environments, offering increased compression and better performance based +on fractal indexes." PARENT_SCOPE) + SET(TOKUDB_VERSION 5.6.49-89.0) # PerconaFT only supports x86-64 and cmake-2.8.9+ IF(WIN32) From 749d8dedc323154f4aa8a6e26dd464696e8c3fed Mon Sep 17 00:00:00 2001 From: Marc Olivier Bergeron Date: Wed, 17 Nov 2021 17:14:27 +1100 Subject: [PATCH 09/16] MDEV-27066: Fixed scientific notation parsing bug The bug occurs where the float token containing a dot with an 'e' notation was dropped from the request completely. This causes a manner of invalid SQL statements like: select id 1.e, char 10.e(id 2.e), concat 3.e('a'12356.e,'b'1.e,'c'1.1234e)1.e, 12 1.e*2 1.e, 12 1.e/2 1.e, 12 1.e|2 1.e, 12 1.e^2 1.e, 12 1.e%2 1.e, 12 1.e&2 from test; To be parsed correctly as if it was: select id, char(id), concat('a','b','c'), 12*2, 12/2, 12|2, 12^2, 12%2, 12&2 from test.test; This correct parsing occurs when e is followed by any of: ( ) . , | & % * ^ / --- mysql-test/r/parser.result | 31 +++++++++++++++++++++++++ mysql-test/t/parser.test | 46 ++++++++++++++++++++++++++++++++++++++ sql/sql_lex.cc | 3 +-- 3 files changed, 78 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/parser.result b/mysql-test/r/parser.result index 9ae5b654eed..9e091688e1d 100644 --- a/mysql-test/r/parser.result +++ b/mysql-test/r/parser.result @@ -1338,3 +1338,34 @@ Select view_definition from information_schema.views where table_schema='test' a view_definition select 1 not between 2 like 3 and 4 AS `1 not between (2 like 3) and 4` drop view v1; +# +# Start of 10.2 tests +# +# +# MDEV-27066 Fixed scientific notation parser +# +SELECT 1 1.e*1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e*1' at line 1 +SELECT 1 1.e/1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e/1' at line 1 +SELECT 1 1.e^1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e^1' at line 1 +SELECT 1 1.e%1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e%1' at line 1 +SELECT 1 1.e&1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e&1' at line 1 +SELECT 1 1.e|1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e|1' at line 1 +SELECT 1.e(1); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e(1)' at line 1 +SELECT (1 1.e); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e)' at line 1 +SELECT 1 1.e, 1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e, 1' at line 1 +CREATE TABLE scientific_notation (test int); +SELECT tmp 1.e.test FROM scientific_notation AS tmp; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e.test FROM scientific_notation AS tmp' at line 1 +DROP TABLE scientific_notation; +# +# End of 10.2 tests +# diff --git a/mysql-test/t/parser.test b/mysql-test/t/parser.test index c5bd31c576e..efb936d8ea4 100644 --- a/mysql-test/t/parser.test +++ b/mysql-test/t/parser.test @@ -1365,3 +1365,49 @@ create or replace view v1 as select 1 not between (2 like 3) and 4; Select view_definition from information_schema.views where table_schema='test' and table_name='v1'; drop view v1; + +--echo # +--echo # Start of 10.2 tests +--echo # +--echo # + +--echo # MDEV-27066 Fixed scientific notation parser +--echo # + +--error ER_PARSE_ERROR +SELECT 1 1.e*1; + +--error ER_PARSE_ERROR +SELECT 1 1.e/1; + +--error ER_PARSE_ERROR +SELECT 1 1.e^1; + +--error ER_PARSE_ERROR +SELECT 1 1.e%1; + +--error ER_PARSE_ERROR +SELECT 1 1.e&1; + +--error ER_PARSE_ERROR +SELECT 1 1.e|1; + +--error ER_PARSE_ERROR +SELECT 1.e(1); + +--error ER_PARSE_ERROR +SELECT (1 1.e); + +--error ER_PARSE_ERROR +SELECT 1 1.e, 1; + +CREATE TABLE scientific_notation (test int); + +--error ER_PARSE_ERROR +SELECT tmp 1.e.test FROM scientific_notation AS tmp; + +DROP TABLE scientific_notation; + +--echo # +--echo # End of 10.2 tests +--echo # diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index b7ed632ed12..ed0b4b36553 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1664,8 +1664,7 @@ static int lex_one_token(YYSTYPE *yylval, THD *thd) c = lip->yyGet(); // Skip sign if (!my_isdigit(cs,c)) { // No digit after sign - state= MY_LEX_CHAR; - break; + return (ABORT_SYM); } while (my_isdigit(cs,lip->yyGet())) ; yylval->lex_str=get_token(lip, 0, lip->yyLength()); From ef179dadf4700f323c507421e850be8dc7547aa8 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 24 Nov 2021 17:19:52 +1100 Subject: [PATCH 10/16] mysql_install_db: remove MySQL references MySQL documentation isn't going to help our users and we shouldn't refer to it. --- scripts/mysql_install_db.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh index c6129659151..6a415f4fa11 100644 --- a/scripts/mysql_install_db.sh +++ b/scripts/mysql_install_db.sh @@ -566,8 +566,7 @@ then fi echo - echo "See the MariaDB Knowledgebase at http://mariadb.com/kb or the" - echo "MySQL manual for more instructions." + echo "See the MariaDB Knowledgebase at http://mariadb.com/kb" if test "$in_rpm" -eq 0 then @@ -583,8 +582,7 @@ then echo "Please report any problems at http://mariadb.org/jira" echo echo "The latest information about MariaDB is available at http://mariadb.org/." - echo "You can find additional information about the MySQL part at:" - echo "http://dev.mysql.com" + echo echo "Consider joining MariaDB's strong and vibrant community:" echo "https://mariadb.org/get-involved/" echo From f809a4fbd069dc2986677eabde50b1a253f6695f Mon Sep 17 00:00:00 2001 From: ryancaicse <73822648+ryancaicse@users.noreply.github.com> Date: Wed, 10 Nov 2021 18:35:17 +0800 Subject: [PATCH 11/16] MDEV-26558 Fix a deadlock due to cyclic dependence Fix a potential deadlock bug between locks ctrl_mutex and entry->mutex --- extra/mariabackup/xbstream.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/mariabackup/xbstream.cc b/extra/mariabackup/xbstream.cc index 5d33f27cbb3..ef5e3bccd9c 100644 --- a/extra/mariabackup/xbstream.cc +++ b/extra/mariabackup/xbstream.cc @@ -443,8 +443,8 @@ extract_worker_thread_func(void *arg) } if (chunk.type == XB_CHUNK_TYPE_EOF) { - pthread_mutex_lock(ctxt->mutex); pthread_mutex_unlock(&entry->mutex); + pthread_mutex_lock(ctxt->mutex); my_hash_delete(ctxt->filehash, (uchar *) entry); pthread_mutex_unlock(ctxt->mutex); From e9572e53e63e8e0b84006d99860c38578dede21f Mon Sep 17 00:00:00 2001 From: Hugo Wen Date: Fri, 15 Oct 2021 23:20:48 +0000 Subject: [PATCH 12/16] MDEV-27124: Update definer of Add/DropGeometryColumn procedures from 'root' to 'mariadb.sys' From 10.4.13, the `mariadb.sys` user was created to replace `root` definers. - In commit 0253ea7f2208354b187ffcfa2f3128878597cc11, definer of Add/DropGeometryColumn procedures was changed to `mariadb.sys`, in `scripts/maria_add_gis_sp.sql.in`. However, maria_add_gis_sp.sql only applies to new databases created by installation script. Databases upgraded from old versions will miss this change. - In addition, according to commit 0d6d801e5886208b2632247d88da106a543e1032(MDEV-23102), in some scenarios when root user is replaced it will skip creating `mariadb.sys` user. This commit is to update the definer from `root` to `mariadb.sys` during upgrade. It only makes the change if the original definers are root. Doesn't choose to execute `maria_add_gis_sp.sql` in upgrade script to recreate the procedures is because of considering the scenarios of MDEV-23102 that `root` user is replaced and `mariadb.sys` is not created. All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc. --- ...de_geometrycolumn_procedure_definer.result | 123 ++++++++++++++++++ ...rade_geometrycolumn_procedure_definer.test | 66 ++++++++++ scripts/mysql_system_tables_fix.sql | 5 + 3 files changed, 194 insertions(+) create mode 100644 mysql-test/main/upgrade_geometrycolumn_procedure_definer.result create mode 100644 mysql-test/main/upgrade_geometrycolumn_procedure_definer.test diff --git a/mysql-test/main/upgrade_geometrycolumn_procedure_definer.result b/mysql-test/main/upgrade_geometrycolumn_procedure_definer.result new file mode 100644 index 00000000000..58cd91f706d --- /dev/null +++ b/mysql-test/main/upgrade_geometrycolumn_procedure_definer.result @@ -0,0 +1,123 @@ +# +# The definer of Add/DropGeometryColumn procedures should be updated to mariadb.sys during upgrade +# +use mysql; +create table save_proc like proc; +insert into save_proc select * from proc; +set @save_sql_mode= @@sql_mode; +# +# If the definer is root before the upgrade: +# Drop the procedures if exists and recreate with root definer +# +DROP PROCEDURE IF EXISTS AddGeometryColumn; +DROP PROCEDURE IF EXISTS DropGeometryColumn; +CREATE DEFINER=`root`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64), +t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER +begin +set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | +CREATE DEFINER=`root`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64), +t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER +begin +set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'root@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'root@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +# +# Run mysql_upgrade +# +Phase 1/7: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.save_proc OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/7: Installing used storage engines... Skipped +Phase 3/7: Fixing views +mysql.user OK +Phase 4/7: Running 'mysql_fix_privilege_tables' +Phase 5/7: Fixing table and database names +Phase 6/7: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +performance_schema +test +Phase 7/7: Running 'FLUSH PRIVILEGES' +OK +# +# check new definers of Add/DropGeometryColumn +# +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'root@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'root@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +1 +# +# restore environment +# +delete from proc; +rename table proc to bad_proc; +rename table save_proc to proc; +drop table bad_proc; +flush privileges; diff --git a/mysql-test/main/upgrade_geometrycolumn_procedure_definer.test b/mysql-test/main/upgrade_geometrycolumn_procedure_definer.test new file mode 100644 index 00000000000..5111fcdf4ea --- /dev/null +++ b/mysql-test/main/upgrade_geometrycolumn_procedure_definer.test @@ -0,0 +1,66 @@ +--echo # +--echo # The definer of Add/DropGeometryColumn procedures should be updated to mariadb.sys during upgrade +--echo # + +--source include/mysql_upgrade_preparation.inc + +use mysql; + +create table save_proc like proc; +insert into save_proc select * from proc; +set @save_sql_mode= @@sql_mode; + +--echo # +--echo # If the definer is root before the upgrade: +--echo # Drop the procedures if exists and recreate with root definer +--echo # +DROP PROCEDURE IF EXISTS AddGeometryColumn; +DROP PROCEDURE IF EXISTS DropGeometryColumn; + +DELIMITER |; + +CREATE DEFINER=`root`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64), + t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER +begin + set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | + +CREATE DEFINER=`root`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64), + t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER +begin + set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | + +DELIMITER ;| + +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'root@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'root@localhost'; + +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; + +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # +--echo # Run mysql_upgrade +--echo # +--exec $MYSQL_UPGRADE 2>&1 +--file_exists $MYSQLD_DATADIR/mysql_upgrade_info +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +--echo # +--echo # check new definers of Add/DropGeometryColumn +--echo # +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'root@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'root@localhost'; + +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; + +--echo # +--echo # restore environment +--echo # +delete from proc; +rename table proc to bad_proc; +rename table save_proc to proc; +drop table bad_proc; +flush privileges; + diff --git a/scripts/mysql_system_tables_fix.sql b/scripts/mysql_system_tables_fix.sql index ec3d532ec11..fdfcd99b91b 100644 --- a/scripts/mysql_system_tables_fix.sql +++ b/scripts/mysql_system_tables_fix.sql @@ -510,6 +510,11 @@ ALTER TABLE proc MODIFY comment ALTER TABLE proc ADD aggregate enum('NONE', 'GROUP') DEFAULT 'NONE' NOT NULL AFTER body_utf8; +# Update definer of Add/DropGeometryColumn procedures to 'mariadb.sys' +# To consider the scenarios in MDEV-23102, only update the definer when it's 'root' +UPDATE proc SET Definer = 'mariadb.sys@localhost' WHERE Definer = 'root@localhost' AND Name = 'AddGeometryColumn'; +UPDATE proc SET Definer = 'mariadb.sys@localhost' WHERE Definer = 'root@localhost' AND Name = 'DropGeometryColumn'; + # # EVENT privilege # From 4ba747855376d9b854dd2656ab8caf7b371ce13e Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Mon, 12 Aug 2019 19:29:06 +0200 Subject: [PATCH 13/16] add a test case MDEV-20330 Combination of "," (comma), cross join and left join fails to parse --- mysql-test/r/join.result | 3 +++ mysql-test/t/join.test | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/mysql-test/r/join.result b/mysql-test/r/join.result index 7d00536cbde..ac9ad8fc6a7 100644 --- a/mysql-test/r/join.result +++ b/mysql-test/r/join.result @@ -3308,3 +3308,6 @@ SELECT STRAIGHT_JOIN * FROM t1, t2 AS t2_1, t2 AS t2_2 WHERE t2_2.c = t2_1.c AND t2_2.b = t2_1.b AND ( a IS NULL OR t2_1.c = a ); a b c b c DROP TABLE t1,t2; +select a.a from (select 1 as a) a, (select 2 as b) b cross join (select 3 as c) c left join (select 4 as d) d on 1; +a +1 diff --git a/mysql-test/t/join.test b/mysql-test/t/join.test index 31eee0a7d5e..a875d247e64 100644 --- a/mysql-test/t/join.test +++ b/mysql-test/t/join.test @@ -1718,3 +1718,8 @@ SELECT STRAIGHT_JOIN * FROM t1, t2 AS t2_1, t2 AS t2_2 WHERE t2_2.c = t2_1.c AND t2_2.b = t2_1.b AND ( a IS NULL OR t2_1.c = a ); DROP TABLE t1,t2; + +# +# MDEV-20330 Combination of "," (comma), cross join and left join fails to parse +# +select a.a from (select 1 as a) a, (select 2 as b) b cross join (select 3 as c) c left join (select 4 as d) d on 1; From a96b42826964b1dbb1eeee536c9f611e462719c0 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Wed, 3 Nov 2021 15:34:28 +0100 Subject: [PATCH 14/16] MDEV-26755 innodb.undo_truncate: ilink::assert_linked(): Assertion `prev != 0 && next != 0' failed close_connections() in mysqld.cc sends a signal to all threads. But InnoDB is too busy purging, doesn't react immediately. close_connections() waits 20 seconds, which isn't enough in this particular case, and then unlinks all threads from the list and forcibly closes their vio connection. InnoDB background threads have no vio connection to close, but they're unlinked all the same. So when later they finally notice the shutdown request and try to unlink themselves, they fail to assert that they're still linked. Fix: don't assert_linked, as another thread can unlink this THD anytime --- sql/sql_class.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/sql/sql_class.h b/sql/sql_class.h index 9fff422684e..3f0fba8fc10 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -4557,12 +4557,10 @@ inline void add_to_active_threads(THD *thd) /* This should be called when you want to delete a thd that was not running any queries. - This function will assert that the THD is linked. */ inline void unlink_not_visible_thd(THD *thd) { - thd->assert_linked(); mysql_mutex_lock(&LOCK_thread_count); thd->unlink(); mysql_mutex_unlock(&LOCK_thread_count); From f5441ef4dac9f3fd5dfe1bfa25a514715fee649f Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 26 Nov 2021 17:15:41 +0100 Subject: [PATCH 15/16] MDEV-26972 MTR worker aborts after server restart failure restore the old behavior where without a debugger mtr does not wait for mysqld to start. It was broken in feacc0aaf2 --- mysql-test/mysql-test-run.pl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index b87263eebd4..809f8794e00 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -5072,6 +5072,7 @@ sub mysqld_start ($$) { # Differs from "generic" MYSQLD_CMD by including all command line # options from *.opt and *.combination files. $ENV{'MYSQLD_LAST_CMD'}= "$exe @$args"; + my $oldexe= $exe; My::Debugger::setup_args(\$args, \$exe, $mysqld->name()); $ENV{'VALGRIND_TEST'}= $opt_valgrind = int(($exe || '') eq 'valgrind'); @@ -5127,8 +5128,9 @@ sub mysqld_start ($$) { $mysqld->{'started_opts'}= $extra_opts; my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect"; - return sleep_until_file_created($mysqld->value('pid-file'), $expect_file, - $opt_start_timeout, $mysqld->{'proc'}, $warn_seconds); + return $oldexe eq $exe || + sleep_until_file_created($mysqld->value('pid-file'), $expect_file, + $opt_start_timeout, $mysqld->{'proc'}, $warn_seconds); } From fafe60e7e2da72488ff3741367a962b45a23b8ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 29 Nov 2021 10:34:33 +0200 Subject: [PATCH 16/16] MDEV-27134: Sporadic failure of DROP DATABASE test Let us create and drop a separate database for getting rid of the default database in the MDEV-22781 test. --- mysql-test/main/cte_nonrecursive.result | 5 +++-- mysql-test/main/cte_nonrecursive.test | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/mysql-test/main/cte_nonrecursive.result b/mysql-test/main/cte_nonrecursive.result index b28c2d4e206..0d8bd151708 100644 --- a/mysql-test/main/cte_nonrecursive.result +++ b/mysql-test/main/cte_nonrecursive.result @@ -1693,7 +1693,9 @@ disconnect con1; # # MDEV-22781: create view with CTE without default database # -drop database test; +create database db; +use db; +drop database db; create database db1; create table db1.t1 (a int); insert into db1.t1 values (3),(7),(1); @@ -1723,7 +1725,6 @@ a drop view db1.v1; drop table db1.t1; drop database db1; -create database test; use test; # # MDEV-24597: CTE with union used multiple times in query diff --git a/mysql-test/main/cte_nonrecursive.test b/mysql-test/main/cte_nonrecursive.test index 41a0146e4d0..0a18ff3a333 100644 --- a/mysql-test/main/cte_nonrecursive.test +++ b/mysql-test/main/cte_nonrecursive.test @@ -1205,7 +1205,9 @@ DROP TABLE test.t; --echo # MDEV-22781: create view with CTE without default database --echo # -drop database test; +create database db; +use db; +drop database db; create database db1; create table db1.t1 (a int); insert into db1.t1 values (3),(7),(1); @@ -1227,7 +1229,6 @@ drop view db1.v1; drop table db1.t1; drop database db1; -create database test; use test; --echo #