Version in base suite: 10.11.3-1 Base version: mariadb_10.11.3-1 Target version: mariadb_10.11.4-0+deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/m/mariadb/mariadb_10.11.3-1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/m/mariadb/mariadb_10.11.4-0+deb12u1.dsc VERSION | 2 debian/changelog | 13 + debian/control | 24 +- debian/gbp.conf | 2 debian/mariadb-test-data.lintian-overrides | 3 debian/mariadb-test.lintian-overrides | 3 debian/salsa-ci-enable-sec-and-update-repos.sh | 23 ++ debian/salsa-ci.yml | 7 mysql-test/main/derived_cond_pushdown.result | 94 ++++++++ mysql-test/main/derived_cond_pushdown.test | 41 +++ mysql-test/main/derived_split_innodb.result | 15 + mysql-test/main/derived_split_innodb.test | 21 + mysql-test/main/explain_non_select.result | 19 + mysql-test/main/explain_non_select.test | 20 + mysql-test/main/myisam_explain_non_select_all.result | 4 mysql-test/suite/galera/r/MDEV-24143.result | 23 ++ mysql-test/suite/galera/r/galera_bf_abort_get_lock.result | 18 + mysql-test/suite/galera/r/galera_locks_funcs.result | 24 -- mysql-test/suite/galera/r/galera_query_cache_invalidate.result | 4 mysql-test/suite/galera/t/MDEV-24143.test | 20 + mysql-test/suite/galera/t/galera_bf_abort_get_lock.test | 36 +++ mysql-test/suite/galera/t/galera_locks_funcs.test | 18 - mysql-test/suite/innodb/r/monitor.result | 112 ++++----- mysql-test/suite/innodb/t/monitor.test | 4 mysql-test/suite/innodb_zip/r/page_size.result | 21 + mysql-test/suite/innodb_zip/t/page_size.test | 24 ++ sql/item_create.cc | 21 - sql/opt_split.cc | 6 sql/sql_select.cc | 3 sql/sql_select.h | 1 storage/innobase/btr/btr0cur.cc | 27 +- storage/innobase/buf/buf0flu.cc | 1 storage/innobase/handler/ha_innodb.cc | 3 storage/innobase/include/srv0srv.h | 2 storage/innobase/include/trx0sys.h | 2 storage/innobase/srv/srv0mon.cc | 2 storage/innobase/srv/srv0srv.cc | 41 ++- storage/innobase/trx/trx0purge.cc | 115 ++++------ storage/innobase/trx/trx0sys.cc | 24 +- 39 files changed, 611 insertions(+), 232 deletions(-) diff -Nru mariadb-10.11.3/VERSION mariadb-10.11.4/VERSION --- mariadb-10.11.3/VERSION 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/VERSION 2023-06-05 17:04:58.000000000 +0000 @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=11 -MYSQL_VERSION_PATCH=3 +MYSQL_VERSION_PATCH=4 SERVER_MATURITY=stable diff -Nru mariadb-10.11.3/debian/changelog mariadb-10.11.4/debian/changelog --- mariadb-10.11.3/debian/changelog 2023-05-28 06:16:42.000000000 +0000 +++ mariadb-10.11.4/debian/changelog 2023-07-14 04:17:18.000000000 +0000 @@ -1,3 +1,16 @@ +mariadb (1:10.11.4-0+deb12u1) bookworm; urgency=medium + + [ Otto Kekäläinen ] + * New upstream version 10.11.4. Includes fixes for several severe regressions, + see details at https://mariadb.com/kb/en/mariadb-10-11-4-release-notes/ + * Duplicate selected Lintian overrides in old Lintian syntax for NEW queue + (this might strictly not be needed for bookworm but does not hurt either) + + [ Andreas Beckmann ] + * Introduce transitional mariadb-server-10.5 (Closes: #1035949) + + -- Otto Kekäläinen Thu, 13 Jul 2023 21:17:18 -0700 + mariadb (1:10.11.3-1) unstable; urgency=medium * New upstream version 10.11.3. Includes security fixes for diff -Nru mariadb-10.11.3/debian/control mariadb-10.11.4/debian/control --- mariadb-10.11.3/debian/control 2023-05-28 06:05:56.000000000 +0000 +++ mariadb-10.11.4/debian/control 2023-07-14 04:08:00.000000000 +0000 @@ -296,7 +296,7 @@ mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4, - mariadb-server-10.5, + mariadb-server-10.5 (<< 1:10.11), mariadb-server-10.6, mysql-client-5.5, mysql-client-5.6, @@ -330,7 +330,7 @@ mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4, - mariadb-server-10.5, + mariadb-server-10.5 (<< 1:10.11), mariadb-server-10.6, mysql-client-5.5, mysql-client-5.6, @@ -374,6 +374,7 @@ mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4, + mariadb-server-10.5 (<< 1:10.11), mariadb-server-core-10.0, mariadb-server-core-10.1, mariadb-server-core-10.2, @@ -398,7 +399,7 @@ mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4, - mariadb-server-10.5, + mariadb-server-10.5 (<< 1:10.11), mariadb-server-10.6, mariadb-server-core-10.0, mariadb-server-core-10.1, @@ -482,7 +483,7 @@ mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4, - mariadb-server-10.5, + mariadb-server-10.5 (<< 1:10.11), mariadb-server-10.6, mariadb-server-5.5, mariadb-tokudb-engine-10.0, @@ -504,7 +505,7 @@ mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4, - mariadb-server-10.5, + mariadb-server-10.5 (<< 1:10.11), mariadb-server-10.6, mariadb-server-5.5, mariadb-tokudb-engine-10.0, @@ -530,6 +531,19 @@ . This package includes the server binaries. +Package: mariadb-server-10.5 +Architecture: any +Depends: mariadb-server (>= 1:10.11), + ${shlibs:Depends} +Description: MariaDB database server binaries + MariaDB is a fast, stable and true multi-user, multi-threaded SQL database + server. SQL (Structured Query Language) is the most popular database query + language in the world. The main goals of MariaDB are speed, robustness and + ease of use. + . + This package is a transitional package designed to make upgrades from previous + MariaDB versions seamless. + Package: mariadb-backup Architecture: any Breaks: mariadb-backup-10.1, diff -Nru mariadb-10.11.3/debian/gbp.conf mariadb-10.11.4/debian/gbp.conf --- mariadb-10.11.3/debian/gbp.conf 2023-05-28 05:46:25.000000000 +0000 +++ mariadb-10.11.4/debian/gbp.conf 2023-07-14 04:08:00.000000000 +0000 @@ -8,7 +8,7 @@ upstream-signatures = on # DEP-14 format -debian-branch = debian/latest +debian-branch = debian/bookworm upstream-branch = 10.11 upstream-tag = mariadb-%(version)s diff -Nru mariadb-10.11.3/debian/mariadb-test-data.lintian-overrides mariadb-10.11.4/debian/mariadb-test-data.lintian-overrides --- mariadb-10.11.3/debian/mariadb-test-data.lintian-overrides 2023-05-28 05:46:25.000000000 +0000 +++ mariadb-10.11.4/debian/mariadb-test-data.lintian-overrides 2023-07-14 04:08:00.000000000 +0000 @@ -1,6 +1,9 @@ # These should be moved, see https://jira.mariadb.org/browse/MDEV-21654 arch-dependent-file-in-usr-share [usr/share/mysql/mysql-test/suite/plugins/pam/pam_mariadb_mtr.so] arch-independent-package-contains-binary-or-object [usr/share/mysql/mysql-test/suite/plugins/pam/pam_mariadb_mtr.so] +# Duplicate in old Lintian syntax as the FTP of NEW queue still uses it +arch-dependent-file-in-usr-share usr/share/mysql/mysql-test/suite/plugins/pam/pam_mariadb_mtr.so +arch-independent-package-contains-binary-or-object usr/share/mysql/mysql-test/suite/plugins/pam/pam_mariadb_mtr.so # Intentional for test files national-encoding [usr/share/mysql/mysql-test/*] # Extra test documentation files that really need to be kept in context in test directory diff -Nru mariadb-10.11.3/debian/mariadb-test.lintian-overrides mariadb-10.11.4/debian/mariadb-test.lintian-overrides --- mariadb-10.11.3/debian/mariadb-test.lintian-overrides 2023-05-28 06:05:56.000000000 +0000 +++ mariadb-10.11.4/debian/mariadb-test.lintian-overrides 2023-07-14 04:08:00.000000000 +0000 @@ -1,6 +1,9 @@ # These should be moved, see https://jira.mariadb.org/browse/MDEV-21653 arch-dependent-file-in-usr-share [usr/share/mysql/mysql-test/lib/My/SafeProcess/my_safe_process] arch-dependent-file-in-usr-share [usr/share/mysql/mysql-test/lib/My/SafeProcess/wsrep_check_version] +# Duplicate in old Lintian syntax as the FTP of NEW queue still uses it +arch-dependent-file-in-usr-share usr/share/mysql/mysql-test/lib/My/SafeProcess/my_safe_process +arch-dependent-file-in-usr-share usr/share/mysql/mysql-test/lib/My/SafeProcess/wsrep_check_version # MyISAM stopwords that cannot be changed and spelling errors remain spelling-error-in-binary noone no one [usr/bin/*] spelling-error-in-binary thats that's [usr/bin/*] diff -Nru mariadb-10.11.3/debian/salsa-ci-enable-sec-and-update-repos.sh mariadb-10.11.4/debian/salsa-ci-enable-sec-and-update-repos.sh --- mariadb-10.11.3/debian/salsa-ci-enable-sec-and-update-repos.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.4/debian/salsa-ci-enable-sec-and-update-repos.sh 2023-07-14 04:08:00.000000000 +0000 @@ -0,0 +1,23 @@ +#!/bin/sh + +set -x +set -e + +# Debug what repositories are available to begin with +grep -r "^deb " /etc/apt/sources.* + +# Enable the same repositories that were available at build time in +# registry.salsa.debian.org/salsa-ci-team/pipeline/base:bullseye +. /etc/os-release +cat << EOF > /etc/apt/sources.list.d/base-$VERSION_CODENAME-repos.list +deb http://deb.debian.org/debian $VERSION_CODENAME main +deb http://deb.debian.org/debian-security $VERSION_CODENAME-security main +deb http://deb.debian.org/debian $VERSION_CODENAME-updates main +EOF + +apt-get update + +# Ref +# bullseye piuparts test runner environment is missing the bullseye-updates apt repository: https://salsa.debian.org/salsa-ci-team/pipeline/-/issues/292 +# piuparts: doesn't install dependencies from experimental or -backports: https://salsa.debian.org/salsa-ci-team/pipeline/-/issues/58 +# autopkgtest: doesn't install dependencies from experimental or backports: https://salsa.debian.org/salsa-ci-team/pipeline/-/issues/85 diff -Nru mariadb-10.11.3/debian/salsa-ci.yml mariadb-10.11.4/debian/salsa-ci.yml --- mariadb-10.11.3/debian/salsa-ci.yml 2023-05-28 06:05:56.000000000 +0000 +++ mariadb-10.11.4/debian/salsa-ci.yml 2023-07-14 04:08:00.000000000 +0000 @@ -8,7 +8,7 @@ variables: BUILT_PACKAGES: "libmariadb-dev libmariadb-dev-compat libmariadb3 libmariadbd19 libmariadbd-dev mariadb-common mariadb-client mariadb-server mariadb-backup mariadb-plugin-connect mariadb-plugin-s3 mariadb-plugin-rocksdb mariadb-plugin-oqgraph mariadb-plugin-mroonga mariadb-plugin-spider mariadb-plugin-cracklib-password-check mariadb-test mariadb-test-data" DEB_BUILD_OPTIONS: "nocheck noautodbgsym" - RELEASE: sid + RELEASE: bookworm # Reprotest works, but takes very long time and often fails due to timeouts. # Thus is is best kept disabled and only occasionally manually enabled to # test that reproducibility works, along with atomic reprotest to directly @@ -17,6 +17,10 @@ SALSA_CI_ENABLE_ATOMIC_REPROTEST: 0 SALSA_CI_DISABLE_MISSING_BREAKS: 0 SALSA_CI_DISABLE_RC_BUGS: 0 + # Make Lintian and Piuparts use ${RELEASE} so our commits get tested against + # the correct release before making an upload to that release + SALSA_CI_IMAGES_LINTIAN: ${SALSA_CI_IMAGES}/lintian:${RELEASE} + SALSA_CI_PIUPARTS_PRE_INSTALL_SCRIPT: 'debian/salsa-ci-enable-sec-and-update-repos.sh' # Extend Salsa-CI build jobs to have longer timeout as the default GitLab # timeout (1h) is often not enough @@ -473,7 +477,6 @@ - *test-full-upgrade - service mariadb status # There is no init.d/mysql in MariaDB 10.5+ - *test-verify-final - allow_failure: true # Currently fails on Bug#1035949 test basic features: extends: .salsa-ci-template-for-mariadb diff -Nru mariadb-10.11.3/mysql-test/main/derived_cond_pushdown.result mariadb-10.11.4/mysql-test/main/derived_cond_pushdown.result --- mariadb-10.11.3/mysql-test/main/derived_cond_pushdown.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/main/derived_cond_pushdown.result 2023-06-05 17:04:58.000000000 +0000 @@ -20790,6 +20790,100 @@ deallocate prepare stmt; drop view v1; drop table t1; +# +# MDEV-31240: condition pushed into splittable derived has reference to +# outer column and does not refer to any column of embedding +# select +# +create table t1 (a int); +insert into t1 select seq from seq_1_to_1000; +create table t2 (a int, b int, key (a)); +insert into t2 select mod(seq,100), rand(13) * mod(seq,500) from seq_1_to_1000; +create table t3 (a int); +insert into t3 values (3), (1); +analyze table t1, t2, t3 persistent for all; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status Table is already up to date +test.t3 analyze status Engine-independent statistics collected +test.t3 analyze status OK +explain select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 +2 DEPENDENT SUBQUERY t3 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY ref key0 key0 5 test.t1.a 2 +3 LATERAL DERIVED t2 ref a a 5 test.t1.a 10 +select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +a ( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +1 1=804 +2 1=1056 +3 1=846 +4 1=947 +5 1=973 +truncate table t2; +insert into t2 select mod(seq,10), rand(15) * mod(seq,500) from seq_1_to_1000; +analyze table t2 persistent for all; +Table Op Msg_type Msg_text +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status Table is already up to date +explain select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 +2 DEPENDENT SUBQUERY t3 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY ref key0 key0 5 test.t1.a 100 +3 DERIVED t2 ALL a NULL NULL NULL 1000 Using temporary; Using filesort +select +a, +( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +from t1 limit 5; +a ( select concat(t3.a,'=',dt.s) +from +(select a, sum(b) as s from t2 group by a) as dt, +t3 +where dt.a=t1.a and t3.a < 3 +) +1 1=11858 +2 1=11380 +3 1=11588 +4 1=11373 +5 1=11612 +drop table t1,t2,t3; # End of 10.4 tests # # MDEV-28958: condition pushable into view after simplification diff -Nru mariadb-10.11.3/mysql-test/main/derived_cond_pushdown.test mariadb-10.11.4/mysql-test/main/derived_cond_pushdown.test --- mariadb-10.11.3/mysql-test/main/derived_cond_pushdown.test 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/main/derived_cond_pushdown.test 2023-06-05 17:04:58.000000000 +0000 @@ -3973,6 +3973,47 @@ drop view v1; drop table t1; +--echo # +--echo # MDEV-31240: condition pushed into splittable derived has reference to +--echo # outer column and does not refer to any column of embedding +--echo # select +--echo # + +create table t1 (a int); +insert into t1 select seq from seq_1_to_1000; + +create table t2 (a int, b int, key (a)); +insert into t2 select mod(seq,100), rand(13) * mod(seq,500) from seq_1_to_1000; + +create table t3 (a int); +insert into t3 values (3), (1); + +analyze table t1, t2, t3 persistent for all; + +let $q= +select + a, + ( select concat(t3.a,'=',dt.s) + from + (select a, sum(b) as s from t2 group by a) as dt, + t3 + where dt.a=t1.a and t3.a < 3 + ) +from t1 limit 5; + +eval explain $q; +eval $q; + +truncate table t2; +insert into t2 select mod(seq,10), rand(15) * mod(seq,500) from seq_1_to_1000; + +analyze table t2 persistent for all; + +eval explain $q; +eval $q; + +drop table t1,t2,t3; + --echo # End of 10.4 tests --echo # diff -Nru mariadb-10.11.3/mysql-test/main/derived_split_innodb.result mariadb-10.11.4/mysql-test/main/derived_split_innodb.result --- mariadb-10.11.3/mysql-test/main/derived_split_innodb.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/main/derived_split_innodb.result 2023-06-05 17:04:58.000000000 +0000 @@ -842,5 +842,20 @@ a set optimizer_switch= @tmp1, join_cache_level= @tmp2; DROP TABLE t1, t2; +# +# MDEV-31403: Server crashes in st_join_table::choose_best_splitting (still) +# +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES +(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15); +CREATE TABLE t2 (b INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (100),(200); +CREATE TABLE t3 (c INT, d INT, KEY(c)) ENGINE=InnoDB; +INSERT INTO t3 VALUES (1,1),(2,2); +CREATE VIEW v AS SELECT c, d FROM t3 GROUP BY c, d; +SELECT * FROM t1 JOIN t2 WHERE (t1.a, t2.b) IN (SELECT * FROM v); +a b +DROP VIEW v; +DROP TABLE t1, t2, t3; # End of 10.4 tests SET GLOBAL innodb_stats_persistent=@save_innodb_stats_persistent; diff -Nru mariadb-10.11.3/mysql-test/main/derived_split_innodb.test mariadb-10.11.4/mysql-test/main/derived_split_innodb.test --- mariadb-10.11.3/mysql-test/main/derived_split_innodb.test 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/main/derived_split_innodb.test 2023-06-05 17:04:58.000000000 +0000 @@ -466,6 +466,27 @@ # Cleanup DROP TABLE t1, t2; +--echo # +--echo # MDEV-31403: Server crashes in st_join_table::choose_best_splitting (still) +--echo # +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES + (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15); + +CREATE TABLE t2 (b INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (100),(200); + +CREATE TABLE t3 (c INT, d INT, KEY(c)) ENGINE=InnoDB; +INSERT INTO t3 VALUES (1,1),(2,2); + +CREATE VIEW v AS SELECT c, d FROM t3 GROUP BY c, d; + +SELECT * FROM t1 JOIN t2 WHERE (t1.a, t2.b) IN (SELECT * FROM v); + +# Cleanup +DROP VIEW v; +DROP TABLE t1, t2, t3; + --echo # End of 10.4 tests SET GLOBAL innodb_stats_persistent=@save_innodb_stats_persistent; diff -Nru mariadb-10.11.3/mysql-test/main/explain_non_select.result mariadb-10.11.4/mysql-test/main/explain_non_select.result --- mariadb-10.11.3/mysql-test/main/explain_non_select.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/main/explain_non_select.result 2023-06-05 17:04:58.000000000 +0000 @@ -277,3 +277,22 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 ALL NULL NULL NULL NULL 2 drop table t1,t2; +# +# MDEV-31224: EXPLAIN EXTENDED for multi-table update of system table +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (3); +EXPLAIN EXTENDED UPDATE t1, t2 SET b = 4 WHERE a IN (6,2); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t2 system NULL NULL NULL NULL 1 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 update `test`.`t1` set `test`.`t2`.`b` = 4 where `test`.`t1`.`a` in (6,2) +UPDATE t1, t2 SET b = 4 WHERE a IN (6,2); +SELECT * from t2; +b +4 +DROP TABLE t1, t2; +# End of 10.4 tests diff -Nru mariadb-10.11.3/mysql-test/main/explain_non_select.test mariadb-10.11.4/mysql-test/main/explain_non_select.test --- mariadb-10.11.3/mysql-test/main/explain_non_select.test 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/main/explain_non_select.test 2023-06-05 17:04:58.000000000 +0000 @@ -250,3 +250,23 @@ EXECUTE stmt; drop table t1,t2; +--echo # +--echo # MDEV-31224: EXPLAIN EXTENDED for multi-table update of system table +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); + +CREATE TABLE t2 (b INT) ENGINE=MyISAM; +INSERT INTO t2 VALUES (3); + +let $q= +UPDATE t1, t2 SET b = 4 WHERE a IN (6,2); + +eval EXPLAIN EXTENDED $q; +eval $q; +SELECT * from t2; + +DROP TABLE t1, t2; + +--echo # End of 10.4 tests diff -Nru mariadb-10.11.3/mysql-test/main/myisam_explain_non_select_all.result mariadb-10.11.4/mysql-test/main/myisam_explain_non_select_all.result --- mariadb-10.11.3/mysql-test/main/myisam_explain_non_select_all.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/main/myisam_explain_non_select_all.result 2023-06-05 17:04:58.000000000 +0000 @@ -2689,7 +2689,7 @@ 1 SIMPLE t2 system NULL NULL NULL NULL 0 0.00 Const row not found 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Warnings: -Note 1003 update `test`.`t1` set NULL = 10 +Note 1003 update `test`.`t1` set `test`.`t2`.`c2` = 10 # Status of EXPLAIN EXTENDED query Variable_name Value Handler_read_key 7 @@ -2734,7 +2734,7 @@ 1 SIMPLE t2 system NULL NULL NULL NULL 0 0.00 Const row not found 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 update `test`.`t1` set NULL = 10 where `test`.`t1`.`c3` = 10 +Note 1003 update `test`.`t1` set `test`.`t2`.`c2` = 10 where `test`.`t1`.`c3` = 10 # Status of EXPLAIN EXTENDED query Variable_name Value Handler_read_key 7 diff -Nru mariadb-10.11.3/mysql-test/suite/galera/r/MDEV-24143.result mariadb-10.11.4/mysql-test/suite/galera/r/MDEV-24143.result --- mariadb-10.11.3/mysql-test/suite/galera/r/MDEV-24143.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/galera/r/MDEV-24143.result 2023-06-05 17:04:58.000000000 +0000 @@ -0,0 +1,23 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (c1 BIGINT NOT NULL PRIMARY KEY, c2 BINARY (10), c3 DATETIME); +SELECT get_lock ('test2', 0); +get_lock ('test2', 0) +1 +DROP TABLE t1; +CREATE TABLE t1 (c1 SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY); +INSERT INTO t1 VALUES (1); +SET SESSION wsrep_trx_fragment_size=10; +SET SESSION autocommit=0; +SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC; +c1 +INSERT INTO t1 VALUES (4),(3),(1),(2); +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE; +ERROR 42S01: Table 't1' already exists +ALTER TABLE t1 DROP COLUMN c2; +ERROR 42000: Can't DROP COLUMN `c2`; check that it exists +SELECT get_lock ('test', 1.5); +get_lock ('test', 1.5) +1 +DROP TABLE t1; diff -Nru mariadb-10.11.3/mysql-test/suite/galera/r/galera_bf_abort_get_lock.result mariadb-10.11.4/mysql-test/suite/galera/r/galera_bf_abort_get_lock.result --- mariadb-10.11.3/mysql-test/suite/galera/r/galera_bf_abort_get_lock.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/galera/r/galera_bf_abort_get_lock.result 2023-06-05 17:04:58.000000000 +0000 @@ -0,0 +1,18 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +connection node_2a; +SELECT GET_LOCK("foo", 1000); +GET_LOCK("foo", 1000) +1 +connection node_2; +SET AUTOCOMMIT=OFF; +INSERT INTO t1 VALUES (1); +SELECT GET_LOCK("foo", 1000);; +connection node_1; +INSERT INTO t1 VALUES (1); +connection node_2; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +wsrep_local_aborts_increment +1 +DROP TABLE t1; diff -Nru mariadb-10.11.3/mysql-test/suite/galera/r/galera_locks_funcs.result mariadb-10.11.4/mysql-test/suite/galera/r/galera_locks_funcs.result --- mariadb-10.11.3/mysql-test/suite/galera/r/galera_locks_funcs.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/galera/r/galera_locks_funcs.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -connection node_2; -connection node_1; -CREATE TABLE t (c DOUBLE,c2 INT,PRIMARY KEY(c)) ENGINE=InnoDB; -INSERT INTO t values (1,1); -SELECT GET_LOCK('a',1); -ERROR 42000: This version of MariaDB doesn't yet support 'GET_LOCK in cluster (WSREP_ON=ON)' -SHOW WARNINGS; -Level Code Message -Error 1235 This version of MariaDB doesn't yet support 'GET_LOCK in cluster (WSREP_ON=ON)' -SELECT * FROM t; -c c2 -1 1 -SELECT RELEASE_LOCK('a'); -ERROR 42000: This version of MariaDB doesn't yet support 'RELEASE_LOCK in cluster (WSREP_ON=ON)' -SHOW WARNINGS; -Level Code Message -Error 1235 This version of MariaDB doesn't yet support 'RELEASE_LOCK in cluster (WSREP_ON=ON)' -SELECT RELEASE_ALL_LOCKS(); -ERROR 42000: This version of MariaDB doesn't yet support 'RELEASE_ALL_LOCKS in cluster (WSREP_ON=ON)' -SHOW WARNINGS; -Level Code Message -Error 1235 This version of MariaDB doesn't yet support 'RELEASE_ALL_LOCKS in cluster (WSREP_ON=ON)' -COMMIT; -DROP TABLE t; diff -Nru mariadb-10.11.3/mysql-test/suite/galera/r/galera_query_cache_invalidate.result mariadb-10.11.4/mysql-test/suite/galera/r/galera_query_cache_invalidate.result --- mariadb-10.11.3/mysql-test/suite/galera/r/galera_query_cache_invalidate.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/galera/r/galera_query_cache_invalidate.result 2023-06-05 17:04:58.000000000 +0000 @@ -8,6 +8,8 @@ call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); connection node_3; CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_1, master_use_gtid=current_pos;; +Warnings: +Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead START SLAVE; include/wait_for_slave_to_start.inc connection node_1; @@ -110,6 +112,8 @@ connection node_3; STOP SLAVE; RESET SLAVE ALL; +Warnings: +Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'Current_Pos' to 'Slave_Pos' connection node_1; SET SESSION WSREP_ON=OFF; RESET MASTER; diff -Nru mariadb-10.11.3/mysql-test/suite/galera/t/MDEV-24143.test mariadb-10.11.4/mysql-test/suite/galera/t/MDEV-24143.test --- mariadb-10.11.3/mysql-test/suite/galera/t/MDEV-24143.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/galera/t/MDEV-24143.test 2023-06-05 17:04:58.000000000 +0000 @@ -0,0 +1,20 @@ +--source include/galera_cluster.inc +--source include/have_sequence.inc + +CREATE TABLE t1 (c1 BIGINT NOT NULL PRIMARY KEY, c2 BINARY (10), c3 DATETIME); +SELECT get_lock ('test2', 0); +DROP TABLE t1; +CREATE TABLE t1 (c1 SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY); +INSERT INTO t1 VALUES (1); +SET SESSION wsrep_trx_fragment_size=10; +SET SESSION autocommit=0; +SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC; +--error ER_LOCK_DEADLOCK +INSERT INTO t1 VALUES (4),(3),(1),(2); +--error ER_TABLE_EXISTS_ERROR +CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE; +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP COLUMN c2; +SELECT get_lock ('test', 1.5); +DROP TABLE t1; + diff -Nru mariadb-10.11.3/mysql-test/suite/galera/t/galera_bf_abort_get_lock.test mariadb-10.11.4/mysql-test/suite/galera/t/galera_bf_abort_get_lock.test --- mariadb-10.11.3/mysql-test/suite/galera/t/galera_bf_abort_get_lock.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/galera/t/galera_bf_abort_get_lock.test 2023-06-05 17:04:58.000000000 +0000 @@ -0,0 +1,36 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc + +# +# Test a local transaction being aborted by a slave one while it is running a GET_LOCK() +# + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--let $galera_connection_name = node_2a +--let $galera_server_number = 2 +--source include/galera_connect.inc +--connection node_2a +SELECT GET_LOCK("foo", 1000); + +--connection node_2 +SET AUTOCOMMIT=OFF; +--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` +INSERT INTO t1 VALUES (1); +--send SELECT GET_LOCK("foo", 1000); + +--connection node_1 +INSERT INTO t1 VALUES (1); + +--connection node_2 +--error ER_LOCK_DEADLOCK +--reap + +--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +# Check that wsrep_local_bf_aborts has been incremented by exactly 1 +--disable_query_log +--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment; +--enable_query_log + +DROP TABLE t1; diff -Nru mariadb-10.11.3/mysql-test/suite/galera/t/galera_locks_funcs.test mariadb-10.11.4/mysql-test/suite/galera/t/galera_locks_funcs.test --- mariadb-10.11.3/mysql-test/suite/galera/t/galera_locks_funcs.test 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/galera/t/galera_locks_funcs.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ ---source include/galera_cluster.inc - -CREATE TABLE t (c DOUBLE,c2 INT,PRIMARY KEY(c)) ENGINE=InnoDB; -INSERT INTO t values (1,1); ---error ER_NOT_SUPPORTED_YET -SELECT GET_LOCK('a',1); -SHOW WARNINGS; -SELECT * FROM t; ---error ER_NOT_SUPPORTED_YET -SELECT RELEASE_LOCK('a'); -SHOW WARNINGS; -# New in 10.5 ---error ER_NOT_SUPPORTED_YET -SELECT RELEASE_ALL_LOCKS(); -SHOW WARNINGS; -COMMIT; -DROP TABLE t; - diff -Nru mariadb-10.11.3/mysql-test/suite/innodb/r/monitor.result mariadb-10.11.4/mysql-test/suite/innodb/r/monitor.result --- mariadb-10.11.3/mysql-test/suite/innodb/r/monitor.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/innodb/r/monitor.result 2023-06-05 17:04:58.000000000 +0000 @@ -1,10 +1,9 @@ -set global innodb_monitor_disable = All; select name, if(enabled,'enabled','disabled') status from information_schema.innodb_metrics; name status metadata_table_handles_opened disabled -lock_deadlocks disabled -lock_timeouts disabled +lock_deadlocks enabled +lock_timeouts enabled lock_rec_lock_waits disabled lock_table_lock_waits disabled lock_rec_lock_requests disabled @@ -14,30 +13,30 @@ lock_table_lock_created disabled lock_table_lock_removed disabled lock_table_locks disabled -lock_row_lock_current_waits disabled -lock_row_lock_time disabled -lock_row_lock_time_max disabled -lock_row_lock_waits disabled -lock_row_lock_time_avg disabled -buffer_pool_size disabled -buffer_pool_reads disabled -buffer_pool_read_requests disabled -buffer_pool_write_requests disabled -buffer_pool_wait_free disabled -buffer_pool_read_ahead disabled -buffer_pool_read_ahead_evicted disabled -buffer_pool_pages_total disabled -buffer_pool_pages_misc disabled -buffer_pool_pages_data disabled -buffer_pool_bytes_data disabled -buffer_pool_pages_dirty disabled -buffer_pool_bytes_dirty disabled -buffer_pool_pages_free disabled -buffer_pages_created disabled -buffer_pages_written disabled -buffer_pages_read disabled -buffer_data_reads disabled -buffer_data_written disabled +lock_row_lock_current_waits enabled +lock_row_lock_time enabled +lock_row_lock_time_max enabled +lock_row_lock_waits enabled +lock_row_lock_time_avg enabled +buffer_pool_size enabled +buffer_pool_reads enabled +buffer_pool_read_requests enabled +buffer_pool_write_requests enabled +buffer_pool_wait_free enabled +buffer_pool_read_ahead enabled +buffer_pool_read_ahead_evicted enabled +buffer_pool_pages_total enabled +buffer_pool_pages_misc enabled +buffer_pool_pages_data enabled +buffer_pool_bytes_data enabled +buffer_pool_pages_dirty enabled +buffer_pool_bytes_dirty enabled +buffer_pool_pages_free enabled +buffer_pages_created enabled +buffer_pages_written enabled +buffer_pages_read enabled +buffer_data_reads enabled +buffer_data_written enabled buffer_flush_batch_scanned disabled buffer_flush_batch_num_scan disabled buffer_flush_batch_scanned_per_call disabled @@ -70,8 +69,8 @@ buffer_LRU_batch_scanned disabled buffer_LRU_batch_num_scan disabled buffer_LRU_batch_scanned_per_call disabled -buffer_LRU_batch_flush_total_pages disabled -buffer_LRU_batch_evict_total_pages disabled +buffer_LRU_batch_flush_total_pages enabled +buffer_LRU_batch_evict_total_pages enabled buffer_LRU_single_flush_failure_count disabled buffer_LRU_get_free_search disabled buffer_LRU_search_scanned disabled @@ -112,21 +111,21 @@ buffer_page_written_zblob disabled buffer_page_written_zblob2 disabled buffer_page_written_other disabled -os_data_reads disabled -os_data_writes disabled -os_data_fsyncs disabled -os_pending_reads disabled -os_pending_writes disabled -os_log_bytes_written disabled +os_data_reads enabled +os_data_writes enabled +os_data_fsyncs enabled +os_pending_reads enabled +os_pending_writes enabled +os_log_bytes_written enabled trx_rw_commits disabled trx_ro_commits disabled trx_nl_ro_commits disabled trx_commits_insert_update disabled trx_rollbacks disabled trx_rollbacks_savepoint disabled -trx_rseg_history_len disabled +trx_rseg_history_len enabled trx_undo_slots_used disabled -trx_undo_slots_cached disabled +trx_undo_slots_cached enabled trx_rseg_current_size disabled purge_del_mark_records disabled purge_upd_exist_or_extern_records disabled @@ -142,9 +141,9 @@ log_lsn_checkpoint_age disabled log_lsn_buf_pool_oldest disabled log_max_modified_age_async disabled -log_waits disabled -log_write_requests disabled -log_writes disabled +log_waits enabled +log_write_requests enabled +log_writes enabled compress_pages_compressed disabled compress_pages_decompressed disabled compression_pad_increments disabled @@ -162,34 +161,34 @@ index_page_reorg_attempts disabled index_page_reorg_successful disabled index_page_discards disabled -adaptive_hash_searches disabled -adaptive_hash_searches_btree disabled +adaptive_hash_searches enabled +adaptive_hash_searches_btree enabled adaptive_hash_pages_added disabled adaptive_hash_pages_removed disabled adaptive_hash_rows_added disabled adaptive_hash_rows_removed disabled adaptive_hash_rows_deleted_no_hash_entry disabled adaptive_hash_rows_updated disabled -file_num_open_files disabled -ibuf_merges_insert disabled -ibuf_merges_delete_mark disabled -ibuf_merges_delete disabled -ibuf_merges_discard_insert disabled -ibuf_merges_discard_delete_mark disabled -ibuf_merges_discard_delete disabled -ibuf_merges disabled -ibuf_size disabled +file_num_open_files enabled +ibuf_merges_insert enabled +ibuf_merges_delete_mark enabled +ibuf_merges_delete enabled +ibuf_merges_discard_insert enabled +ibuf_merges_discard_delete_mark enabled +ibuf_merges_discard_delete enabled +ibuf_merges enabled +ibuf_size enabled innodb_master_thread_sleeps disabled -innodb_activity_count disabled +innodb_activity_count enabled innodb_master_active_loops disabled innodb_master_idle_loops disabled innodb_log_flush_usec disabled innodb_dict_lru_usec disabled innodb_dict_lru_count_active disabled innodb_dict_lru_count_idle disabled -innodb_dblwr_writes disabled -innodb_dblwr_pages_written disabled -innodb_page_size disabled +innodb_dblwr_writes enabled +innodb_dblwr_pages_written enabled +innodb_page_size enabled ddl_background_drop_indexes disabled ddl_online_create_index disabled ddl_pending_alter_table disabled @@ -199,6 +198,9 @@ icp_no_match disabled icp_out_of_range disabled icp_match disabled +set global innodb_monitor_disable = All; +select name from information_schema.innodb_metrics where enabled; +name set global innodb_monitor_enable = all; select name from information_schema.innodb_metrics where not enabled; name diff -Nru mariadb-10.11.3/mysql-test/suite/innodb/t/monitor.test mariadb-10.11.4/mysql-test/suite/innodb/t/monitor.test --- mariadb-10.11.3/mysql-test/suite/innodb/t/monitor.test 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/innodb/t/monitor.test 2023-06-05 17:04:58.000000000 +0000 @@ -5,12 +5,14 @@ # sys_vars.innodb_monitor_enable_basic --source include/have_innodb.inc -set global innodb_monitor_disable = All; # Test turn on/off the monitor counter with "all" option # By default, they will be off. select name, if(enabled,'enabled','disabled') status from information_schema.innodb_metrics; +set global innodb_monitor_disable = All; +select name from information_schema.innodb_metrics where enabled; + # Turn on all monitor counters set global innodb_monitor_enable = all; diff -Nru mariadb-10.11.3/mysql-test/suite/innodb_zip/r/page_size.result mariadb-10.11.4/mysql-test/suite/innodb_zip/r/page_size.result --- mariadb-10.11.3/mysql-test/suite/innodb_zip/r/page_size.result 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/innodb_zip/r/page_size.result 2023-06-05 17:04:58.000000000 +0000 @@ -608,4 +608,25 @@ INSERT INTO t1 VALUES (''); SET GLOBAL innodb_compression_level= @save_innodb_compression_level; DROP TABLE t1; +# +# MDEV-31158 Assertion ...MTR_MEMO_X_LOCKED in btr_attach_half_pages() +# +SET @save_compression_level=@@GLOBAL.innodb_compression_level; +SET GLOBAL innodb_compression_level=0; +CREATE TEMPORARY TABLE t(a SERIAL, prefix VARBINARY(4), pad INT); +INSERT INTO t(prefix, pad) VALUES +(_binary 0xff,160),('',19),(_binary 0x0001,253),(_binary 0x0b11,169), +(_binary 0x0b010001,23),(_binary 0x0b100001,251),(_binary 0x0d,163), +(_binary 0xb3,254),(_binary 0x96,254),(_binary 0xeb,61), +(_binary 0xf231,253),(_binary 0x1db0,253),(_binary 0x0005,101), +(_binary 0x6370,253),(_binary 0x0b12,112),(_binary 0x0b010002,23), +(_binary 0x0b100002,80),(_binary 0x181984,163),(_binary 0x181926,168), +(_binary 0xe1,176),(_binary 0xe2,187),(_binary 0xe6,254),(_binary 0xbb,51), +(_binary 0x1c,248),(_binary 0x8a,94),(_binary 0x14,254); +CREATE TABLE u(a SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, +b VARBINARY(255), KEY(b)) ENGINE=InnoDB +KEY_BLOCK_SIZE=1 ROW_FORMAT=COMPRESSED; +INSERT INTO u SELECT a,CONCAT(prefix,REPEAT(chr(0),pad)) FROM t; +DROP TABLE u, t; +SET GLOBAL innodb_compression_level=@save_compression_level; # End of 10.6 tests diff -Nru mariadb-10.11.3/mysql-test/suite/innodb_zip/t/page_size.test mariadb-10.11.4/mysql-test/suite/innodb_zip/t/page_size.test --- mariadb-10.11.3/mysql-test/suite/innodb_zip/t/page_size.test 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/mysql-test/suite/innodb_zip/t/page_size.test 2023-06-05 17:04:58.000000000 +0000 @@ -888,4 +888,28 @@ SET GLOBAL innodb_compression_level= @save_innodb_compression_level; DROP TABLE t1; +--echo # +--echo # MDEV-31158 Assertion ...MTR_MEMO_X_LOCKED in btr_attach_half_pages() +--echo # +--source include/have_innodb.inc + +SET @save_compression_level=@@GLOBAL.innodb_compression_level; +SET GLOBAL innodb_compression_level=0; +CREATE TEMPORARY TABLE t(a SERIAL, prefix VARBINARY(4), pad INT); +INSERT INTO t(prefix, pad) VALUES +(_binary 0xff,160),('',19),(_binary 0x0001,253),(_binary 0x0b11,169), +(_binary 0x0b010001,23),(_binary 0x0b100001,251),(_binary 0x0d,163), +(_binary 0xb3,254),(_binary 0x96,254),(_binary 0xeb,61), +(_binary 0xf231,253),(_binary 0x1db0,253),(_binary 0x0005,101), +(_binary 0x6370,253),(_binary 0x0b12,112),(_binary 0x0b010002,23), +(_binary 0x0b100002,80),(_binary 0x181984,163),(_binary 0x181926,168), +(_binary 0xe1,176),(_binary 0xe2,187),(_binary 0xe6,254),(_binary 0xbb,51), +(_binary 0x1c,248),(_binary 0x8a,94),(_binary 0x14,254); +CREATE TABLE u(a SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + b VARBINARY(255), KEY(b)) ENGINE=InnoDB + KEY_BLOCK_SIZE=1 ROW_FORMAT=COMPRESSED; +INSERT INTO u SELECT a,CONCAT(prefix,REPEAT(chr(0),pad)) FROM t; +DROP TABLE u, t; +SET GLOBAL innodb_compression_level=@save_compression_level; + --echo # End of 10.6 tests diff -Nru mariadb-10.11.3/sql/item_create.cc mariadb-10.11.4/sql/item_create.cc --- mariadb-10.11.3/sql/item_create.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/sql/item_create.cc 2023-06-05 17:04:58.000000000 +0000 @@ -3679,13 +3679,6 @@ Item* Create_func_get_lock::create_2_arg(THD *thd, Item *arg1, Item *arg2) { -#ifdef WITH_WSREP - if (WSREP_ON && WSREP(thd)) - { - my_error(ER_NOT_SUPPORTED_YET, MYF(0), "GET_LOCK in cluster (WSREP_ON=ON)"); - return NULL; - } -#endif /* WITH_WSREP */ thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); return new (thd->mem_root) Item_func_get_lock(thd, arg1, arg2); @@ -5020,13 +5013,6 @@ Item* Create_func_release_all_locks::create_builder(THD *thd) { -#ifdef WITH_WSREP - if (WSREP_ON && WSREP(thd)) - { - my_error(ER_NOT_SUPPORTED_YET, MYF(0), "RELEASE_ALL_LOCKS in cluster (WSREP_ON=ON)"); - return NULL; - } -#endif /* WITH_WSREP */ thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); return new (thd->mem_root) Item_func_release_all_locks(thd); @@ -5038,13 +5024,6 @@ Item* Create_func_release_lock::create_1_arg(THD *thd, Item *arg1) { -#ifdef WITH_WSREP - if (WSREP_ON && WSREP(thd)) - { - my_error(ER_NOT_SUPPORTED_YET, MYF(0), "RELEASE_LOCK in cluster (WSREP_ON=ON)"); - return NULL; - } -#endif /* WITH_WSREP */ thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT); return new (thd->mem_root) Item_func_release_lock(thd, arg1); diff -Nru mariadb-10.11.3/sql/opt_split.cc mariadb-10.11.4/sql/opt_split.cc --- mariadb-10.11.3/sql/opt_split.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/sql/opt_split.cc 2023-06-05 17:04:58.000000000 +0000 @@ -664,7 +664,8 @@ keyuse_ext.cond_guard= added_key_field->cond_guard; keyuse_ext.sj_pred_no= added_key_field->sj_pred_no; keyuse_ext.validity_ref= 0; - keyuse_ext.needed_in_prefix= added_key_field->val->used_tables(); + keyuse_ext.needed_in_prefix= added_key_field->val->used_tables() & + ~(OUTER_REF_TABLE_BIT | RAND_TABLE_BIT); keyuse_ext.validity_var= false; return ext_keyuses->push(keyuse_ext); } @@ -945,6 +946,7 @@ SplM_plan_info * JOIN_TAB::choose_best_splitting(uint idx, table_map remaining_tables, + const POSITION *join_positions, table_map *spl_pd_boundary) { SplM_opt_info *spl_opt_info= table->spl_opt_info; @@ -1042,7 +1044,7 @@ else { table_map last_found= this->table->map; - for (POSITION *pos= &this->join->positions[idx - 1]; ; pos--) + for (const POSITION *pos= &join_positions[idx - 1]; ; pos--) { if (pos->table->table->map & excluded_tables) continue; diff -Nru mariadb-10.11.3/sql/sql_select.cc mariadb-10.11.4/sql/sql_select.cc --- mariadb-10.11.3/sql/sql_select.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/sql/sql_select.cc 2023-06-05 17:04:58.000000000 +0000 @@ -8010,6 +8010,7 @@ if (s->table->is_splittable()) spl_plan= s->choose_best_splitting(idx, remaining_tables, + join_positions, &spl_pd_boundary); Json_writer_array trace_paths(thd, "considered_access_paths"); @@ -29469,7 +29470,7 @@ else str->append(','); - item->print(str, query_type); + item->print(str, (enum_query_type) (query_type | QT_NO_DATA_EXPANSION)); str->append(STRING_WITH_LEN(" = ")); val->print(str, query_type); } diff -Nru mariadb-10.11.3/sql/sql_select.h mariadb-10.11.4/sql/sql_select.h --- mariadb-10.11.3/sql/sql_select.h 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/sql/sql_select.h 2023-06-05 17:04:58.000000000 +0000 @@ -707,6 +707,7 @@ void add_keyuses_for_splitting(); SplM_plan_info *choose_best_splitting(uint idx, table_map remaining_tables, + const POSITION *join_positions, table_map *spl_pd_boundary); bool fix_splitting(SplM_plan_info *spl_plan, table_map excluded_tables, bool is_const_table); diff -Nru mariadb-10.11.3/storage/innobase/btr/btr0cur.cc mariadb-10.11.4/storage/innobase/btr/btr0cur.cc --- mariadb-10.11.3/storage/innobase/btr/btr0cur.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/btr/btr0cur.cc 2023-06-05 17:04:58.000000000 +0000 @@ -748,18 +748,24 @@ /** Detects whether the modifying record might need a opposite modification to the intention. -@param page page -@param lock_intention lock intention for the tree operation +@param bpage buffer pool page +@param is_clust whether this is a clustered index +@param lock_intention lock intention for the tree operation @param node_ptr_max_size the maximum size of a node pointer @param compress_limit BTR_CUR_PAGE_COMPRESS_LIMIT(index) -@param rec record (current node_ptr) -@return true if tree modification is needed */ -static bool btr_cur_need_opposite_intention(const page_t *page, +@param rec record (current node_ptr) +@return true if tree modification is needed */ +static bool btr_cur_need_opposite_intention(const buf_page_t &bpage, + bool is_clust, btr_intention_t lock_intention, ulint node_ptr_max_size, ulint compress_limit, const rec_t *rec) { + if (UNIV_LIKELY_NULL(bpage.zip.data) && + !page_zip_available(&bpage.zip, is_clust, node_ptr_max_size, 1)) + return true; + const page_t *const page= bpage.frame; if (lock_intention != BTR_INTENTION_INSERT) { /* We compensate also for btr_cur_compress_recommendation() */ @@ -1343,7 +1349,8 @@ !btr_block_get(*index(), btr_page_get_next(block->page.frame), RW_X_LATCH, false, mtr, &err)) goto func_exit; - if (btr_cur_need_opposite_intention(block->page.frame, lock_intention, + if (btr_cur_need_opposite_intention(block->page, index()->is_clust(), + lock_intention, node_ptr_max_size, compress_limit, page_cur.rec)) goto need_opposite_intention; @@ -1399,7 +1406,8 @@ default: break; case BTR_MODIFY_TREE: - if (btr_cur_need_opposite_intention(block->page.frame, lock_intention, + if (btr_cur_need_opposite_intention(block->page, index()->is_clust(), + lock_intention, node_ptr_max_size, compress_limit, page_cur.rec)) /* If the rec is the first or last in the page for pessimistic @@ -1949,7 +1957,7 @@ break; if (!index->lock.have_x() && - btr_cur_need_opposite_intention(block->page.frame, + btr_cur_need_opposite_intention(block->page, index->is_clust(), lock_intention, node_ptr_max_size, compress_limit, page_cur.rec)) @@ -1996,7 +2004,8 @@ ut_ad(latch_mode != BTR_MODIFY_TREE || upper_rw_latch == RW_X_LATCH); if (latch_mode != BTR_MODIFY_TREE); - else if (btr_cur_need_opposite_intention(block->page.frame, lock_intention, + else if (btr_cur_need_opposite_intention(block->page, index->is_clust(), + lock_intention, node_ptr_max_size, compress_limit, page_cur.rec)) { diff -Nru mariadb-10.11.3/storage/innobase/buf/buf0flu.cc mariadb-10.11.4/storage/innobase/buf/buf0flu.cc --- mariadb-10.11.3/storage/innobase/buf/buf0flu.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/buf/buf0flu.cc 2023-06-05 17:04:58.000000000 +0000 @@ -2430,6 +2430,7 @@ else if (buf_pool.ran_out()) { buf_pool.page_cleaner_set_idle(false); + buf_pool.get_oldest_modification(0); mysql_mutex_unlock(&buf_pool.flush_list_mutex); n= srv_max_io_capacity; mysql_mutex_lock(&buf_pool.mutex); diff -Nru mariadb-10.11.3/storage/innobase/handler/ha_innodb.cc mariadb-10.11.4/storage/innobase/handler/ha_innodb.cc --- mariadb-10.11.3/storage/innobase/handler/ha_innodb.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/handler/ha_innodb.cc 2023-06-05 17:04:58.000000000 +0000 @@ -945,7 +945,8 @@ {"buffer_pool_read_ahead", &buf_pool.stat.n_ra_pages_read, SHOW_SIZE_T}, {"buffer_pool_read_ahead_evicted", &buf_pool.stat.n_ra_pages_evicted, SHOW_SIZE_T}, - {"buffer_pool_read_requests", &buf_pool.stat.n_page_gets, SHOW_SIZE_T}, + {"buffer_pool_read_requests", + &export_vars.innodb_buffer_pool_read_requests, SHOW_SIZE_T}, {"buffer_pool_reads", &buf_pool.stat.n_pages_read, SHOW_SIZE_T}, {"buffer_pool_wait_free", &buf_pool.stat.LRU_waits, SHOW_SIZE_T}, {"buffer_pool_write_requests", &buf_pool.flush_list_requests, SHOW_SIZE_T}, diff -Nru mariadb-10.11.3/storage/innobase/include/srv0srv.h mariadb-10.11.4/storage/innobase/include/srv0srv.h --- mariadb-10.11.3/storage/innobase/include/srv0srv.h 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/include/srv0srv.h 2023-06-05 17:04:58.000000000 +0000 @@ -617,6 +617,8 @@ #ifdef UNIV_DEBUG ulint innodb_buffer_pool_pages_latched; /*!< Latched pages */ #endif /* UNIV_DEBUG */ + /** buf_pool.stat.n_page_gets (a sharded counter) */ + ulint innodb_buffer_pool_read_requests; ulint innodb_checkpoint_age; ulint innodb_checkpoint_max_age; ulint innodb_data_pending_reads; /*!< Pending reads */ diff -Nru mariadb-10.11.3/storage/innobase/include/trx0sys.h mariadb-10.11.4/storage/innobase/include/trx0sys.h --- mariadb-10.11.3/storage/innobase/include/trx0sys.h 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/include/trx0sys.h 2023-06-05 17:04:58.000000000 +0000 @@ -1055,7 +1055,7 @@ void close(); /** @return total number of active (non-prepared) transactions */ - ulint any_active_transactions(); + size_t any_active_transactions(size_t *prepared= nullptr); /** diff -Nru mariadb-10.11.3/storage/innobase/srv/srv0mon.cc mariadb-10.11.4/storage/innobase/srv/srv0mon.cc --- mariadb-10.11.3/storage/innobase/srv/srv0mon.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/srv/srv0mon.cc 2023-06-05 17:04:58.000000000 +0000 @@ -674,7 +674,7 @@ {"trx_rseg_history_len", "transaction", "Length of the TRX_RSEG_HISTORY list", static_cast( - MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT), + MONITOR_EXISTING | MONITOR_DISPLAY_CURRENT | MONITOR_DEFAULT_ON), MONITOR_DEFAULT_START, MONITOR_RSEG_HISTORY_LEN}, {"trx_undo_slots_used", "transaction", "Number of undo slots used", diff -Nru mariadb-10.11.3/storage/innobase/srv/srv0srv.cc mariadb-10.11.4/storage/innobase/srv/srv0srv.cc --- mariadb-10.11.3/storage/innobase/srv/srv0srv.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/srv/srv0srv.cc 2023-06-05 17:04:58.000000000 +0000 @@ -919,6 +919,9 @@ export_vars.innodb_data_written = srv_stats.data_written + (dblwr << srv_page_size_shift); + export_vars.innodb_buffer_pool_read_requests + = buf_pool.stat.n_page_gets; + export_vars.innodb_buffer_pool_bytes_data = buf_pool.stat.LRU_bytes + (UT_LIST_GET_LEN(buf_pool.unzip_LRU) @@ -1409,7 +1412,7 @@ } /** @return whether purge should exit due to shutdown */ -static bool srv_purge_should_exit() +static bool srv_purge_should_exit(size_t old_history_size) { ut_ad(srv_shutdown_state <= SRV_SHUTDOWN_CLEANUP); @@ -1420,8 +1423,12 @@ return true; /* Slow shutdown was requested. */ + size_t prepared, active= trx_sys.any_active_transactions(&prepared); const size_t history_size= trx_sys.history_size(); - if (history_size) + + if (!history_size); + else if (!active && history_size == old_history_size && prepared); + else { static time_t progress_time; time_t now= time(NULL); @@ -1438,7 +1445,7 @@ return false; } - return !trx_sys.any_active_transactions(); + return !active; } /*********************************************************************//** @@ -1581,7 +1588,7 @@ break; } - if (!srv_purge_should_exit()) + if (!srv_purge_should_exit(history_size)) goto loop; } @@ -1777,15 +1784,19 @@ /** Shut down the purge threads. */ void srv_purge_shutdown() { - if (purge_sys.enabled()) { - if (!srv_fast_shutdown && !opt_bootstrap) - srv_update_purge_thread_count(innodb_purge_threads_MAX); - while(!srv_purge_should_exit()) { - ut_a(!purge_sys.paused()); - srv_wake_purge_thread_if_not_active(); - purge_coordinator_task.wait(); - } - purge_sys.coordinator_shutdown(); - srv_shutdown_purge_tasks(); - } + if (purge_sys.enabled()) + { + if (!srv_fast_shutdown && !opt_bootstrap) + srv_update_purge_thread_count(innodb_purge_threads_MAX); + size_t history_size= trx_sys.history_size(); + while (!srv_purge_should_exit(history_size)) + { + history_size= trx_sys.history_size(); + ut_a(!purge_sys.paused()); + srv_wake_purge_thread_if_not_active(); + purge_coordinator_task.wait(); + } + purge_sys.coordinator_shutdown(); + srv_shutdown_purge_tasks(); + } } diff -Nru mariadb-10.11.3/storage/innobase/trx/trx0purge.cc mariadb-10.11.4/storage/innobase/trx/trx0purge.cc --- mariadb-10.11.3/storage/innobase/trx/trx0purge.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/trx/trx0purge.cc 2023-06-05 17:04:58.000000000 +0000 @@ -371,19 +371,6 @@ undo = NULL; } -MY_ATTRIBUTE((nonnull, warn_unused_result)) -/** Remove undo log header from the history list. -@param[in,out] rseg rollback segment header page -@param[in] log undo log segment header page -@param[in] offset byte offset in the undo log segment header page -@param[in,out] mtr mini-transaction */ -static dberr_t trx_purge_remove_log_hdr(buf_block_t *rseg, buf_block_t* log, - uint16_t offset, mtr_t *mtr) -{ - return flst_remove(rseg, TRX_RSEG + TRX_RSEG_HISTORY, log, - uint16_t(offset + TRX_UNDO_HISTORY_NODE), mtr); -} - /** Free an undo log segment. @param block rollback segment header page @param mtr mini-transaction */ @@ -393,7 +380,7 @@ block->page.frame, &mtr)) { block->fix(); - const page_id_t id{block->page.id()}; + ut_d(const page_id_t id{block->page.id()}); mtr.commit(); /* NOTE: If the server is killed after the log that was produced up to this point was written, and before the log from the mtr.commit() @@ -405,16 +392,8 @@ log_free_check(); mtr.start(); block->page.lock.x_lock(); - if (UNIV_UNLIKELY(block->page.id() != id)) - { - block->unfix(); - block->page.lock.x_unlock(); - block= buf_page_get_gen(id, 0, RW_X_LATCH, nullptr, BUF_GET, &mtr); - if (!block) - return; - } - else - mtr.memo_push(block, MTR_MEMO_PAGE_X_MODIFY); + ut_ad(block->page.id() == id); + mtr.memo_push(block, MTR_MEMO_PAGE_X_MODIFY); } while (!fseg_free_step(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + @@ -422,12 +401,13 @@ } /** Remove unnecessary history data from a rollback segment. -@param[in,out] rseg rollback segment -@param[in] limit truncate anything before this +@param rseg rollback segment +@param limit truncate anything before this +@param all whether everything can be truncated @return error code */ static dberr_t -trx_purge_truncate_rseg_history(trx_rseg_t& rseg, - const purge_sys_t::iterator& limit) +trx_purge_truncate_rseg_history(trx_rseg_t &rseg, + const purge_sys_t::iterator &limit, bool all) { fil_addr_t hdr_addr; mtr_t mtr; @@ -436,7 +416,6 @@ mtr.start(); dberr_t err; -reget: buf_block_t *rseg_hdr= rseg.get(&mtr, &err); if (!rseg_hdr) { @@ -471,23 +450,24 @@ goto func_exit; } + if (!all) + goto func_exit; + fil_addr_t prev_hdr_addr= flst_get_prev_addr(b->page.frame + hdr_addr.boffset + TRX_UNDO_HISTORY_NODE); prev_hdr_addr.boffset= static_cast(prev_hdr_addr.boffset - TRX_UNDO_HISTORY_NODE); - err= trx_purge_remove_log_hdr(rseg_hdr, b, hdr_addr.boffset, &mtr); + + err= flst_remove(rseg_hdr, TRX_RSEG + TRX_RSEG_HISTORY, b, + uint16_t(hdr_addr.boffset + TRX_UNDO_HISTORY_NODE), &mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) goto func_exit; rseg_hdr->fix(); - if (mach_read_from_2(b->page.frame + hdr_addr.boffset + TRX_UNDO_NEXT_LOG) || - rseg.is_referenced() || - rseg.needs_purge > (purge_sys.head.trx_no - ? purge_sys.head.trx_no - : purge_sys.tail.trx_no)) - /* We cannot free the entire undo page. */; + if (mach_read_from_2(b->page.frame + hdr_addr.boffset + TRX_UNDO_NEXT_LOG)) + /* We cannot free the entire undo log segment. */; else { const uint32_t seg_size= @@ -512,9 +492,9 @@ if (undo->hdr_page_no == hdr_addr.page) goto found_cached; ut_ad("inconsistent undo logs" == 0); - break; - found_cached: - UT_LIST_REMOVE(rseg.undo_cached, undo); + if (false) + found_cached: + UT_LIST_REMOVE(rseg.undo_cached, undo); static_assert(FIL_NULL == 0xffffffff, ""); if (UNIV_UNLIKELY(mach_read_from_4(TRX_RSEG + TRX_RSEG_FORMAT + rseg_hdr->page.frame))) @@ -537,12 +517,7 @@ log_free_check(); mtr.start(); rseg_hdr->page.lock.x_lock(); - if (UNIV_UNLIKELY(rseg_hdr->page.id() != rseg.page_id())) - { - rseg_hdr->unfix(); - rseg_hdr->page.lock.x_unlock(); - goto reget; - } + ut_ad(rseg_hdr->page.id() == rseg.page_id()); mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_MODIFY); goto loop; @@ -615,7 +590,10 @@ { ut_ad(rseg.is_persistent()); rseg.latch.wr_lock(SRW_LOCK_CALL); - if (dberr_t e= trx_purge_truncate_rseg_history(rseg, head)) + if (dberr_t e= + trx_purge_truncate_rseg_history(rseg, head, + !rseg.is_referenced() && + rseg.needs_purge <= head.trx_no)) err= e; rseg.latch.wr_unlock(); } @@ -694,7 +672,8 @@ } ut_ad(rseg.curr_size > cached); - if (rseg.curr_size > cached + 1) + if (rseg.curr_size > cached + 1 && + (rseg.history_size || srv_fast_shutdown || srv_undo_sources)) goto not_free; rseg.latch.rd_unlock(); @@ -708,6 +687,7 @@ mtr_t mtr; mtr.start(); mtr.x_lock_space(&space); + const auto space_id= space.id; /* Lock all modified pages of the tablespace. @@ -717,8 +697,8 @@ mini-transaction commit and the server was killed, then discarding the to-be-trimmed pages without flushing would break crash recovery. */ + rescan: mysql_mutex_lock(&buf_pool.flush_list_mutex); - for (buf_page_t *bpage= UT_LIST_GET_LAST(buf_pool.flush_list); bpage; ) { ut_ad(bpage->oldest_modification()); @@ -726,46 +706,47 @@ buf_page_t *prev= UT_LIST_GET_PREV(list, bpage); - if (bpage->id().space() == space.id && - bpage->oldest_modification() != 1) + if (bpage->oldest_modification() > 2 && bpage->id().space() == space_id) { ut_ad(bpage->frame); - auto block= reinterpret_cast(bpage); - if (!bpage->lock.x_lock_try()) + bpage->fix(); { - rescan: - /* Let buf_pool_t::release_freed_page() proceed. */ + /* Try to acquire an exclusive latch while the cache line is + fresh after fix(). */ + const bool got_lock{bpage->lock.x_lock_try()}; + buf_pool.flush_hp.set(prev); mysql_mutex_unlock(&buf_pool.flush_list_mutex); - mysql_mutex_lock(&buf_pool.mutex); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - mysql_mutex_unlock(&buf_pool.mutex); - bpage= UT_LIST_GET_LAST(buf_pool.flush_list); - continue; + if (!got_lock) + bpage->lock.x_lock(); } - buf_pool.flush_hp.set(prev); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); #ifdef BTR_CUR_HASH_ADAPT - ut_ad(!block->index); /* There is no AHI on undo tablespaces. */ + /* There is no AHI on undo tablespaces. */ + ut_ad(!reinterpret_cast(bpage)->index); #endif - bpage->fix(); ut_ad(!bpage->is_io_fixed()); - mysql_mutex_lock(&buf_pool.flush_list_mutex); + ut_ad(bpage->id().space() == space_id); - if (bpage->oldest_modification() > 1) + if (bpage->oldest_modification() > 2) { + mtr.memo_push(reinterpret_cast(bpage), + MTR_MEMO_PAGE_X_FIX); + mysql_mutex_lock(&buf_pool.flush_list_mutex); + ut_ad(bpage->oldest_modification() > 2); bpage->reset_oldest_modification(); - mtr.memo_push(block, MTR_MEMO_PAGE_X_FIX); } else { bpage->unfix(); bpage->lock.x_unlock(); + mysql_mutex_lock(&buf_pool.flush_list_mutex); } if (prev != buf_pool.flush_hp.get()) - /* Rescan, because we may have lost the position. */ + { + mysql_mutex_unlock(&buf_pool.flush_list_mutex); goto rescan; + } } bpage= prev; diff -Nru mariadb-10.11.3/storage/innobase/trx/trx0sys.cc mariadb-10.11.4/storage/innobase/trx/trx0sys.cc --- mariadb-10.11.3/storage/innobase/trx/trx0sys.cc 2023-05-05 13:09:16.000000000 +0000 +++ mariadb-10.11.4/storage/innobase/trx/trx0sys.cc 2023-06-05 17:04:58.000000000 +0000 @@ -342,15 +342,29 @@ } /** @return total number of active (non-prepared) transactions */ -ulint trx_sys_t::any_active_transactions() +size_t trx_sys_t::any_active_transactions(size_t *prepared) { - uint32_t total_trx= 0; + size_t total_trx= 0, prepared_trx= 0; - trx_sys.trx_list.for_each([&total_trx](const trx_t &trx) { - if (trx.state == TRX_STATE_COMMITTED_IN_MEMORY || - (trx.state == TRX_STATE_ACTIVE && trx.id)) + trx_sys.trx_list.for_each([&](const trx_t &trx) { + switch (trx.state) { + case TRX_STATE_NOT_STARTED: + break; + case TRX_STATE_ACTIVE: + if (!trx.id) + break; + /* fall through */ + case TRX_STATE_COMMITTED_IN_MEMORY: total_trx++; + break; + case TRX_STATE_PREPARED: + case TRX_STATE_PREPARED_RECOVERED: + prepared_trx++; + } }); + if (prepared) + *prepared= prepared_trx; + return total_trx; }