mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Merge 10.2 into 10.3
This commit is contained in:
commit
acf6f92aa9
60 changed files with 1130 additions and 287 deletions
|
@ -1,5 +1,5 @@
|
|||
# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2008, 2018, MariaDB Corporation
|
||||
# Copyright (c) 2008, 2019, MariaDB Corporation
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -1982,10 +1982,8 @@ static bool innodb_init()
|
|||
}
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
msg("mariabackup: innodb_init() returned %d (%s).",
|
||||
die("mariabackup: innodb_init() returned %d (%s).",
|
||||
err, ut_strerr(err));
|
||||
innodb_shutdown();
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
return(FALSE);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
'\" t
|
||||
.\"
|
||||
.TH "\FBMYSQL_INSTALL_DB\" "1" "9 May 2017" "MariaDB 10\&.3" "MariaDB Database System"
|
||||
.TH "\FBMYSQL_INSTALL_DB\FR" "1" "4 April 2019" "MariaDB 10\&.3" "MariaDB Database System"
|
||||
.\" -----------------------------------------------------------------
|
||||
.\" * set default formatting
|
||||
.\" -----------------------------------------------------------------
|
||||
|
@ -198,6 +198,21 @@ Must be given as first option\&.
|
|||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
.\" mysql_install_db: defaults-group-suffix option
|
||||
.\" defaults-group-suffix option: mysql_install_db
|
||||
\fB\-\-defaults\-group\-suffix=\fR\fB\fIname\fR\fR
|
||||
.sp
|
||||
In addition to the given groups, also read groups with this suffix\&.
|
||||
.RE
|
||||
.sp
|
||||
.RS 4
|
||||
.ie n \{\
|
||||
\h'-04'\(bu\h'+03'\c
|
||||
.\}
|
||||
.el \{\
|
||||
.sp -1
|
||||
.IP \(bu 2.3
|
||||
.\}
|
||||
.\" mysql_install_db: force option
|
||||
.\" force option: mysql_install_db
|
||||
\fB\-\-force\fR
|
||||
|
@ -354,7 +369,7 @@ For internal use\&. This option is used for creating Windows distributions\&.
|
|||
.SH "COPYRIGHT"
|
||||
.br
|
||||
.PP
|
||||
Copyright 2007-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc., 2010-2015 MariaDB Foundation
|
||||
Copyright 2007-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc., 2010-2019 MariaDB Foundation
|
||||
.PP
|
||||
This documentation is free software; you can redistribute it and/or modify it only under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License.
|
||||
.PP
|
||||
|
|
|
@ -504,6 +504,10 @@ GEOMETRYFROMTEXT('POINT(4599 60359)'),
|
|||
) as relate_res;
|
||||
relate_res
|
||||
0
|
||||
prepare s from 'do st_convexhull(st_aswkb(multipoint(point(-11702,15179),point(-5031,27960),point(-30557,11158),point(-27804,30314))))';
|
||||
execute s;
|
||||
execute s;
|
||||
deallocate prepare s;
|
||||
with cte1 as( select (st_symdifference(point(1,1),point(1,1))) as a1 ), cte2 as(select 1 as a2) select 1 from cte1 where cte1.a1 < '1';
|
||||
1
|
||||
1
|
||||
|
|
|
@ -382,6 +382,12 @@ SELECT ST_RELATE(
|
|||
'F*FFFF**F'
|
||||
) as relate_res;
|
||||
|
||||
# MDEV-18920 Prepared statements with st_convexhull hang and eat 100% cpu.
|
||||
prepare s from 'do st_convexhull(st_aswkb(multipoint(point(-11702,15179),point(-5031,27960),point(-30557,11158),point(-27804,30314))))';
|
||||
execute s;
|
||||
execute s;
|
||||
deallocate prepare s;
|
||||
|
||||
# MDEV- 16050 cte + geometry functions lead to crash.
|
||||
|
||||
with cte1 as( select (st_symdifference(point(1,1),point(1,1))) as a1 ), cte2 as(select 1 as a2) select 1 from cte1 where cte1.a1 < '1';
|
||||
|
|
|
@ -786,6 +786,66 @@ t COUNT(*)
|
|||
12:12:13 1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-17830 Server crashes in Item_null_result::field_type upon SELECT with CHARSET(date) and ROLLUP
|
||||
#
|
||||
# Note, different MariaDB versions can return different results
|
||||
# in the two rows (such as "latin1" vs "binary"). This is wrong.
|
||||
# Both lines should return equal values.
|
||||
# The point in this test is to make sure it does not crash.
|
||||
# As this is a minor issue, bad result will be fixed
|
||||
# in a later version, presumably in 10.4.
|
||||
CREATE TABLE t (d DATE) ENGINE=MyISAM;
|
||||
INSERT INTO t VALUES ('2018-12-12');
|
||||
SELECT CHARSET(d) AS f FROM t GROUP BY d WITH ROLLUP;
|
||||
f
|
||||
binary
|
||||
latin1
|
||||
DROP TABLE t;
|
||||
#
|
||||
# MDEV-14041 Server crashes in String::length on queries with functions and ROLLUP
|
||||
#
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
SELECT GET_LOCK( 'foo', 0 );
|
||||
GET_LOCK( 'foo', 0 )
|
||||
1
|
||||
SELECT HEX( RELEASE_LOCK( 'foo' ) ) AS f FROM t1 GROUP BY f WITH ROLLUP;
|
||||
f
|
||||
NULL
|
||||
1
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
SELECT i FROM t1 GROUP BY i WITH ROLLUP
|
||||
UNION ALL
|
||||
SELECT ELT( FOUND_ROWS(), 1 ) f FROM t1 GROUP BY f WITH ROLLUP;
|
||||
i
|
||||
1
|
||||
2
|
||||
NULL
|
||||
NULL
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
SELECT a FROM t1 GROUP BY NULLIF( CONVERT('', DATE), '2015-10-15' ) WITH ROLLUP;
|
||||
a
|
||||
1
|
||||
1
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
Warning 1292 Incorrect datetime value: ''
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 10.1 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -423,6 +423,45 @@ SELECT t, COUNT(*) FROM t1 GROUP BY t WITH ROLLUP HAVING t > '00:00:00';
|
|||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17830 Server crashes in Item_null_result::field_type upon SELECT with CHARSET(date) and ROLLUP
|
||||
--echo #
|
||||
|
||||
--echo # Note, different MariaDB versions can return different results
|
||||
--echo # in the two rows (such as "latin1" vs "binary"). This is wrong.
|
||||
--echo # Both lines should return equal values.
|
||||
--echo # The point in this test is to make sure it does not crash.
|
||||
--echo # As this is a minor issue, bad result will be fixed
|
||||
--echo # in a later version, presumably in 10.4.
|
||||
|
||||
CREATE TABLE t (d DATE) ENGINE=MyISAM;
|
||||
INSERT INTO t VALUES ('2018-12-12');
|
||||
SELECT CHARSET(d) AS f FROM t GROUP BY d WITH ROLLUP;
|
||||
DROP TABLE t;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-14041 Server crashes in String::length on queries with functions and ROLLUP
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
SELECT GET_LOCK( 'foo', 0 );
|
||||
SELECT HEX( RELEASE_LOCK( 'foo' ) ) AS f FROM t1 GROUP BY f WITH ROLLUP;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
SELECT i FROM t1 GROUP BY i WITH ROLLUP
|
||||
UNION ALL
|
||||
SELECT ELT( FOUND_ROWS(), 1 ) f FROM t1 GROUP BY f WITH ROLLUP;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
SELECT a FROM t1 GROUP BY NULLIF( CONVERT('', DATE), '2015-10-15' ) WITH ROLLUP;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.1 tests
|
||||
--echo #
|
||||
|
|
|
@ -3253,3 +3253,16 @@ Warnings:
|
|||
Note 1003 select `test`.`wings`.`id` AS `wing_id`,`test`.`wings`.`department_id` AS `department_id` from `test`.`wings` semi join (`test`.`books`) where `test`.`books`.`library_id` = 8663 and `test`.`books`.`scheduled_for_removal` = 0 and `test`.`wings`.`id` = `test`.`books`.`wings_id` order by `test`.`wings`.`id`
|
||||
set optimizer_switch= @save_optimizer_switch;
|
||||
DROP TABLE books, wings;
|
||||
#
|
||||
# MDEV-17796: query with DISTINCT, GROUP BY and ORDER BY
|
||||
#
|
||||
CREATE TABLE t1 (id int, gr int, v1 varchar(10));
|
||||
INSERT INTO t1 VALUES (1,1,'A'), (2,2,'B'), (3,3,NULL), (4,4,'C');
|
||||
SELECT DISTINCT NULLIF(GROUP_CONCAT(v1), null) FROM t1
|
||||
WHERE gr in (4,2)
|
||||
GROUP BY id
|
||||
ORDER BY id+1 DESC;
|
||||
NULLIF(GROUP_CONCAT(v1), null)
|
||||
C
|
||||
B
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -2187,3 +2187,17 @@ eval explain extended $q;
|
|||
set optimizer_switch= @save_optimizer_switch;
|
||||
|
||||
DROP TABLE books, wings;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17796: query with DISTINCT, GROUP BY and ORDER BY
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (id int, gr int, v1 varchar(10));
|
||||
INSERT INTO t1 VALUES (1,1,'A'), (2,2,'B'), (3,3,NULL), (4,4,'C');
|
||||
|
||||
SELECT DISTINCT NULLIF(GROUP_CONCAT(v1), null) FROM t1
|
||||
WHERE gr in (4,2)
|
||||
GROUP BY id
|
||||
ORDER BY id+1 DESC;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -7643,6 +7643,22 @@ c1 c2 count(c3)
|
|||
2012-03-01 02:00:00 3 1
|
||||
DROP PROCEDURE p1;
|
||||
# End of 5.5 test
|
||||
CREATE PROCEDURE sp() ALTER TABLE non_existing_table OPTIMIZE PARTITION p0;
|
||||
CALL sp;
|
||||
Table Op Msg_type Msg_text
|
||||
test.non_existing_table optimize Error Table 'test.non_existing_table' doesn't exist
|
||||
test.non_existing_table optimize status Operation failed
|
||||
SELECT 1;
|
||||
1
|
||||
1
|
||||
DROP PROCEDURE sp;
|
||||
CREATE PROCEDURE sp() SHOW USER_STATISTICS;
|
||||
CALL sp;
|
||||
User Total_connections Concurrent_connections Connected_time Busy_time Cpu_time Bytes_received Bytes_sent Binlog_bytes_written Rows_read Rows_sent Rows_deleted Rows_inserted Rows_updated Select_commands Update_commands Other_commands Commit_transactions Rollback_transactions Denied_connections Lost_connections Access_denied Empty_queries Total_ssl_connections Max_statement_time_exceeded
|
||||
SELECT 1;
|
||||
1
|
||||
1
|
||||
DROP PROCEDURE sp;
|
||||
#
|
||||
# Bug#12663165 SP DEAD CODE REMOVAL DOESN'T UNDERSTAND CONTINUE HANDLERS
|
||||
#
|
||||
|
|
|
@ -9068,6 +9068,15 @@ DROP PROCEDURE p1;
|
|||
|
||||
--echo # End of 5.5 test
|
||||
|
||||
#MDEV-17610
|
||||
CREATE PROCEDURE sp() ALTER TABLE non_existing_table OPTIMIZE PARTITION p0;
|
||||
CALL sp;
|
||||
SELECT 1;
|
||||
DROP PROCEDURE sp;
|
||||
CREATE PROCEDURE sp() SHOW USER_STATISTICS;
|
||||
CALL sp;
|
||||
SELECT 1;
|
||||
DROP PROCEDURE sp;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#12663165 SP DEAD CODE REMOVAL DOESN'T UNDERSTAND CONTINUE HANDLERS
|
||||
|
|
|
@ -625,6 +625,76 @@ MAX(pk)
|
|||
NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-17605: SHOW INDEXES with use_stat_tables='preferably'
|
||||
#
|
||||
set use_stat_tables='preferably';
|
||||
CREATE DATABASE dbt3_s001;
|
||||
use dbt3_s001;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set optimizer_switch='extended_keys=off';
|
||||
select * from mysql.table_stats;
|
||||
db_name table_name cardinality
|
||||
dbt3_s001 lineitem 6005
|
||||
select * from mysql.index_stats;
|
||||
db_name table_name index_name prefix_arity avg_frequency
|
||||
dbt3_s001 lineitem PRIMARY 1 4.0033
|
||||
dbt3_s001 lineitem PRIMARY 2 1.0000
|
||||
dbt3_s001 lineitem i_l_shipdate 1 2.6500
|
||||
dbt3_s001 lineitem i_l_suppkey_partkey 1 30.0250
|
||||
dbt3_s001 lineitem i_l_suppkey_partkey 2 8.5786
|
||||
dbt3_s001 lineitem i_l_partkey 1 30.0250
|
||||
dbt3_s001 lineitem i_l_suppkey 1 600.5000
|
||||
dbt3_s001 lineitem i_l_receiptdate 1 2.6477
|
||||
dbt3_s001 lineitem i_l_orderkey 1 4.0033
|
||||
dbt3_s001 lineitem i_l_orderkey_quantity 1 4.0033
|
||||
dbt3_s001 lineitem i_l_orderkey_quantity 2 1.0404
|
||||
dbt3_s001 lineitem i_l_commitdate 1 2.7160
|
||||
SHOW INDEXES FROM lineitem;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
|
||||
lineitem 0 PRIMARY 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
lineitem 0 PRIMARY 2 l_linenumber A 6005 NULL NULL BTREE
|
||||
lineitem 1 i_l_shipdate 1 l_shipDATE A 2266 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_suppkey_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_suppkey_partkey 2 l_suppkey A 699 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_suppkey 1 l_suppkey A 10 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_receiptdate 1 l_receiptDATE A 2268 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_orderkey 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
lineitem 1 i_l_orderkey_quantity 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
lineitem 1 i_l_orderkey_quantity 2 l_quantity A 5771 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_commitdate 1 l_commitDATE A 2210 NULL NULL YES BTREE
|
||||
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name='lineitem';
|
||||
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT INDEX_COMMENT
|
||||
def dbt3_s001 lineitem 0 dbt3_s001 PRIMARY 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 0 dbt3_s001 PRIMARY 2 l_linenumber A 6005 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_shipdate 1 l_shipDATE A 2266 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_suppkey_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_suppkey_partkey 2 l_suppkey A 699 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_suppkey 1 l_suppkey A 10 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_receiptdate 1 l_receiptDATE A 2268 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_orderkey 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_orderkey_quantity 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_orderkey_quantity 2 l_quantity A 5771 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_commitdate 1 l_commitDATE A 2210 NULL NULL YES BTREE
|
||||
SELECT
|
||||
COUNT(DISTINCT l_orderkey), COUNT(DISTINCT l_orderkey,l_linenumber),
|
||||
COUNT(DISTINCT l_shipDATE),
|
||||
COUNT(DISTINCT l_partkey), COUNT(DISTINCT l_partkey,l_suppkey),
|
||||
COUNT(DISTINCT l_suppkey), COUNT(DISTINCT l_receiptDATE),
|
||||
COUNT(DISTINCT l_orderkey, l_quantity), COUNT(DISTINCT l_commitDATE)
|
||||
FROM lineitem;
|
||||
COUNT(DISTINCT l_orderkey) COUNT(DISTINCT l_orderkey,l_linenumber) COUNT(DISTINCT l_shipDATE) COUNT(DISTINCT l_partkey) COUNT(DISTINCT l_partkey,l_suppkey) COUNT(DISTINCT l_suppkey) COUNT(DISTINCT l_receiptDATE) COUNT(DISTINCT l_orderkey, l_quantity) COUNT(DISTINCT l_commitDATE)
|
||||
1500 6005 2266 200 700 10 2268 5772 2211
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
DROP DATABASE dbt3_s001;
|
||||
USE test;
|
||||
delete from mysql.table_stats;
|
||||
delete from mysql.column_stats;
|
||||
delete from mysql.index_stats;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
#
|
||||
# MDEV-18899: Server crashes in Field::set_warning_truncated_wrong_value
|
||||
#
|
||||
set names utf8;
|
||||
|
|
|
@ -401,6 +401,61 @@ SELECT MAX(pk) FROM t1;
|
|||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17605: SHOW INDEXES with use_stat_tables='preferably'
|
||||
--echo #
|
||||
|
||||
set use_stat_tables='preferably';
|
||||
|
||||
CREATE DATABASE dbt3_s001;
|
||||
|
||||
use dbt3_s001;
|
||||
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set optimizer_switch='extended_keys=off';
|
||||
|
||||
--disable_query_log
|
||||
--disable_result_log
|
||||
--disable_warnings
|
||||
--source include/dbt3_s001.inc
|
||||
create index i_p_retailprice on part(p_retailprice);
|
||||
delete from mysql.table_stats;
|
||||
delete from mysql.column_stats;
|
||||
delete from mysql.index_stats;
|
||||
ANALYZE TABLE lineitem;
|
||||
FLUSH TABLE mysql.table_stats, mysql.index_stats;
|
||||
--enable_warnings
|
||||
--enable_result_log
|
||||
--enable_query_log
|
||||
|
||||
select * from mysql.table_stats;
|
||||
select * from mysql.index_stats;
|
||||
|
||||
SHOW INDEXES FROM lineitem;
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name='lineitem';
|
||||
|
||||
SELECT
|
||||
COUNT(DISTINCT l_orderkey), COUNT(DISTINCT l_orderkey,l_linenumber),
|
||||
COUNT(DISTINCT l_shipDATE),
|
||||
COUNT(DISTINCT l_partkey), COUNT(DISTINCT l_partkey,l_suppkey),
|
||||
COUNT(DISTINCT l_suppkey), COUNT(DISTINCT l_receiptDATE),
|
||||
COUNT(DISTINCT l_orderkey, l_quantity), COUNT(DISTINCT l_commitDATE)
|
||||
FROM lineitem;
|
||||
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
DROP DATABASE dbt3_s001;
|
||||
USE test;
|
||||
|
||||
delete from mysql.table_stats;
|
||||
delete from mysql.column_stats;
|
||||
delete from mysql.index_stats;
|
||||
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-18899: Server crashes in Field::set_warning_truncated_wrong_value
|
||||
--echo #
|
||||
|
|
|
@ -652,6 +652,76 @@ MAX(pk)
|
|||
NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-17605: SHOW INDEXES with use_stat_tables='preferably'
|
||||
#
|
||||
set use_stat_tables='preferably';
|
||||
CREATE DATABASE dbt3_s001;
|
||||
use dbt3_s001;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set optimizer_switch='extended_keys=off';
|
||||
select * from mysql.table_stats;
|
||||
db_name table_name cardinality
|
||||
dbt3_s001 lineitem 6005
|
||||
select * from mysql.index_stats;
|
||||
db_name table_name index_name prefix_arity avg_frequency
|
||||
dbt3_s001 lineitem PRIMARY 1 4.0033
|
||||
dbt3_s001 lineitem PRIMARY 2 1.0000
|
||||
dbt3_s001 lineitem i_l_shipdate 1 2.6500
|
||||
dbt3_s001 lineitem i_l_suppkey_partkey 1 30.0250
|
||||
dbt3_s001 lineitem i_l_suppkey_partkey 2 8.5786
|
||||
dbt3_s001 lineitem i_l_partkey 1 30.0250
|
||||
dbt3_s001 lineitem i_l_suppkey 1 600.5000
|
||||
dbt3_s001 lineitem i_l_receiptdate 1 2.6477
|
||||
dbt3_s001 lineitem i_l_orderkey 1 4.0033
|
||||
dbt3_s001 lineitem i_l_orderkey_quantity 1 4.0033
|
||||
dbt3_s001 lineitem i_l_orderkey_quantity 2 1.0404
|
||||
dbt3_s001 lineitem i_l_commitdate 1 2.7160
|
||||
SHOW INDEXES FROM lineitem;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
|
||||
lineitem 0 PRIMARY 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
lineitem 0 PRIMARY 2 l_linenumber A 6005 NULL NULL BTREE
|
||||
lineitem 1 i_l_shipdate 1 l_shipDATE A 2266 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_suppkey_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_suppkey_partkey 2 l_suppkey A 699 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_suppkey 1 l_suppkey A 10 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_receiptdate 1 l_receiptDATE A 2268 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_orderkey 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
lineitem 1 i_l_orderkey_quantity 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
lineitem 1 i_l_orderkey_quantity 2 l_quantity A 5771 NULL NULL YES BTREE
|
||||
lineitem 1 i_l_commitdate 1 l_commitDATE A 2210 NULL NULL YES BTREE
|
||||
SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name='lineitem';
|
||||
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT INDEX_COMMENT
|
||||
def dbt3_s001 lineitem 0 dbt3_s001 PRIMARY 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 0 dbt3_s001 PRIMARY 2 l_linenumber A 6005 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_shipdate 1 l_shipDATE A 2266 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_suppkey_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_suppkey_partkey 2 l_suppkey A 699 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_partkey 1 l_partkey A 200 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_suppkey 1 l_suppkey A 10 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_receiptdate 1 l_receiptDATE A 2268 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_orderkey 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_orderkey_quantity 1 l_orderkey A 1500 NULL NULL BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_orderkey_quantity 2 l_quantity A 5771 NULL NULL YES BTREE
|
||||
def dbt3_s001 lineitem 1 dbt3_s001 i_l_commitdate 1 l_commitDATE A 2210 NULL NULL YES BTREE
|
||||
SELECT
|
||||
COUNT(DISTINCT l_orderkey), COUNT(DISTINCT l_orderkey,l_linenumber),
|
||||
COUNT(DISTINCT l_shipDATE),
|
||||
COUNT(DISTINCT l_partkey), COUNT(DISTINCT l_partkey,l_suppkey),
|
||||
COUNT(DISTINCT l_suppkey), COUNT(DISTINCT l_receiptDATE),
|
||||
COUNT(DISTINCT l_orderkey, l_quantity), COUNT(DISTINCT l_commitDATE)
|
||||
FROM lineitem;
|
||||
COUNT(DISTINCT l_orderkey) COUNT(DISTINCT l_orderkey,l_linenumber) COUNT(DISTINCT l_shipDATE) COUNT(DISTINCT l_partkey) COUNT(DISTINCT l_partkey,l_suppkey) COUNT(DISTINCT l_suppkey) COUNT(DISTINCT l_receiptDATE) COUNT(DISTINCT l_orderkey, l_quantity) COUNT(DISTINCT l_commitDATE)
|
||||
1500 6005 2266 200 700 10 2268 5772 2211
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
DROP DATABASE dbt3_s001;
|
||||
USE test;
|
||||
delete from mysql.table_stats;
|
||||
delete from mysql.column_stats;
|
||||
delete from mysql.index_stats;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set use_stat_tables=@save_use_stat_tables;
|
||||
#
|
||||
# MDEV-18899: Server crashes in Field::set_warning_truncated_wrong_value
|
||||
#
|
||||
set names utf8;
|
||||
|
|
|
@ -65,3 +65,27 @@ SELECT * FROM t1;
|
|||
a_id b_id c_id
|
||||
1 NULL NULL
|
||||
drop table t1,t2;
|
||||
#
|
||||
# MDEV-18300: ASAN error in Field_blob::get_key_image upon UPDATE with subquery
|
||||
#
|
||||
set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
|
||||
set @save_use_stat_tables= @@use_stat_tables;
|
||||
set use_stat_tables=preferably;
|
||||
set optimizer_use_condition_selectivity=4;
|
||||
CREATE TABLE t1 (a INT, b CHAR(8)) ENGINE=InnoDB;
|
||||
insert into t1 values (1,'foo'),(2, 'abc');
|
||||
CREATE TABLE t2 (c CHAR(8), d BLOB) ENGINE=InnoDB;
|
||||
insert into t2 values ('abc', 'foo'),('edf', 'food');
|
||||
ANALYZE TABLE t1,t2;
|
||||
UPDATE t1 SET a = 1 WHERE b = ( SELECT c FROM t2 WHERE d = 'foo' );
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
1 foo
|
||||
1 abc
|
||||
DROP TABLE t1, t2;
|
||||
create table t1 (a int not null, b int, c int) engine=InnoDB;
|
||||
create table t2 (d int, e int) engine=InnoDB;
|
||||
update t1, t2 set a=NULL, b=2, c=NULL where b=d and e=200;
|
||||
drop table t1,t2;
|
||||
set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||
set @@use_stat_tables= @save_use_stat_tables;
|
||||
|
|
|
@ -75,3 +75,32 @@ SELECT t2.b_id FROM t1,t2 WHERE t2.c_id = t1.c_id;
|
|||
UPDATE t1 SET b_id = (SELECT t2.b_id FROM t2 t2 WHERE t2.c_id = t1.c_id);
|
||||
SELECT * FROM t1;
|
||||
drop table t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-18300: ASAN error in Field_blob::get_key_image upon UPDATE with subquery
|
||||
--echo #
|
||||
|
||||
set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
|
||||
set @save_use_stat_tables= @@use_stat_tables;
|
||||
set use_stat_tables=preferably;
|
||||
set optimizer_use_condition_selectivity=4;
|
||||
|
||||
CREATE TABLE t1 (a INT, b CHAR(8)) ENGINE=InnoDB;
|
||||
insert into t1 values (1,'foo'),(2, 'abc');
|
||||
CREATE TABLE t2 (c CHAR(8), d BLOB) ENGINE=InnoDB;
|
||||
insert into t2 values ('abc', 'foo'),('edf', 'food');
|
||||
|
||||
--disable_result_log
|
||||
ANALYZE TABLE t1,t2;
|
||||
--enable_result_log
|
||||
UPDATE t1 SET a = 1 WHERE b = ( SELECT c FROM t2 WHERE d = 'foo' );
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
create table t1 (a int not null, b int, c int) engine=InnoDB;
|
||||
create table t2 (d int, e int) engine=InnoDB;
|
||||
update t1, t2 set a=NULL, b=2, c=NULL where b=d and e=200;
|
||||
drop table t1,t2;
|
||||
|
||||
set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
|
||||
set @@use_stat_tables= @save_use_stat_tables;
|
||||
|
|
|
@ -3506,6 +3506,18 @@ id a b sum_a_b
|
|||
2 2 2 4
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-15837: Assertion `item1->type() == Item::FIELD_ITEM && item2->type() == Item::FIELD_ITEM'
|
||||
# failed in compare_order_elements function
|
||||
#
|
||||
CREATE TABLE t1 (a1 int);
|
||||
insert into t1 values (1),(2),(3);
|
||||
SELECT rank() OVER (ORDER BY 1), ROW_NUMBER() OVER (ORDER BY (EXPORT_SET(5,'Y','N',',',4))) FROM t1;
|
||||
rank() OVER (ORDER BY 1) ROW_NUMBER() OVER (ORDER BY (EXPORT_SET(5,'Y','N',',',4)))
|
||||
1 1
|
||||
1 2
|
||||
1 3
|
||||
drop table t1;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -2255,6 +2255,16 @@ select e.id,
|
|||
from t1 e;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-15837: Assertion `item1->type() == Item::FIELD_ITEM && item2->type() == Item::FIELD_ITEM'
|
||||
--echo # failed in compare_order_elements function
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a1 int);
|
||||
insert into t1 values (1),(2),(3);
|
||||
SELECT rank() OVER (ORDER BY 1), ROW_NUMBER() OVER (ORDER BY (EXPORT_SET(5,'Y','N',',',4))) FROM t1;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
|
24
mysql-test/suite/archive/archive_eits.result
Normal file
24
mysql-test/suite/archive/archive_eits.result
Normal file
|
@ -0,0 +1,24 @@
|
|||
drop table if exists t1;
|
||||
#
|
||||
# MDEV-17297: stats.records=0 for a table of Archive engine when it has rows, when we run ANALYZE command
|
||||
#
|
||||
CREATE TABLE t1 (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g POINT)engine=archive;
|
||||
INSERT INTO t1 VALUES
|
||||
(101, PointFromText('POINT(10 10)')),
|
||||
(102, PointFromText('POINT(20 10)')),
|
||||
(103, PointFromText('POINT(20 20)')),
|
||||
(104, PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
|
||||
set @tmp1= @@optimizer_use_condition_selectivity;
|
||||
set @tmp2= @@use_stat_tables;
|
||||
set optimizer_use_condition_selectivity=4;
|
||||
set use_stat_tables=PREFERABLY;
|
||||
ANALYZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze note The storage engine for the table doesn't support analyze
|
||||
select * from mysql.table_stats where table_name='t1' and db_name=database();
|
||||
db_name table_name cardinality
|
||||
test t1 4
|
||||
drop table t1;
|
||||
set optimizer_use_condition_selectivity=@tmp1;
|
||||
set use_stat_tables=@tmp2;
|
32
mysql-test/suite/archive/archive_eits.test
Normal file
32
mysql-test/suite/archive/archive_eits.test
Normal file
|
@ -0,0 +1,32 @@
|
|||
-- source include/have_archive.inc
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17297: stats.records=0 for a table of Archive engine when it has rows, when we run ANALYZE command
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (fid INTEGER PRIMARY KEY AUTO_INCREMENT, g POINT)engine=archive;
|
||||
INSERT INTO t1 VALUES
|
||||
(101, PointFromText('POINT(10 10)')),
|
||||
(102, PointFromText('POINT(20 10)')),
|
||||
(103, PointFromText('POINT(20 20)')),
|
||||
(104, PointFromWKB(AsWKB(PointFromText('POINT(10 20)'))));
|
||||
|
||||
set @tmp1= @@optimizer_use_condition_selectivity;
|
||||
set @tmp2= @@use_stat_tables;
|
||||
|
||||
set optimizer_use_condition_selectivity=4;
|
||||
set use_stat_tables=PREFERABLY;
|
||||
ANALYZE TABLE t1;
|
||||
|
||||
select * from mysql.table_stats where table_name='t1' and db_name=database();
|
||||
|
||||
drop table t1;
|
||||
|
||||
set optimizer_use_condition_selectivity=@tmp1;
|
||||
set use_stat_tables=@tmp2;
|
||||
|
||||
|
|
@ -261,10 +261,18 @@ ALTER IGNORE TABLE t1 ADD FOREIGN KEY (a) REFERENCES t2 (b);
|
|||
ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Warning 150 Alter table test/#sql-temporary with foreign key constraint failed. Referenced table `test`.`t2` not found in the data dictionary near 'FOREIGN KEY (a) REFERENCES t2 (b)'.
|
||||
Warning 150 Alter table `test`.`t1` with foreign key constraint failed. Referenced table `test`.`t2` not found in the data dictionary near 'FOREIGN KEY (a) REFERENCES t2 (b)'.
|
||||
Error 1005 Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint for `t1`
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-18139 ALTER IGNORE ... ADD FOREIGN KEY causes bogus error
|
||||
#
|
||||
CREATE TABLE t1 (f1 INT, f2 INT, f3 INT, KEY(f1)) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (f INT, KEY(f)) ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD FOREIGN KEY (f2) REFERENCES t2 (f);
|
||||
ALTER IGNORE TABLE t1 ADD FOREIGN KEY (f3) REFERENCES t1 (f1);
|
||||
DROP TABLE t1, t2;
|
||||
# Start of 10.2 tests
|
||||
#
|
||||
# MDEV-13246 Stale rows despite ON DELETE CASCADE constraint
|
||||
|
|
361
mysql-test/suite/innodb/r/xa_debug.result
Normal file
361
mysql-test/suite/innodb/r/xa_debug.result
Normal file
|
@ -0,0 +1,361 @@
|
|||
call mtr.add_suppression("Found 50 prepared XA transactions");
|
||||
create table t1 (a int) engine=innodb;
|
||||
insert into t1 values(1);
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test50';
|
||||
insert into t1 values(1);
|
||||
xa end 'test50';
|
||||
xa prepare 'test50';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test49';
|
||||
insert into t1 values(1);
|
||||
xa end 'test49';
|
||||
xa prepare 'test49';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test48';
|
||||
insert into t1 values(1);
|
||||
xa end 'test48';
|
||||
xa prepare 'test48';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test47';
|
||||
insert into t1 values(1);
|
||||
xa end 'test47';
|
||||
xa prepare 'test47';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test46';
|
||||
insert into t1 values(1);
|
||||
xa end 'test46';
|
||||
xa prepare 'test46';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test45';
|
||||
insert into t1 values(1);
|
||||
xa end 'test45';
|
||||
xa prepare 'test45';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test44';
|
||||
insert into t1 values(1);
|
||||
xa end 'test44';
|
||||
xa prepare 'test44';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test43';
|
||||
insert into t1 values(1);
|
||||
xa end 'test43';
|
||||
xa prepare 'test43';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test42';
|
||||
insert into t1 values(1);
|
||||
xa end 'test42';
|
||||
xa prepare 'test42';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test41';
|
||||
insert into t1 values(1);
|
||||
xa end 'test41';
|
||||
xa prepare 'test41';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test40';
|
||||
insert into t1 values(1);
|
||||
xa end 'test40';
|
||||
xa prepare 'test40';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test39';
|
||||
insert into t1 values(1);
|
||||
xa end 'test39';
|
||||
xa prepare 'test39';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test38';
|
||||
insert into t1 values(1);
|
||||
xa end 'test38';
|
||||
xa prepare 'test38';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test37';
|
||||
insert into t1 values(1);
|
||||
xa end 'test37';
|
||||
xa prepare 'test37';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test36';
|
||||
insert into t1 values(1);
|
||||
xa end 'test36';
|
||||
xa prepare 'test36';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test35';
|
||||
insert into t1 values(1);
|
||||
xa end 'test35';
|
||||
xa prepare 'test35';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test34';
|
||||
insert into t1 values(1);
|
||||
xa end 'test34';
|
||||
xa prepare 'test34';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test33';
|
||||
insert into t1 values(1);
|
||||
xa end 'test33';
|
||||
xa prepare 'test33';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test32';
|
||||
insert into t1 values(1);
|
||||
xa end 'test32';
|
||||
xa prepare 'test32';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test31';
|
||||
insert into t1 values(1);
|
||||
xa end 'test31';
|
||||
xa prepare 'test31';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test30';
|
||||
insert into t1 values(1);
|
||||
xa end 'test30';
|
||||
xa prepare 'test30';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test29';
|
||||
insert into t1 values(1);
|
||||
xa end 'test29';
|
||||
xa prepare 'test29';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test28';
|
||||
insert into t1 values(1);
|
||||
xa end 'test28';
|
||||
xa prepare 'test28';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test27';
|
||||
insert into t1 values(1);
|
||||
xa end 'test27';
|
||||
xa prepare 'test27';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test26';
|
||||
insert into t1 values(1);
|
||||
xa end 'test26';
|
||||
xa prepare 'test26';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test25';
|
||||
insert into t1 values(1);
|
||||
xa end 'test25';
|
||||
xa prepare 'test25';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test24';
|
||||
insert into t1 values(1);
|
||||
xa end 'test24';
|
||||
xa prepare 'test24';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test23';
|
||||
insert into t1 values(1);
|
||||
xa end 'test23';
|
||||
xa prepare 'test23';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test22';
|
||||
insert into t1 values(1);
|
||||
xa end 'test22';
|
||||
xa prepare 'test22';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test21';
|
||||
insert into t1 values(1);
|
||||
xa end 'test21';
|
||||
xa prepare 'test21';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test20';
|
||||
insert into t1 values(1);
|
||||
xa end 'test20';
|
||||
xa prepare 'test20';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test19';
|
||||
insert into t1 values(1);
|
||||
xa end 'test19';
|
||||
xa prepare 'test19';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test18';
|
||||
insert into t1 values(1);
|
||||
xa end 'test18';
|
||||
xa prepare 'test18';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test17';
|
||||
insert into t1 values(1);
|
||||
xa end 'test17';
|
||||
xa prepare 'test17';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test16';
|
||||
insert into t1 values(1);
|
||||
xa end 'test16';
|
||||
xa prepare 'test16';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test15';
|
||||
insert into t1 values(1);
|
||||
xa end 'test15';
|
||||
xa prepare 'test15';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test14';
|
||||
insert into t1 values(1);
|
||||
xa end 'test14';
|
||||
xa prepare 'test14';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test13';
|
||||
insert into t1 values(1);
|
||||
xa end 'test13';
|
||||
xa prepare 'test13';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test12';
|
||||
insert into t1 values(1);
|
||||
xa end 'test12';
|
||||
xa prepare 'test12';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test11';
|
||||
insert into t1 values(1);
|
||||
xa end 'test11';
|
||||
xa prepare 'test11';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test10';
|
||||
insert into t1 values(1);
|
||||
xa end 'test10';
|
||||
xa prepare 'test10';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test9';
|
||||
insert into t1 values(1);
|
||||
xa end 'test9';
|
||||
xa prepare 'test9';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test8';
|
||||
insert into t1 values(1);
|
||||
xa end 'test8';
|
||||
xa prepare 'test8';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test7';
|
||||
insert into t1 values(1);
|
||||
xa end 'test7';
|
||||
xa prepare 'test7';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test6';
|
||||
insert into t1 values(1);
|
||||
xa end 'test6';
|
||||
xa prepare 'test6';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test5';
|
||||
insert into t1 values(1);
|
||||
xa end 'test5';
|
||||
xa prepare 'test5';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test4';
|
||||
insert into t1 values(1);
|
||||
xa end 'test4';
|
||||
xa prepare 'test4';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test3';
|
||||
insert into t1 values(1);
|
||||
xa end 'test3';
|
||||
xa prepare 'test3';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test2';
|
||||
insert into t1 values(1);
|
||||
xa end 'test2';
|
||||
xa prepare 'test2';
|
||||
connect con$trial, localhost, root,,;
|
||||
xa start 'test1';
|
||||
insert into t1 values(1);
|
||||
xa end 'test1';
|
||||
xa prepare 'test1';
|
||||
connection default;
|
||||
xa recover;
|
||||
formatID gtrid_length bqual_length data
|
||||
1 5 0 test1
|
||||
1 5 0 test2
|
||||
1 5 0 test3
|
||||
1 5 0 test4
|
||||
1 5 0 test5
|
||||
1 5 0 test6
|
||||
1 5 0 test7
|
||||
1 5 0 test8
|
||||
1 5 0 test9
|
||||
1 6 0 test10
|
||||
1 6 0 test11
|
||||
1 6 0 test12
|
||||
1 6 0 test13
|
||||
1 6 0 test14
|
||||
1 6 0 test15
|
||||
1 6 0 test16
|
||||
1 6 0 test17
|
||||
1 6 0 test18
|
||||
1 6 0 test19
|
||||
1 6 0 test20
|
||||
1 6 0 test21
|
||||
1 6 0 test22
|
||||
1 6 0 test23
|
||||
1 6 0 test24
|
||||
1 6 0 test25
|
||||
1 6 0 test26
|
||||
1 6 0 test27
|
||||
1 6 0 test28
|
||||
1 6 0 test29
|
||||
1 6 0 test30
|
||||
1 6 0 test31
|
||||
1 6 0 test32
|
||||
1 6 0 test33
|
||||
1 6 0 test34
|
||||
1 6 0 test35
|
||||
1 6 0 test36
|
||||
1 6 0 test37
|
||||
1 6 0 test38
|
||||
1 6 0 test39
|
||||
1 6 0 test40
|
||||
1 6 0 test41
|
||||
1 6 0 test42
|
||||
1 6 0 test43
|
||||
1 6 0 test44
|
||||
1 6 0 test45
|
||||
1 6 0 test46
|
||||
1 6 0 test47
|
||||
1 6 0 test48
|
||||
1 6 0 test49
|
||||
1 6 0 test50
|
||||
xa recover;
|
||||
formatID gtrid_length bqual_length data
|
||||
1 5 0 test1
|
||||
1 5 0 test2
|
||||
1 5 0 test3
|
||||
1 5 0 test4
|
||||
1 5 0 test5
|
||||
1 5 0 test6
|
||||
1 5 0 test7
|
||||
1 5 0 test8
|
||||
1 5 0 test9
|
||||
1 6 0 test10
|
||||
1 6 0 test11
|
||||
1 6 0 test12
|
||||
1 6 0 test13
|
||||
1 6 0 test14
|
||||
1 6 0 test15
|
||||
1 6 0 test16
|
||||
1 6 0 test17
|
||||
1 6 0 test18
|
||||
1 6 0 test19
|
||||
1 6 0 test20
|
||||
1 6 0 test21
|
||||
1 6 0 test22
|
||||
1 6 0 test23
|
||||
1 6 0 test24
|
||||
1 6 0 test25
|
||||
1 6 0 test26
|
||||
1 6 0 test27
|
||||
1 6 0 test28
|
||||
1 6 0 test29
|
||||
1 6 0 test30
|
||||
1 6 0 test31
|
||||
1 6 0 test32
|
||||
1 6 0 test33
|
||||
1 6 0 test34
|
||||
1 6 0 test35
|
||||
1 6 0 test36
|
||||
1 6 0 test37
|
||||
1 6 0 test38
|
||||
1 6 0 test39
|
||||
1 6 0 test40
|
||||
1 6 0 test41
|
||||
1 6 0 test42
|
||||
1 6 0 test43
|
||||
1 6 0 test44
|
||||
1 6 0 test45
|
||||
1 6 0 test46
|
||||
1 6 0 test47
|
||||
1 6 0 test48
|
||||
1 6 0 test49
|
||||
1 6 0 test50
|
||||
xa recover;
|
||||
formatID gtrid_length bqual_length data
|
||||
drop table t1;
|
|
@ -244,10 +244,18 @@ DROP TABLE t1;
|
|||
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||
--error ER_CANT_CREATE_TABLE
|
||||
ALTER IGNORE TABLE t1 ADD FOREIGN KEY (a) REFERENCES t2 (b);
|
||||
--replace_regex /#sql-[0-9_a-f-]*/#sql-temporary/
|
||||
SHOW WARNINGS;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-18139 ALTER IGNORE ... ADD FOREIGN KEY causes bogus error
|
||||
--echo #
|
||||
CREATE TABLE t1 (f1 INT, f2 INT, f3 INT, KEY(f1)) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (f INT, KEY(f)) ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD FOREIGN KEY (f2) REFERENCES t2 (f);
|
||||
ALTER IGNORE TABLE t1 ADD FOREIGN KEY (f3) REFERENCES t1 (f1);
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo # Start of 10.2 tests
|
||||
|
||||
--echo #
|
||||
|
|
45
mysql-test/suite/innodb/t/xa_debug.test
Normal file
45
mysql-test/suite/innodb/t/xa_debug.test
Normal file
|
@ -0,0 +1,45 @@
|
|||
-- source include/have_innodb.inc
|
||||
-- source include/have_debug.inc
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
call mtr.add_suppression("Found 50 prepared XA transactions");
|
||||
create table t1 (a int) engine=innodb;
|
||||
insert into t1 values(1);
|
||||
|
||||
let $trial = 50;
|
||||
while ($trial)
|
||||
{
|
||||
--connect (con$trial, localhost, root,,)
|
||||
let $st_pre = `select concat('test', $trial)`;
|
||||
eval xa start '$st_pre';
|
||||
insert into t1 values(1);
|
||||
eval xa end '$st_pre';
|
||||
eval xa prepare '$st_pre';
|
||||
dec $trial;
|
||||
}
|
||||
|
||||
connection default;
|
||||
# Kill and restart the server.
|
||||
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- shutdown_server 0
|
||||
-- source include/wait_until_disconnected.inc
|
||||
|
||||
-- exec echo "restart:--debug_dbug=+d,min_xa_len" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- enable_reconnect
|
||||
-- source include/wait_until_connected_again.inc
|
||||
-- disable_reconnect
|
||||
--sorted_result
|
||||
xa recover;
|
||||
--sorted_result
|
||||
xa recover;
|
||||
--disable_query_log
|
||||
let $trial = 50;
|
||||
while ($trial)
|
||||
{
|
||||
let $st_pre = `select concat('test', $trial)`;
|
||||
eval xa commit '$st_pre';
|
||||
dec $trial;
|
||||
}
|
||||
--enable_query_log
|
||||
xa recover;
|
||||
drop table t1;
|
|
@ -993,6 +993,8 @@ void Gcalc_heap::reset()
|
|||
{
|
||||
if (m_n_points)
|
||||
{
|
||||
if (m_hook)
|
||||
*m_hook= NULL;
|
||||
free_list(m_first);
|
||||
m_n_points= 0;
|
||||
}
|
||||
|
|
|
@ -2048,6 +2048,7 @@ int ha_recover(HASH *commit_list)
|
|||
for (info.len= MAX_XID_LIST_SIZE ;
|
||||
info.list==0 && info.len > MIN_XID_LIST_SIZE; info.len/=2)
|
||||
{
|
||||
DBUG_EXECUTE_IF("min_xa_len", info.len = 16;);
|
||||
info.list=(XID *)my_malloc(info.len*sizeof(XID), MYF(0));
|
||||
}
|
||||
if (!info.list)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2017, MariaDB
|
||||
Copyright (c) 2009, 2019, MariaDB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -203,6 +203,7 @@ sp_get_flags_for_command(LEX *lex)
|
|||
case SQLCOM_SHOW_EXPLAIN:
|
||||
case SQLCOM_SHOW_FIELDS:
|
||||
case SQLCOM_SHOW_FUNC_CODE:
|
||||
case SQLCOM_SHOW_GENERIC:
|
||||
case SQLCOM_SHOW_GRANTS:
|
||||
case SQLCOM_SHOW_ENGINE_STATUS:
|
||||
case SQLCOM_SHOW_ENGINE_LOGS:
|
||||
|
@ -3209,7 +3210,7 @@ sp_head::show_routine_code(THD *thd)
|
|||
const char *format= "Instruction at position %u has m_ip=%u";
|
||||
char tmp[sizeof(format) + 2*SP_INSTR_UINT_MAXLEN + 1];
|
||||
|
||||
sprintf(tmp, format, ip, i->m_ip);
|
||||
my_snprintf(tmp, sizeof(tmp), format, ip, i->m_ip);
|
||||
/*
|
||||
Since this is for debugging purposes only, we don't bother to
|
||||
introduce a special error code for it.
|
||||
|
|
|
@ -2443,6 +2443,9 @@ public:
|
|||
*/
|
||||
bool create_tmp_table_for_derived;
|
||||
|
||||
/* The flag to force reading statistics from EITS tables */
|
||||
bool force_read_stats;
|
||||
|
||||
bool save_prep_leaf_list;
|
||||
|
||||
/* container for handler's private per-connection data */
|
||||
|
|
|
@ -2964,15 +2964,14 @@ static bool do_execute_sp(THD *thd, sp_head *sp)
|
|||
my_error(ER_SP_BADSELECT, MYF(0), ErrConvDQName(sp).ptr());
|
||||
return 1;
|
||||
}
|
||||
/*
|
||||
If SERVER_MORE_RESULTS_EXISTS is not set,
|
||||
then remember that it should be cleared
|
||||
*/
|
||||
bits_to_be_cleared= (~thd->server_status &
|
||||
SERVER_MORE_RESULTS_EXISTS);
|
||||
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
||||
}
|
||||
|
||||
/*
|
||||
If SERVER_MORE_RESULTS_EXISTS is not set,
|
||||
then remember that it should be cleared
|
||||
*/
|
||||
bits_to_be_cleared= (~thd->server_status &
|
||||
SERVER_MORE_RESULTS_EXISTS);
|
||||
thd->server_status|= SERVER_MORE_RESULTS_EXISTS;
|
||||
ha_rows select_limit= thd->variables.select_limit;
|
||||
thd->variables.select_limit= HA_POS_ERROR;
|
||||
|
||||
|
|
|
@ -3399,7 +3399,8 @@ JOIN::create_postjoin_aggr_table(JOIN_TAB *tab, List<Item> *table_fields,
|
|||
if (setup_sum_funcs(thd, sum_funcs))
|
||||
goto err;
|
||||
|
||||
if (!group_list && !table->distinct && order && simple_order)
|
||||
if (!group_list && !table->distinct && order && simple_order &&
|
||||
tab == join_tab + const_tables)
|
||||
{
|
||||
DBUG_PRINT("info",("Sorting for order"));
|
||||
THD_STAGE_INFO(thd, stage_sorting_for_order);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2017, MariaDB
|
||||
Copyright (c) 2009, 2019, MariaDB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -4606,7 +4606,10 @@ fill_schema_table_by_open(THD *thd, MEM_ROOT *mem_root,
|
|||
}
|
||||
|
||||
DBUG_ASSERT(thd->lex == lex);
|
||||
thd->force_read_stats= get_schema_table_idx(schema_table) == SCH_STATISTICS;
|
||||
result= open_tables_only_view_structure(thd, table_list, can_deadlock);
|
||||
(void) read_statistics_for_tables_if_needed(thd, table_list);
|
||||
thd->force_read_stats= false;
|
||||
|
||||
DEBUG_SYNC(thd, "after_open_table_ignore_flush");
|
||||
|
||||
|
|
|
@ -2185,7 +2185,10 @@ inline bool statistics_for_command_is_needed(THD *thd)
|
|||
{
|
||||
if (thd->bootstrap || thd->variables.use_stat_tables == NEVER)
|
||||
return FALSE;
|
||||
|
||||
|
||||
if (thd->force_read_stats)
|
||||
return TRUE;
|
||||
|
||||
switch(thd->lex->sql_command) {
|
||||
case SQLCOM_SELECT:
|
||||
case SQLCOM_INSERT:
|
||||
|
@ -4081,6 +4084,7 @@ bool is_eits_usable(Field *field)
|
|||
partition list of a table. We assume the selecticivity for
|
||||
such columns would be handled during partition pruning.
|
||||
*/
|
||||
DBUG_ASSERT(field->table->stats_is_read);
|
||||
Column_statistics* col_stats= field->read_stats;
|
||||
return col_stats && !col_stats->no_stat_values_provided() && //(1)
|
||||
field->type() != MYSQL_TYPE_GEOMETRY && //(2)
|
||||
|
|
|
@ -738,11 +738,6 @@ public:
|
|||
{
|
||||
length(0);
|
||||
}
|
||||
StringBuffer(const char *str, size_t length_arg, CHARSET_INFO *cs)
|
||||
: String(buff, buff_sz, cs)
|
||||
{
|
||||
set(str, length_arg, cs);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -355,6 +355,8 @@ int mysql_update(THD *thd,
|
|||
if (lock_tables(thd, table_list, table_count, 0))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
(void) read_statistics_for_tables_if_needed(thd, table_list);
|
||||
|
||||
THD_STAGE_INFO(thd, stage_init_update);
|
||||
if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT))
|
||||
DBUG_RETURN(1);
|
||||
|
@ -1688,6 +1690,7 @@ int mysql_multi_update_prepare(THD *thd)
|
|||
{
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
(void) read_statistics_for_tables_if_needed(thd, table_list);
|
||||
/* @todo: downgrade the metadata locks here. */
|
||||
|
||||
/*
|
||||
|
|
|
@ -455,6 +455,22 @@ int compare_order_lists(SQL_I_List<ORDER> *part_list1,
|
|||
for ( ; elem1 && elem2; elem1= elem1->next, elem2= elem2->next)
|
||||
{
|
||||
int cmp;
|
||||
// remove all constants as we don't need them for comparision
|
||||
while(elem1 && ((*elem1->item)->real_item())->const_item())
|
||||
{
|
||||
elem1= elem1->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
while(elem2 && ((*elem2->item)->real_item())->const_item())
|
||||
{
|
||||
elem2= elem2->next;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!elem1 || !elem2)
|
||||
break;
|
||||
|
||||
if ((cmp= compare_order_elements(elem1, elem2)))
|
||||
return cmp;
|
||||
}
|
||||
|
|
|
@ -1671,7 +1671,6 @@ void ha_archive::update_create_info(HA_CREATE_INFO *create_info)
|
|||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Hints for optimizer, see ha_tina for more information
|
||||
*/
|
||||
|
@ -1679,22 +1678,7 @@ int ha_archive::info(uint flag)
|
|||
{
|
||||
DBUG_ENTER("ha_archive::info");
|
||||
|
||||
mysql_mutex_lock(&share->mutex);
|
||||
if (share->dirty)
|
||||
{
|
||||
DBUG_PRINT("ha_archive", ("archive flushing out rows for scan"));
|
||||
DBUG_ASSERT(share->archive_write_open);
|
||||
azflush(&(share->archive_write), Z_SYNC_FLUSH);
|
||||
share->dirty= FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
This should be an accurate number now, though bulk and delayed inserts can
|
||||
cause the number to be inaccurate.
|
||||
*/
|
||||
stats.records= share->rows_recorded;
|
||||
mysql_mutex_unlock(&share->mutex);
|
||||
|
||||
flush_and_clear_pending_writes();
|
||||
stats.deleted= 0;
|
||||
|
||||
DBUG_PRINT("ha_archive", ("Stats rows is %d\n", (int)stats.records));
|
||||
|
@ -1737,6 +1721,38 @@ int ha_archive::info(uint flag)
|
|||
}
|
||||
|
||||
|
||||
int ha_archive::external_lock(THD *thd, int lock_type)
|
||||
{
|
||||
if (lock_type == F_RDLCK)
|
||||
{
|
||||
// We are going to read from the table. Flush any pending writes that we
|
||||
// may have
|
||||
flush_and_clear_pending_writes();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void ha_archive::flush_and_clear_pending_writes()
|
||||
{
|
||||
mysql_mutex_lock(&share->mutex);
|
||||
if (share->dirty)
|
||||
{
|
||||
DBUG_PRINT("ha_archive", ("archive flushing out rows for scan"));
|
||||
DBUG_ASSERT(share->archive_write_open);
|
||||
azflush(&(share->archive_write), Z_SYNC_FLUSH);
|
||||
share->dirty= FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
This should be an accurate number now, though bulk and delayed inserts can
|
||||
cause the number to be inaccurate.
|
||||
*/
|
||||
stats.records= share->rows_recorded;
|
||||
mysql_mutex_unlock(&share->mutex);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
This method tells us that a bulk insert operation is about to occur. We set
|
||||
a flag which will keep write_row from saying that its data is dirty. This in
|
||||
|
|
|
@ -169,5 +169,8 @@ public:
|
|||
int unpack_row(azio_stream *file_to_read, uchar *record);
|
||||
unsigned int pack_row(uchar *record, azio_stream *writer);
|
||||
bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes);
|
||||
int external_lock(THD *thd, int lock_type);
|
||||
private:
|
||||
void flush_and_clear_pending_writes();
|
||||
};
|
||||
|
||||
|
|
|
@ -3897,10 +3897,6 @@ got_block:
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(page_id) == 0);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
return(bpage);
|
||||
}
|
||||
|
||||
|
@ -4682,15 +4678,9 @@ evict_from_pool:
|
|||
}
|
||||
}
|
||||
|
||||
if (!recv_no_ibuf_operations) {
|
||||
if (access_time) {
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(page_id) == 0);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
} else {
|
||||
ibuf_merge_or_delete_for_page(
|
||||
block, page_id, &page_size, TRUE);
|
||||
}
|
||||
if (!access_time && !recv_no_ibuf_operations) {
|
||||
ibuf_merge_or_delete_for_page(
|
||||
block, page_id, &page_size, TRUE);
|
||||
}
|
||||
|
||||
buf_pool_mutex_enter(buf_pool);
|
||||
|
@ -4892,10 +4882,6 @@ evict_from_pool:
|
|||
buf_read_ahead_linear(page_id, page_size, ibuf_inside(mtr));
|
||||
}
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(fix_block->page.id) == 0);
|
||||
#endif
|
||||
|
||||
ut_ad(!rw_lock_own_flagged(hash_lock,
|
||||
RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
|
||||
|
||||
|
@ -5003,10 +4989,6 @@ buf_page_optimistic_get(
|
|||
ibuf_inside(mtr));
|
||||
}
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(block->page.id) == 0);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
buf_pool = buf_pool_from_block(block);
|
||||
buf_pool->stat.n_page_gets++;
|
||||
|
||||
|
@ -5110,9 +5092,6 @@ buf_page_get_known_nowait(
|
|||
}
|
||||
#endif /* UNIV_DEBUG */
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a((mode == BUF_KEEP_OLD) || ibuf_count_get(block->page.id) == 0);
|
||||
#endif
|
||||
buf_pool->stat.n_page_gets++;
|
||||
|
||||
return(TRUE);
|
||||
|
@ -5197,10 +5176,6 @@ buf_page_try_get_func(
|
|||
|
||||
buf_pool->stat.n_page_gets++;
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(block->page.id) == 0);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
return(block);
|
||||
}
|
||||
|
||||
|
@ -5599,11 +5574,6 @@ buf_page_create(
|
|||
if (block
|
||||
&& buf_page_in_file(&block->page)
|
||||
&& !buf_pool_watch_is_sentinel(buf_pool, &block->page)) {
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(page_id) == 0);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
ut_d(block->page.file_page_was_freed = FALSE);
|
||||
|
||||
/* Page can be found in buf_pool */
|
||||
|
@ -5708,9 +5678,6 @@ buf_page_create(
|
|||
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
|
||||
ut_a(++buf_dbg_counter % 5771 || buf_validate());
|
||||
#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(block->page.id) == 0);
|
||||
#endif
|
||||
return(block);
|
||||
}
|
||||
|
||||
|
@ -6158,14 +6125,6 @@ database_corrupted:
|
|||
buf_pool_mutex_enter(buf_pool);
|
||||
mutex_enter(block_mutex);
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
if (io_type == BUF_IO_WRITE || uncompressed) {
|
||||
/* For BUF_IO_READ of compressed-only blocks, the
|
||||
buffered operations will be merged by buf_page_get_gen()
|
||||
after the block has been uncompressed. */
|
||||
ut_a(ibuf_count_get(bpage->id) == 0);
|
||||
}
|
||||
#endif
|
||||
/* Because this thread which does the unlocking is not the same that
|
||||
did the locking, we use a pass value != 0 in unlock, which simply
|
||||
removes the newest lock debug record, without checking the thread
|
||||
|
@ -6394,11 +6353,6 @@ buf_pool_validate_instance(
|
|||
buf_pool, block->page.id)
|
||||
== &block->page);
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(buf_page_get_io_fix(&block->page)
|
||||
== BUF_IO_READ
|
||||
|| !ibuf_count_get(block->page.id));
|
||||
#endif
|
||||
switch (buf_page_get_io_fix(&block->page)) {
|
||||
case BUF_IO_NONE:
|
||||
break;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2019, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2014, Fusion-io
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
|
@ -1043,11 +1043,6 @@ buf_flush_write_block_low(
|
|||
ut_ad(!buf_page_get_mutex(bpage)->is_owned());
|
||||
ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_WRITE);
|
||||
ut_ad(bpage->oldest_modification != 0);
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(bpage->id) == 0);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
ut_ad(bpage->newest_modification != 0);
|
||||
|
||||
/* Force the log to the disk before writing the modified block */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2017, 2019, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -1595,10 +1595,6 @@ buf_LRU_free_page(
|
|||
goto func_exit;
|
||||
}
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(bpage->id) == 0);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
if (zip || !bpage->zip.data) {
|
||||
/* This would completely free the block. */
|
||||
/* Do not completely free dirty blocks. */
|
||||
|
|
|
@ -4355,11 +4355,19 @@ dict_create_foreign_constraints_low(
|
|||
}
|
||||
|
||||
orig = ptr;
|
||||
ptr = dict_accept(cs, ptr, "TABLE", &success);
|
||||
|
||||
if (!success) {
|
||||
|
||||
goto loop;
|
||||
for (;;) {
|
||||
ptr = dict_accept(cs, ptr, "TABLE", &success);
|
||||
if (success) {
|
||||
break;
|
||||
}
|
||||
ptr = dict_accept(cs, ptr, "ONLINE", &success);
|
||||
if (success) {
|
||||
continue;
|
||||
}
|
||||
ptr = dict_accept(cs, ptr, "IGNORE", &success);
|
||||
if (!success) {
|
||||
goto loop;
|
||||
}
|
||||
}
|
||||
|
||||
/* We are doing an ALTER TABLE: scan the table name we are altering */
|
||||
|
|
|
@ -192,35 +192,6 @@ uint ibuf_debug;
|
|||
/** The insert buffer control structure */
|
||||
ibuf_t* ibuf = NULL;
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
/** Number of tablespaces in the ibuf_counts array */
|
||||
#define IBUF_COUNT_N_SPACES 4
|
||||
/** Number of pages within each tablespace in the ibuf_counts array */
|
||||
#define IBUF_COUNT_N_PAGES 130000
|
||||
|
||||
/** Buffered entry counts for file pages, used in debugging */
|
||||
static ulint ibuf_counts[IBUF_COUNT_N_SPACES][IBUF_COUNT_N_PAGES];
|
||||
|
||||
/** Checks that the indexes to ibuf_counts[][] are within limits.
|
||||
@param[in] page_id page id */
|
||||
UNIV_INLINE
|
||||
void
|
||||
ibuf_count_check(
|
||||
const page_id_t page_id)
|
||||
{
|
||||
if (page_id.space() < IBUF_COUNT_N_SPACES
|
||||
&& page_id.page_no() < IBUF_COUNT_N_PAGES) {
|
||||
return;
|
||||
}
|
||||
|
||||
ib::fatal() << "UNIV_IBUF_COUNT_DEBUG limits space_id and page_no"
|
||||
" and breaks crash recovery. space_id=" << page_id.space()
|
||||
<< ", should be 0<=space_id<" << IBUF_COUNT_N_SPACES
|
||||
<< ". page_no=" << page_id.page_no()
|
||||
<< ", should be 0<=page_no<" << IBUF_COUNT_N_PAGES;
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @name Offsets to the per-page bits in the insert buffer bitmap */
|
||||
/* @{ */
|
||||
#define IBUF_BITMAP_FREE 0 /*!< Bits indicating the
|
||||
|
@ -408,35 +379,6 @@ ibuf_tree_root_get(
|
|||
return(root);
|
||||
}
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
|
||||
/** Gets the ibuf count for a given page.
|
||||
@param[in] page_id page id
|
||||
@return number of entries in the insert buffer currently buffered for
|
||||
this page */
|
||||
ulint ibuf_count_get(const page_id_t page_id)
|
||||
{
|
||||
ibuf_count_check(page_id);
|
||||
|
||||
return(ibuf_counts[page_id.space()][page_id.page_no()]);
|
||||
}
|
||||
|
||||
/** Sets the ibuf count for a given page.
|
||||
@param[in] page_id page id
|
||||
@param[in] val value to set */
|
||||
static
|
||||
void
|
||||
ibuf_count_set(
|
||||
const page_id_t page_id,
|
||||
ulint val)
|
||||
{
|
||||
ibuf_count_check(page_id);
|
||||
ut_a(val < srv_page_size);
|
||||
|
||||
ibuf_counts[page_id.space()][page_id.page_no()] = val;
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************//**
|
||||
Closes insert buffer and frees the data structures. */
|
||||
void
|
||||
|
@ -733,10 +675,6 @@ ibuf_bitmap_page_set_bits(
|
|||
compile_time_assert(!(IBUF_BITS_PER_PAGE % 2));
|
||||
ut_ad(mtr_memo_contains_page(mtr, page, MTR_MEMO_PAGE_X_FIX));
|
||||
ut_ad(mtr->is_named_space(page_id.space()));
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a((bit != IBUF_BITMAP_BUFFERED) || (val != FALSE)
|
||||
|| (0 == ibuf_count_get(page_id)));
|
||||
#endif
|
||||
|
||||
bit_offset = (page_id.page_no() % page_size.physical())
|
||||
* IBUF_BITS_PER_PAGE + bit;
|
||||
|
@ -3492,9 +3430,6 @@ fail_exit:
|
|||
which it cannot do until we have buffered the IBUF_OP_DELETE
|
||||
and done mtr_commit(&mtr) to release the latch. */
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a((buffered == 0) || ibuf_count_get(page_id));
|
||||
#endif
|
||||
ibuf_mtr_start(&bitmap_mtr);
|
||||
index->set_modified(bitmap_mtr);
|
||||
|
||||
|
@ -3637,17 +3572,6 @@ fail_exit:
|
|||
}
|
||||
|
||||
func_exit:
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
if (err == DB_SUCCESS) {
|
||||
|
||||
ib::info() << "Incrementing ibuf count of page " << page_id
|
||||
<< " from " << ibuf_count_get(space, page_no)
|
||||
<< " by 1";
|
||||
|
||||
ibuf_count_set(page_id, ibuf_count_get(page_id) + 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
ibuf_mtr_commit(&mtr);
|
||||
btr_pcur_close(&pcur);
|
||||
|
||||
|
@ -4339,14 +4263,6 @@ ibuf_delete_rec(
|
|||
ibuf->empty = true;
|
||||
}
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ib::info() << "Decrementing ibuf count of space " << space
|
||||
<< " page " << page_no << " from "
|
||||
<< ibuf_count_get(page_id) << " by 1";
|
||||
|
||||
ibuf_count_set(page_id, ibuf_count_get(page_id) - 1);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
|
@ -4382,10 +4298,6 @@ ibuf_delete_rec(
|
|||
false, mtr);
|
||||
ut_a(err == DB_SUCCESS);
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ibuf_count_set(page_id, ibuf_count_get(page_id) - 1);
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
ibuf_size_update(root);
|
||||
mutex_exit(&ibuf_mutex);
|
||||
|
||||
|
@ -4768,10 +4680,6 @@ reset_bit:
|
|||
my_atomic_addlint(&ibuf->n_merges, 1);
|
||||
ibuf_add_ops(ibuf->n_merged_ops, mops);
|
||||
ibuf_add_ops(ibuf->n_discarded_ops, dops);
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ut_a(ibuf_count_get(page_id) == 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
|
@ -4889,11 +4797,6 @@ ibuf_print(
|
|||
/*=======*/
|
||||
FILE* file) /*!< in: file where to print */
|
||||
{
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ulint i;
|
||||
ulint j;
|
||||
#endif
|
||||
|
||||
mutex_enter(&ibuf_mutex);
|
||||
|
||||
fprintf(file,
|
||||
|
@ -4910,22 +4813,6 @@ ibuf_print(
|
|||
fputs("discarded operations:\n ", file);
|
||||
ibuf_print_ops(ibuf->n_discarded_ops, file);
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
for (i = 0; i < IBUF_COUNT_N_SPACES; i++) {
|
||||
for (j = 0; j < IBUF_COUNT_N_PAGES; j++) {
|
||||
ulint count = ibuf_count_get(page_id_t(i, j, 0));
|
||||
|
||||
if (count > 0) {
|
||||
fprintf(stderr,
|
||||
"Ibuf count for page "
|
||||
ULINTPF ":" ULINTPF ""
|
||||
" is " ULINTPF "\n",
|
||||
i, j, count);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* UNIV_IBUF_COUNT_DEBUG */
|
||||
|
||||
mutex_exit(&ibuf_mutex);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2016, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2016, 2019, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -381,13 +381,6 @@ ibuf_parse_bitmap_init(
|
|||
buf_block_t* block, /*!< in: block or NULL */
|
||||
mtr_t* mtr); /*!< in: mtr or NULL */
|
||||
|
||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
/** Gets the ibuf count for a given page.
|
||||
@param[in] page_id page id
|
||||
@return number of entries in the insert buffer currently buffered for
|
||||
this page */
|
||||
ulint ibuf_count_get(const page_id_t page_id);
|
||||
#endif
|
||||
/******************************************************************//**
|
||||
Looks if the insert buffer is empty.
|
||||
@return true if empty */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2017, 2019, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -431,6 +431,7 @@ class rw_trx_hash_t
|
|||
if (trx_t *trx= element->trx)
|
||||
{
|
||||
ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED) ||
|
||||
trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED) ||
|
||||
(trx_state_eq(trx, TRX_STATE_ACTIVE) &&
|
||||
(!srv_was_started ||
|
||||
srv_read_only_mode ||
|
||||
|
@ -515,6 +516,7 @@ class rw_trx_hash_t
|
|||
ut_ad(!trx_is_autocommit_non_locking(trx));
|
||||
mutex_enter(&trx->mutex);
|
||||
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) ||
|
||||
trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED) ||
|
||||
trx_state_eq(trx, TRX_STATE_PREPARED));
|
||||
mutex_exit(&trx->mutex);
|
||||
}
|
||||
|
|
|
@ -447,7 +447,7 @@ Check transaction state */
|
|||
ut_ad(!trx_is_autocommit_non_locking((t))); \
|
||||
switch ((t)->state) { \
|
||||
case TRX_STATE_PREPARED: \
|
||||
/* fall through */ \
|
||||
case TRX_STATE_PREPARED_RECOVERED: \
|
||||
case TRX_STATE_ACTIVE: \
|
||||
case TRX_STATE_COMMITTED_IN_MEMORY: \
|
||||
continue; \
|
||||
|
@ -785,6 +785,7 @@ public:
|
|||
TRX_STATE_NOT_STARTED
|
||||
TRX_STATE_ACTIVE
|
||||
TRX_STATE_PREPARED
|
||||
TRX_STATE_PREPARED_RECOVERED (special case of TRX_STATE_PREPARED)
|
||||
TRX_STATE_COMMITTED_IN_MEMORY (alias below COMMITTED)
|
||||
|
||||
Valid state transitions are:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2016, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2016, 2019, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -47,7 +47,7 @@ trx_state_eq(
|
|||
#ifdef UNIV_DEBUG
|
||||
switch (trx->state) {
|
||||
case TRX_STATE_PREPARED:
|
||||
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
ut_ad(!trx_is_autocommit_non_locking(trx));
|
||||
return(trx->state == state);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2017, 2019, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -62,10 +62,11 @@ enum trx_state_t {
|
|||
TRX_STATE_NOT_STARTED,
|
||||
|
||||
TRX_STATE_ACTIVE,
|
||||
|
||||
/** Support for 2PC/XA */
|
||||
/** XA PREPARE has been executed; only XA COMMIT or XA ROLLBACK
|
||||
are possible */
|
||||
TRX_STATE_PREPARED,
|
||||
|
||||
/** XA PREPARE transaction that was returned to ha_recover() */
|
||||
TRX_STATE_PREPARED_RECOVERED,
|
||||
TRX_STATE_COMMITTED_IN_MEMORY
|
||||
};
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2013, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2013, 2019, MariaDB Corporation.
|
||||
Copyright (c) 2008, Google Inc.
|
||||
|
||||
Portions of this file contain modifications contributed and copyrighted by
|
||||
|
@ -205,9 +205,6 @@ using the call command. */
|
|||
this will break redo log file compatibility, but it may be useful when
|
||||
debugging redo log application problems. */
|
||||
#define UNIV_IBUF_DEBUG /* debug the insert buffer */
|
||||
#define UNIV_IBUF_COUNT_DEBUG /* debug the insert buffer;
|
||||
this limits the database to IBUF_COUNT_N_SPACES and IBUF_COUNT_N_PAGES,
|
||||
and the insert buffer must be empty when the database is started */
|
||||
#define UNIV_PERF_DEBUG /* debug flag that enables
|
||||
light weight performance
|
||||
related stuff. */
|
||||
|
|
|
@ -6307,6 +6307,7 @@ lock_trx_release_locks(
|
|||
{
|
||||
check_trx_state(trx);
|
||||
ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED)
|
||||
|| trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)
|
||||
|| trx_state_eq(trx, TRX_STATE_ACTIVE));
|
||||
|
||||
bool release_lock = UT_LIST_GET_LEN(trx->lock.trx_locks) > 0;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
Copyright (c) 2017, 2019, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -130,6 +130,7 @@ row_undo_node_create(
|
|||
undo_node_t* undo;
|
||||
|
||||
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)
|
||||
|| trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)
|
||||
|| trx_state_eq(trx, TRX_STATE_PREPARED));
|
||||
ut_ad(parent);
|
||||
|
||||
|
|
|
@ -1400,10 +1400,6 @@ dberr_t srv_start(bool create_new_db)
|
|||
|
||||
#ifdef UNIV_IBUF_DEBUG
|
||||
ib::info() << "!!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!";
|
||||
# ifdef UNIV_IBUF_COUNT_DEBUG
|
||||
ib::info() << "!!!!!!!! UNIV_IBUF_COUNT_DEBUG switched on !!!!!!!!!";
|
||||
ib::error() << "Crash recovery will fail with UNIV_IBUF_COUNT_DEBUG";
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef UNIV_LOG_LSN_DEBUG
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2016, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2016, 2019, MariaDB Corporation.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free Software
|
||||
|
@ -236,6 +236,7 @@ dberr_t trx_rollback_for_mysql(trx_t* trx)
|
|||
return(trx_rollback_for_mysql_low(trx));
|
||||
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
ut_ad(!trx_is_autocommit_non_locking(trx));
|
||||
if (trx->rsegs.m_redo.undo || trx->rsegs.m_redo.old_insert) {
|
||||
/* Change the undo log state back from
|
||||
|
@ -335,6 +336,7 @@ trx_rollback_last_sql_stat_for_mysql(
|
|||
return(err);
|
||||
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||
/* The statement rollback is only allowed on an ACTIVE
|
||||
transaction, not a PREPARED or COMMITTED one. */
|
||||
|
@ -508,6 +510,7 @@ trx_rollback_to_savepoint_for_mysql(
|
|||
trx, savep, mysql_binlog_cache_pos));
|
||||
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||
/* The savepoint rollback is only allowed on an ACTIVE
|
||||
transaction, not a PREPARED or COMMITTED one. */
|
||||
|
|
|
@ -466,6 +466,7 @@ trx_free_at_shutdown(trx_t *trx)
|
|||
{
|
||||
ut_ad(trx->is_recovered);
|
||||
ut_a(trx_state_eq(trx, TRX_STATE_PREPARED)
|
||||
|| trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)
|
||||
|| (trx_state_eq(trx, TRX_STATE_ACTIVE)
|
||||
&& (!srv_was_started
|
||||
|| srv_operation == SRV_OPERATION_RESTORE
|
||||
|
@ -1551,7 +1552,7 @@ trx_commit_or_rollback_prepare(
|
|||
|
||||
case TRX_STATE_ACTIVE:
|
||||
case TRX_STATE_PREPARED:
|
||||
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
/* If the trx is in a lock wait state, moves the waiting
|
||||
query thread to the suspended state */
|
||||
|
||||
|
@ -1662,7 +1663,7 @@ trx_commit_for_mysql(
|
|||
/* fall through */
|
||||
case TRX_STATE_ACTIVE:
|
||||
case TRX_STATE_PREPARED:
|
||||
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
trx->op_info = "committing";
|
||||
|
||||
trx_commit(trx);
|
||||
|
@ -1708,6 +1709,7 @@ trx_mark_sql_stat_end(
|
|||
|
||||
switch (trx->state) {
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||
break;
|
||||
case TRX_STATE_NOT_STARTED:
|
||||
|
@ -1762,6 +1764,7 @@ trx_print_low(
|
|||
(ulong) difftime(time(NULL), trx->start_time));
|
||||
goto state_ok;
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
fprintf(f, ", ACTIVE (PREPARED) %lu sec",
|
||||
(ulong) difftime(time(NULL), trx->start_time));
|
||||
goto state_ok;
|
||||
|
@ -2041,6 +2044,7 @@ struct trx_recover_for_mysql_callback_arg
|
|||
static my_bool trx_recover_for_mysql_callback(rw_trx_hash_element_t *element,
|
||||
trx_recover_for_mysql_callback_arg *arg)
|
||||
{
|
||||
DBUG_ASSERT(arg->len > 0);
|
||||
mutex_enter(&element->mutex);
|
||||
if (trx_t *trx= element->trx)
|
||||
{
|
||||
|
@ -2052,17 +2056,38 @@ static my_bool trx_recover_for_mysql_callback(rw_trx_hash_element_t *element,
|
|||
if (trx_state_eq(trx, TRX_STATE_PREPARED))
|
||||
{
|
||||
ut_ad(trx->is_recovered);
|
||||
ut_ad(trx->id);
|
||||
if (arg->count == 0)
|
||||
ib::info() << "Starting recovery for XA transactions...";
|
||||
ib::info() << "Transaction " << trx_get_id_for_print(trx)
|
||||
<< " in prepared state after recovery";
|
||||
ib::info() << "Transaction contains changes to " << trx->undo_no
|
||||
<< " rows";
|
||||
arg->xid_list[arg->count++]= *trx->xid;
|
||||
XID& xid= arg->xid_list[arg->count];
|
||||
if (arg->count++ < arg->len)
|
||||
{
|
||||
trx->state= TRX_STATE_PREPARED_RECOVERED;
|
||||
ib::info() << "Transaction " << trx->id
|
||||
<< " in prepared state after recovery";
|
||||
ib::info() << "Transaction contains changes to " << trx->undo_no
|
||||
<< " rows";
|
||||
xid= *trx->xid;
|
||||
}
|
||||
}
|
||||
}
|
||||
mutex_exit(&element->mutex);
|
||||
return arg->count == arg->len;
|
||||
/* Do not terminate upon reaching arg->len; count all transactions */
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static my_bool trx_recover_reset_callback(rw_trx_hash_element_t *element,
|
||||
void*)
|
||||
{
|
||||
mutex_enter(&element->mutex);
|
||||
if (trx_t *trx= element->trx)
|
||||
{
|
||||
if (trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED))
|
||||
trx->state= TRX_STATE_PREPARED;
|
||||
}
|
||||
mutex_exit(&element->mutex);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2086,9 +2111,18 @@ int trx_recover_for_mysql(XID *xid_list, uint len)
|
|||
trx_sys.rw_trx_hash.iterate_no_dups(reinterpret_cast<my_hash_walk_action>
|
||||
(trx_recover_for_mysql_callback), &arg);
|
||||
if (arg.count)
|
||||
{
|
||||
ib::info() << arg.count
|
||||
<< " transactions in prepared state after recovery";
|
||||
return int(arg.count);
|
||||
<< " transactions in prepared state after recovery";
|
||||
/* After returning the full list, reset the state, because
|
||||
init_server_components() wants to recover the collection of
|
||||
transactions twice, by first calling tc_log->open() and then
|
||||
ha_recover() directly. */
|
||||
if (arg.count <= len)
|
||||
trx_sys.rw_trx_hash.iterate(reinterpret_cast<my_hash_walk_action>
|
||||
(trx_recover_reset_callback), NULL);
|
||||
}
|
||||
return int(std::min(arg.count, len));
|
||||
}
|
||||
|
||||
|
||||
|
@ -2106,7 +2140,9 @@ static my_bool trx_get_trx_by_xid_callback(rw_trx_hash_element_t *element,
|
|||
mutex_enter(&element->mutex);
|
||||
if (trx_t *trx= element->trx)
|
||||
{
|
||||
if (trx->is_recovered && trx_state_eq(trx, TRX_STATE_PREPARED) &&
|
||||
if (trx->is_recovered &&
|
||||
(trx_state_eq(trx, TRX_STATE_PREPARED) ||
|
||||
trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)) &&
|
||||
arg->xid->eq(reinterpret_cast<XID*>(trx->xid)))
|
||||
{
|
||||
#ifdef WITH_WSREP
|
||||
|
@ -2172,6 +2208,7 @@ trx_start_if_not_started_xa_low(
|
|||
}
|
||||
return;
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||
break;
|
||||
}
|
||||
|
@ -2199,6 +2236,7 @@ trx_start_if_not_started_low(
|
|||
return;
|
||||
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||
break;
|
||||
}
|
||||
|
@ -2265,6 +2303,7 @@ trx_start_for_ddl_low(
|
|||
|
||||
case TRX_STATE_ACTIVE:
|
||||
case TRX_STATE_PREPARED:
|
||||
case TRX_STATE_PREPARED_RECOVERED:
|
||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -362,7 +362,7 @@ int test_write(MARIA_HA *file,int id,int lock_type)
|
|||
maria_extra(file,HA_EXTRA_WRITE_CACHE,0);
|
||||
}
|
||||
|
||||
sprintf((char*) record.id,"%7ld", (long) getpid());
|
||||
my_snprintf((char*) record.id, sizeof(record.id), "%7ld", (long) getpid());
|
||||
strnmov((char*) record.text,"Testing...", sizeof(record.text));
|
||||
|
||||
tries=(uint) rnd(100)+10;
|
||||
|
|
|
@ -1731,8 +1731,8 @@ static void descript(HA_CHECK *param, register MARIA_HA *info, char *name)
|
|||
null_bit[0]=null_pos[0]=0;
|
||||
if (keyseg->null_bit)
|
||||
{
|
||||
sprintf(null_bit,"%d",keyseg->null_bit);
|
||||
sprintf(null_pos,"%ld",(long) keyseg->null_pos+1);
|
||||
my_snprintf(null_bit, sizeof(null_bit), "%d", keyseg->null_bit);
|
||||
my_snprintf(null_pos, sizeof(null_pos), "%ld", (long) keyseg->null_pos+1);
|
||||
}
|
||||
printf("%-7ld%-5d%-9s%-10s%-30s\n",
|
||||
(long) keyseg->start+1,keyseg->length,
|
||||
|
|
|
@ -365,7 +365,7 @@ int test_write(MI_INFO *file,int id,int lock_type)
|
|||
mi_extra(file,HA_EXTRA_WRITE_CACHE,0);
|
||||
}
|
||||
|
||||
sprintf((char*) record.id,"%7ld",(long) getpid());
|
||||
my_snprintf((char*) record.id, sizeof(record.id), "%7ld", (long) getpid());
|
||||
strnmov((char*) record.text,"Testing...", sizeof(record.text));
|
||||
|
||||
tries=(uint) rnd(100)+10;
|
||||
|
|
|
@ -1405,8 +1405,8 @@ static void descript(HA_CHECK *param, register MI_INFO *info, char * name)
|
|||
null_bit[0]=null_pos[0]=0;
|
||||
if (keyseg->null_bit)
|
||||
{
|
||||
sprintf(null_bit,"%d",keyseg->null_bit);
|
||||
sprintf(null_pos,"%ld",(long) keyseg->null_pos+1);
|
||||
my_snprintf(null_bit, sizeof(null_bit), "%d", keyseg->null_bit);
|
||||
my_snprintf(null_pos, sizeof(null_pos), "%ld", (long) keyseg->null_pos+1);
|
||||
}
|
||||
printf("%-7ld%-5d%-9s%-10s%-30s\n",
|
||||
(long) keyseg->start+1,keyseg->length,
|
||||
|
|
|
@ -34,14 +34,8 @@ struct PFS_events
|
|||
ulonglong m_event_id;
|
||||
/** END_EVENT_ID. */
|
||||
ulonglong m_end_event_id;
|
||||
/** (EVENT_TYPE) */
|
||||
enum_event_type m_event_type;
|
||||
/** NESTING_EVENT_ID. */
|
||||
ulonglong m_nesting_event_id;
|
||||
/** NESTING_EVENT_TYPE */
|
||||
enum_event_type m_nesting_event_type;
|
||||
/** Instrument metadata. */
|
||||
PFS_instr_class *m_class;
|
||||
/**
|
||||
Timer start.
|
||||
This member is populated only if m_class->m_timed is true.
|
||||
|
@ -52,8 +46,14 @@ struct PFS_events
|
|||
This member is populated only if m_class->m_timed is true.
|
||||
*/
|
||||
ulonglong m_timer_end;
|
||||
/** Instrument metadata. */
|
||||
PFS_instr_class *m_class;
|
||||
/** Location of the instrumentation in the source code (file name). */
|
||||
const char *m_source_file;
|
||||
/** (EVENT_TYPE) */
|
||||
enum_event_type m_event_type;
|
||||
/** NESTING_EVENT_TYPE */
|
||||
enum_event_type m_nesting_event_type;
|
||||
/** Location of the instrumentation in the source code (line number). */
|
||||
uint m_source_line;
|
||||
};
|
||||
|
|
|
@ -55,6 +55,23 @@ enum events_waits_class
|
|||
/** A wait event record. */
|
||||
struct PFS_events_waits : public PFS_events
|
||||
{
|
||||
/** Executing thread. */
|
||||
PFS_thread *m_thread;
|
||||
/** Table share, for table operations only. */
|
||||
PFS_table_share *m_weak_table_share;
|
||||
/** File, for file operations only. */
|
||||
PFS_file *m_weak_file;
|
||||
/** Address in memory of the object instance waited on. */
|
||||
const void *m_object_instance_addr;
|
||||
/** Socket, for socket operations only. */
|
||||
PFS_socket *m_weak_socket;
|
||||
/**
|
||||
Number of bytes read/written.
|
||||
This member is populated for file READ/WRITE operations only.
|
||||
*/
|
||||
size_t m_number_of_bytes;
|
||||
/** Flags */
|
||||
ulong m_flags;
|
||||
/**
|
||||
The type of wait.
|
||||
Readers:
|
||||
|
@ -67,34 +84,17 @@ struct PFS_events_waits : public PFS_events
|
|||
- TRUNCATE EVENTS_WAITS_HISTORY_LONG
|
||||
*/
|
||||
events_waits_class m_wait_class;
|
||||
/** Executing thread. */
|
||||
PFS_thread *m_thread;
|
||||
/** Object type */
|
||||
enum_object_type m_object_type;
|
||||
/** Table share, for table operations only. */
|
||||
PFS_table_share *m_weak_table_share;
|
||||
/** File, for file operations only. */
|
||||
PFS_file *m_weak_file;
|
||||
/** Socket, for socket operations only. */
|
||||
PFS_socket *m_weak_socket;
|
||||
/** For weak pointers, target object version. */
|
||||
uint32 m_weak_version;
|
||||
/** Address in memory of the object instance waited on. */
|
||||
const void *m_object_instance_addr;
|
||||
/** Operation performed. */
|
||||
enum_operation_type m_operation;
|
||||
/**
|
||||
Number of bytes read/written.
|
||||
This member is populated for file READ/WRITE operations only.
|
||||
*/
|
||||
size_t m_number_of_bytes;
|
||||
/**
|
||||
Index used.
|
||||
This member is populated for TABLE IO operations only.
|
||||
*/
|
||||
uint m_index;
|
||||
/** Flags */
|
||||
ulong m_flags;
|
||||
};
|
||||
|
||||
/** TIMED bit in the state flags bitfield. */
|
||||
|
|
Loading…
Reference in a new issue